Nextcloud Sicherung und Wiederherstellung

Nextcloud Sicherung und Wiederherstellung

EIn neuerer Guide ist verfügbar: Nextcloud Backup (Borg) mit De-Duplizierung


Mit dem skizzierten Vorgehen wird der Nextcloud Server regelmäßig gesichert und rotiert. Die Sicherungen enthalten u.a.
– das Web – und Datenverzeichnis: /var/www/nextcloud und /var/nc_data
– sowie die Nextcloud Datenbank.

Ersetzen Sie im weiteren Verlauf bitte den osusername und die Datenbank bzw . das Datenbankppasswort nextcloud mit Ihren Werten.

Beginnen wir und wechseln dazu in den sudo Mode:

sudo -s

1. Nextcloud Wartungsmodus aktivieren:

sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --on

2. Sicherung des Webverzeichnisses:

tar -cpzf /home/osusername/ncserver_`date +"%w"`.tar.gz -C /var/www/nextcloud .

3. Sicherung des Datenverezeichnisses:

tar -cpzf /home/osusername/ncdata_`date +"%w"`.tar.gz -C /var/nc_data .

4. Sicherung der Datenbank:

mysqldump --single-transaction -h localhost -unextcloud -pnextcloud nextcloud > /home/osusername/ncdb_`date +"%w"`.sql

5. Nextcloud Wartungsmodus deaktivieren:

sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --off

Sicherung erstellt.

Wiederherstellung der zuvor erstellten Nextcloud Sicherung

Die Sicherung besteht u.a. aus
– dem Webverzeichnis: /var/www/nextcloud
– dem Datenverzeichnis: /var/nc_data/appdata_<id>
– der Datenbank: nextcloud.

Wir demonstrieren die exemplarische Herstellung einer Montags-Sicherung (_1). Wechseln Sie dafür zuerst in den sudo Mode:

sudo -s

1. Nextcloud Wartungsmodus aktivieren:

sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --on

2. Stoppen aller relevanten Services:

/usr/sbin/service nginx stop
/usr/sbin/service php7.4-fpm stop

3. Löschen der alten Verzeichnisse:

rm -r /var/www/nextcloud/
rm -r /var/nc_data/

4. Anlegen der Verzeichnisse und Entpacken der Sicherung:

mkdir -p /var/www/nextcloud/
mkdir -p /var/nc_data/
tar -xpzf /home/osusername/ncserver_1.tar.gz -C /var/www/nextcloud/
tar -xpzf /home/osusername/ncdata_1.tar.gz -C /var/nc_data/

5. Berechtigungen setzen:

chown -R www-data:www-data /var/nc_data /var/www

6. Nextcloud Datenbank wiederherstellen:

– Löschen der alten Datenbank

mysql -h localhost -uroot -pnextcloud -e "DROP DATABASE nextcloud"

– Anlegen einer leeren Datenbank

mysql -h localhost -uroot -pnextcloud -e "CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"

– Berechtigungen setzen

mysql -h localhost -uroot -pnextcloud -e "GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost"

– Wiederherstellen der Datenbank

mysql -h localhost -unextcloud -pnextcloud nextcloud < /home/osusername/ncdb_1.sql

7. Neustart der relevanten Services:

/usr/sbin/service php7.4-fpm start
/usr/sbin/service nginx start

8. Nextcloud fingerprint setzen:

Nach einem Daten- oder Datenbankrestore sollte immer occ maintenance:data-fingerprint ausgeführt werden. Dieser Befehl passt den ETag aller Dateien an und teilt den Sync-Clients mit, das Dateien verändert wurden.

sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:data-fingerprint

9. Nextcloud Wartungsmodus deaktivieren:

sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --off

Done.

Nachfolgen stelle ich Ihnen ein exemplarisches Backupscript zur Verfügung, das nur noch hinsichtlich der Verzeichnisse und Datenbankparameter angepasst werden muss:

!/bin/bash
#enbale Maintenance Mode to prevent users from working with Nextcloud
sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --on
#create directory first: mkdir /backup -p
BACKUP_STORE=/backup
#create directory first: mkdir /backup-repository -p
ARCHIVE_STORE=/backup-repository
#declare dateformat and numbering of backups
CURRENT_TIME_FORMAT="%w"
#print start date/time
echo "START: $(date)"
#list of folders to be backed up, feel free to add/remove directories
FOLDERS_TO_BACKUP=(
"/root/"
"/etc/fail2ban/"
"/etc/letsencrypt/"
"/etc/mysql/"
"/etc/nginx/"
"/etc/php/"
"/etc/ssh/"
"/etc/pam.d/"
"/etc/ssl/"
"/var/www/"
"/var/nc_data/"
"/nc_data/rainloop-storage/"
)
#declare the backup filename
ARCHIVE_FILE="$ARCHIVE_STORE/nc_backup_$(date +$CURRENT_TIME_FORMAT).tar.gz"
#change directory
cd $BACKUP_STORE
#start rsync to back up the folders
for FOLDER in ${FOLDERS_TO_BACKUP[@]}
do
        if [ -d "$FOLDER" ];
        then
                echo "Copying $FOLDER…"
                rsync -AaRx --delete $FOLDER $BACKUP_STORE
        else
                echo "Skipping $FOLDER (does not exist!)"
        fi
done
#copy the fstab
[ -f /etc/fstab ] && cp /etc/fstab $BACKUP_STORE/etc/
#copy the mail configuration
[ -f /etc/msmtprc ] && cp /etc/msmtprc $BACKUP_STORE/etc/
#create a database back up
mysqldump --single-transaction -h localhost -unextcloud -pnextcloud nextcloud > $BACKUP_STORE/ncdb_date +"%w".sql
#print the database backup size
mysql -hlocalhost -unextcloud -pnextcloud -e "SELECT table_schema 'DB',round(sum(data_length+index_length)/1024/1024,1) 'Size (MB)' from information_schema.tables WHERE table_schema = 'nextcloud';"
#create the directories
mkdir -p $(dirname $ARCHIVE_FILE)
#compress all data
tar -cpzf $ARCHIVE_FILE .
#print back up size
echo "nc_backup size: $(stat --printf='%s' $ARCHIVE_FILE | numfmt --to=iec)"
#stop all services
/usr/sbin/service nginx stop
/usr/sbin/service mysql stop
/usr/sbin/service redis-server stop
/usr/sbin/service php7.4-fpm stop
#remove copied files
[ -f $BACKUP_STORE/ncdb_date +"%w".sql ] && rm -f $BACKUP_STORE/ncdb_date +"%w".sql
[ -f /etc/msmtprc ] && rm -f $BACKUP_STORE/etc/msmtprc
[ -f /etc/fstab ] && rm -f $BACKUP_STORE/etc/fstab
#restart all services
/usr/sbin/service nginx stop
/usr/sbin/service mysql restart
/usr/sbin/service redis-server restart
#enable if Collabora and/or OnlyOffice are used
/usr/bin/docker restart COLLABORAOFFICE
/usr/sbin/service php7.4-fpm restart
/usr/sbin/service nginx restart
#disable maintanance mode
sudo -u www-data php7.4 /var/www/nextcloud/occ maintenance:mode --off
#Nextcloud optimizations
#Ubuntu:
/usr/bin/redis-cli -s /var/run/redis/redis-server.sock <<EOF 
#Debian: /usr/bin/redis-cli -s /var/run/redis/redis.sock <<EOF 
FLUSHALL
quit
EOF
sudo -u www-data php7.4 /var/www/nextcloud/occ files:scan --all
sudo -u www-data php7.4 /var/www/nextcloud/occ files:scan-app-data
#check for Nextcloud updates
echo "Nextcloud apps are checked for updates…"
sudo -u www-data php7.4 /var/www/nextcloud/occ app:update --all
#print end date/time
echo "END: $(date)"
exit 0

Über eine Spende würden sich meine Frau, meine Zwillinge und ich sehr freuen!

© Carsten Rieger IT-Services