зеркало из https://github.com/nextcloud/container.git
601 строка
18 KiB
Bash
601 строка
18 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
source ${NEXTCLOUD_RUNTIME_DIR}/env-defaults
|
|
|
|
NEXTCLOUD_TEMPLATES_DIR=${NEXTCLOUD_RUNTIME_DIR}/config
|
|
NEXTCLOUD_APP_CONFIG=${NEXTCLOUD_CONFIG_DIR}/config.php
|
|
NEXTCLOUD_NGINX_CONFIG=/etc/nginx/sites-enabled/Nextcloud.conf
|
|
|
|
# Compares two version strings `a` and `b`
|
|
# Returns
|
|
# - negative integer, if `a` is less than `b`
|
|
# - 0, if `a` and `b` are equal
|
|
# - non-negative integer, if `a` is greater than `b`
|
|
vercmp() {
|
|
expr '(' "$1" : '\([^.]*\)' ')' '-' '(' "$2" : '\([^.]*\)' ')' '|' \
|
|
'(' "$1.0" : '[^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0" : '[^.]*[.]\([^.]*\)' ')' '|' \
|
|
'(' "$1.0.0" : '[^.]*[.][^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0.0" : '[^.]*[.][^.]*[.]\([^.]*\)' ')' '|' \
|
|
'(' "$1.0.0.0" : '[^.]*[.][^.]*[.][^.]*[.]\([^.]*\)' ')' '-' '(' "$2.0.0.0" : '[^.]*[.][^.]*[.][^.]*[.]\([^.]*\)' ')'
|
|
}
|
|
|
|
# Read YAML file from Bash script
|
|
# Credits: https://gist.github.com/pkuczynski/8665367
|
|
parse_yaml() {
|
|
local prefix=$2
|
|
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
|
|
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
|
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
|
|
awk -F$fs '{
|
|
indent = length($1)/2;
|
|
vname[indent] = $2;
|
|
for (i in vname) {if (i > indent) {delete vname[i]}}
|
|
if (length($3) > 0) {
|
|
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
|
|
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
|
|
}
|
|
}'
|
|
}
|
|
|
|
get_php_param() {
|
|
local key=${1?key not specified}
|
|
sed -n -e "s/^\(${key}=\)\(.*\)\(.*\)$/\2/p" ${NEXTCLOUD_INSTALL_DIR}/.user.ini
|
|
}
|
|
|
|
set_php_param() {
|
|
local key=${1?key not specified}
|
|
local value=${2?value not specified}
|
|
local verbosity=${3:-verbose}
|
|
|
|
local current=$(get_php_param ${key})
|
|
if [[ "${current}" != "${value}" ]]; then
|
|
if [[ ${verbosity} == verbose ]]; then
|
|
echo "Setting .user.ini parameter: ${key}=${value}"
|
|
fi
|
|
fi
|
|
|
|
if [[ $(sed -n -e "s/^[;]*[ ]*\(${key}\)=.*/\1/p" .user.ini) == ${key} ]]; then
|
|
value="$(echo "${value}" | sed 's|[&]|\\&|g')"
|
|
sed -i "s|^[;]*[ ]*${key}=.*|${key}=${value}|" ${NEXTCLOUD_INSTALL_DIR}/.user.ini
|
|
else
|
|
echo "${key}=${value}" >> ${NEXTCLOUD_INSTALL_DIR}/.user.ini
|
|
fi
|
|
}
|
|
|
|
## Execute a command as NEXTCLOUD_USER
|
|
exec_as_nextcloud() {
|
|
if [[ $(whoami) == ${NEXTCLOUD_USER} ]]; then
|
|
$@
|
|
else
|
|
sudo -HEu ${NEXTCLOUD_USER} "$@"
|
|
fi
|
|
}
|
|
|
|
occ_cli() {
|
|
exec_as_nextcloud php occ $@
|
|
}
|
|
|
|
## Copies configuration template in ${NEXTCLOUD_TEMPLATES_DIR} to the destination as the specified USER
|
|
# $1: ownership of destination file, uses `chown`
|
|
# $2: source file
|
|
# $3: destination location
|
|
# $4: mode of destination, uses `chmod` (default: 0644)
|
|
install_template() {
|
|
local OWNERSHIP=${1}
|
|
local SRC=${2}
|
|
local DEST=${3}
|
|
local MODE=${4:-0644}
|
|
if [[ -f ${NEXTCLOUD_TEMPLATES_DIR}/${SRC} ]]; then
|
|
cp ${NEXTCLOUD_TEMPLATES_DIR}/${SRC} ${DEST}
|
|
fi
|
|
chmod ${MODE} ${DEST}
|
|
chown ${OWNERSHIP} ${DEST}
|
|
}
|
|
|
|
|
|
## Replace placeholders with values
|
|
# $1: file with placeholders to replace
|
|
# $x: placeholders to replace
|
|
update_template() {
|
|
local FILE=${1?missing argument}
|
|
shift
|
|
|
|
[[ ! -f ${FILE} ]] && return 1
|
|
|
|
local VARIABLES=($@)
|
|
local USR=$(stat -c %U ${FILE})
|
|
local tmp_file=$(mktemp)
|
|
cp -a "${FILE}" ${tmp_file}
|
|
|
|
local variable
|
|
for variable in ${VARIABLES[@]}; do
|
|
# Keep the compatibilty: {{VAR}} => ${VAR}
|
|
sed -ri "s/[{]{2}$variable[}]{2}/\${$variable}/g" ${tmp_file}
|
|
done
|
|
|
|
# Replace placeholders
|
|
(
|
|
export ${VARIABLES[@]}
|
|
local IFS=":"; sudo -HEu ${USR} envsubst "${VARIABLES[*]/#/$}" < ${tmp_file} > ${FILE}
|
|
)
|
|
rm -f ${tmp_file}
|
|
}
|
|
|
|
nextcloud_finalize_database_parameters() {
|
|
# is a mysql or postgresql database linked?
|
|
# requires that the mysql or postgresql containers have exposed
|
|
# port 3306 and 5432 respectively.
|
|
if [[ -n ${MYSQL_PORT_3306_TCP_ADDR} ]]; then
|
|
DB_TYPE=${DB_TYPE:-mysql}
|
|
DB_HOST=${DB_HOST:-mysql}
|
|
DB_PORT=${DB_PORT:-$MYSQL_PORT_3306_TCP_PORT}
|
|
|
|
# support for linked sameersbn/mysql image
|
|
DB_USER=${DB_USER:-$MYSQL_ENV_DB_USER}
|
|
DB_PASS=${DB_PASS:-$MYSQL_ENV_DB_PASS}
|
|
DB_NAME=${DB_NAME:-$MYSQL_ENV_DB_NAME}
|
|
|
|
# support for linked orchardup/mysql and enturylink/mysql image
|
|
# also supports official mysql image
|
|
DB_USER=${DB_USER:-$MYSQL_ENV_MYSQL_USER}
|
|
DB_PASS=${DB_PASS:-$MYSQL_ENV_MYSQL_PASSWORD}
|
|
DB_NAME=${DB_NAME:-$MYSQL_ENV_MYSQL_DATABASE}
|
|
elif [[ -n ${POSTGRESQL_PORT_5432_TCP_ADDR} ]]; then
|
|
DB_TYPE=${DB_TYPE:-pgsql}
|
|
DB_HOST=${DB_HOST:-postgresql}
|
|
DB_PORT=${DB_PORT:-$POSTGRESQL_PORT_5432_TCP_PORT}
|
|
|
|
# support for linked official postgres image
|
|
DB_USER=${DB_USER:-$POSTGRESQL_ENV_POSTGRES_USER}
|
|
DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_POSTGRES_PASSWORD}
|
|
DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_POSTGRES_DB}
|
|
DB_NAME=${DB_NAME:-$DB_USER}
|
|
|
|
# support for linked sameersbn/postgresql image
|
|
DB_USER=${DB_USER:-$POSTGRESQL_ENV_DB_USER}
|
|
DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_DB_PASS}
|
|
DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_DB_NAME}
|
|
|
|
# support for linked orchardup/postgresql image
|
|
DB_USER=${DB_USER:-$POSTGRESQL_ENV_POSTGRESQL_USER}
|
|
DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_POSTGRESQL_PASS}
|
|
DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_POSTGRESQL_DB}
|
|
|
|
# support for linked paintedfox/postgresql image
|
|
DB_USER=${DB_USER:-$POSTGRESQL_ENV_USER}
|
|
DB_PASS=${DB_PASS:-$POSTGRESQL_ENV_PASS}
|
|
DB_NAME=${DB_NAME:-$POSTGRESQL_ENV_DB}
|
|
fi
|
|
|
|
if [[ -z ${DB_HOST} ]]; then
|
|
echo
|
|
echo "ERROR: "
|
|
echo " Please configure the database connection."
|
|
echo " Cannot continue without a database. Aborting..."
|
|
echo
|
|
return 1
|
|
fi
|
|
|
|
# use default port number if it is still not set
|
|
case ${DB_TYPE} in
|
|
mysql) DB_PORT=${DB_PORT:-3306} ;;
|
|
pgsql) DB_PORT=${DB_PORT:-5432} ;;
|
|
*)
|
|
echo
|
|
echo "ERROR: "
|
|
echo " Please specify the database type in use via the DB_TYPE configuration option."
|
|
echo " Accepted values are \"pgsql\" or \"mysql\". Aborting..."
|
|
echo
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
# set default user and database
|
|
DB_USER=${DB_USER:-root}
|
|
DB_NAME=${DB_NAME:-nextclouddb}
|
|
}
|
|
|
|
nextcloud_finalize_php_fpm_parameters() {
|
|
# is a nextcloud-php-fpm container linked?
|
|
if [[ -n ${PHP_FPM_PORT_9000_TCP_ADDR} ]]; then
|
|
NEXTCLOUD_PHP_FPM_HOST=${NEXTCLOUD_PHP_FPM_HOST:-$PHP_FPM_PORT_9000_TCP_ADDR}
|
|
NEXTCLOUD_PHP_FPM_PORT=${NEXTCLOUD_PHP_FPM_PORT:-$PHP_FPM_PORT_9000_TCP_PORT}
|
|
fi
|
|
|
|
if [[ -z ${NEXTCLOUD_PHP_FPM_HOST} ]]; then
|
|
echo
|
|
echo "ERROR: "
|
|
echo " Please configure the php-fpm connection. Aborting..."
|
|
echo
|
|
return 1
|
|
fi
|
|
|
|
# use default php-fpm port number if it is still not set
|
|
NEXTCLOUD_PHP_FPM_PORT=${NEXTCLOUD_PHP_FPM_PORT:-9000}
|
|
}
|
|
|
|
nextcloud_check_database_connection() {
|
|
case ${DB_TYPE} in
|
|
mysql)
|
|
prog="mysqladmin -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASS:+-p$DB_PASS} status"
|
|
;;
|
|
pgsql)
|
|
prog=$(find /usr/lib/postgresql/ -name pg_isready)
|
|
prog="${prog} -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -t 1"
|
|
;;
|
|
esac
|
|
timeout=60
|
|
while ! ${prog} >/dev/null 2>&1
|
|
do
|
|
timeout=$(expr $timeout - 1)
|
|
if [[ $timeout -eq 0 ]]; then
|
|
echo
|
|
echo "Could not connect to database server. Aborting..."
|
|
return 1
|
|
fi
|
|
echo -n "."
|
|
sleep 1
|
|
done
|
|
echo
|
|
}
|
|
|
|
nextcloud_configure_database() {
|
|
echo -n "Configuring Nextcloud::database"
|
|
|
|
nextcloud_finalize_database_parameters
|
|
nextcloud_check_database_connection
|
|
|
|
if [[ -f ${NEXTCLOUD_APP_CONFIG} ]]; then
|
|
occ_cli config:system:set dbtype --value ${DB_TYPE}
|
|
occ_cli config:system:set dbhost --value ${DB_HOST}:${DB_PORT}
|
|
occ_cli config:system:set dbname --value ${DB_NAME}
|
|
occ_cli config:system:set dbuser --value ${DB_USER}
|
|
occ_cli config:system:set dbpassword --value ${DB_PASS}
|
|
fi
|
|
}
|
|
|
|
nextcloud_upgrade() {
|
|
# perform installation on firstrun
|
|
case ${DB_TYPE} in
|
|
mysql)
|
|
QUERY="SELECT count(*) FROM information_schema.tables WHERE table_schema = '${DB_NAME}';"
|
|
COUNT=$(mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASS:+-p$DB_PASS} -ss -e "${QUERY}")
|
|
;;
|
|
pgsql)
|
|
QUERY="SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public';"
|
|
COUNT=$(PGPASSWORD="${DB_PASS}" psql -h ${DB_HOST} -p ${DB_PORT} -U ${DB_USER} -d ${DB_NAME} -Atw -c "${QUERY}")
|
|
;;
|
|
esac
|
|
|
|
local update_version=false
|
|
if [[ -z ${COUNT} || ${COUNT} -eq 0 ]]; then
|
|
echo "Setting up Nextcloud for firstrun..."
|
|
mkdir -p ${NEXTCLOUD_INSTALL_DIR}/data
|
|
chown -R ${NEXTCLOUD_USER}: ${NEXTCLOUD_INSTALL_DIR}/data
|
|
|
|
occ_cli maintenance:install \
|
|
--database=${DB_TYPE} --database-host=${DB_HOST}:${DB_PORT} \
|
|
--database-name=${DB_NAME} --database-user=${DB_USER} --database-pass=${DB_PASS} \
|
|
--admin-user=${NEXTCLOUD_ADMIN_USER} --admin-pass=${NEXTCLOUD_ADMIN_PASSWORD} \
|
|
--data-dir=${NEXTCLOUD_OCDATA_DIR}
|
|
|
|
update_version=true
|
|
else
|
|
CACHE_VERSION=
|
|
[[ -f ${NEXTCLOUD_CONFIG_DIR}/VERSION ]] && CACHE_VERSION=$(cat ${NEXTCLOUD_CONFIG_DIR}/VERSION)
|
|
if [[ ${NEXTCLOUD_VERSION} != ${CACHE_VERSION} ]]; then
|
|
## version check, only upgrades are allowed
|
|
if [[ -n ${CACHE_VERSION} && $(vercmp ${NEXTCLOUD_VERSION} ${CACHE_VERSION}) -lt 0 ]]; then
|
|
echo
|
|
echo "ERROR: "
|
|
echo " Cannot downgrade from Nextcloud version ${CACHE_VERSION} to ${NEXTCLOUD_VERSION}."
|
|
echo " Only upgrades are allowed. Please use sameersbn/nextcloud:${CACHE_VERSION} or higher."
|
|
echo " Cannot continue. Aborting!"
|
|
echo
|
|
return 1
|
|
fi
|
|
|
|
echo "Upgrading Nextcloud..."
|
|
occ_cli maintenance:mode --on
|
|
occ_cli upgrade
|
|
occ_cli maintenance:mode --off
|
|
|
|
update_version=true
|
|
fi
|
|
fi
|
|
|
|
if [[ ${update_version} == true ]]; then
|
|
echo -n "${NEXTCLOUD_VERSION}" | exec_as_nextcloud tee ${NEXTCLOUD_CONFIG_DIR}/VERSION >/dev/null
|
|
fi
|
|
}
|
|
|
|
nextcloud_configure_domain() {
|
|
echo "Configuring Nextcloud::trusted_domain..."
|
|
occ_cli config:system:set trusted_domains 0 --value ${NEXTCLOUD_FQDN}
|
|
}
|
|
|
|
nextcloud_configure_max_upload_size() {
|
|
echo "Configuring Nextcloud::max_upload_size..."
|
|
set_php_param upload_max_filesize ${NEXTCLOUD_UPLOAD_MAX_FILESIZE}
|
|
set_php_param post_max_size ${NEXTCLOUD_UPLOAD_MAX_FILESIZE}
|
|
}
|
|
|
|
nextcloud_configure_max_file_uploads() {
|
|
echo "Configuring Nextcloud::max_file_uploads..."
|
|
set_php_param max_file_uploads ${NEXTCLOUD_MAX_FILE_UPLOADS}
|
|
}
|
|
|
|
nginx_configure_virtualhost() {
|
|
echo "Configuring Nextcloud virtualhost..."
|
|
nextcloud_finalize_php_fpm_parameters
|
|
update_template ${NEXTCLOUD_NGINX_CONFIG} \
|
|
NEXTCLOUD_FQDN \
|
|
NEXTCLOUD_HTTPS \
|
|
NEXTCLOUD_PHP_FPM_HOST \
|
|
NEXTCLOUD_PHP_FPM_PORT
|
|
}
|
|
|
|
backup_dump_database() {
|
|
case ${DB_TYPE} in
|
|
pgsql)
|
|
echo "Dumping PostgreSQL database ${DB_NAME}..."
|
|
PGPASSWORD=${DB_PASS} pg_dump --clean \
|
|
--host ${DB_HOST} --port ${DB_PORT} \
|
|
--username ${DB_USER} ${DB_NAME} > ${NEXTCLOUD_BACKUPS_DIR}/database.sql
|
|
;;
|
|
mysql)
|
|
echo "Dumping MySQL database ${DB_NAME}..."
|
|
MYSQL_PWD=${DB_PASS} mysqldump --lock-tables --add-drop-table \
|
|
--host ${DB_HOST} --port ${DB_PORT} \
|
|
--user ${DB_USER} ${DB_NAME} > ${NEXTCLOUD_BACKUPS_DIR}/database.sql
|
|
;;
|
|
esac
|
|
chown ${NEXTCLOUD_USER}: ${NEXTCLOUD_BACKUPS_DIR}/database.sql
|
|
exec_as_nextcloud gzip -f ${NEXTCLOUD_BACKUPS_DIR}/database.sql
|
|
}
|
|
|
|
backup_dump_directory() {
|
|
local directory=${1}
|
|
local dirname=$(basename ${directory})
|
|
local extension=${2}
|
|
|
|
echo "Dumping ${dirname}..."
|
|
exec_as_nextcloud tar -cf ${NEXTCLOUD_BACKUPS_DIR}/${dirname}${extension} -C ${directory} .
|
|
}
|
|
|
|
backup_dump_information() {
|
|
(
|
|
echo "info:"
|
|
echo " nextcloud_version: ${NEXTCLOUD_VERSION}"
|
|
echo " database_adapter: $(occ_cli config:system:get dbtype)"
|
|
echo " created_at: $(date)"
|
|
) > ${NEXTCLOUD_BACKUPS_DIR}/backup_information.yml
|
|
chown ${NEXTCLOUD_USER}: ${NEXTCLOUD_BACKUPS_DIR}/backup_information.yml
|
|
}
|
|
|
|
backup_create_archive() {
|
|
local tar_file="$(date +%s)_nextcloud_backup.tar"
|
|
|
|
echo "Creating backup archive: ${tar_file}..."
|
|
exec_as_nextcloud tar -cf ${NEXTCLOUD_BACKUPS_DIR}/${tar_file} -C ${NEXTCLOUD_BACKUPS_DIR} $@
|
|
exec_as_nextcloud chmod 0755 ${NEXTCLOUD_BACKUPS_DIR}/${tar_file}
|
|
|
|
for f in $@
|
|
do
|
|
exec_as_nextcloud rm -rf ${NEXTCLOUD_BACKUPS_DIR}/${f}
|
|
done
|
|
}
|
|
|
|
backup_purge_expired() {
|
|
if [[ ${NEXTCLOUD_BACKUPS_EXPIRY} -gt 0 ]]; then
|
|
echo -n "Deleting old backups... "
|
|
local removed=0
|
|
local now=$(date +%s)
|
|
local cutoff=$(expr ${now} - ${NEXTCLOUD_BACKUPS_EXPIRY})
|
|
for backup in $(ls ${NEXTCLOUD_BACKUPS_DIR}/*_nextcloud_backup.tar)
|
|
do
|
|
local timestamp=$(stat -c %Y ${backup})
|
|
if [[ ${timestamp} -lt ${cutoff} ]]; then
|
|
rm ${backup}
|
|
removed=$(expr ${removed} + 1)
|
|
fi
|
|
done
|
|
echo "(${removed} removed)"
|
|
fi
|
|
}
|
|
|
|
backup_restore_unpack() {
|
|
local backup=${1}
|
|
echo "Unpacking ${backup}..."
|
|
tar xf ${NEXTCLOUD_BACKUPS_DIR}/${backup} -C ${NEXTCLOUD_BACKUPS_DIR}
|
|
}
|
|
|
|
backup_restore_validate() {
|
|
eval $(parse_yaml ${NEXTCLOUD_BACKUPS_DIR}/backup_information.yml backup_)
|
|
|
|
## version check
|
|
if [[ $(vercmp ${NEXTCLOUD_VERSION} ${backup_info_nextcloud_version}) -lt 0 ]]; then
|
|
echo
|
|
echo "ERROR: "
|
|
echo " Cannot restore backup for version ${backup_info_nextcloud_version} on a ${NEXTCLOUD_VERSION} instance."
|
|
echo " You can only restore backups generated for versions <= ${NEXTCLOUD_VERSION}."
|
|
echo " Please use sameersbn/nextcloud:${backup_info_nextcloud_version} to restore this backup."
|
|
echo " Cannot continue. Aborting!"
|
|
echo
|
|
return 1
|
|
fi
|
|
|
|
## database adapter check
|
|
if [[ ${DB_TYPE} != ${backup_info_database_adapter} ]]; then
|
|
echo
|
|
echo "ERROR:"
|
|
echo " Your current setup uses the ${DB_TYPE} adapter, while the database"
|
|
echo " backup was generated with the ${backup_info_database_adapter} adapter."
|
|
echo " Cannot continue. Aborting!"
|
|
echo
|
|
return 1
|
|
fi
|
|
exec_as_nextcloud rm -rf ${NEXTCLOUD_BACKUPS_DIR}/backup_information.yml
|
|
}
|
|
|
|
backup_restore_database() {
|
|
case ${DB_TYPE} in
|
|
pgsql)
|
|
echo "Restoring PostgreSQL database..."
|
|
gzip -dc ${NEXTCLOUD_BACKUPS_DIR}/database.sql.gz | \
|
|
PGPASSWORD=${DB_PASS} psql \
|
|
--host ${DB_HOST} --port ${DB_PORT} \
|
|
--username ${DB_USER} ${DB_NAME}
|
|
;;
|
|
mysql)
|
|
echo "Restoring MySQL database..."
|
|
gzip -dc ${NEXTCLOUD_BACKUPS_DIR}/database.sql.gz | \
|
|
MYSQL_PWD=${DB_PASS} mysql \
|
|
--host ${DB_HOST} --port ${DB_PORT} \
|
|
--user ${DB_USER} ${DB_NAME}
|
|
;;
|
|
*)
|
|
echo "Database type ${DB_TYPE} not supported."
|
|
return 1
|
|
;;
|
|
esac
|
|
exec_as_nextcloud rm -rf ${NEXTCLOUD_BACKUPS_DIR}/database.sql.gz
|
|
}
|
|
|
|
backup_restore_directory() {
|
|
local directory=${1}
|
|
local dirname=$(basename ${directory})
|
|
local extension=${2}
|
|
|
|
echo "Restoring ${dirname}..."
|
|
files=($(shopt -s nullglob;shopt -s dotglob;echo ${directory}/*))
|
|
if [[ ${#files[@]} -gt 0 ]]; then
|
|
exec_as_nextcloud mv ${directory} ${directory}.$(date +%s)
|
|
else
|
|
exec_as_nextcloud rm -rf ${directory}
|
|
fi
|
|
exec_as_nextcloud mkdir -p ${directory}
|
|
exec_as_nextcloud tar -xf ${NEXTCLOUD_BACKUPS_DIR}/${dirname}${extension} -C ${directory}
|
|
exec_as_nextcloud rm -rf ${NEXTCLOUD_BACKUPS_DIR}/${dirname}${extension}
|
|
}
|
|
|
|
install_configuration_templates() {
|
|
echo "Installing configuration templates..."
|
|
if [[ -d /etc/nginx/sites-enabled && ! -f ${NEXTCLOUD_NGINX_CONFIG} ]]; then
|
|
install_template root: nginx/Nextcloud.conf ${NEXTCLOUD_NGINX_CONFIG} 0644
|
|
update_template ${NEXTCLOUD_NGINX_CONFIG} NEXTCLOUD_INSTALL_DIR
|
|
fi
|
|
}
|
|
|
|
initialize_datadir() {
|
|
echo "Initializing datadir..."
|
|
chmod 0755 ${NEXTCLOUD_DATA_DIR}
|
|
chown ${NEXTCLOUD_USER}: ${NEXTCLOUD_DATA_DIR}
|
|
|
|
# create ocdata directory
|
|
mkdir -p ${NEXTCLOUD_OCDATA_DIR}
|
|
chown -R ${NEXTCLOUD_USER}: ${NEXTCLOUD_OCDATA_DIR}
|
|
chmod -R 0750 ${NEXTCLOUD_OCDATA_DIR}
|
|
|
|
# create config directory
|
|
mkdir -p ${NEXTCLOUD_CONFIG_DIR}
|
|
chown -R ${NEXTCLOUD_USER}: ${NEXTCLOUD_CONFIG_DIR}
|
|
chmod -R 0750 ${NEXTCLOUD_CONFIG_DIR}
|
|
|
|
# create backups directory
|
|
mkdir -p ${NEXTCLOUD_BACKUPS_DIR}
|
|
chmod -R 0755 ${NEXTCLOUD_BACKUPS_DIR}
|
|
chown -R ${NEXTCLOUD_USER}: ${NEXTCLOUD_BACKUPS_DIR}
|
|
|
|
# symlink to config/config.php -> ${NEXTCLOUD_APP_CONFIG}
|
|
ln -sf ${NEXTCLOUD_APP_CONFIG} ${NEXTCLOUD_INSTALL_DIR}/config/config.php
|
|
}
|
|
|
|
initialize_system() {
|
|
initialize_datadir
|
|
install_configuration_templates
|
|
}
|
|
|
|
configure_nextcloud() {
|
|
echo "Configuring Nextcloud..."
|
|
nextcloud_configure_database
|
|
nextcloud_upgrade
|
|
nextcloud_configure_domain
|
|
nextcloud_configure_max_upload_size
|
|
nextcloud_configure_max_file_uploads
|
|
|
|
if [[ -f ${NEXTCLOUD_APP_CONFIG} ]]; then
|
|
occ_cli maintenance:mode --quiet --off
|
|
fi
|
|
}
|
|
|
|
configure_nginx() {
|
|
echo "Configuring nginx..."
|
|
nginx_configure_virtualhost
|
|
}
|
|
|
|
backup_create() {
|
|
echo -n "Checking database connection"
|
|
nextcloud_finalize_database_parameters
|
|
nextcloud_check_database_connection
|
|
|
|
occ_cli maintenance:mode --on
|
|
backup_dump_database
|
|
backup_dump_directory ${NEXTCLOUD_CONFIG_DIR} .tar.gz
|
|
backup_dump_directory ${NEXTCLOUD_OCDATA_DIR} .tar
|
|
backup_dump_information
|
|
backup_create_archive backup_information.yml database.sql.gz config.tar.gz ocdata.tar
|
|
backup_purge_expired
|
|
occ_cli maintenance:mode --off
|
|
}
|
|
|
|
backup_restore() {
|
|
local tar_file=
|
|
local interactive=true
|
|
for arg in $@
|
|
do
|
|
if [[ $arg == BACKUP=* ]]; then
|
|
tar_file=${arg##BACKUP=}
|
|
interactive=false
|
|
break
|
|
fi
|
|
done
|
|
|
|
# user needs to select the backup to restore
|
|
if [[ $interactive == true ]]; then
|
|
num_backups=$(ls ${NEXTCLOUD_BACKUPS_DIR}/*_nextcloud_backup.tar | wc -l)
|
|
if [[ $num_backups -eq 0 ]]; then
|
|
echo "No backups exist at ${NEXTCLOUD_BACKUPS_DIR}. Cannot continue."
|
|
return 1
|
|
fi
|
|
|
|
echo
|
|
for b in $(ls ${NEXTCLOUD_BACKUPS_DIR} | grep _nextcloud_backup.tar | sort -r)
|
|
do
|
|
echo "‣ $b (created at $(date --date="@${b%%_nextcloud_backup.tar}" +'%d %b, %G - %H:%M:%S %Z'))"
|
|
done
|
|
echo
|
|
|
|
read -p "Select a backup to restore: " tar_file
|
|
|
|
if [[ -z ${tar_file} ]]; then
|
|
echo "Backup not specified. Exiting..."
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -f ${NEXTCLOUD_BACKUPS_DIR}/${tar_file} ]]; then
|
|
echo "Specified backup does not exist. Aborting..."
|
|
return 1
|
|
fi
|
|
|
|
echo -n "Checking database connection"
|
|
nextcloud_finalize_database_parameters
|
|
nextcloud_check_database_connection
|
|
|
|
backup_restore_unpack ${tar_file}
|
|
backup_restore_validate
|
|
backup_restore_database
|
|
backup_restore_directory ${NEXTCLOUD_CONFIG_DIR} .tar.gz
|
|
backup_restore_directory ${NEXTCLOUD_OCDATA_DIR} .tar
|
|
}
|