Total refactor of upgrade and install functions

Many other refactors/fixes/improvements inlcuding to supervisor
now suitable for release 30
master 2024.10.17
David Kebler 2024-10-17 17:26:11 -07:00
parent 7a83069283
commit b03c398e35
68 changed files with 1741 additions and 904 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ logs/
deploy/nextcloud deploy/nextcloud
deploy/opt deploy/opt
build/mnt build/mnt
dev/**

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
if dcp=$(./dcp $1); then if dcp=$(./dcp "$@"); then
eval "$dcp up $2" eval "$dcp up -d"
else else
echo no environment file passed ${1:-$ENV_FILE} echo no environment file passed ${1:-$ENV_FILE}
fi fi

View File

@ -2,9 +2,9 @@
[[ $1 = "-f" ]] && force=force && shift [[ $1 = "-f" ]] && force=force && shift
if [[ ! $(udbuild image exists -e ../build/.env) || $force ]] ; then if [[ ! $(udbuild image exists -e ../build/.env) || $force ]] ; then
echo $force building image echo $force building image
pushd ../build || exit pushd ../build > /dev/null || exit
./build -p -e .env -a build.env $@ ./build -p -e .env -a build.env $@
popd popd > /dev/null
echo done building image echo done building image
else else
echo using existing image, use -f to force rebuild echo using existing image, use -f to force rebuild

4
dev/dcstart Normal file → Executable file
View File

@ -1 +1,3 @@
docker-compose up CMD=$1
CMD=${CMD:-idle} docker-compose up -d
[[ ! $CMD ]] && docker exec -it try-ucommandit-nextcloud /opt/bin/entrypoint nextcloud shell

View File

@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
# # check for image and build # # check for image and build
source ./build $1 ./build "$@"
[[ $force ]] && shift 1 mkdir opt &> /dev/null
mkdir dopt ./try -v NEXTCLOUD_DEV=clean nextcloud shell
udbuild try -e ../build/.env -f nextcloud.env -m opt -h dopt -o '-p 8080:8080' -k shell

View File

@ -1,5 +1,8 @@
rsync -r ../src/rootfs/opt/lib/ opt/lib/ opt=${1:-opt}
rsync -r ../src/rootfs/opt/supervisor/ opt/supervisor/ rsync -r ../src/rootfs/opt/lib/ $opt/lib/
rsync -r ../src/rootfs/opt/bin/ opt/bin/ rsync -r ../src/rootfs/opt/supervisor/ $opt/supervisor/
rsync -r ../src/rootfs/opt/env/ opt/env/ rsync -a ../src/rootfs/opt/bin/ $opt/bin/
rsync -r ../src/rootfs/opt/caddy/conf/ opt/caddy/conf rsync -r ../src/rootfs/opt/env/ $opt/env/
rsync -r ../src/rootfs/opt/nextcloud/config/ $opt/nextcloud/config
rsync -r ../src/rootfs/opt/caddy/conf/ $opt/caddy/conf
rsync -r ../src/rootfs/opt/nextcloud/db/ $opt/nextcloud/db

View File

@ -1,40 +1,59 @@
version: '3'
services: services:
nextcloud-app: nextcloud-app:
image: ucommandit/nextcloud image: ucommandit/nextcloud
container_name: try-ucommandit-nextcloud container_name: try-ucommandit-nextcloud
# use exec to substitute shell script at PID 1 ? # restart: ${RESTART:-unless-stopped}
entrypoint: ['exec /opt/bin/boot'] command: ['nextcloud', "${CMD:-idle}" ]
hostname: compose-uci-nextcloud hostname: compose-uci-nextcloud
env_file: nextcloud.env env_file: nextcloud.env
volumes: volumes:
# - nextcloud:/opt/nextcloud # required volume to save state of nextcloud instance
- opt:/opt - nextcloud:/opt/nextcloud
# for pre-downloaded releases
- releases:/opt/releases
# for full dev development
# - opt:/opt
# for minimal development (just the nextcloud cli)
# - lib:/opt/lib
ports: ports:
# required: the nextcloud web server
- 8080:8080 - 8080:8080
- 9001:9001 # if using ssh access to container
- 8022:22
# this is for supervisor interface
# - 9001:9001
volumes: volumes:
# db:
# driver: local
# driver_opts:
# o: bind
# type: none
# device: ${HOST_NEXTCLOUD_DB}
opt: nextcloud:
driver: local driver: local
driver_opts: driver_opts:
o: bind o: bind
type: none type: none
device: ${PWD}/opt device: ${PWD}/devcloud
# nextcloud: releases:
driver: local
driver_opts:
o: bind
type: none
device: ${PWD}/releases
# lib:
# driver: local # driver: local
# driver_opts: # driver_opts:
# o: bind # o: bind
# type: none # type: none
# device: ${PWD}/nextcloud # device: ${PWD}/lib
# opt:
# driver: local
# driver_opts:
# o: bind
# type: none
# device: ${PWD}/opt
# user-files: # user-files:
# driver: local # driver: local
# driver_opts: # driver_opts:

View File

@ -6,27 +6,6 @@ COMPOSE_PROJECT_NAME=nextcloud
# https://timezonedb.com/time-zones # https://timezonedb.com/time-zones
TZ=America/Los_Angles TZ=America/Los_Angles
# default is sqlite, mariadb or mysql, postgres
# SQL_DB_TYPE=mysql
# sqlite default db name
# SQLITE_DATABASE=nextcloud-db
# mariadb/mysql
# MYSQL_ROOT_PASSWORD=nextcloud1234
# MYSQL_HOST=nextcloud
# MYSQL_PASSWORD=nextcloud1234
# MYSQL_DATABASE=nextcloud
# MYSQL_USER=nextcloud
# postgres
# MYSQL_ROOT_PASSWORD=nextcloud1234
# MYSQL_PASSWORD=nextcloud1234
# MYSQL_DATABASE=nextcloud
# MYSQL_USER=nextcloud
# NEXTCLOUD # NEXTCLOUD
TRUSTED_PROXIES="<ip where your reverse proxy runs>" TRUSTED_PROXIES="<ip where your reverse proxy runs>"
NEXTCLOUD_DOMAIN="<domain of reverse proxy>" NEXTCLOUD_DOMAIN="<domain of reverse proxy>"
@ -46,14 +25,11 @@ SMTP_PORT=465
SMTP_NAME="<just your google account name (no @gmail.com)>" SMTP_NAME="<just your google account name (no @gmail.com)>"
SMTP_PASSWORD="<a 16 character app password generated from your google account>" SMTP_PASSWORD="<a 16 character app password generated from your google account>"
# volumes can be found at /var/lib/docker/volumes but can be bound else via below
# DOCKER HOST Volume Bindings Parent Directory
# use only if you need/want to bind the three <db,src,user-files> volumes elsewhere for easier access
# will create up to three directories parent/nextcloud/<volume>
# must pre make all the directories <parent>/nextcloud/<volume> == db,src,user-files
# must uncomment driver and driver opts in docker-compose.yml in the volumes stanza
# HOST_NEXTCLOUD_PARENT_DIR=/data
SSH_USER=root
SSH_PUBKEY="the public key"
SSH_ADDRESS=10.0.0.43
SSH_HOST_PORT

View File

@ -2,4 +2,4 @@
# # check for image and build # # check for image and build
source ./build $1 source ./build $1
[[ $force ]] && shift 1 [[ $force ]] && shift 1
./try -k "$@" nextcloud shell ./try -k "$@" shell

View File

@ -1 +1 @@
docker exec -t try-ucommandit-nextcloud /bin/bash -l docker exec -it try-ucommandit-nextcloud $@

View File

@ -1,5 +1,3 @@
#!/bin/bash #!/bin/bash
# # check for image and build # # check for image and build
source ./build $1 udbuild try -k -e ../build/.env -f nextcloud.env -m opt -h opt -o '-p 8080:8080 -p 8022:22 --dns=10.0.0.1' "$@"
[[ $force ]] && shift 1
udbuild try -e ../build/.env -f nextcloud.env -m opt -h opt -o '-p 8080:8080' -o '-p 9001:9001' -o '--dns=10.0.0.1' "$@"

View File

@ -18,7 +18,7 @@ PHP_VERSION="${PHP_VERSION#php}"
ln -s $(which php-fpm$PHP_VERSION) /bin/php-fpm ln -s $(which php-fpm$PHP_VERSION) /bin/php-fpm
echo -e "export PHP_INI_DIR=$PHP_INI_DIR\nexport PHP_VERSION=$PHP_VERSION" >> $ENV_DIR/php.env echo -e "export PHP_INI_DIR=$PHP_INI_DIR\nexport PHP_VERSION=$PHP_VERSION" >> $ENV_DIR/php.env
cat $ENV_DIR/php.env quiet cat $ENV_DIR/php.env
cat <<PHP > $PHP_INI_DIR/conf.d/03-opcache-recommended.ini cat <<PHP > $PHP_INI_DIR/conf.d/03-opcache-recommended.ini
opcache.enable=1 opcache.enable=1
@ -41,13 +41,13 @@ mysql.max_links=-1
mysql.default_port= mysql.default_port=
mysql.default_socket=/run/nextcloud/db.sock mysql.default_socket=/run/nextcloud/db.sock
mysql.default_host=localhost mysql.default_host=localhost
mysql.default_user=${MYSQL_USER:-nextcloud} mysql.default_user=${NEXTCLOUD_DB_USER:-nextcloud}
mysql.default_password=${MYSQL_PASSWORD:-nextcloud1234} mysql.default_password=${NEXTCLOUD_DB_PASSWORD:-nextcloud}
mysql.connect_timeout=60 mysql.connect_timeout=60
mysql.trace_mode=Off mysql.trace_mode=Off
[Pdo_mysql] [Pdo_mysql]
pdo_mysql.default_socket=/opt/nextcloud/db/db.sock pdo_mysql.default_socket=/run/nextcloud/db.sock
PHP PHP
cat <<PHP > "${PHP_INI_DIR}/conf.d/03-ext-apcu.ini" cat <<PHP > "${PHP_INI_DIR}/conf.d/03-ext-apcu.ini"
@ -66,7 +66,7 @@ rm $PHP_INI_DIR/php-fpm.d/www.conf
cat <<PHP > $PHP_INI_DIR/php-fpm.d/nextcloud.conf cat <<PHP > $PHP_INI_DIR/php-fpm.d/nextcloud.conf
[global] [global]
error_log = $NEXTCLOUD_LOGS_DIR/php-fpm.err error_log = $NEXTCLOUD_LOGS_DIR/php-fpm.error.log
log_level = ${PHP_LOG_LEVEL:-warning} log_level = ${PHP_LOG_LEVEL:-warning}
emergency_restart_threshold = 10 emergency_restart_threshold = 10
emergency_restart_interval = 1m emergency_restart_interval = 1m
@ -105,8 +105,8 @@ php_admin_value[session.save_path] = /var/tmp/nextcloud
php_admin_value[sys_temp_dir] = /var/tmp/nextcloud php_admin_value[sys_temp_dir] = /var/tmp/nextcloud
php_admin_value[upload_tmp_dir] = /var/tmp/nextcloud php_admin_value[upload_tmp_dir] = /var/tmp/nextcloud
php_admin_flag[log_errors] = on php_admin_flag[log_errors] = on
php_admin_value[error_log] = $NEXTCLOUD_LOGS_DIR/admin.php.error.log php_admin_value[error_log] = $NEXTCLOUD_LOGS_DIR/php.admin.error.log
php_admin_value[opcache.error_log] = $NEXTCLOUD_LOGS_DIR/admin.opcache.php.error.log php_admin_value[opcache.error_log] = $NEXTCLOUD_LOGS_DIR/php.admin.opcache.error.log
php_admin_flag[output_buffering] = false php_admin_flag[output_buffering] = false
php_admin_value[disable_functions] = exec,passthru,system,proc_open,curl_multi_exec,show_source php_admin_value[disable_functions] = exec,passthru,system,proc_open,curl_multi_exec,show_source
php_admin_flag[opcache.enable_cli] = true php_admin_flag[opcache.enable_cli] = true
@ -117,18 +117,23 @@ php_admin_value[opcache.memory_consumption] = 128
php_admin_value[opcache.revalidate_freq] = 1 php_admin_value[opcache.revalidate_freq] = 1
catch_workers_output = yes catch_workers_output = yes
slowlog = $NEXTCLOUD_LOGS_DIR/slow.log slowlog = $NEXTCLOUD_LOGS_DIR/php-slow.log
access.log = $NEXTCLOUD_LOGS_DIR/access.log access.log = $NEXTCLOUD_LOGS_DIR/php-access.log
PHP PHP
# create php temp directory and set ownership
mkdir -p /var/tmp/nextcloud
chown -R $USER:$USER /var/tmp/nextcloud
# ls -la $PHP_INI_DIR/conf.d # ls -la $PHP_INI_DIR/conf.d
ls -la $PHP_INI_DIR/php-fpm.d quiet ls -la $PHP_INI_DIR/php-fpm.d
# cat $PHP_INI_DIR/conf.d/03-opcache-recommended.ini # cat $PHP_INI_DIR/conf.d/03-opcache-recommended.ini
# cat "${PHP_INI_DIR}/conf.d/03-docker-php-ext-apcu.ini" # cat "${PHP_INI_DIR}/conf.d/03-docker-php-ext-apcu.ini"
# cat $PHP_INI_DIR/conf.d/03-nextcloud.ini # cat $PHP_INI_DIR/conf.d/03-nextcloud.ini
cat $PHP_INI_DIR/php-fpm.d/nextcloud.conf quiet cat $PHP_INI_DIR/php-fpm.d/nextcloud.conf
# allow only occ as part of nextcloud # remove any occ not part of nextcloud source
rm -f /usr/bin/occ rm -f /usr/bin/occ
source $LIB_DIR/caddy.lib source $LIB_DIR/caddy.lib
@ -138,4 +143,40 @@ chown -R $USER:$USER $CADDY_HOME
echo "vm.overcommit_memory = 1" | sudo tee /etc/sysctl.d/nextcloud-memory-overcommit.conf echo "vm.overcommit_memory = 1" | sudo tee /etc/sysctl.d/nextcloud-memory-overcommit.conf
mkdir /opt/releases
chown -R $USER:$USER /opt/releases
echo keeping a copy of /opt/nextcloud core files for later updates in /opt/nextcloud-container
mkdir /opt/nextcloud-container
chown -R $USER:$USER /opt/nextcloud-container
rsync -r /opt/nextcloud/ /opt/nextcloud-container
echo creating crontab file @ /etc/crontabs/$USER
echo "*/5 * * * * $(which php) -f $NEXTCLOUD_SRC_DIR/cron.php" > /etc/crontabs/$USER
chown $USER:$USER /etc/crontabs/$USER
chmod 0600 /etc/crontabs/$USER
cat /etc/crontabs/$USER
echo generating ssh server keys
ssh-keygen -A
echo adding nextcloud sourcing for root ssh session
source /opt/lib/release.lib
cat << EOF > /container-build
container:
name: ${BUILD_NAME:-Ucommandit Nextcloud Container}
desc: ${BUILD_DESC:-nextcloud}
id: $(date '+%Y%m%d%H%M%S')
tag: ${BUILD_TAG:-$(date '+%Y.%m.%d')}
date: $(date)
php: $PHP_VERSION
mysql: $(mysql --version | cut -f1 -d- | rev | cut -f1 -d' ' | rev)
caddy: $(/usr/sbin/caddy -v | cut -f2 -dv)
redis: $(redis-server -v | cut -f3 -d ' ' | cut -f2 -d=)
nc-tested: ${NEXCLOUD_TESTED_VERSION:-$(nextcloud_releases latest)}
EOF
chmod 0600 /container-build
echo -e "********** Done: Nextcloud Setup and Install ***************" echo -e "********** Done: Nextcloud Setup and Install ***************"

47
src/packages/packages.sh Normal file → Executable file
View File

@ -1,20 +1,31 @@
# php version estatablished in php.env via run.env #!/bin/bash
source $LIB_DIR/verbose.lib
echo "----- Installing php version $PHP_VERSION specific system packages in $file ---------------" source $ENV_DIR/run.env
while IFS= read -r pkg || [ -n "$pkg" ]; do source php-modules.sh
echo installing: php$PHP_VERSION-$pkg
silence $INSTALL_PKGS php$PHP_VERSION-$pkg
done < ./php-ver.mods
echo "done ----- Installing System Packages from $file ---------------"
echo adding php version specific modules based on php version installed: $PHP_VERSION
silence $INSTALL_PKGS php$PHP_VERSION-pecl-imagick
silence $INSTALL_PKGS php$PHP_VERSION-pdo_mysql
silence $INSTALL_PKGS php$PHP_VERSION-pecl-redis
silence $INSTALL_PKGS php$PHP_VERSION-pecl-apcu
update_supervisor () {
supver=$(/usr/bin/supervisord --version)
pkgs=/usr/lib/python3.12/site-packages
echo updating supervisord $supver to latest commit from https://github.com/Supervisor/supervisor.git
mv $pkgs/supervisor $pkgs/supervisor-$supver
git clone https://github.com/Supervisor/supervisor.git /tmp/supervisor
mv /tmp/supervisor/supervisor $pkgs/supervisor
if [[ $(/usr/bin/supervisord --version) == *dev* ]]; then
echo supervisord has been updated to latest commit
/usr/bin/supervisord --version
rm -rf /tmp/supervisor
rm -rf $pkgs/supervisor-$supver
else
unable to update supervisord, rolling back to latest release $supver
rm -rf $pkgs/supervisor
mv $pkgs/supervisor-$supver $pkgs/supervisor
if [[ $(/usr/bin/supervisord --version) == "$supver" ]]; then
echo restore succesfull
else
echo WARNING: restore failed
return 1
fi
fi
}
[[ $UPDATE_SUPERVISOR ]] && update_supervisor

17
src/packages/php-modules.sh Executable file
View File

@ -0,0 +1,17 @@
#!/bin/bash
# php version estatablished in php.env via run.env
list=""
list+=" $(ls ./php-modules/*.mods 2> /dev/null)"
silence echo list of files containg php$PHPVERSION modules to install: $list
for file in $list; do
[ -f "$file" ] || break
echo installing php$PHPVERSION modules from $file
cat $file | head -n 1
#sed -e 'h;s/[^#]*//1;x;s/#.*//;${1};G;s/(.*)\n/\1/' < $file
sed '/^[[:space:]]*#[^!]/d; /#$/d' $file | sed '/^\s*$/ d' | cut -f1 -d\ | while IFS= read -r mod || [ -n "$mod" ]; do
echo installing module $mod as $LINUX_DISTRO package php$PHP_VERSION-$mod
silence $INSTALL_PKGS php$PHP_VERSION-$mod
done
echo "done ----- Installing php$PHP_VERSION modules from $file ---------------"
done
echo "done ----- Installing all php$PHP_VERSION modules for build ---------------"

View File

@ -0,0 +1,18 @@
# Required Modules for Nextcloud
# https://docs.nextcloud.com/server/latest/admin_manual/installation/php_configuration.html
ctype # this is a comment after
curl
dom
fileinfo (included with PHP)
gd
# JSON (included with PHP >= 8.0)
xml (Linux package libxml2 must be >=2.7.0)
mbstring
# openssl (included with PHP >= 8.0)
posix
session
simplexml
xmlreader
xmlwriter
zip
zlib

View File

@ -0,0 +1,4 @@
# database Modules
# pdo_sqlite (>= 3, usually not recommended for performance reasons)
pdo_mysql (MySQL/MariaDB)
# pdo_pgsql (PostgreSQL)

View File

@ -0,0 +1,9 @@
# Recommended Modules
# no translation needed so no need
intl (increases language translation performance and fixes sorting of non-ASCII characters)
sodium (for Argon2 for password hashing. bcrypt is used as fallback, but if passwords were hashed with Argon2 already and the module is missing, your users can't log in. Included with PHP >= 7.2)
pcntl (enables command interruption by pressing ``ctrl-c``)
sysvsem

View File

@ -0,0 +1,5 @@
# cache modules
pecl-memcached
pecl-redis
pecl-apcu
opcache

View File

@ -0,0 +1,16 @@
# Required for specific apps:
# ldap (for LDAP integration)
# smbclient (SMB/CIFS integration, see :doc:`../configuration_files/external_storage/smb`)
# ftp (for FTP storage / external user authentication)
imap (for external user authentication)
bcmath (for passwordless login)
gmp (for passwordless login, sftp)
# Recommended
exif (for image rotation in pictures app)
# For preview generation (*optional*):
pecl-imagick

View File

@ -1,5 +0,0 @@
pecl-imagick
pdo_mysql
pecl-redis
pecl-apcu
sysvsem

View File

@ -1,4 +1,5 @@
jq yq-go
rsync rsync
envsubst envsubst
supervisor supervisor
openssh

View File

@ -1,2 +1,3 @@
php php
php-fpm php-fpm
phpmyadmin

View File

@ -0,0 +1,5 @@
caddy
redis
imagemagick
imagemagick-svg
supercronic

View File

@ -1,4 +0,0 @@
nextcloud
nextcloud-initscript
caddy
redis

View File

@ -0,0 +1,3 @@
mariadb
mariadb-client
mariadb-server-utils

View File

@ -1,4 +0,0 @@
nextcloud-sqlite
mariadb
mariadb-client
nextcloud-mysql

View File

@ -1,6 +0,0 @@
nextcloud-files_pdfviewer
nextcloud-text
nextcloud-notifications
nextcloud-files_videoplayer
nextcloud-files_external
nextcloud-default-apps

View File

@ -1,83 +0,0 @@
#!/bin/bash
# do not add code here for non-interative login shell
# rather put additional non-interactive profile script code in files in /etc/profile.d
# this files is sourced for all login shells and also interactive non-login shells via /etc/bash.bashrc
# more info see http://www.linuxfromscratch.org/blfs/view/svn/postlfs/profile.html
# interactive non-login and login shells will call the BASH_SHELL_LOAD script below
# non-interative login shells only source /etc/profile.d
# in profile.d is 03-startup.sh which will call
# any of the scripts in a repo's startup subdirectory
# non-interactive non-login shells are not handled here only via /etc/bash.bashrc
# interactive login
([ -n "$SSH_CONNECTION" ] || [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]) && export SSH_SESSION=true
[[ $- == *i* ]] && export SHELL_INTERACTIVE=true
shopt -q login_shell && export SHELL_LOGIN=true
[ $EUID -eq 0 ] && export USER_ROOT=true
# uncomment for debugging non-interactive login shell, i.e. $ . /etc/profile
#unset SHELL_INTERACTIVE
#uncomment these for debugging.
# echo ---- sourcing system /etc/profile ---
# [[ $USER_ROOT ]] && echo 'Root User' || echo 'Non Root User'
# [[ $SHELL_INTERACTIVE ]] && echo 'Interactive' || echo 'Not interactive'
# [[ $SHELL_LOGIN ]] && echo 'Login shell' || echo 'Not login shell'
# [[ $SSH_SESSION ]] && echo ssh remote user || echo local user
# echo ---------------------
# Set the initial path
export PATH=/bin:/usr/bin:/usr/local/bin
# set directory for base shell repo
export BASH_SHELL_BASE=/shell
# now bootstrap by souring the shell repo envinroment
source $BASH_SHELL_BASE/shell.env
# set $BASH_SAFE_MODE=true in shell.env to disable UCI interactive shell from loading
# TODO see if $NO_BASH_SHELL_SSH=true in user or host directory (at the remote machine)
# if so don't source the load command below and make just a simple prompt.
if [[ $SHELL_INTERACTIVE ]]; then
if [[ ! $BASH_SAFE_MODE ]]; then
# echo interactive shell loading $BASH_SHELL_LOAD
source "$BASH_SHELL_LOAD"
else
# safe mode
# just set a simple prompt instead
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
YELLOW='\e[1;33m'
if [[ $EUID == 0 ]] ; then
PS1="${YELLOW}SAFE:$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
PS1="${YELLOW}SAFE:$GREEN \u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi
unset RED GREEN NORMAL YELLOW
fi
else
# this is non-interactive login (e.g. at user machine login)
if [[ $EUID -ne 0 ]] && [[ ! $SSH_SESSION ]]; then
export LOGIN_LOG=$HOME/logs/login.log
mkdir -p $HOME/logs
touch $LOGIN_LOG
llog () {
echo "$@" >> $LOGIN_LOG 2>&1
}
export -f llog
llog "$(env | grep BASH)"
echo "$(date)" > $LOGIN_LOG
llog "non-interactive login shell for $USER"
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
llog "sourcing $i"
source $i
fi
done
unset i
fi
fi
fi

View File

@ -1,6 +0,0 @@
# root login setup only, put in if block
if [ $EUID -eq 0 ] ; then # if root user
echo login profile, root specific setup
export PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
unset HISTFILE
fi

View File

@ -1,10 +0,0 @@
# this runs startups for bash shell base system
# don't run statup if user logs in via su
if [ "$SHELL" = "/bin/bash" ] && [ "${BASH_SHELL_STARTUP}" ] && [ "$(ps -o comm= $PPID)" != "su" ]; then
# uncomment for debugging
if [[ -f $BASH_SHELL_STARTUP ]] && [[ $EUID -ne 0 ]]; then
llog "sourcing startup script $BASH_SHELL_STARTUP"
# (${BASH_SHELL_STARTUP}) &
source ${BASH_SHELL_STARTUP}
fi
fi

View File

@ -0,0 +1,2 @@
# use configuration files
Include /etc/ssh/sshd_config.d/*.conf

View File

@ -0,0 +1,8 @@
PermitRootLogin no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication no
KbdInteractiveAuthentication no
PasswordAuthentication no
PrintMotd no

View File

@ -0,0 +1 @@
Subsystem sftp internal-sftp

View File

@ -0,0 +1,2 @@
PubkeyAuthentication yes
PermitRootLogin prohibit-password

View File

@ -1,27 +0,0 @@
#!/bin/bash
source /opt/core_run.env
source $LIB_DIR/nextcloud.lib
export BOOT=true
ps -ea
exec nextcloud supstart -n
# get this to be process zero
# /usr/bin/python3 /usr/bin/supervisord -c /opt/supervisor/supervisord.conf -n
# # catch shutdown signals
# trap nextcloud shutdown SIGTERM SIGHUP SIGQUIT SIGINT
# # wait $RUNIT
# sleep 5
# ps -ea
# echo "killing any other processes (zombie) still running in the container"
# for _pid in $(ps -eo pid | grep -v PID | tr -d ' ' | grep -v '^1$' | head -n -6); do
# timeout 5 /bin/sh -c "kill $_pid && wait $_pid || kill -9 $_pid"
# done
# https://docs.docker.com/config/containers/multi-service_container/
# https://github.com/phusion/baseimage-docker
# https://computingforgeeks.com/use-tini-init-system-in-docker-containers/#google_vignette

View File

@ -3,21 +3,47 @@
source $LIB_DIR/nextcloud.lib source $LIB_DIR/nextcloud.lib
nextcloud () { nextcloud () {
local cmd
cmd=$1
if ! { [[ $(installed) ]] || [[ $NEXTCLOUD_DEV ]] || [[ $NEXTCLOUD_INSTALLING ]]; }; then if [[ $cmd == "install" ]]; then
if ! { [[ $1 == "install" ]] || [[ $1 == "supstart" ]] || [[ $1 == "start" ]] || [[ $1 == "installed" ]]; }; then shift
echo "nextcloud not installed, only valid nextcloud subcommands are 'supstart', 'start', 'installed' or 'install '" if [[ $(installed) ]] && [[ ! $1 == "--force" ]]; then
echo exiting now from passed subcommand: $1 echo nextcloud is already installed
echo use \'nextcloud upgrade\'
else
echo installing nextcloud ......
export NEXTCLOUD_INSTALLING=true
source $LIB_DIR/install.lib
if nextcloud_install "$@"; then
echo nextcloud succesfull installed, nextcloud commands now available
else
[[ $? == 2 ]] && echo nextcloud not fully installed
fi
unset NEXTCLOUD_INSTALLING
fi
echo returning from install
return
fi
# env > /opt/netcloud/logs/temp.log
if ! installed; then
if ! [[ $cmd == "idle" || $cmd == "shell" ]]; then
if [[ ! $NEXTCLOUD_INSTALLING ]] && [[ ! $NEXTCLOUD_DEV ]]; then
echo "nextcloud not installed, Only shell, idle and install commands are available"
echo start a container with 'nextcloud idle'
echo then enter container via a shell and
echo "run 'nextcloud install' from a container terminal"
return 1 return 1
fi fi
fi fi
fi
cmd=$1
case "$cmd" in case "$cmd" in
idle) ;& idle) ;&
shell) ;& shell) ;&
install) ;&
installed) ;&
caddy) ;& caddy) ;&
db) ;& db) ;&
redis) ;& redis) ;&
@ -26,21 +52,46 @@ case "$cmd" in
reinstall) ;& reinstall) ;&
redis) ;& redis) ;&
start) ;& start) ;&
state) ;&
repair) ;&
restart) ;&
run) ;& run) ;&
suprld) ;& suprld) ;&
supctl) ;& supctl) ;&
supstart) ;& supstart) ;&
supstop) ;& supstop) ;&
config_update) ;&
app) ;& app) ;&
history) ;&
config) ;& config) ;&
occ) ;& occ) ;&
func) ;& func) ;&
version) ;& version) ;&
config) config) ;&
update) ;&
cron) ;&
ssh) ;&
log)
shift 1 shift 1
$cmd "$@" $cmd "$@"
;; ;;
boot)
if [ -t 1 ] ; then
echo can not run boot command from terminal, only at container startup
else
if nextcloud supctl pid &>> $NEXTCLOUD_LOGS_DIR/boot.log ; then
echo supervisor already running ignoring boot command >> $NEXTCLOUD_LOGS_DIR/boot.log
return 1
fi
echo nextcloud boot requested $(date) > $NEXTCLOUD_LOGS_DIR/boot.log
nextcloud ssh boot &>> $NEXTCLOUD_LOGS_DIR/boot.log &
{ sleep 10; echo pid: $$; ps -ea; nextcloud state; } &>> $NEXTCLOUD_LOGS_DIR/boot.log &
echo nextcloud booted > /tmp/ncbooted
BOOT=true exec /usr/bin/supervisord -n --loglevel warn -c $SUPERVISOR_CONF &>> $NEXTCLOUD_LOGS_DIR/boot.log
fi
;;
booted)
if [[ -f /tmp/ncbooted ]]; then echo nextcloud was booted; return 0; else return 1; fi
;;
*) *)
occ "$@" occ "$@"
;; ;;

View File

@ -1,28 +1,49 @@
:8080 { # https://caddy.community/t/caddy-v2-configuration-nextcloud-docker-php-fpm-with-rules-from-htaccess/20662
redir /.well-known/webfinger /index.php/.well-known/webfinger 301 http://{$NEXTCLOUD_DOMAIN}:8080 {
# redir /.well-known/webfinger /index.php/.well-known/webfinger 301
redir /.well-known/carddav /remote.php/dav 301 redir /.well-known/carddav /remote.php/dav 301
redir /.well-known/caldav /remote.php/dav 301 redir /.well-known/caldav /remote.php/dav 301
redir /.well-known/* /index.php{uri} 301 # Nextcloud front-controller handles routes to /.well-known
redir /remote/* /remote.php{uri} 301
header { header {
# enable HSTS Strict-Transport-Security "max-age=31536000; includeSubDomains"
Strict-Transport-Security max-age=31536000; Permissions-Policy interest-cohort=()
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
Referrer-Policy no-referrer
X-XSS-Protection "1; mode=block"
X-Permitted-Cross-Domain-Policies none
X-Robots-Tag "noindex, nofollow"
-X-Powered-By
} }
# .htaccess / data / config / ... shouldn't be accessible from outside # From .htaccess, deny access to sensible files and directories
@forbidden { @forbidden {
path /.htaccess path /build/* /tests/* /config/* /lib/* /3rdparty/* /templates/* /data/*
path /data/* path /.* /autotest* /occ* /issue* /indie* /db_* /console*
path /config/* not path /.well-known/*
path /db_structure
path /.xml
path /README
path /3rdparty/*
path /lib/*
path /templates/*
path /occ
path /console.php
} }
respond @forbidden 404 error @forbidden 404
# From .htaccess, set cache for versioned static files (cache-busting)
@immutable {
path *.css *.js *.mjs *.svg *.gif *.png *.jpg *.ico *.wasm *.tflite
query v=*
}
header @immutable Cache-Control "max-age=15778463, immutable"
# From .htaccess, set cache for normal static files
@static {
path *.css *.js *.mjs *.svg *.gif *.png *.jpg *.ico *.wasm *.tflite
not query v=*
}
header @static Cache-Control "max-age=15778463"
# From .htaccess, cache fonts for 1 week
@woff2 path *.woff2
header @woff2 Cache-Control "max-age=604800"
@collabora { @collabora {
path /browser/* # Browser is the client part of LibreOffice Online path /browser/* # Browser is the client part of LibreOffice Online
@ -50,3 +71,16 @@
} }
file_server file_server
} }
:8081 {
log {
output file {$NEXTCLOUD_LOGS_DIR}/phpmyadmin-caddy.log
}
root * /usr/share/webapps/phpmyadmin
php_fastcgi unix//run/nextcloud/fastcgi.sock {
root /usr/share/webapps/phpmyadmin
}
file_server
}

View File

@ -5,11 +5,20 @@ shell () {
} }
func () { func () {
local lib
[[ $1 == "-l" ]] && lib="source $LIB_DIR/$2.lib" && shift 2
local func=$1 local func=$1
shift 1 shift 1
$lib
if declare -F "$func" > /dev/null; then
$func $@ $func $@
else
no function $func
return 1
fi
} }
# execute whatever is passed at the nextcloud linux user
run() { run() {
if [ "$(id -u)" = 0 ]; then if [ "$(id -u)" = 0 ]; then
sudo -u "${NEXTCLOUD_USER:-nextcloud}" bash -c "source /opt/core_run.env; $*" sudo -u "${NEXTCLOUD_USER:-nextcloud}" bash -c "source /opt/core_run.env; $*"
@ -21,73 +30,64 @@ idle () {
sleep infinity sleep infinity
} }
config_update() { start () {
echo config.php update
backup=$NEXTCLOUD_CONFIG_DIR/config.$(date +%F-%H-%M-%S).php if nextcloud supstart > /dev/null; then
echo making copy of config.php to $backup
/bin/cp $NEXTCLOUD_CONFIG_FILE $backup if [[ $1 ]]; then
echo "merging additional configurations into config.php now" if [[ $1 == "status" ]]; then nextcloud state; return; fi
ls -la $NEXTCLOUD_CONFIG_DIR/*.config.php
[[ $NEXTCLOUD_DEV ]] && mv -f $NEXTCLOUD_CONFIG_DIR/config.org.php $NEXTCLOUD_CONFIG_FILE && echo dev mode original config.php used if nextcloud supctl start nextcloud:$1 > /dev/null; then
# echo current settings sleep 3
# if [[ $1 ]]; then grep -A6 $1 $NEXTCLOUD_CONFIG_FILE; else cat $NEXTCLOUD_CONFIG_FILE; fi if ! nextcloud state $1 > /dev/null; then return 1; fi
nextcloud occ config:system:delete configs_merged &>/dev/null return
nextcloud occ config:system:set --value true update_config &>/dev/null
nextcloud occ config:system:delete update_config &>/dev/null
if nextcloud occ config:system:get configs_merged &>/dev/null; then
echo configuration files merged successfully
echo "***************************"
if [[ $1 ]]; then grep -A6 $1 $NEXTCLOUD_CONFIG_FILE; else cat $NEXTCLOUD_CONFIG_FILE; fi
echo "***************************"
else else
echo failed to merge configuration files echo unable to start process $1
return 1 return 1
fi fi
fi
if nextcloud state &> /dev/null; then
echo nextcloud already started and available at $NEXTCLOUD_DOMAIN
return 0
fi
nextcloud supctl start nextcloud:
sleep 5
if ! nextcloud state >/dev/null ; then nextcloud state; echo FATAL: could not bring nextcloud online; nextcloud stop; return 1; fi
if ! nextcloud db > /dev/null; then echo WARNING: could not reach database $NEXTCLOUD_DB; fi
# if ! nextcloud config update; then nextcloud stop; return 1; fi
echo nextcloud should be online at $NEXTCLOUD_DOMAIN
else
echo "unable to start supervisor, so can't start nextcloud"
fi
} }
start () { stop () {
if nextcloud installed; then if nextcloud state >/dev/null; then nextcloud supctl stop nextcloud:"$*"; fi
if nextcloud supstart; then }
if nextcloud db start; then
sleep 5 restart () {
if nextcloud db online nextcloud; then if nextcloud stop "$@"; then
nextcloud supctl start caddy sleep 4
nextcloud redis start nextcloud start "$@"
nextcloud supctl start php-fpm
sleep 5
if nextcloud supctl status mysql caddy redis php-fpm; then
nextcloud config_update
echo nextcloud services are all online
ps -ea
echo "------------------------"
echo Success! Nextcloud is online
[[ $NEXTCLOUD_DOMAIN ]] && echo at $NEXTCLOUD_DOMAIN
echo "------------------------"
else
echo FATAL! unable to bring nextcloud online
nextcloud stop
fi fi
}
state () {
if [[ $1 ]]; then
nextcloud supctl status nextcloud:$1
return $?
fi
if nextcloud supctl status nextcloud: ; then
echo all nextcloud processes active
echo nextcloud should be available at $NEXTCLOUD_DOMAIN
return 0
else else
echo unable to access the nextcloud database: ${MYSQL_DATABASE:-nextcloud} echo "!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo FATAL! can not start nextcloud echo WARNING: one are more required processes are dead!
nextcloud db stop
return 1 return 1
fi fi
else
echo unable to start mysql server
echo FATAL! can not start nextcloud
return 1
fi
else
echo "unable to start supervisor, can't start nextcloud"
fi
else
if [[ ! $NEXTCLOUD_DEV ]]; then
echo unable to start nextcloud because it is not installed
echo installing now...
nextcloud install
fi
fi
} }
@ -100,12 +100,12 @@ suprld () {
} }
supstart () { supstart () {
if ! supctl pid > /dev/null ; then if supctl pid > /dev/null ; then
echo supervisord was not running, starting now
[[ $1 == -n ]] && echo running in foreground || echo running as daemon
BOOT=${BOOT:-false} /usr/bin/supervisord -c $SUPERVISOR_CONF $@
else
echo supervisor already running echo supervisor already running
else
BOOT=false AUTORESTART=false /usr/bin/supervisord --loglevel warn -c $SUPERVISOR_CONF $@
sleep 4
if ! supctl pid > /dev/null ; then echo WARNING: supervisord did start; return 1; fi
fi fi
} }
@ -113,79 +113,57 @@ supstop () {
if supctl pid > /dev/null ; then if supctl pid > /dev/null ; then
echo killing supervisord at $(cat $SUPERVISOR_HOME/supervisor.pid) echo killing supervisord at $(cat $SUPERVISOR_HOME/supervisor.pid)
kill -s SIGTERM $(cat $SUPERVISOR_HOME/supervisor.pid) kill -s SIGTERM $(cat $SUPERVISOR_HOME/supervisor.pid)
sleep 2 sleep 4
ps -ea if supctl pid > /dev/null ; then echo WARNING: supervisord did not stop; return 1; fi
else else
echo supervisord was not running so not stopping echo supervisord was not running so not stopping
fi fi
} }
stop () {
nextcloud supctl stop "${@:-all}"
}
occ () { occ () {
local _occ=$NEXTCLOUD_SRC_DIR/occ local _occ=$NEXTCLOUD_SRC_DIR/occ
[[ ! -f $_occ ]] && echo "FATAL! no occ command found in $NEXTCLOUD_SRC_DIR" && return 1 [[ ! -f $_occ ]] && echo "FATAL! no occ command found in $NEXTCLOUD_SRC_DIR" && return 1
sudo -u nextcloud -E php $_occ "$@" sudo -u $NEXTCLOUD_USER -E php $_occ "$@"
}
config () {
nextcloud occ config:list --private | grep -A5 -B5 $1
}
install () {
if [[ ! -f $NEXTCLOUD_SRC_DIR/installed || $NEXTCLOUD_DEV ]]; then
if nextcloud supstart > /dev/null; then
echo installing nextcloud with args: $@
. $LIB_DIR/install/install.sh "$@"
else
echo unable to run supervisord, thus unable to install nextcloud
fi
else
echo nextcloud already installed
fi
} }
upgrade () { upgrade () {
if [[ -f $NEXTCLOUD_SRC_DIR/installed ]]; then if nextcloud booted; then echo can not do an upgrade on booted container, stop container and start with idle; return 1; fi
local cur=$(version) if ! nextcloud state > /dev/null; then
local src=$(version source) echo to upgrade nextcloud must be online, starting now
echo checking for upgrade from $cur to $src if ! nextcloud start; then echo could not bring nextcloud online so can not upgrade; return 1; fi
if upgradable $src $cur; then fi
echo upgradable, beginning upgrade process . $LIB_DIR/upgrade.lib "$@"
NEXTCLOUD_UPGRADING=true
if ! upgrade_prepare; then echo upgrade prepare failed, aborting upgrade; return 1; fi
if upgrade_run; then
echo upgrade success
echo now running $(version)
else else
echo not upgradable echo TODO: run 'nextcloud upgrade rollback'
if [[ "$cur" == "$src" ]]; then
echo same versions nothing to upgrade
echo to upgrade pull/build an updated docker image
fi fi
fi unset NEXTCLOUD_UPGRADING
else
echo "nextcloud not installed, can not upgrade"
fi
} }
# todo guard with YES
reinstall () { # enable rollback
repair () {
if [[ $(installed) ]]; then # TODO mm
if [[ $1 == 'yes' ]]; then if nextcloud db backup $1; then
echo nextcloud install force if nextcloud db migration >/dev/null; then
if occ maintenance:repair --include-expensive &>/dev/null; then
echo repair successfull
else else
echo reinstall requested. echo db maintenance repair failed
echo because reinstall will potentially trash your current install return 2
echo "you need to make sure you have backups of the app (source), the database, and user-files"
echo " and then issue the command 'nextcloud reinstall yes"
fi fi
else else
echo nextcloud not installed so reinstall will now do install echo db migration failed, aborting repar
install return 2
fi fi
else
echo unable to backup database so will not run repair
fi
} }
app () { app () {
@ -196,6 +174,14 @@ case "$1" in
shift 1 shift 1
acmd=remove acmd=remove
;; ;;
disable)
shift 1
acmd=disable
;;
enable)
shift 1
acmd=enable
;;
install) install)
shift 1 shift 1
;& ;&
@ -236,4 +222,168 @@ esac
fi fi
} }
# TODO use jq/yq to parse logs
log () {
local sub=$1
case $sub in
clear)
if [[ $2 == "all" ]]; then
truncate -s 0 $NEXTCLOUD_LOGS_DIR/*.log
else
truncate -s 0 $NEXTCLOUD_LOGS_DIR/nextcloud.log
fi
;;
*)
if [[ $1 ]]; then
cat $NEXTCLOUD_LOGS_DIR/nextcloud.log | yq -p=json | grep $1
else
cat $NEXTCLOUD_LOGS_DIR/nextcloud.log | yq -p=json
fi
;;
esac
}
config () {
local sub=$1
shift 1
if ! nextcloud start > /dev/null; then echo for config nextcloud must be started; fi
case $sub in
list)
if [[ $1 ]]; then
nextcloud config:list --private system | grep $1
else
nextcloud config:list --private system
fi
;;
raw)
if [[ $1 ]]; then
cat $NEXTCLOUD_CONFIG_FILE | grep $1
else
cat $NEXTCLOUD_CONFIG_FILE
fi
;;
get)
if ! nextcloud config:system:get $1; then
return 1
fi
;;
del)
nextcloud config:system:delete $1
;;
array)
shift 1
config_add_array "$@"
echo $(nextcloud occ config:system:get $1)
;;
set)
if ! nextcloud occ config:system:set "$1" --type=${3:-string} --value="$2" ; then
return 1
fi
;;
backup)
backup=$NEXTCLOUD_CONFIG_DIR/config.$(version)-$(date '+%Y%m%d%H%M%S').php
echo making copy of config.php to $backup
/bin/cp $NEXTCLOUD_CONFIG_FILE $backup
;;
update)
echo updating $NEXTCLOUD_CONFIG_FILE by merging these files
(cd $NEXTCLOUD_CONFIG_DIR && ls *.config.php)
nextcloud config backup
nextcloud occ config:system:delete configs_merged &>/dev/null
nextcloud occ config:system:set --value true update_config &>/dev/null
nextcloud occ config:system:delete update_config &>/dev/null
if nextcloud occ config:system:get configs_merged &>/dev/null; then
echo configuration files merged successfully
else
echo failed to merge configuration files
return 1
fi
;;
*)
sub=$1
nextcloud occ config:$sub "$@"
;;
esac
}
cron () {
echo running cron.php
sudo -u nextcloud php -f $NEXTCLOUD_SRC_DIR/cron.php &
}
## guard with confirm
update () {
# TODO mmode
if nextcloud booted; then echo can not do an update on booted container, stop container and start with idle; return 1; fi
nextcloud func mmode on
echo updating any changes to the containers base nextcloud directory
echo first stopping nextcloud
if ! nextcloud stop > /dev/null; then echo ERROR: could not take nextcloud offline; return 1; fi
echo syncing /opt/nextcloud-container to $NEXTCLOUD_HOME
chown -R $NEXTCLOUD_USER:$NEXTCLOUD_USER /opt/nextcloud-container/
rsync -a /opt/nextcloud-container/ $NEXTCLOUD_HOME
echo updating database server configuration
nextcloud db config update
echo updating redis server configuration
nextcloud redis update
sleep 3
echo starting nextcloud
if ! nextcloud restart ; then nextcloud state; echo ERROR: could not bring nextcloud online; return 1; fi
echo "--------------------"
if ! nextcloud config update; then echo WARNING: issue updating the config.php; fi
echo "done with nextcloud update"
nextcloud func mmode off
}
history () {
local sub=$1
local id
shift 1
id=${1:-$(date '+%Y%m%d%H%M%S')}
case $sub in
upgrade)
if [[ $NEXTCLOUD_UPGRADING ]]; then
cat << EOF >> $NEXTCLOUD_HOME/version-history
- id: $id
date: $(date)
type: upgrade
version: $(version)
previous-version: $(cat $NEXTCLOUD_HOME/previous-version)
$(while read; do echo " $REPLY"; done </container-build)
EOF
else
echo Warning: not currently upgrading so can not update history
return 1
fi
;;
install)
if [[ $NEXTCLOUD_INSTALLING ]]; then
cat << EOF > $NEXTCLOUD_HOME/version-history
history:
- id: $id
date: $(date)
type: install
version: $(version)
database:
name: ${NEXTCLOUD_DB:-nextcloud}
server: ${DB_TYPE:-mysql}
user: ${NEXTCLOUD_DB_USER:-nextcloud}
password: ${NEXTCLOUD_DB_PASSWORD:-nextcloud}
admin: ${NEXTCLOUD_ADMIN_USER:-admin}
$(while read; do echo " $REPLY"; done </container-build)
EOF
else
echo Warning: not currently installing so can not create history
return 1
fi
;;
*)
if [[ $1 ]]; then
echo TODO: filter for for key $1 using yq
# yq '.history | map(select(.type == "install")) | .[] | .database:server' < $NEXTCLOUD_HOME/version-history
else
cat -T $NEXTCLOUD_HOME/version-history
fi
esac
}

View File

@ -0,0 +1,51 @@
#!/bin/bash
# ======================================================================
#
# flags: -s, use strong confirmation, only yes or YES or Yes is accepted
#
# Parameters:
# $@ - The confirmation message
#
# Examples:
# > # Example 1
# > # The preferred way to use confirm
# > confirm Delete file1? && echo rm file1
# > or
# > [[ confirm Delete file1 ]]; then
# > rm file1
# > fi
# >
# > # Example 2
# > # Use the $? variable to examine confirm's return value
# > confirm Delete file2?
# > if [ $? -eq 0 ]
# > then
# > echo Another file deleted
# > fi
# >
# > # Example 3
# > # Tell bash to exit right away if any command returns a non-zero code
# > set -o errexit
# > confirm Do you want to run the rest of the script?
# > echo Here is the rest of the script
#
# ======================================================================
function confirm()
{
local res="y Y yes YES Yes Sure sure SURE OK ok Ok"
local strong="yes YES Yes"
[[ $1 = "-s" ]] && { res=$strong; strong=true shift; } || strong=""
echo -n "$@" "$([[ $strong ]] && echo \< $res \>) ? "
read -e answer
for response in $res
do
if [ "_$answer" == "_$response" ]
then
return 0
fi
done
# Any answer other than the list above is considered a "no" answer
return 1
}

View File

@ -1,123 +1,133 @@
#!/bin/bash #!/bin/bash
source "$LIB_DIR/${DB_TYPE:-mysql}.lib"
db () { db () {
case "$1" in case "$1" in
init) version)
source $LIB_DIR/install/mysql.lib nextcloud db cmd "SHOW VARIABLES LIKE 'version';" | tail -n1 | cut -f2 | cut -f1 -d-
echo "Intialzing MySQL server" ;;
if mysql_init; then config)
echo mysql server successfully intialized shift
else case "$1" in
echo FATAL: mysql initialization failed section)
return 1 sed -nr "/^\["$2"\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }" $DB_CONF
;;
edit)
cp $DB_HOME/${DB_TYPE:-mysql}.conf.tmpl $DB_HOME/${DB_TYPE:-mysql}.conf.tmpl.sav
nano $DB_HOME/${DB_TYPE:-mysql}.conf.tmpl
echo run \'nextcloud db config update\'
echo backup copy saved to ${DB_TYPE:-mysql}.conf.tmpl.sav
;;
update)
nextcloud func process_template $DB_CONF
;;
*)
[[ ! -f $DB_CONF ]] && db update
[[ $1 ]] && cat $DB_CONF | grep $1 || cat $DB_CONF;
esac
;;
repair)
nextcloud repair $2
;;
migration)
nextcloud db:add-missing-columns
nextcloud db:add-missing-indices
nextcloud db:add-missing-primary-keys
;;
backup)
local target
shift
id=${1:-$(date '+%Y%m%d%H%M%S')}
target=$NEXTCLOUD_HOME/db-$(version)-$id
echo stopping database
if ! nextcloud db stop > /dev/null; then echo unable to shut down db server before backup, aborting; return 1; fi
echo backing up $DB_HOME to $target
sleep 3
if ! rsync -a --info=progress2 $DB_HOME/ $target; then
echo ERROR rsync error, copying failed
rm -rf $target
return 2
fi fi
if [[ ! -d $target/$NEXTCLOUD_DB ]]; then
echo ERROR database backup to $target was not succesful!
rm -rf $target
return 2
fi
echo created backup: "$target"
if ! nextcloud db start; then echo WARNING: mysql server not back online after backup; return 1; fi
sleep 3
if ! nextcloud db; then echo WARNING: could not access $NEXTCLOUD_DB after backup; fi
;; ;;
start) start)
nextcloud supstart nextcloud start db
if nextcloud supctl status mysql 1> /dev/null; then
echo MySQL service already online
else
nextcloud supctl start mysql 1>/dev/null;
sleep 4
if nextcloud supctl status mysql 1>/dev/null; then
echo mysql service online
else
echo ERROR: unable to start mysql service
return 1
fi
fi
;; ;;
restart) restart)
nextcloud supctl restart mysql nextcloud stop db
nextcloud start db
;;
upgrade )
cver=$(yq '.history | map(select(.type == "install")) | .[] | .container.mysql' < $NEXTCLOUD_HOME/version-history)
ver=$(nextcloud db version)
ver=10.10.8
echo -e "$cver\n$ver" | sort -V
if [[ "$cver" == "$(echo -e "$cver\n$ver" | sort -V | head -n1)" ]]; then
echo $ver and $cver are the same, nothing to upgrade
else
echo the installed version $ver is older than the container version $cver
echo doing database upgrade
if ! nextcloud db backup $ver; then echo could not backup database so will not upgrade; return 1; fi
mysql_upgrade $DB_SERVER_OPTS --force -u root
fi
;; ;;
stop) stop)
if nextcloud supctl status mysql; then echo stopping db server
nextcloud supctl stop mysql; nextcloud stop db
else sleep 3
echo msyql server was not running, nothing to stop if nextcloud state db > /dev/null; then return 1; fi
return 0
fi
;; ;;
mkncdb) cmd)
source $LIB_DIR/install/mysql.lib shift
mysql_create_nextcloud_db [[ $1 == "root" ]] && set -- "-r" "${@:2}"
db_cli "$@"
;; ;;
online) remote)
shift 1 echo when functional this will
case "$1" in echo set up a remote user
core) echo with access to the database
;& # if [[ $DB_REMOTE_PASSWORD ]]; then
nextcloud) # echo creating remote user for remote access ${DB_REMOTE_PASSWORD}
if [[ $1 == "core" ]]; then # $DB_CLIENT_BIN -uroot << EOF
dcmd="$DB_CLIENT_BIN $DB_SERVER_OPTS -uroot mysql" # CREATE USER '${DB_REMOTE_USER:-remote}'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD';
else # GRANT ALL PRIVILEGES on *.* to 'remote'@'localhost';
dcmd="nextcloud run $DB_CLIENT_BIN $DB_SERVER_OPTS $MYSQL_DATABASE" # FLUSH privileges;
fi # EOF
echo checking status of database $MYSQL_DATABASE
if nextcloud db online 1> /dev/null ; then
# echo DEBUG: command to run $dcmd
if timeout 10s bash -c "source /opt/bin/nextcloud; _db_online $dcmd" ; then
echo database $1 is online
return 0
else
echo database $1 is offline
return 1
fi
else
echo database server is not online so can not check status of database $1
fi
;; ;;
*) *)
echo checking to see if db server is online if nextcloud db cmd "select 1" &>/dev/null; then
if nextcloud supctl status mysql >/dev/null ; then echo nextcloud database online
echo mysql server daemon is running
return 0
else else
echo mysql server daemon is offline echo nextcloud database offline
sleep 1
return 1 return 1
fi fi
esac esac
;;
root)
if db online mysql; then
shift 1
# -e \"$*\"
cmd="$DB_CLIENT_BIN $DB_SERVER_OPTS -uroot mysql"
if [[ $* ]]; then
echo $*
query="$*"
echo $query
$cmd <<< $query
else
$cmd
fi
else
echo mysql server is offline or no root mysql database has been created
fi
;;
*)
cmd="nextcloud run $DB_CLIENT_BIN $DB_SERVER_OPTS $MYSQL_DATABASE"
echo $cmd
[[ $* ]] && $cmd <<< "$*" || $cmd
esac
} }
_db_online () {
# echo $@
if $@ <<< "select 1" >/dev/null 2>&1 ; then
return 0 # _db_online () {
else # # echo $@
sleep 1 # if $@ <<< "select 1" >/dev/null 2>&1 ; then
# echo trying to connect to database # return 0
_db_online $@ # else
return 1 # sleep 1
fi # # echo trying to connect to database
} # _db_online $@
# return 1
# fi
# }

View File

@ -6,66 +6,44 @@ directory_empty() {
[ -z "$(ls -A "$1/")" ] [ -z "$(ls -A "$1/")" ]
} }
# usage: file_env VAR [DEFAULT] installed () {
# ie: file_env 'XYZ_DB_PASSWORD' 'example' # TODO return version from version history
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of [[ -f $NEXTCLOUD_HOME/version-history ]] || return 1
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) }
# file_env() {
# local var="$1" version_directories () {
# local fileVar="${var}_FILE"
# local def="${2:-}" /usr/bin/find "$NEXTCLOUD_RELEASES_DIR" -type d -maxdepth 1 -mindepth 1 -exec basename {} \; \
# local varValue=$(env | grep -E "^${var}=" | sed -E -e "s/^${var}=//") | cut -f1 -d'/' \
# local fileVarValue=$(env | grep -E "^${fileVar}=" | sed -E -e "s/^${fileVar}=//") | sort -Vr \
# if [ -n "${varValue}" ] && [ -n "${fileVarValue}" ]; then | if [[ $1 == "latest" ]]; then head -n 1; shift; else cat; fi \
# echo >&2 "error: both $var and $fileVar are set (but are exclusive)" | if [[ $1 && ! $1 == "latest" ]]; then grep -w ^$1; else cat; fi
# exit 1
# fi }
# if [ -n "${varValue}" ]; then
# export "$var"="${varValue}"
# elif [ -n "${fileVarValue}" ]; then
# export "$var"="$(cat "${fileVarValue}")"
# elif [ -n "${def}" ]; then
# export "$var"="$def"
# fi
# unset "$fileVar"
# }
version () { version () {
local ver local ver
if [[ $1 == "image" ]]; then local key='$OC_VersionString'
ver=$(php -d display_errors="0" -r 'require "'$NEXTCLOUD_INSTALL_FROM_DIR'/version.php"; echo implode(".",$OC_Version);' 2>/dev/null) local dir=$NEXTCLOUD_SRC_DIR
[[ $1 == "-f" ]] && key='implode(".",$OC_Version)' && shift
if [[ $1 == "release" ]]; then
if [[ $2 ]]; then
dir=$NEXTCLOUD_RELEASES_DIR/$2
shift
else
dir=$NEXTCLOUD_RELEASES_DIR/$(version_directories latest)
fi
shift
fi
[[ $1 ]] && dir=$1
ver=$(php -d display_errors="0" -r 'require "'$dir'/version.php"; echo '$key';' 2>/dev/null)
if [[ ! $ver ]]; then if [[ ! $ver ]]; then
echo "SUPER FATAL ERROR NO NEXTCLOUD ALPINE IMAGE SOURCE FOUND AT $NEXTCLOUD_INSTALL_FROM_DIR"
return 1 return 1
else else
echo $ver echo $ver
fi fi
else
ver=$(php -d display_errors="0" -r 'require "'$NEXTCLOUD_SRC_DIR'/version.php"; echo implode(".",$OC_Version);' 2>/dev/null)
if [[ ! $ver ]]; then
unset NEXTCLOUD_INSTALLED
return 1
else
echo $ver
fi
fi
} }
installed () {
if [[ -f $NEXTCLOUD_HOME/installed ]]; then
echo $(cat $NEXTCLOUD_HOME/installed)
return 0
else
# echo "WARNING: nextcloud not installed, run 'nextcloud install'"
return 1
fi
}
upgradable () {
# printf '%s\n' $1 $2 | sort -t '.' -n -k1,1 -k2,2 -k3,3 -k4,4
# | head -n 1
[ "$(printf '%s\n' $1 $2 | sort -t '.' -n -k1,1 -k2,2 -k3,3 -k4,4 | head -n 1)" != "$1" ]
}
process_template () { process_template () {
@ -77,8 +55,6 @@ fi
} }
# TODO PHP
list_php_settings () { list_php_settings () {
cat $PHP_INI_DIR/$1 | grep -v '^;' | grep -v '^$' cat $PHP_INI_DIR/$1 | grep -v '^;' | grep -v '^$'
} }
@ -89,6 +65,8 @@ php -m
} }
edit_phpfpm_config () { edit_phpfpm_config () {
echo warning: editing these settings will not survive a container restart
echo and should only be done in troubleshooting
nano /etc/php$PHP_VERSION/php-fpm.d/nextcloud.conf nano /etc/php$PHP_VERSION/php-fpm.d/nextcloud.conf
} }
@ -105,7 +83,6 @@ config_array() {
done done
} }
config_add_array() { config_add_array() {
local idx=0 local idx=0
local item local item
@ -119,45 +96,28 @@ config_add_array() {
done done
} }
config () { # maintenance mode
local sub=$1 mmode () {
shift 1 local state
case $sub in local op
list) state=$([[ $(nextcloud status | grep maintenance | cut -f2 -d: | xargs echo -n) == "true" ]] && echo on || echo off)
nextcloud config:list --private system if [[ $1 == "enabled" ]]; then
;; [[ $state == "off" ]] && return 1
get) return 0
if ! nextcloud config:system:get $1; then
return 1
fi fi
;; if [[ $1 ]]; then
del) [[ $1 == "on" ]] && op="--on"
nextcloud config:system:delete $1 [[ $1 == "off" ]] && op="--off"
;; else
array) echo toggling current state $state
shift 1 [[ $state == "on" ]] && op="--off" || op="--on"
config_add_array "$@" fi
echo $(nextcloud occ config:system:get $1) if [[ $op == --$state ]]; then
;; echo maintenance mode already $state
set) else
if ! nextcloud occ config:system:set $1 --value=$2 ; then echo changing $(nextcloud maintenance:mode $op)
return 1 state=$([[ $(nextcloud status | grep maintenance | cut -f2 -d: | xargs echo -n) == "true" ]] && echo on || echo off)
echo maintenance mode now $state
fi fi
;;
*)
sub=$1
nextcloud occ config:$sub "$@"
;;
esac
} }
docker_latest_image() {
image=$1
major=${2:-1}
tokenUri="https://auth.docker.io/token"
data=("service=registry.docker.io" "scope=repository:$image:pull")
token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
listUri="https://registry-1.docker.io/v2/$image/tags/list"
curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri \
| jq --raw-output ".tags[] | select(. | startswith(\"$major.\"))" | sort -V | sed -n \$p
}

View File

@ -2,3 +2,4 @@
/apps/ /apps/
/themes/ /themes/
/apps-appstore/ /apps-appstore/
/updater/

View File

@ -0,0 +1,318 @@
#!/bin/bash
source $LIB_DIR/release.lib
source $LIB_DIR/confirm.func
source $BIN_DIR/nextcloud
declare -A steps=(["0"]="0: no install steps completed" ["1"]="1: download a release" ["2"]="2: create database" ["3"]="3: copy release source" ["4"]="4: initialize nextcloud" ["5"]="5: update config, save install info")
step () {
local s
local save
# local desc
# [[ $1 = "-n" ]] && desc=true && shift
save="$NEXTCLOUD_HOME/install-step"
[[ ! -f $save ]] && echo "0" > $save
s=$(cat $save)
if [[ $1 == "reset" ]]; then
echo 0 > $save
return
fi
if [[ $1 == "cur" ]]; then
echo ${steps[$(($s + 1))]}
return
fi
if [[ $1 == "get" ]]; then
echo $s
return
fi
if [[ $1 == "set" ]]; then
s=$2
echo $s > $save
return
fi
if [[ $1 == "done" || $1 == "next" ]]; then
((s++))
echo $s > $save
return
fi
if [[ $1 ]]; then
# echo $1, $s
[[ $1 -eq $s ]] || return 1
else
echo ${steps["$s"]}
fi
}
install_scrub () {
if [[ $1 == "yes" ]]; then
[[ -f $SUPERVISOR_HOME/supervisor.pid ]] && kill -s SIGTERM $(cat $SUPERVISOR_HOME/supervisor.pid)
sleep 3
/bin/rm -rf $NEXTCLOUD_HOME/*
/bin/rm -rf $NEXTCLOUD_DATA_DIR/*
rsync -r /opt/nextcloud-container/ $NEXTCLOUD_HOME
step reset
else
echo scrubbing an install is super dangerous, you must use 'install_scrub yes' in order to actually scrub the install
fi
}
install_release () {
echo step: ${steps["1"]}
local rel
NEXTCLOUD_INSTALL_VERSION=${1:-$NEXTCLOUD_INSTALL_VERSION}
rel=$NEXTCLOUD_INSTALL_VERSION
if [[ $rel ]]; then
[[ ! $rel == *.* ]] && echo latest version of $rel will be installed && rel="latest $rel"
else
rel=latest
echo latest nextcloud release will be installed
fi
if NEXTCLOUD_INSTALL_VERSION=$(nextcloud_releases $rel); then
if confirm -s nextcloud version $NEXTCLOUD_INSTALL_VERSION will be installed; then
echo $NEXTCLOUD_INSTALL_VERSION > $NEXTCLOUD_HOME/install-version
if version release $NEXTCLOUD_INSTALL_VERSION > /dev/null ; then
echo $NEXTCLOUD_INSTALL_VERSION already downloaded
echo step: ${steps["1"]}, completed
step next
else
echo downloading $NEXTCLOUD_INSTALL_VERSION now
if nextcloud_pull $NEXTCLOUD_INSTALL_VERSION; then
echo step: ${steps["1"]}, completed
step next
else
return 1
fi
fi
else
return 1
fi
else
echo unable to determine a vaild install version, aborting install
rm -f $NEXTCLOUD_HOME/install-version
return 1
fi
}
install_database () {
echo step: ${steps["2"]}
# make sure any db server is off
# rm -rf $DB_HOME/*
# cp -f /opt/nextcloud-container/db/mysql.conf.tmpl $DB_HOME
if ! nextcloud db config update; then echo unable to create server config file from template; return 1; fi
if ! nextcloud db stop &> /dev/null; then echo unable to stop database service so can not initialize; return 1; fi
if ! db_init; then
echo ${DB_TYPE:-mysql} server initialization failed
echo scrubbing any created files in $DB_HOME
rm -rf $DB_HOME/*
cp -f /opt/nextcloud-container/db/${DB_TYPE:-mysql}.conf.tmpl $DB_HOME
return 1
fi
echo ${DB_TYPE:-mysql} server successfully initialized
if ! nextcloud start db; then echo unable to start database server so can not finish install; return 1; fi
local cmd
cmd="CREATE DATABASE IF NOT EXISTS ${NEXTCLOUD_DB:-nextcloud} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
echo creating nextcloud database: ${NEXTCLOUD_DB:-nextcloud}
# echo $cmd
if ! nextcloud db cmd root "$cmd"; then
echo could not create nextcloud databas ${NEXTCLOUD_DB:-nextcloud}
return 1;
fi
cmd="ALTER USER ${NEXTCLOUD_DB_USER:-nextcloud}@localhost IDENTIFIED BY '${NEXTCLOUD_DB_PASSWORD:-nextcloud}'"
# echo $cmd
if ! nextcloud db cmd root "$cmd"; then
echo could not set a password for nextcloud db user: ${NEXTCLOUD_DB_USER:-nextcloud};
return 1;
fi
if ! nextcloud db; then return 1; fi
echo step: ${steps["2"]}, completed
step next
}
install_source () {
echo step: ${steps["3"]}
local SRC
if ! SRC=$NEXTCLOUD_RELEASES_DIR/$(version release $NEXTCLOUD_INSTALL_VERSION); then
echo no version $NEXTCLOUD_INSTALL_VERSION to install, rerun \'nextcloud install\'
unset NEXTCLOUD_INSTALL
return 1
fi
echo copying nextcloud source at $SRC to the install directory $NEXTCLOUD_SRC_DIR
if ! confirm -s continue; then return 3; fi
# rm -rf $NEXTCLOUD_SRC_DIR/*
if ! rsync -rlD --info=progress2 --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER --exclude-from=$LIB_DIR/install.exclude $SRC/ $NEXTCLOUD_SRC_DIR/; then
return 1; fi
echo copying nextcloud apps at $SRC/apps to the apps directory $NEXTCLOUD_APPS_DIR
if ! rsync -rlD --info=progress2 --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER $SRC/apps/ $NEXTCLOUD_APPS_DIR/; then
return 1; fi
echo copying nextcloud themes at $SRC/themes to themes directory $NEXTCLOUD_THEMES_DIR
if ! rsync -rlD --info=progress2 --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER $SRC/themes/ $NEXTCLOUD_THEMES_DIR/; then
return 1; fi
rm -rf $NEXTCLOUD_SRC_DIR/config
ln -sf $NEXTCLOUD_APPS_DIR $NEXTCLOUD_SRC_DIR/apps
ln -sf $NEXTCLOUD_THEMES_DIR $NEXTCLOUD_SRC_DIR/themes
ln -sf $NEXTCLOUD_CONFIG_DIR $NEXTCLOUD_SRC_DIR/config
if [[ $NEXTCLOUD_INSTALL_VERSION == $(version) ]]; then
echo source copied succesfully
echo step: ${steps["3"]}, completed
step next
else
echo can not confirm copied version $NEXTCLOUD_INSTALL_VERSION:$(version), copy failed
return 2
fi
}
install_nextcloud () {
echo step: ${steps["4"]}
local options
if ! nextcloud db start; then echo the nextcloud database: ${NEXTCLOUD_DB:-nextcloud} not online, can not run maintenance:install; return 1; fi
options="--admin-user ${NEXTCLOUD_ADMIN_USER:-admin} --admin-pass ${NEXTCLOUD_ADMIN_PASSWORD:-admin} --admin-email ${NEXTCLOUD_ADMIN_EMAIL:-xxx@gmail.com} "
options+=" --data-dir ${NEXTCLOUD_DATA_DIR}"
options+=" --database ${DB_TYPE:-mysql} --database-name ${NEXTCLOUD_DB:-nextcloud} --database-user ${NEXTCLOUD_DB_USER:-nextcloud} --database-pass ${NEXTCLOUD_DB_PASSWORD:-nextcloud} --database-host localhost:/run/nextcloud/db.sock"
echo getting ready to start the nextcloud system initialization
echo the maintenance:install options are
echo $options
if ! confirm -s confirm correct options; then echo aborting install; return 1; fi
echo initializing nextcloud via maintence:install...please wait
cmd=" sudo -u $NEXTCLOUD_USER -E $(which php) $NEXTCLOUD_SRC_DIR/occ maintenance:install $options"
if $cmd; then
echo maintenance:install succeeded! nextcloud is installed
echo step: ${steps["4"]}, completed
step next
else
return 1
fi
}
install_finish () {
echo step: ${steps["5"]}
echo "**** NOTE: default administrator login is user:${NEXTCLOUD_ADMIN_USER:-admin} password: ${NEXTCLOUD_ADMIN_PASSWORD:-admin} ***"
# make initial copy of config.php
/bin/cp $NEXTCLOUD_CONFIG_FILE $NEXTCLOUD_CONFIG_DIR/config.init.php
if ! nextcloud redis update; then
echo unable to initialize redis
return 1
fi
if ! nextcloud start; then
echo FATAL: unable to bring nextcloud up even though all the install steps completed
echo see readme file for troubleshooting
return 1
fi
echo running a repair after install
if ! nextcloud repair >/dev/null; then echo WARN: could not complete a nextcloud repair; return 1; fi
echo
echo any nextcloud issues repaired
echo this assumes you have a reverse proxy set up to the docker mapped host port you set
echo "otherwise try http://localhost:<host port>"
echo see readme file for information on completing the production deployment
echo saving install history to $NEXTCLOUD_HOME/version-history
echo "--------------------------------------"
nextcloud history install
nextcloud history
echo "--------------------------------------"
echo step: ${steps["5"]}, completed
step next
return 0
}
nextcloud_install () {
## TODO look at key in version-history
if [[ $1 == "--force" ]]; then
shift
echo Danger, you have requesed a force install
echo absolutely everything will be scrubbed! including all users and their data
echo this is really suitable only in development
if ! confirm -s "continue"; then return 1; fi
install_scrub yes
else
if installed; then
echo nextcloud is already installed
echo use --force if you want to scrub and reinstall
return 1
fi
fi
if nextcloud supstart > /dev/null; then
if [[ $(step get) -gt 0 ]]; then
NEXTCLOUD_INSTALL_VERSION=${NEXTCLOUD_INSTALL_VERSION:-$(cat $NEXTCLOUD_HOME/install-version)}
if [[ $NEXTCLOUD_INSTALL_VERSION ]]; then
echo install was not finished, continuing to install $NEXTCLOUD_INSTALL_VERSION at step $(step cur)
else
echo unable to determine the current version of nextcloud being installed
echo you must use --force to start again
return 1
fi
fi
if step 0; then install_release $1; fi
if step 1; then install_database; fi
if step 2; then install_source; fi
if step 3; then install_nextcloud; fi
if step 4; then install_finish; fi
if step 5; then
echo all installation steps completed
echo nextcloud should be online and available $NEXTCLOUD_DOMAIN
unset NEXTCLOUD_INSTALLING
unset NEXTCLOUD_INSTALL_VERSION
rm -f $NEXTCLOUD_HOME/install-version
rm -f $NEXTCLOUD_HOME/install-step
else
echo "*********** INSTALL FAILED ******************"
echo install failed at step $(step cur)
echo fix any issue and run \'nextcloud install\' again
echo to continue installation at that point
echo
echo or use \'nextcloud install --force\' to scrub and start install from the beginning
echo "**********************************"
nextcloud stop
return 2
fi
else
echo unable to run supervisord, thus unable to begin the installation
return 1
fi
}

View File

@ -1,127 +0,0 @@
#!/bin/bash
nc_scrub () {
if [[ $1 == "yes" ]]; then
rm -rf $NEXTCLOUD_SRC_DIR/*
rm -rf $NEXTCLOUD_DATA_DIR/*
rm -rf $NEXTCLOUD_THEMES_DIR/*
rm $NEXTCLOUD_CONFIG_FILE
else
echo nc_scrub is super dangerous function, you must use 'nc_scrub yes' in order to actually scrub the install
fi
}
install_failed () {
unset NEXTCLOUD_INSTALLING
echo doing cleanup from failed install
}
if [[ -f $NEXTCLOUD_SRC_DIR/version.php || -f $NEXTCLOUD_CONFIG_FILE ]]; then
echo this is not a clean install there are files in $NEXTCLOUD_SRC_DIR
echo or $NEXTCLOUD_CONFIG_FILE exists
echo to avoid possibly overwriting the configuration/install by mistake
echo "this install is aborted, use 'nextcloud update' instead"
[[ ! ( $NEXTCLOUD_DEV || $1 == "force" ) ]] && return 1 || echo dev or force mode, continuing install
fi
export NEXTCLOUD_INSTALLING=true
if [[ ! -f $NEXTCLOUD_SRC_DIR/version.php ]]; then
export NEXTCLOUD_APPS_DIR=$NEXTCLOUD_HOME/apps
echo copying nextcloud source at $NEXTCLOUD_INSTALL_FROM_DIR to the instance directory $NEXTCLOUD_SRC_DIR
rsync -rlD --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER --exclude-from=$LIB_DIR/install/install.exclude $NEXTCLOUD_INSTALL_FROM_DIR/ $NEXTCLOUD_SRC_DIR/
echo copying nextcloud apps at $NEXTCLOUD_INSTALL_FROM_DIR/apps to the apps directory $NEXTCLOUD_APPS_DIR
rsync -rlD --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER $NEXTCLOUD_INSTALL_FROM_DIR/apps/ $NEXTCLOUD_APPS_DIR/
echo copying nextcloud themes at $NEXTCLOUD_INSTALL_FROM_DIR/themes to themes directory $NEXTCLOUD_THEMES_DIR
rsync -rlD --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER $NEXTCLOUD_INSTALL_FROM_DIR/themes/ $NEXTCLOUD_THEMES_DIR/
rm $NEXTCLOUD_SRC_DIR/apps-appstore
rm $NEXTCLOUD_SRC_DIR/config
ln -s $NEXTCLOUD_APPS_DIR $NEXTCLOUD_SRC_DIR/apps
ln -s $NEXTCLOUD_THEMES_DIR $NEXTCLOUD_SRC_DIR/themes
ln -s $NEXTCLOUD_CONFIG_DIR $NEXTCLOUD_SRC_DIR/config
else
echo source files already installed, skipping source files copy
fi
# --database=DATABASE Supported database type [default: "sqlite"]
# --database-name=DATABASE-NAME Name of the database
# --database-host=DATABASE-HOST Hostname of the database [default: "localhost"]
# --database-port=DATABASE-PORT Port the database is listening on
# --database-user=DATABASE-USER User name to connect to the database
# --database-pass[=DATABASE-PASS] Password of the database user
# --database-table-space[=DATABASE-TABLE-SPACE] Table space of the database (oci only)
# --admin-user=ADMIN-USER User name of the admin account [default: "admin"]
# --admin-pass=ADMIN-PASS Password of the admin account
# --admin-email[=ADMIN-EMAIL] E-Mail of the admin account
# --data-dir=DATA-DIR
install_options="--admin-user ${NEXTCLOUD_ADMIN_USER:-admin} --admin-pass ${NEXTCLOUD_ADMIN_PASSWORD:-admin} --admin-email ${NEXTCLOUD_ADMIN_EMAIL:-xxx@gmail.com} "
install_options+=" --data-dir $NEXTCLOUD_DATA_DIR"
# DB setup and admin user are set via autoconfig.php
if [[ $NEXTCLOUD_DEV ]]; then
nextcloud stop
sleep 3
echo dev mode, moving config.php and deleting nextcloud db
mv $NEXTCLOUD_HOME/config/config.php $NEXTCLOUD_HOME/config/config.php.sav 2>/dev/null
/bin/rm -rf $NEXTCLOUD_HOME/user-files/*
mv $NEXTCLOUD_HOME/db/mysql.conf.tmpl /tmp/
/bin/rm -rf $NEXTCLOUD_HOME/db/*
mv /tmp/mysql.conf.tmpl $NEXTCLOUD_HOME/db
fi
# set database
source $LIB_DIR/db.lib
echo intializing mysql server databases for nextcloud use...be patient
if ! db init; then echo unable to initialze mysql database, thus nextcloud install failed; return 1; fi
echo bringing now ready mysql server online to complete nextcloud installation
nextcloud db start
sleep 5
if nextcloud supctl status mysql; then
if nextcloud db online nextcloud; then
install_options+=" --database mysql --database-name $MYSQL_DATABASE --database-user nextcloud --database-pass nextcloud --database-host localhost:/run/nextcloud/db.sock"
echo initializing nextcloud via maintence:install...please wait
cmd="sudo -u nextcloud $NEXTCLOUD_SRC_DIR/occ maintenance:install $install_options"
[[ $NEXTCLOUD_DEV ]] && echo DEBUG: $cmd
if $cmd; then
/bin/cp $NEXTCLOUD_CONFIG_FILE $NEXTCLOUD_CONFIG_DIR/config.init.php
echo SUCCESS: maintenance:install succeeded! Nextcloud is installed
echo installed version $(version) on > $NEXTCLOUD_HOME/installed
echo $(date) >> $NEXTCLOUD_HOME/installed
cat $NEXTCLOUD_HOME/installed
echo "**** NOTE: default administrator login is user:${NEXTCLOUD_ADMIN_USER:-admin} password: ${NEXTCLOUD_ADMIN_PASSWORD:-admin} ***"
echo merging config files into config.php
echo starting nextcloud now
if nextcloud start; then
unset NEXTCLOUD_INSTALLING
if [[ $NEXTCLOUD_APPS ]]; then
echo installing nextcloud apps from list
echo $NEXTCLOUD_APPS
nextcloud app install $NEXTCLOUD_APPS
echo "done installing apps"
fi
else
echo FATAL! could not bring up nextcloud after successfull install
install_failed
return 1
fi
else
echo FATAL! - Install was not successful
install_failed
return 1
fi
else
echo nextcloud database never came online
echo FATAL! unable to finish nextcloud installation
install_failed
return 1
fi
else
echo FATAL! unable to bring up mysql database, install FAILED
install_failed
return 1
fi

View File

@ -1,82 +0,0 @@
#!/bin/bash
# ENVIRONENT VARIABLES as get in db.env
# as set in $ENV_DIR/mysql.env
# export DB_HOME=$NEXTCLOUD_DB_DIR
# export DB_CONF=$DB_HOME/mysql.conf
# export DB_SERVER_BIN="$(which mysqld)"
# export DB_SERVER_BIN="$(which mysqld)"
# export DB_CLIENT_BIN="$(which mysql)"
# export DB_SERVER_OPTS=" --defaults-file=$DB_CONF"
# export MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud}
# export MYSQL_USER=${MYSQL_USER:-nextcloud}
# export MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD:-nextcloud1234}
# export MYSQL_PASSWORD=${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}
mysql_init () {
if nextcloud func process_template $DB_CONF; then
if [ -d $DB_HOME/mysql ]; then
echo "MySQL system DB $DB_HOME/mysql already present, skipping initial creation"
else
echo "MySQL data directory not found, creating initial mysql DBs"
chown -R nextcloud:nextcloud $DB_HOME
# mysql_install_db is a mysql cli command
if mysql_install_db $DB_SERVER_OPTS >/dev/null; then
echo mysql system DBs succesfully created
if nextcloud db start; then
if nextcloud db online mysql; then
echo creating additional root user with root password
$DB_CLIENT_BIN $DB_SERVER_OPTS -uroot << EOF
CREATE USER 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';
GRANT ALL PRIVILEGES on *.* to 'root'@'%';
FLUSH privileges;
EOF
echo creating empty nextcloud DB...
if mysql_create_nextcloud_db; then
echo Success!
echo MySQL initialzed for Nextcloud on $(date) > $DB_HOME/installed
cat $DB_HOME/installed
else
echo FATAL: unable to to create user and database nextcloud
return 1
fi
else
echo FATAL: could not access mysql system database
return 1
fi
else
echo FATAL: could not start mysql daemon
return 1
fi
else
echo FATAL: unable to make mysql system DB.
return 1
fi
fi
else
echo unable to make mysql.conf from template in $DB_HOME
return 1
fi
}
mysql_create_nextcloud_db () {
echo creating nextcloud db user and database
$DB_CLIENT_BIN $DB_SERVER_OPTS -uroot << EOF
CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on $MYSQL_DATABASE.* to 'nextcloud'@'localhost';
CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';
GRANT ALL PRIVILEGES on $MYSQL_DATABASE.* to '$MYSQL_USER'@'%';
FLUSH privileges;
EOF
sleep 5
if nextcloud db online nextcloud; then
echo "nextcloud database successfully created"
else
echo FATAL! error attemping to create nextcloud database with mysql
return 1
fi
}

View File

@ -0,0 +1,40 @@
#!/bin/bash
db_init () {
# only run this from install_database function
# initializing mysql server by creating mysql db
if [[ ! -d $DB_HOME/mysql ]]; then
echo "mysql server system databases not found, installing now"
echo "....please wait"
# mysql_install_db is a mysql cli command that starts a server by itself
if mysql_install_db $DB_SERVER_OPTS >/dev/null; then
echo mysql system databases succesfully created
return
else
echo install of mysql system databases failed
pgrep -x mysql_install_db | xargs kill -9
return 1
fi
else
echo mysql system databases already created on server
fi
}
db_cli () {
local user
local db
local cmd
db=${NEXTCLOUD_DB:-nextcloud}
[[ $NEXTCLOUD_DB_PASSWORD ]] && user=" -u ${NEXTCLOUD_DB_USER:-nextcloud} -p${NEXTCLOUD_DB_PASSWORD}"
if [[ $1 == "-r" ]] || [[ $1 == "--root" ]]; then user="-u root"; db="mysql"; shift; fi
cmd="$DB_CLIENT_BIN ${user} ${db}"
if [[ $1 ]]; then
$cmd <<< "$1;"
else
$cmd
fi
}

View File

@ -1,9 +1,12 @@
#!/bin/bash #!/bin/bash
source $LIB_DIR/verbose.lib # source $LIB_DIR/verbose.lib
source $LIB_DIR/confirm.func
source $LIB_DIR/helpers.lib source $LIB_DIR/helpers.lib
source $LIB_DIR/db.lib source $LIB_DIR/db.lib
source $LIB_DIR/redis.lib source $LIB_DIR/redis.lib
source $LIB_DIR/caddy.lib source $LIB_DIR/caddy.lib
source $LIB_DIR/ssh.lib
source $LIB_DIR/cmds.lib source $LIB_DIR/cmds.lib

View File

@ -5,11 +5,7 @@ redis () {
case "$1" in case "$1" in
start) start)
if nextcloud supctl status redis 1> /dev/null; then return $(nextcloud start redis)
echo Redis server already running
else
nextcloud supctl start redis;
fi
;; ;;
restart) restart)
nextcloud supctl restart redis nextcloud supctl restart redis
@ -22,9 +18,10 @@ case "$1" in
return 0 return 0
fi fi
;; ;;
init) update)
if ! nextcloud func process_template $REDIS_CONF; then if ! nextcloud func process_template $REDIS_CONF; then
echo unable to make $REDIS_CONF echo unable to make $REDIS_CONF
return 1
fi fi
;; ;;

View File

@ -0,0 +1,111 @@
#!/bin/bash
export NEXTCLOUD_RELEASES_URL=https://download.nextcloud.com/server/releases
nextcloud_pull () {
local ver
local file
echo determining release ....
if [[ $1 ]]; then
if [[ $1 == *.* ]] ; then
ver=$1
if ! nextcloud_releases $ver > /dev/null; then
echo no version $ver in releases nothing to pull
echo possible valid releases are
sleep 2
nextcloud_releases
return 1
fi
else
if ! ver=$(nextcloud_releases latest $1); then
unable to find lastest minor release for version $1
return 1
fi
fi
else
if ! ver=$(nextcloud_releases latest) ; then
echo unable to determine any latest release
return 1
fi
fi
if version release $ver > /dev/null ; then
read -p "local copy of $ver already exists do you want to pull it again?, [yY]" -n 1 -r
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "\n !!! aborting pull !!! \n"
return 4
fi
fi
file=nextcloud-$ver.tar.bz2
if ! nextcloud_release_exists $file; then
echo ERROR: file $file does not exist at repository nothing to pull
return 1
fi
read -p "do you want to pull and extract version: $ver, file: $file?, [yY]" -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo -e "\n --- pulling now --- \n"
else
echo -e "\n !!! aborting pull !!! \n"
return 4
fi
# echo curl -o /tmp/$file $NEXTCLOUD_RELEASES_URL/$file
if ([[ -f /tmp/$file ]] && ( echo $file already pulled; true; ) || curl -o /tmp/$file $NEXTCLOUD_RELEASES_URL/$file) ; then
echo success downloading $file to /tmp
echo attempting to extact $file to $NEXTCLOUD_RELEASES_DIR/$ver
mkdir -p $NEXTCLOUD_RELEASES_DIR/$ver
if tar -xjf /tmp/$file --strip-components=1 -C $NEXTCLOUD_RELEASES_DIR/$ver; then
echo extraction sucessfull to $NEXTCLOUD_RELEASES_DIR/$ver
echo confirming version:
if version release $ver > /dev/null ; then rm -f /tmp/$file; fi
else
echo unable to extract $file to $NEXTCLOUD_RELEASES_DIR
echo $file may be corrupted.
echo deleting /tmp/$file, will need to pull again
rm -f /tmp/$file
return 2
fi
else
echo unable to download and extract $file
return 1;
fi
}
nextcloud_release_exists () {
local code
local url
url="$NEXTCLOUD_RELEASES_URL/$1"
code=$(curl -o /dev/null --silent -Iw '%{http_code}' $url)
[[ $code == 200 ]] && return 0
echo can not confirm existance of $1 at
echo $url
return 1
}
nextcloud_releases () {
local vers=nextcloud; local latest; local vout
[[ $1 == "major" ]] && vers=latest && shift
[[ $1 == "latest" ]] && latest=true && shift
vout=$(curl -s $NEXTCLOUD_RELEASES_URL/ \
| grep "<a href=\"${vers}-.*\.zip\"" \
| sed "s/<a href/\\n<a href/g" \
| sed 's/\"/\"><\/a>\n/2' \
| grep href \
| sed -e 's/.*<a href="'${vers}'-\(.*\).zip.*/\1/' \
| sort -Vr | uniq \
| if [[ $1 ]]; then grep -w ^$1; else cat; fi \
| if [[ $latest ]]; then head -n 1; else cat; fi )
[[ $vout ]] && echo "$vout" || return 1
}

102
src/rootfs/opt/lib/ssh.lib Normal file
View File

@ -0,0 +1,102 @@
#!/bin/bash
ssh () {
if [[ $SSH_USER ]] && [[ $SSH_PUBKEY ]]; then
if [[ $SSH_ADDRESS ]] || [[ $SSH_HOST ]]; then
subcmd=$1
shift
local boot
case "$subcmd" in
boot)
boot=-D
echo will start ssh server in foreground
;&
start)
if ssh >/dev/null; then
echo ssh server is already running can not boot/start
else
if ssh_make_authorized_keys; then
ssh_make_conf
echo starting ssh server
/usr/sbin/sshd $boot -E $NEXTCLOUD_LOGS_DIR/ssh.log "$@"
sleep 1
if pgrep sshd >/dev/null ; then
echo ssh server started
else
echo ssh server failed to start
return 1
fi
fi
fi
;;
conf)
ssh_make_conf
;;
pubkey)
ssh_make_authorized_keys
;;
stop)
for proc in $(pgrep sshd); do kill $proc; done
sleep 1
if pgrep sshd; then echo unable to stop ssh server; return 1; fi
;;
*)
if pgrep sshd >/dev/null; then
echo ssh server is running
else
echo ssh server is down
return 1
fi
esac
else
echo to use ssh you MUST set either SSH_ADDRESS and/or SSH_HOST
return 1
fi
else
echo to use ssh you MUST set both SSH_USER and SSH_PUBKEY
return 1
fi
}
ssh_make_conf () {
conf=/etc/ssh/sshd_config.d/03-container-key-access.conf
cat <<EOF > $conf
Match User $SSH_USER $([[ $SSH_ADDRESS ]] && echo Address $SSH_ADDRESS) $([[ $SSH_HOST ]] && echo Host $SSH_HOST)
$(cat $conf.tmpl)
EOF
echo added Match line to $conf
cat $conf
}
ssh_make_authorized_keys () {
if getent passwd $SSH_USER | grep -q '/bin/bash' ;then
local home
home=$( [[ $SSH_USER == "root" ]] && echo /root/.ssh || echo /home/$SSH_USER/.ssh )
mkdir $home 2>/dev/null
chmod 700 $home
echo -e "$SSH_PUBKEY\n" > $home/authorized_keys
chmod 600 $home/authorized_keys
chown -R $SSH_USER:$SSH_USER $home
echo made authorized_keys file at $home with key
ls -ls $home
cat $home/authorized_keys
else
echo user $SSH_USER does not have bash login privilidges, can not set up as ssh user
return 1
fi
}
# if script was executed then call the function
(return 0 2>/dev/null) || ssh "$@"

View File

@ -1,6 +1,5 @@
/config/ /config/
/data/ /data/
/custom_apps/ /apps/
/themes/ /themes/
/version.php /updater/
/nextcloud-init-sync.lock

View File

@ -0,0 +1,200 @@
#!/bin/bash
export NEXTCLOUD_UPGRADE_VERSION=""
source $LIB_DIR/release.lib
source $LIB_DIR/db.lib
upgrade_container () {
echo upgrade container image files /tmp/nextcloud
rsync -rlDv --info=progress2 /tmp/nextcloud/ $NEXTCLOUD_SRC_DIR
}
upgradable () {
# https://stackoverflow.com/a/4024263
local vfrom=$1
local vto=$2
[[ $vto == "$vfrom" ]] && return 1
if ! printf '%s\n' $$vto $vfrom | sort -C -V ; then
local diff=$(($(echo $vto | cut -f1 -d.)-$(echo $vfrom | cut -f1 -d.)))
[[ $diff -gt 1 ]] && echo can not upgrade two major versions $vfrom to $vto && return 2
if [[ $diff == 1 ]]; then
local latest=$(nextcloud_releases latest $(echo $vfrom | cut -f1 -d.))
if [[ ! $vfrom == "$latest" ]]; then
echo $vfrom is not the latest minor version which is $latest
echo must upgrade first to $latest before upgrading to $vto
return 1
fi
fi
fi
}
upgrade_version () {
local cur=$1
if cur=${cur:-$(version)}; then
local minor=$(nextcloud_releases latest $(echo $cur | cut -f1 -d.))
echo checking for minor upgrade for current version, $cur
if upgradable $cur $minor; then
echo minor upgrade to $minor available
export NEXTCLOUD_UPGRADE_VERSION=$minor
else
if [[ "$minor" == "$cur" ]]; then
echo current version, $cur, is latest version minor for $(echo $cur | cut -f1 -d.)
echo checking for major upgrade
local major=$(nextcloud_releases latest $(($(echo $cur | cut -f1 -d.)+1)))
if [[ $major ]]; then
echo major version upgrade available, $major
export NEXTCLOUD_UPGRADE_VERSION=$major
else
echo current version $cur is latest major available, nothing to upgrade
export NEXTCLOUD_UPGRADE_VERSION=""
return 1
fi
else
echo $cur not upgradable to $minor
export NEXTCLOUD_UPGRADE_VERSION=""
return 1
fi
fi
else
echo "can't determine current version likely nextcloud is not installed, can not upgrade"
return 1
fi
}
upgrade_prepare () {
[[ $1 == "container" ]] && ( upgrade_container; return $?; )
if ! nextcloud state > /dev/null; then echo $NEXTCLOUD_NAME is not currenly running, must be running to upgrade; return 1; fi
if ! installed > /dev/null ; then echo nextcloud not installed, can not upgrade; return 4; fi
if [[ "$1" == "-f" ]]; then
if [[ $(nextcloud_releases $2 | wc -l) -eq "1" ]]; then
NEXTCLOUD_UPGRADE_VERSION=$2
shift 2
else
echo forced upgrade release $2 does not exist
echo these are the available releases for $(echo $2 | cut -f1 -d.)
nextcloud_releases $(echo $2 | cut -f1 -d.)
echo aborting upgrade
return 3
fi
fi
local cur=${1:-$(version)}
[[ ! $cur ]] && echo unable to determine current version, is nextcloud installed? && return 2
if [[ $NEXTCLOUD_UPGRADE_VERSION ]]; then
if upgradable $cur $NEXTCLOUD_UPGRADE_VERSION; then
echo current version $cur can be upgraded to $NEXTCLOUD_UPGRADE_VERSION
if confirm -s Do you want to download version $NEXTCLOUD_UPGRADE_VERSION?; then
if version release $NEXTCLOUD_UPGRADE_VERSION > /dev/null ; then
echo $NEXTCLOUD_UPGRADE_VERSION already downloaded
echo upgrade prepared
else
echo downloading $NEXTCLOUD_UPGRADE_VERSION now, be patient....
if ! nextcloud_pull $NEXTCLOUD_UPGRADE_VERSION; then echo download/extract failed; return 1; fi
echo download/extract successful, upgrade prepared
fi
else
echo upgrade aborted
return 1
fi
else
echo $cur can not be upgraded to $NEXTCLOUD_UPGRADE_VERSION
return 1
fi
else
if upgrade_version $cur; then
upgrade_prepare $cur
else
echo can not determine upgrade version, upgrade aborted
return 1
fi
fi
}
# do the actual upgrade
upgrade_run () {
NEXTCLOUD_UPGRADE_ID=$(date '+%Y%m%d%H%M%S')
nextcloud config backup
echo saving copy of database
if ! nextcloud db backup $NEXTCLOUD_UPGRADE_ID ; then
echo database backup failed
echo can not continue with upgrade
return 2
fi
if ! nextcloud update; then
echo FAILED: nextcloud update with container failed, aborting upgrade
return 3
fi
if ! nextcloud func mmode on; then echo unable to enter maintenance mode, aborting upgrade; return 1; fi
local previous=$(version)
[[ ! $previous ]] && echo unable to determine current version, aborting upgrade && return 5
echo $previous > $NEXTCLOUD_HOME/previous-version
local SRC
if ! SRC=$NEXTCLOUD_RELEASES_DIR/$(version release $NEXTCLOUD_UPGRADE_VERSION); then
echo no version $NEXTCLOUD_UPGRADE_VERSION to install, rerun \'nextcloud upgrade\'
unset NEXTCLOUD_UPGRADE_VERSION
return 1
fi
echo saving list of current apps
nextcloud occ app:list > $NEXTCLOUD_APPS_DIR/apps-list
echo saving nextcloud $previous source
mv $NEXTCLOUD_SRC_DIR/ $NEXTCLOUD_SRC_DIR-$previous
if ! version $NEXTCLOUD_SRC_DIR-$previous > /dev/null; then
echo unable to save current version $previous of source
echo can not continue upgrade
return 3
fi
echo copying new nextcloud source at $SRC to the instance directory $NEXTCLOUD_SRC_DIR
if ! rsync -rlD --info=progress2 --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER --exclude-from=$LIB_DIR/upgrade.exclude $SRC/ $NEXTCLOUD_SRC_DIR; then
echo ERROR: unable to copy new release source code
return 4
fi
if [[ ! $NEXTCLOUD_UPGRADE_VERSION == $(version) ]]; then
echo unable to confirm that new source is version $NEXTCLOUD_UPGRADE_VERSION
return 5
fi
echo backup apps directory
mv $NEXTCLOUD_APPS_DIR $NEXTCLOUD_APPS_DIR-$previous-$NEXTCLOUD_UPGRADE_ID
echo copying new apps directory
rsync -rlD --info=progress2 --chown=$NEXTCLOUD_USER:$NEXTCLOUD_USER $SRC/apps/ $NEXTCLOUD_APPS_DIR
echo create links to apps, themes, and config
ln -s $NEXTCLOUD_APPS_DIR $NEXTCLOUD_SRC_DIR/apps
ln -s $NEXTCLOUD_THEMES_DIR $NEXTCLOUD_SRC_DIR/themes
ln -s $NEXTCLOUD_CONFIG_DIR $NEXTCLOUD_SRC_DIR/config
echo starting upgrade processing now... please wait
if nextcloud occ upgrade &> $NEXTCLOUD_LOGS_DIR/upgrade-$NEXTCLOUD_UPGRADE_VERSION-$NEXTCLOUD_UPGRADE_ID; then
echo nextcloud system upgrade was successfull
else
echo FATAL: unable to complete upgrade, need to run nextcloud upgrade rollback
return 7
fi
nextcloud func mmode off
echo restarting nextcloud
if ! nextcloud restart >/dev/null; then echo could not restart nextcloud after upgrade, see troubleshooting; return 1; fi
echo running a repair after upgrade
if ! nextcloud repair >/dev/null; then echo WARN: could not complete a nextcloud repair; return 1; fi
echo
echo any nextcloud issues repaired
nextcloud history upgrade $NEXTCLOUD_UPGRADE_ID
nextcloud history
unset NEXTCLOUD_UPGRADE_VERSION
unset NEXTCLOUD_UPGRADE_ID
}

View File

@ -3,4 +3,6 @@ $CONFIG = array (
'logfile' =>getenv('NEXTCLOUD_LOGS_DIR') ?: '/opt/nextcloud/logs'.'/nextcloud.log', 'logfile' =>getenv('NEXTCLOUD_LOGS_DIR') ?: '/opt/nextcloud/logs'.'/nextcloud.log',
'default_phone_region' => getenv('NEXTCLOUD_REGION') ?: 'US', 'default_phone_region' => getenv('NEXTCLOUD_REGION') ?: 'US',
'configs_merged' => true, 'configs_merged' => true,
'backgroundjobs_mode' => 'cron',
'maintenance_window_start' => getenv('MAINTENANCE_WINDOW_START')/1 ?: 1
); );

View File

@ -26,6 +26,6 @@ if ($overwriteCondAddr) {
$trustedProxies = getenv('NEXTCLOUD_TRUSTED_PROXIES'); $trustedProxies = getenv('NEXTCLOUD_TRUSTED_PROXIES');
if ($trustedProxies) { if ($trustedProxies) {
$CONFIG['trusted_proxies'] = array_filter(array_map('trim', explode(' ', $trustedProxies))); $CONFIG['trusted_proxies'] = explode(' ', $trustedProxies);
$CONFIG['forwarded_for_headers'] => array('HTTP_X_FORWARDED_FOR'), $CONFIG['forwarded_for_headers'] = array('HTTP_X_FORWARDED_FOR');
} }

View File

@ -11,15 +11,17 @@ query_cache_size = 64M
tmp_table_size= 64M tmp_table_size= 64M
max_heap_table_size= 64M max_heap_table_size= 64M
slow_query_log = 1 slow_query_log = 1
slow_query_log_file = $NEXTCLOUD_LOGS_DIR/db-slow.log slow_query_log_file = $NEXTCLOUD_LOGS_DIR/mysql-slow.log
long_query_time = 1 long_query_time = 1
general_log_file = $NEXTCLOUD_LOGS_DIR/db.log general_log_file = $NEXTCLOUD_LOGS_DIR/mysql.log
general_log = 1 general_log = 1
[client] [client]
default-character-set = utf8mb4 default-character-set = utf8mb4
user = nextcloud user = nextcloud
password = nextcloud
socket = /run/nextcloud/db.sock socket = /run/nextcloud/db.sock
protocol = socket
[mariadb] [mariadb]
user = nextcloud user = nextcloud
@ -31,10 +33,15 @@ bind-address = 127.0.0.1
character_set_server = utf8mb4 character_set_server = utf8mb4
collation_server = utf8mb4_general_ci collation_server = utf8mb4_general_ci
transaction_isolation = READ-COMMITTED transaction_isolation = READ-COMMITTED
log-bin = 1 # disable binary logs
# log-bin = 1
binlog_format = ROW binlog_format = ROW
innodb_file_per_table=1 innodb_file_per_table=1
[mysqld_safe] [mysqld_safe]
log-error=$NEXTCLOUD_LOGS_DIR/mysql_safe.err log-error=$NEXTCLOUD_LOGS_DIR/mysql_safe.erorr.log
# pid-file=$DB_HOME/mysqld.pid # pid-file=$DB_HOME/mysqld.pid
[mysql_install_db]
admin-user = nextcloud
insecure = 1

View File

@ -1,11 +1,11 @@
[program:caddy] [program:caddy]
command=%(ENV_CADDY_BIN)s run --config %(ENV_CADDY_CONF)s/.Caddyfile --adapter caddyfile command=%(ENV_CADDY_BIN)s run --config %(ENV_CADDY_CONF)s/.Caddyfile --adapter caddyfile
stopsignal=QUIT stopsignal=QUIT
autostart=false autostart=%(ENV_BOOT)s
;autorestart=unexpected autorestart=%(ENV_AUTORESTART)s
priority=2 priority=2
user=nextcloud user=nextcloud
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/caddy.log stdout_logfile_backups=1
stdout_logfile_maxbytes=0 stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/caddy.log
stderr_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/caddy.err stdout_logfile_maxbytes=10MB
stderr_logfile_maxbytes=0 redirect_stderr=true

View File

@ -0,0 +1,10 @@
[program:cron]
command = /usr/bin/supercronic --passthrough-logs -json /etc/crontabs/nextcloud
autostart=%(ENV_BOOT)s
autorestart=%(ENV_AUTORESTART)s
priority=10
user=nextcloud
stdout_logfile_backups=1
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/cron.log
stdout_logfile_maxbytes=10MB
redirect_stderr=true

View File

@ -0,0 +1,10 @@
[program:db]
command=/usr/bin/pidproxy /run/nextcloud/db.pid /usr/bin/mysqld_safe %(ENV_DB_SERVER_OPTS)s
autostart=%(ENV_BOOT)s
autorestart=%(ENV_AUTORESTART)s
priority=1
user=nextcloud
stdout_logfile_backups=1
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/db.log
stdout_logfile_maxbytes=10MB
redirect_stderr=true

View File

@ -1,10 +0,0 @@
[program:mysql]
command=/usr/bin/pidproxy /run/nextcloud/db.pid /usr/bin/mysqld_safe %(ENV_DB_SERVER_OPTS)s
autostart=false
;autorestart=unexpected
priority=1
user=nextcloud
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/mysql.log
stdout_logfile_maxbytes=0
stderr_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/mysql.err
stderr_logfile_maxbytes=0

View File

@ -1,10 +0,0 @@
[program:nextcloud]
priority=1
command=/opt/bin/nextcloud start
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/start.log
stdout_logfile_maxbytes=0
stderr_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/start.err
stderr_logfile_maxbytes=0
autostart=%(ENV_BOOT)s
autorestart=false
startsecs=0

View File

@ -1,24 +0,0 @@
[program:php-fpm]
command = /bin/php-fpm -g /run/nextcloud/php-fpm.pid -F
autostart=false
; autorestart=unexpected
priority=3
user=nextcloud
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/php-fpm.log
stdout_logfile_maxbytes=0
stderr_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/php-fpm.err
stderr_logfile_maxbytes=0
; [program:php-fpm]
; command = /bin/php-fpm --force-stderr --nodaemonize --fpm-config
; autostart=false
; ;autorestart=true
; priority=5
; stdout_events_enabled=true
; stderr_events_enabled=true
; stdout_logfile=/dev/stdout
; stdout_logfile_maxbytes=0
; stderr_logfile=/dev/stderr
; stderr_logfile_maxbytes=0
; stopsignal=QUIT

View File

@ -0,0 +1,10 @@
[program:php-fpm]
command = /bin/php-fpm -g /run/nextcloud/php-fpm.pid -F
autostart=%(ENV_BOOT)s
autorestart=%(ENV_AUTORESTART)s
priority=3
user=nextcloud
stdout_logfile_backups=1
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/php-fpm.log
stdout_logfile_maxbytes=10MB
redirect_stderr=true

View File

@ -1,10 +1,11 @@
[program:redis] [program:redis]
command=%(ENV_REDIS_BIN)s %(ENV_REDIS_CONF)s command=%(ENV_REDIS_BIN)s %(ENV_REDIS_CONF)s
directory=%(ENV_REDIS_HOME)s directory=%(ENV_REDIS_HOME)s
autostart=false autostart=%(ENV_BOOT)s
priority=1 autorestart=%(ENV_AUTORESTART)s
priority=4
user=nextcloud user=nextcloud
stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/redis.log stdout_logfile_backups=1
stdout_logfile_maxbytes=0 stdout_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/redis.log
stderr_logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor/redis.err stdout_logfile_maxbytes=10MB
stderr_logfile_maxbytes=0 redirect_stderr=true

View File

@ -9,6 +9,10 @@ port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
[supervisord] [supervisord]
;nodaemon=true ;nodaemon=true
logfile_maxbytes=10MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=1 ; # of main logfile backups; 0 means none, default 10
loglevel=warn
;silent=true
user=root user=root
logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor.log logfile=%(ENV_NEXTCLOUD_LOGS_DIR)s/supervisor.log
pidfile=%(ENV_SUPERVISOR_HOME)s/supervisor.pid pidfile=%(ENV_SUPERVISOR_HOME)s/supervisor.pid
@ -22,3 +26,12 @@ serverurl=unix:///run/nextcloud/supervisor.sock
[include] [include]
files = %(ENV_SUPERVISOR_HOME)s/*.ini files = %(ENV_SUPERVISOR_HOME)s/*.ini
[group:nextcloud]
programs=db,caddy,php-fpm,redis,cron
; https://thepracticalsysadmin.com/quicktip-manage-memory-usage-with-supervisord/
; memory watch
; watchdog that kills supervisor is any child is fatal
; https://github.com/Supervisor/supervisor/issues/712#issuecomment-184668764

View File

@ -0,0 +1 @@
complete -E -W nextcloud

View File

@ -0,0 +1,12 @@
#!/bin/bash
if [[ $SSH_SESSION ]]; then
if [[ -f /tmp/passed.env ]]; then
while IFS== read -r key value; do
printf -v "$key" %s "$value" && export "$key" >/dev/null
done < /tmp/passed.env
fi
source /opt/core_run.env
source /opt/bin/nextcloud
cd "$NEXTCLOUD_HOME"
fi