mirror of
https://github.com/nextcloud/nextcloudpi.git
synced 2026-01-10 15:12:01 -03:30
Move ncp-backup and ncp-restore to separate files (instead relying on cat during installation)
Signed-off-by: Tobias K <6317548+theCalcaholic@users.noreply.github.com> Signed-off-by: Tobias Knöppler <6317548+theCalcaholic@users.noreply.github.com>
This commit is contained in:
parent
2072f77720
commit
cde1b44063
104
bin/ncp-backup
Executable file
104
bin/ncp-backup
Executable file
@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
set -eE
|
||||
source /usr/local/etc/library.sh
|
||||
|
||||
if [ "$1" = "--help" ]; then
|
||||
echo "$0 <destdir> <includedata> <compress> <backuplimit>"
|
||||
echo " <includedata> and <compress> are 'yes' or 'no'"
|
||||
echo " <backuplimit> integer >= 1 or 0 for no limit"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
destdir="${1:-/media/USBdrive/ncp-backups}"
|
||||
includedata="${2:-no}"
|
||||
compress="${3:-no}"
|
||||
backuplimit="${4:-0}"
|
||||
|
||||
destfile="$destdir"/nextcloud-bkp_$( date +"%Y%m%d_%s" ).tar
|
||||
dbbackup=nextcloud-sqlbkp_$( date +"%Y%m%d" ).bak
|
||||
[[ -f /.docker-image ]] && basedir=/data || basedir=/var/www
|
||||
|
||||
[[ "$compress" == "yes" ]] && destfile="$destfile".gz
|
||||
|
||||
datadir=$( get_nc_config_value datadirectory ) || {
|
||||
echo "Error reading data directory. Is NextCloud running and configured?";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
cleanup(){ local ret=$?; rm -f "${dbbackup}" ; restore_maintenance_mode; exit $ret; }
|
||||
fail() { local ret=$?; echo "Abort..." ; rm -f "${dbbackup}" "${destfile}"; restore_maintenance_mode; exit $ret; }
|
||||
trap cleanup EXIT
|
||||
trap fail INT TERM HUP ERR
|
||||
|
||||
echo "check free space..." # allow at least ~500 extra MiB
|
||||
mkdir -p "$destdir"
|
||||
nsize=$(du -sb "$basedir/nextcloud" | awk '{ print $1 }')
|
||||
[[ -d "$basedir/nextcloud"/data ]] && \
|
||||
dsize=$(du -sb "$basedir/nextcloud"/data | awk '{ print $1 }')
|
||||
margin=$((500*1024*1024)) # safety margin for database and some extra
|
||||
if [[ "$includedata" == "yes" ]]; then
|
||||
datasize=$(du -sb "$datadir" | awk '{ print $1 }')
|
||||
size=$((nsize - dsize + margin + datasize))
|
||||
else
|
||||
size=$((nsize - dsize + margin))
|
||||
fi
|
||||
free=$( df -B1 "$destdir" | tail -1 | awk '{ print $4 }' )
|
||||
|
||||
[ $size -ge $free ] && {
|
||||
echo "free space check failed. Need $size Bytes";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# delete older backups
|
||||
[[ $backuplimit != 0 ]] && {
|
||||
numbkps=$( ls "$destdir"/nextcloud-bkp_* 2>/dev/null | wc -l )
|
||||
[[ $numbkps -ge $backuplimit ]] && \
|
||||
ls -t $destdir/nextcloud-bkp_* | tail -$(( numbkps - backuplimit + 1 )) | while read -r f; do
|
||||
echo "clean up old backup $f"
|
||||
rm "$f"
|
||||
done
|
||||
}
|
||||
|
||||
# database
|
||||
save_maintenance_mode
|
||||
cd "$basedir" || exit 1
|
||||
echo "backup database..."
|
||||
mysqldump -u root --single-transaction nextcloud > "$dbbackup"
|
||||
|
||||
# files
|
||||
echo "backup files..."
|
||||
[[ "$includedata" == "yes" ]] && data="$(basename "$datadir")"
|
||||
[[ "$compress" == "yes" ]] && compress_arg="-I pigz"
|
||||
mkdir -p "$destdir"
|
||||
tar $compress_arg -cf "$destfile" \
|
||||
\
|
||||
"$dbbackup" \
|
||||
\
|
||||
--exclude "$data/.opcache" \
|
||||
--exclude "$data/{access,error,nextcloud}.log" \
|
||||
--exclude "$data/access.log" \
|
||||
--exclude "$data/ncp-update-backups" \
|
||||
-C "$(dirname "$datadir"/)" $data \
|
||||
\
|
||||
--exclude "nextcloud/data/*/files/*" \
|
||||
--exclude "nextcloud/data/.opcache" \
|
||||
--exclude "nextcloud/data/{access,error,nextcloud}.log" \
|
||||
--exclude "nextcloud/data/access.log" \
|
||||
--exclude "nextcloud/data/appdata_*/preview/*" \
|
||||
--exclude "nextcloud/data/*/uploads/*" \
|
||||
--exclude "nextcloud/data/*/cache/*" \
|
||||
--exclude "nextcloud/data/*/files_trashbin/*" \
|
||||
--exclude "nextcloud/data/*/files_versions/*" \
|
||||
--exclude "nextcloud/data/ncp-update-backups" \
|
||||
--exclude "nextcloud/data/__groupfolders" \
|
||||
--exclude "nextcloud/.data_*" \
|
||||
-C $basedir nextcloud/ \
|
||||
|| {
|
||||
echo "error generating backup"
|
||||
exit 1
|
||||
}
|
||||
rm "$dbbackup"
|
||||
chmod 640 "$destfile"
|
||||
chown :www-data "$destfile"
|
||||
|
||||
echo "backup $destfile generated"
|
||||
184
bin/ncp-restore
Executable file
184
bin/ncp-restore
Executable file
@ -0,0 +1,184 @@
|
||||
#!/bin/bash
|
||||
set -eE
|
||||
|
||||
BACKUPFILE="$1"
|
||||
|
||||
DBADMIN=ncadmin
|
||||
DBPASSWD="$( grep password /root/.my.cnf | sed 's|password=||' )"
|
||||
|
||||
source /usr/local/etc/library.sh # sets PHPVER
|
||||
|
||||
DIR="$( cd "$( dirname "$BACKUPFILE" )" &>/dev/null && pwd )" #abspath
|
||||
|
||||
[[ -f /.docker-image ]] && NCDIR=/data/nextcloud || NCDIR=/var/www/nextcloud
|
||||
|
||||
[[ $# -eq 0 ]] && { echo "missing first argument" ; exit 1; }
|
||||
[[ -f "$BACKUPFILE" ]] || { echo "$BACKUPFILE not found" ; exit 1; }
|
||||
[[ "$DIR" =~ "$NCDIR".* ]] && { echo "Refusing to restore from $NCDIR"; exit 1; }
|
||||
|
||||
TMPDIR="$( mktemp -d "$( dirname "$BACKUPFILE" )"/ncp-restore.XXXXXX )" || { echo "Failed to create temp dir" >&2; exit 1; }
|
||||
grep -q -e ext -e btrfs -e zfs <( stat -fc%T "$TMPDIR" ) || { echo "Can only restore from ext/btrfs/zfs filesystems (found '$(stat -fc%T "${TMPDIR}")" >&2; exit 1; }
|
||||
|
||||
TMPDIR="$( cd "$TMPDIR" &>/dev/null && pwd )" || { echo "$TMPDIR not found"; exit 1; } #abspath
|
||||
cleanup(){ local RET=$?; echo "Cleanup..."; rm -rf "${TMPDIR}"; trap "" EXIT; exit $RET; }
|
||||
trap cleanup INT TERM HUP ERR EXIT
|
||||
rm -rf "$TMPDIR" && mkdir -p "$TMPDIR"
|
||||
|
||||
[[ "$BACKUPFILE" =~ .*".tar.gz" ]] && compress_arg="-I pigz"
|
||||
|
||||
# CHECK FREE SPACE IN $TMPDIR
|
||||
echo "check free space..." # allow at least ~100 extra MiB
|
||||
extractedsize=$(tar $compress_arg -tvf "$BACKUPFILE" | awk '{s+=$3} END{printf "%.0f", (s/1024)}') # Size of extracted files in "KB"
|
||||
size=$(($extractedsize + 100*1024))
|
||||
free=$( df "$TMPDIR" | tail -1 | awk '{ print $4 }' )
|
||||
[ $size -ge $free ] && {
|
||||
echo "free space check failed. Need $size KB in $TMPDIR";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# EXTRACT FILES
|
||||
echo "extracting backup file $BACKUPFILE..."
|
||||
tar $compress_arg -xf "$BACKUPFILE" -C "$TMPDIR" || exit 1
|
||||
|
||||
## SANITY CHECKS
|
||||
[[ -d "$TMPDIR"/nextcloud ]] && [[ -f "$( ls "$TMPDIR"/nextcloud-sqlbkp_*.bak 2>/dev/null )" ]] || {
|
||||
echo "invalid backup file. Abort"
|
||||
exit 1
|
||||
}
|
||||
|
||||
## RESTORE FILES
|
||||
|
||||
echo "restore files..."
|
||||
[[ -d "$NCDIR/data" ]] && {
|
||||
DATA_BKP_DIR="$(mktemp -d -p "$NCDIR/.." nc-data-XXXXXX)"
|
||||
mv -T "$NCDIR/data" "$DATA_BKP_DIR/"
|
||||
}
|
||||
rm -rf "$NCDIR"
|
||||
mv -T "$TMPDIR"/nextcloud "$NCDIR" || { echo "Error restoring base files"; exit 1; }
|
||||
|
||||
if [[ -n "$DATA_BKP_DIR" ]]
|
||||
then
|
||||
echo "Restoring $NCDIR/data..."
|
||||
target="$NCDIR/data"
|
||||
[[ -d "$target" ]] && target="$NCDIR/.data_$(date)"
|
||||
mv -T "$DATA_BKP_DIR" "$target"
|
||||
else
|
||||
echo "Dataless backup detected - not restoring data"
|
||||
fi
|
||||
|
||||
# update NC database password to this instance
|
||||
sed -i "s|'dbpassword' =>.*|'dbpassword' => '$DBPASSWD',|" /var/www/nextcloud/config/config.php
|
||||
|
||||
# update redis credentials
|
||||
REDISPASS="$( grep "^requirepass" /etc/redis/redis.conf | cut -f2 -d' ' )"
|
||||
[[ "$REDISPASS" != "" ]] && \
|
||||
sed -i "s|'password'.*|'password' => '$REDISPASS',|" /var/www/nextcloud/config/config.php
|
||||
service redis-server restart
|
||||
|
||||
## RE-CREATE DATABASE TABLE
|
||||
|
||||
echo "restore database..."
|
||||
mysql -u root <<EOFMYSQL
|
||||
DROP DATABASE IF EXISTS nextcloud;
|
||||
CREATE DATABASE nextcloud;
|
||||
GRANT USAGE ON *.* TO '$DBADMIN'@'localhost' IDENTIFIED BY '$DBPASSWD';
|
||||
DROP USER '$DBADMIN'@'localhost';
|
||||
CREATE USER '$DBADMIN'@'localhost' IDENTIFIED BY '$DBPASSWD';
|
||||
GRANT ALL PRIVILEGES ON nextcloud.* TO $DBADMIN@localhost;
|
||||
EXIT
|
||||
EOFMYSQL
|
||||
[ $? -ne 0 ] && { echo "Error configuring nextcloud database"; exit 1; }
|
||||
|
||||
mysql -u root nextcloud < "$TMPDIR"/nextcloud-sqlbkp_*.bak || { echo "Error restoring nextcloud database"; exit 1; }
|
||||
|
||||
## RESTORE DATADIR
|
||||
|
||||
if is_docker; then
|
||||
DATADIR=/data/nextcloud/data
|
||||
else
|
||||
DATADIR="$(get_nc_config_value datadirectory)"
|
||||
fi
|
||||
[[ "$DATADIR" == "" ]] && { echo "Error reading data directory"; exit 1; }
|
||||
|
||||
cd "$NCDIR"
|
||||
|
||||
### INCLUDEDATA=yes situation
|
||||
|
||||
NUMFILES=2
|
||||
if [[ $( ls "$TMPDIR" | wc -l ) -eq $NUMFILES ]]; then
|
||||
|
||||
[[ -e "$DATADIR" ]] && {
|
||||
echo "backing up existing $DATADIR to $DATADIR-$( date "+%m-%d-%y" )..."
|
||||
mv "$DATADIR" "$DATADIR-$( date "+%m-%d-%y" )" || exit 1
|
||||
}
|
||||
|
||||
echo "restore datadir to $DATADIR..."
|
||||
|
||||
mkdir -p "$DATADIR"
|
||||
grep -q "btrfs" <(stat -fc%T "$DATADIR") && which btrfs &>/dev/null && {
|
||||
rmdir "$DATADIR" || exit 1
|
||||
btrfs subvolume create "$DATADIR" || exit 1
|
||||
}
|
||||
chown www-data: "$DATADIR"
|
||||
TMPDATA="$TMPDIR/$( basename "$DATADIR" )"
|
||||
mv "$TMPDATA"/* "$TMPDATA"/.[!.]* "$DATADIR" || exit 1
|
||||
rmdir "$TMPDATA" || exit 1
|
||||
|
||||
ncc maintenance:mode --off
|
||||
|
||||
### INCLUDEDATA=no situation
|
||||
|
||||
else
|
||||
echo "No datadir found in backup"
|
||||
|
||||
[[ -e "$DATADIR" ]] || {
|
||||
echo "${DATADIR} not found. Resetting to ${NCDIR}/data"
|
||||
DATADIR="$NCDIR"/data
|
||||
mkdir -p "${DATADIR}"
|
||||
touch "${DATADIR}"/.ocdata
|
||||
chown -R www-data: "${DATADIR}"
|
||||
}
|
||||
|
||||
ncc maintenance:mode --off
|
||||
ncc files:scan --all
|
||||
|
||||
# cache needs to be cleaned as of NC 12
|
||||
NEED_RESTART=1
|
||||
fi
|
||||
|
||||
sed -i "s|'datadirectory' =>.*|'datadirectory' => '${DATADIR}',|" "${NCDIR}"/config/config.php
|
||||
|
||||
# Just in case we moved the opcache dir
|
||||
install_template "php/opcache.ini.sh" "/etc/php/${PHPVER}/mods-available/opcache.ini"
|
||||
|
||||
# tmp upload dir
|
||||
mkdir -p "$DATADIR/tmp"
|
||||
chown www-data: "$DATADIR/tmp"
|
||||
ncc config:system:set tempdirectory --value "$DATADIR/tmp"
|
||||
sed -i "s|^;\?upload_tmp_dir =.*$|upload_tmp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/cli/php.ini
|
||||
sed -i "s|^;\?upload_tmp_dir =.*$|upload_tmp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/fpm/php.ini
|
||||
sed -i "s|^;\?sys_temp_dir =.*$|sys_temp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/fpm/php.ini
|
||||
|
||||
# logs
|
||||
ncc config:system:set logfile --value="$DATADIR/nextcloud.log"
|
||||
|
||||
# update fail2ban logpath
|
||||
[[ -f /etc/fail2ban/jail.conf ]] && {
|
||||
sed -i "s|logpath =.*|logpath = $DATADIR/nextcloud.log|" /etc/fail2ban/jail.conf
|
||||
pgrep fail2ban &>/dev/null && service fail2ban restart
|
||||
}
|
||||
|
||||
# refresh nextcloud trusted domains
|
||||
bash /usr/local/bin/nextcloud-domain.sh
|
||||
|
||||
# update the systems data-fingerprint
|
||||
ncc maintenance:data-fingerprint
|
||||
|
||||
# refresh thumbnails
|
||||
ncc files:scan-app-data
|
||||
|
||||
# restart PHP if needed
|
||||
[[ "$NEED_RESTART" == "1" ]] && {
|
||||
clear_opcache
|
||||
bash -c "sleep 3; service php${PHPVER}-fpm restart" &>/dev/null &
|
||||
}
|
||||
@ -19,114 +19,8 @@ install()
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends pigz
|
||||
|
||||
cat > /usr/local/bin/ncp-backup <<'EOF'
|
||||
#!/bin/bash
|
||||
set -eE
|
||||
source /usr/local/etc/library.sh
|
||||
|
||||
if [ "$1" = "--help" ]; then
|
||||
echo "$0 <destdir> <includedata> <compress> <backuplimit>"
|
||||
echo " <includedata> and <compress> are 'yes' or 'no'"
|
||||
echo " <backuplimit> integer >= 1 or 0 for no limit"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
destdir="${1:-/media/USBdrive/ncp-backups}"
|
||||
includedata="${2:-no}"
|
||||
compress="${3:-no}"
|
||||
backuplimit="${4:-0}"
|
||||
|
||||
destfile="$destdir"/nextcloud-bkp_$( date +"%Y%m%d_%s" ).tar
|
||||
dbbackup=nextcloud-sqlbkp_$( date +"%Y%m%d" ).bak
|
||||
occ="sudo -u www-data php /var/www/nextcloud/occ"
|
||||
[[ -f /.docker-image ]] && basedir=/data || basedir=/var/www
|
||||
|
||||
[[ "$compress" == "yes" ]] && destfile="$destfile".gz
|
||||
|
||||
datadir=$( get_nc_config_value datadirectory ) || {
|
||||
echo "Error reading data directory. Is NextCloud running and configured?";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
cleanup(){ local ret=$?; rm -f "${dbbackup}" ; restore_maintenance_mode; exit $ret; }
|
||||
fail() { local ret=$?; echo "Abort..." ; rm -f "${dbbackup}" "${destfile}"; restore_maintenance_mode; exit $ret; }
|
||||
trap cleanup EXIT
|
||||
trap fail INT TERM HUP ERR
|
||||
|
||||
echo "check free space..." # allow at least ~500 extra MiB
|
||||
mkdir -p "$destdir"
|
||||
nsize=$(du -sb "$basedir/nextcloud" | awk '{ print $1 }')
|
||||
[[ -d "$basedir/nextcloud"/data ]] && \
|
||||
dsize=$(du -sb "$basedir/nextcloud"/data | awk '{ print $1 }')
|
||||
margin=$((500*1024*1024)) # safety margin for database and some extra
|
||||
if [[ "$includedata" == "yes" ]]; then
|
||||
datasize=$(du -sb "$datadir" | awk '{ print $1 }')
|
||||
size=$((nsize - dsize + margin + datasize))
|
||||
else
|
||||
size=$((nsize - dsize + margin))
|
||||
fi
|
||||
free=$( df -B1 "$destdir" | tail -1 | awk '{ print $4 }' )
|
||||
|
||||
[ $size -ge $free ] && {
|
||||
echo "free space check failed. Need $size Bytes";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# delete older backups
|
||||
[[ $backuplimit != 0 ]] && {
|
||||
numbkps=$( ls "$destdir"/nextcloud-bkp_* 2>/dev/null | wc -l )
|
||||
[[ $numbkps -ge $backuplimit ]] && \
|
||||
ls -t $destdir/nextcloud-bkp_* | tail -$(( numbkps - backuplimit + 1 )) | while read -r f; do
|
||||
echo "clean up old backup $f"
|
||||
rm "$f"
|
||||
done
|
||||
}
|
||||
|
||||
# database
|
||||
save_maintenance_mode
|
||||
cd "$basedir" || exit 1
|
||||
echo "backup database..."
|
||||
mysqldump -u root --single-transaction nextcloud > "$dbbackup"
|
||||
|
||||
# files
|
||||
echo "backup files..."
|
||||
[[ "$includedata" == "yes" ]] && data="$(basename "$datadir")"
|
||||
[[ "$compress" == "yes" ]] && compress_arg="-I pigz"
|
||||
mkdir -p "$destdir"
|
||||
tar $compress_arg -cf "$destfile" \
|
||||
\
|
||||
"$dbbackup" \
|
||||
\
|
||||
--exclude "$data/.opcache" \
|
||||
--exclude "$data/{access,error,nextcloud}.log" \
|
||||
--exclude "$data/access.log" \
|
||||
--exclude "$data/ncp-update-backups" \
|
||||
-C "$(dirname "$datadir"/)" $data \
|
||||
\
|
||||
--exclude "nextcloud/data/*/files/*" \
|
||||
--exclude "nextcloud/data/.opcache" \
|
||||
--exclude "nextcloud/data/{access,error,nextcloud}.log" \
|
||||
--exclude "nextcloud/data/access.log" \
|
||||
--exclude "nextcloud/data/appdata_*/preview/*" \
|
||||
--exclude "nextcloud/data/*/uploads/*" \
|
||||
--exclude "nextcloud/data/*/cache/*" \
|
||||
--exclude "nextcloud/data/*/files_trashbin/*" \
|
||||
--exclude "nextcloud/data/*/files_versions/*" \
|
||||
--exclude "nextcloud/data/ncp-update-backups" \
|
||||
--exclude "nextcloud/data/__groupfolders" \
|
||||
--exclude "nextcloud/.data_*" \
|
||||
-C $basedir nextcloud/ \
|
||||
|| {
|
||||
echo "error generating backup"
|
||||
exit 1
|
||||
}
|
||||
rm "$dbbackup"
|
||||
chmod 640 "$destfile"
|
||||
chown :www-data "$destfile"
|
||||
|
||||
echo "backup $destfile generated"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/ncp-backup
|
||||
ln -s /usr/local/bin/ncp-backup /usr/local/bin/ncp/ncp-backup
|
||||
chmod +x /usr/local/bin/ncp/ncp-backup
|
||||
}
|
||||
|
||||
configure()
|
||||
|
||||
@ -11,202 +11,8 @@
|
||||
|
||||
install()
|
||||
{
|
||||
cat > /usr/local/bin/ncp-restore <<'EOF'
|
||||
#!/bin/bash
|
||||
set -eE
|
||||
|
||||
BACKUPFILE="$1"
|
||||
|
||||
DBADMIN=ncadmin
|
||||
DBPASSWD="$( grep password /root/.my.cnf | sed 's|password=||' )"
|
||||
|
||||
source /usr/local/etc/library.sh # sets PHPVER
|
||||
|
||||
DIR="$( cd "$( dirname "$BACKUPFILE" )" &>/dev/null && pwd )" #abspath
|
||||
|
||||
[[ -f /.docker-image ]] && NCDIR=/data/nextcloud || NCDIR=/var/www/nextcloud
|
||||
|
||||
[[ $# -eq 0 ]] && { echo "missing first argument" ; exit 1; }
|
||||
[[ -f "$BACKUPFILE" ]] || { echo "$BACKUPFILE not found" ; exit 1; }
|
||||
[[ "$DIR" =~ "$NCDIR" ]] && { echo "Refusing to restore from $NCDIR"; exit 1; }
|
||||
|
||||
TMPDIR="$( mktemp -d "$( dirname "$BACKUPFILE" )"/ncp-restore.XXXXXX )" || { echo "Failed to create temp dir" >&2; exit 1; }
|
||||
grep -q -e ext -e btrfs -e zfs <( stat -fc%T "$TMPDIR" ) || { echo "Can only restore from ext/btrfs/zfs filesystems (found '$(stat -fc%T "${TMPDIR}")" >&2; exit 1; }
|
||||
|
||||
TMPDIR="$( cd "$TMPDIR" &>/dev/null && pwd )" || { echo "$TMPDIR not found"; exit 1; } #abspath
|
||||
cleanup(){ local RET=$?; echo "Cleanup..."; rm -rf "${TMPDIR}"; trap "" EXIT; exit $RET; }
|
||||
trap cleanup INT TERM HUP ERR EXIT
|
||||
rm -rf "$TMPDIR" && mkdir -p "$TMPDIR"
|
||||
|
||||
[[ "$BACKUPFILE" =~ ".tar.gz" ]] && compress_arg="-I pigz"
|
||||
|
||||
# CHECK FREE SPACE IN $TMPDIR
|
||||
echo "check free space..." # allow at least ~100 extra MiB
|
||||
extractedsize=$(tar $compress_arg -tvf "$BACKUPFILE" | awk '{s+=$3} END{printf "%.0f", (s/1024)}') # Size of extracted files in "KB"
|
||||
size=$(($extractedsize + 100*1024))
|
||||
free=$( df "$TMPDIR" | tail -1 | awk '{ print $4 }' )
|
||||
[ $size -ge $free ] && {
|
||||
echo "free space check failed. Need $size KB in $TMPDIR";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# EXTRACT FILES
|
||||
echo "extracting backup file $BACKUPFILE..."
|
||||
tar $compress_arg -xf "$BACKUPFILE" -C "$TMPDIR" || exit 1
|
||||
|
||||
## SANITY CHECKS
|
||||
[[ -d "$TMPDIR"/nextcloud ]] && [[ -f "$( ls "$TMPDIR"/nextcloud-sqlbkp_*.bak 2>/dev/null )" ]] || {
|
||||
echo "invalid backup file. Abort"
|
||||
exit 1
|
||||
}
|
||||
|
||||
## RESTORE FILES
|
||||
|
||||
echo "restore files..."
|
||||
[[ -d "$NCDIR/data" ]] && {
|
||||
DATA_BKP_DIR="$(mktemp -d -p "$NCDIR/.." nc-data-XXXXXX)"
|
||||
mv -T "$NCDIR/data" "$DATA_BKP_DIR/"
|
||||
}
|
||||
rm -rf "$NCDIR"
|
||||
mv -T "$TMPDIR"/nextcloud "$NCDIR" || { echo "Error restoring base files"; exit 1; }
|
||||
|
||||
if [[ -n "$DATA_BKP_DIR" ]]
|
||||
then
|
||||
echo "Restoring $NCDIR/data..."
|
||||
target="$NCDIR/data"
|
||||
[[ -d "$target" ]] && target="$NCDIR/.data_$(date)"
|
||||
mv -T "$DATA_BKP_DIR" "$target"
|
||||
else
|
||||
echo "Not overwriting data directory"
|
||||
fi
|
||||
|
||||
if [[ -n "$DATA_BKP_DIR" ]]
|
||||
then
|
||||
echo "Restoring $NCDIR/data..."
|
||||
target="$NCDIR/data"
|
||||
[[ -d "$target" ]] && target="$NCDIR/.data_$(date)"
|
||||
mv -T "$DATA_BKP_DIR" "$target"
|
||||
else
|
||||
fi
|
||||
|
||||
# update NC database password to this instance
|
||||
sed -i "s|'dbpassword' =>.*|'dbpassword' => '$DBPASSWD',|" /var/www/nextcloud/config/config.php
|
||||
|
||||
# update redis credentials
|
||||
REDISPASS="$( grep "^requirepass" /etc/redis/redis.conf | cut -f2 -d' ' )"
|
||||
[[ "$REDISPASS" != "" ]] && \
|
||||
sed -i "s|'password'.*|'password' => '$REDISPASS',|" /var/www/nextcloud/config/config.php
|
||||
service redis-server restart
|
||||
|
||||
## RE-CREATE DATABASE TABLE
|
||||
|
||||
echo "restore database..."
|
||||
mysql -u root <<EOFMYSQL
|
||||
DROP DATABASE IF EXISTS nextcloud;
|
||||
CREATE DATABASE nextcloud;
|
||||
GRANT USAGE ON *.* TO '$DBADMIN'@'localhost' IDENTIFIED BY '$DBPASSWD';
|
||||
DROP USER '$DBADMIN'@'localhost';
|
||||
CREATE USER '$DBADMIN'@'localhost' IDENTIFIED BY '$DBPASSWD';
|
||||
GRANT ALL PRIVILEGES ON nextcloud.* TO $DBADMIN@localhost;
|
||||
EXIT
|
||||
EOFMYSQL
|
||||
[ $? -ne 0 ] && { echo "Error configuring nextcloud database"; exit 1; }
|
||||
|
||||
mysql -u root nextcloud < "$TMPDIR"/nextcloud-sqlbkp_*.bak || { echo "Error restoring nextcloud database"; exit 1; }
|
||||
|
||||
## RESTORE DATADIR
|
||||
|
||||
if is_docker; then
|
||||
DATADIR=/data/nextcloud/data
|
||||
else
|
||||
DATADIR="$(get_nc_config_value datadirectory)"
|
||||
fi
|
||||
[[ "$DATADIR" == "" ]] && { echo "Error reading data directory"; exit 1; }
|
||||
|
||||
cd "$NCDIR"
|
||||
|
||||
### INCLUDEDATA=yes situation
|
||||
|
||||
NUMFILES=2
|
||||
if [[ $( ls "$TMPDIR" | wc -l ) -eq $NUMFILES ]]; then
|
||||
|
||||
[[ -e "$DATADIR" ]] && {
|
||||
echo "backing up existing $DATADIR to $DATADIR-$( date "+%m-%d-%y" )..."
|
||||
mv "$DATADIR" "$DATADIR-$( date "+%m-%d-%y" )" || exit 1
|
||||
}
|
||||
|
||||
echo "restore datadir to $DATADIR..."
|
||||
|
||||
mkdir -p "$DATADIR"
|
||||
grep -q "btrfs" <(stat -fc%T "$DATADIR") && which btrfs &>/dev/null && {
|
||||
rmdir "$DATADIR" || exit 1
|
||||
btrfs subvolume create "$DATADIR" || exit 1
|
||||
}
|
||||
chown www-data: "$DATADIR"
|
||||
TMPDATA="$TMPDIR/$( basename "$DATADIR" )"
|
||||
mv "$TMPDATA"/* "$TMPDATA"/.[!.]* "$DATADIR" || exit 1
|
||||
rmdir "$TMPDATA" || exit 1
|
||||
|
||||
ncc maintenance:mode --off
|
||||
|
||||
### INCLUDEDATA=no situation
|
||||
|
||||
else
|
||||
echo "No datadir found in backup"
|
||||
|
||||
[[ -e "$DATADIR" ]] || {
|
||||
echo "${DATADIR} not found. Resetting to ${NCDIR}/data"
|
||||
DATADIR="$NCDIR"/data
|
||||
mkdir -p "${DATADIR}"
|
||||
touch "${DATADIR}"/.ocdata
|
||||
chown -R www-data: "${DATADIR}"
|
||||
}
|
||||
|
||||
ncc maintenance:mode --off
|
||||
ncc files:scan --all
|
||||
|
||||
# cache needs to be cleaned as of NC 12
|
||||
NEED_RESTART=1
|
||||
fi
|
||||
|
||||
sed -i "s|'datadirectory' =>.*|'datadirectory' => '${DATADIR}',|" "${NCDIR}"/config/config.php
|
||||
|
||||
# Just in case we moved the opcache dir
|
||||
install_template "php/opcache.ini.sh" "/etc/php/${PHPVER}/mods-available/opcache.ini"
|
||||
|
||||
# tmp upload dir
|
||||
mkdir -p "$DATADIR/tmp"
|
||||
chown www-data: "$DATADIR/tmp"
|
||||
ncc config:system:set tempdirectory --value "$DATADIR/tmp"
|
||||
sed -i "s|^;\?upload_tmp_dir =.*$|upload_tmp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/cli/php.ini
|
||||
sed -i "s|^;\?upload_tmp_dir =.*$|upload_tmp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/fpm/php.ini
|
||||
sed -i "s|^;\?sys_temp_dir =.*$|sys_temp_dir = $DATADIR/tmp|" /etc/php/${PHPVER}/fpm/php.ini
|
||||
|
||||
# logs
|
||||
ncc config:system:set logfile --value="$DATADIR/nextcloud.log"
|
||||
|
||||
# update fail2ban logpath
|
||||
[[ -f /etc/fail2ban/jail.conf ]] && {
|
||||
sed -i "s|logpath =.*|logpath = $DATADIR/nextcloud.log|" /etc/fail2ban/jail.conf
|
||||
pgrep fail2ban &>/dev/null && service fail2ban restart
|
||||
}
|
||||
|
||||
# refresh nextcloud trusted domains
|
||||
bash /usr/local/bin/nextcloud-domain.sh
|
||||
|
||||
# update the systems data-fingerprint
|
||||
ncc maintenance:data-fingerprint
|
||||
|
||||
# refresh thumbnails
|
||||
ncc files:scan-app-data
|
||||
|
||||
# restart PHP if needed
|
||||
[[ "$NEED_RESTART" == "1" ]] && {
|
||||
clear_opcache
|
||||
bash -c "sleep 3; service php${PHPVER}-fpm restart" &>/dev/null &
|
||||
}
|
||||
EOF
|
||||
chmod +x /usr/local/bin/ncp-restore
|
||||
ln -s /usr/local/bin/ncp-restore /usr/local/bin/ncp/ncp-restore
|
||||
chmod +x /usr/local/bin/ncp/ncp-restore
|
||||
}
|
||||
|
||||
configure()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user