Skip to content
zurück

Nextcloud Backup mit Borg

Published:  at  12:11

Vorbereitung

für SSH muss der Port 23 verwendet werden.

SSH Key erstellen und bei Hetzner hinterlegen

Für die Kommunikation über SSH wird am besten ein SSH-Key verwendet. Der kann mit ssh-keygen erstellt werden. Dieser muss dann bei Hetzner in die SSH-Umgebung der StorageBox kopiert werden.

cat ~/.ssh/id_rsa.pub | ssh -p23 uXXXXX@uXXXXX.your-storagebox.de install-ssh-key

Backup Repo anlegen

Backup Repo anlegen:

borg init --encryption=repokey --remote-path=borg-1.2 ssh://XXXXX@XXXXX.your-storagebox.de:23/./nextcloud-backup

Das Repository ist mit den Repo-Key verschlüsselt, dieser liegt im Repo und kann nur mit dem vergebenen Passwort “geöffnet” werden. Der Repo-Key sollte gesichert werden.

Backup Script

Das Backup Script wird unter /root/backup.sh erstellt. Mittels nano /root/backup.sh" kann die Datei erstellt werden und das Script eingefügt werden. Angepasst werden müssen die Parameter: BORG_PASSPHRASE,backupDiscMount,dbUser,dbPassword, ggf. der Name der Datenbank, Speicherort der Nextcloud-Daten.

Das Script muss noch ausführbar gemacht werden chmod +x /root/backup.sh und in cron zur automatischen Ausführung hinterlegt werden.

crontab -e
0 2 * * * /root/backup.sh > /dev/null 2>&1

Das Script wird jeden Tag um 02 Uhr ausgeführt.

#!/bin/bash
##################################
### Beispieldaten:
### logDirectory="/backup_logs/"
### backupDiscMount="/backup/"
### localBackupDir="/backup/temp"
##################################
export BORG_PASSPHRASE='XXXXX'
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
startTime=$(date +%s)
currentDate=$(date --date @"$startTime" +"%Y%m%d_%H%M%S")
currentDateReadable=$(date --date @"$startTime" +"%d.%m.%Y - %H:%M:%S")
logDirectory="/root/BorgLog"
logFile="${logDirectory}/${currentDate}.log"
backupDiscMount="ssh://xxxxx@xxxxx.your-storagebox.de:23/./"
localBackupDir="/root/"
borgRepository="${backupDiscMount}/nextcloud-backup"
borgBackupDirs="/etc/ /mnt/nextcloud-data/ /root/ /var/www/nextcloud/ $localBackupDir/"
nextcloudFileDir='/var/www/nextcloud'
webserverServiceName='nginx'
webserverUser='www-data'
nextcloudDatabase='nextcloud'
dbUser='root'
dbPassword='XXXXX'
fileNameBackupDb='nextcloud-db.sql'
if [ ! -d "${logDirectory}" ]
then
        mkdir -p "${logDirectory}"
fi
errorecho() { cat <<< "$@" 1>&2; }
exec > >(tee -i "${logFile}")
exec 2>&1
if [ "$(id -u)" != "0" ]
then
        errorecho "ERROR: This script has to be run as root!"
        exit 1
fi
if [ ! -d "${localBackupDir}" ]
then
        errorecho "ERROR: The local backup directory ${localBackupDir} does not exist!"
        exit 1
fi
echo -e "\n###### Start des Backups: ${currentDateReadable} ######\n"
echo -e "Daten werden zusammengestellt"
dpkg --get-selections > "${localBackupDir}/software.list"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --on
echo "nginx wird gestoppt"
systemctl stop "${webserverServiceName}"
echo "Datenbanksicherung wird erstellt"
mysqldump --single-transaction --routines -h localhost -u "${dbUser}" -p"${dbPassword}" "${nextcloudDatabase}" > "${localBackupDir}/${fileNameBackupDb}"
echo -e "\nBackup mit borgbackup"
borg create -C zstd,15 --stats \
    $borgRepository::"${currentDate}" \
        $localBackupDir \
        $borgBackupDirs 
echo
echo "nginx wird gestartet"
systemctl start "${webserverServiceName}"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --off
rm "${localBackupDir}"/software.list
rm -r "${localBackupDir}/${fileNameBackupDb}"
borg prune --progress --stats $borgRepository --keep-within=7d --keep-weekly=4 --keep-monthly=6
endTime=$(date +%s)
endDateReadable=$(date --date @"$endTime" +"%d.%m.%Y - %H:%M:%S")
duration=$((endTime-startTime))
durationSec=$((duration % 60))
durationMin=$(((duration / 60) % 60))
durationHour=$((duration / 3600))
durationReadable=$(printf "%02d Stunden %02d Minuten %02d Sekunden" $durationHour $durationMin $durationSec)
echo -e "\n###### Ende des Backups: ${endDateReadable} (${durationReadable}) ######\n"
#mail -s "Nextcloud-Backup beendet" <email@example.com> < "${logFile}"

Disaster Recovery

Beispiel für eine komplette Recovery der Nextcloud inklusive der Datenbank und Dateien. Selbstverständlich kann auch nur eine Datei oder Ordner aus dem Backup wiederhergestellt werden. Wurde ein älteres Script zu Installation verwendet, können sich die verwendeten Benutzernamen unterschieden. Weiteres im Troubleshooting Bereich

Nachdem das Backup erstellt wurde muss auch die Recovery getestet werden. Die neue VM für Nextcloud wurde erstellt und mit dem Script von c-rieger installiert.

1) Vorbereitung, Backup in der neue VM mouten

Deinen SSH-Schlüssel erstellen und zu Hetzner übertragen.

Backups auflisten

borg list ssh://xxxx@xxxx.your-storagebox.de:23/./nextcloud-backup

Backups mit dem gewählten Datum mounten

borg mount ssh://xxxx@xxxx.your-storagebox.de:23/./nextcloud-backup::20230104_103705 /mnt/restore

Als Erstes sollten die Nextcloud-Daten wieder an den originalen Ort kopiert werden. Die Wiederherstellung der Daten wird lange dauern! Hat man noch Einstellungen an mysql, redis oder SSL-Zerts vorgenommen/erstellt, müssen diese auch wiederhergestellt werden. Daher sollte der “/etc/” Ordner mit gesichert werden.

2) Daten migrieren

mv /var/www/nextcloud /var/www/nextcloud_backup
rsync -av /mnt/restore/var/www /var/
rsync -av /mnt/restore/mnt/nextcloud-data/ /mnt/nextcloud-data

Es muss nicht die alte Nextcloud aus /var/www verwendet werden. Es kann mit der neu erstellen gearbeitet werden. Anpassungen wie ein reverse Proxy muss dann eingetragen werden. Apps etc. sind dann aber auch nicht verfügbar. Es reicht aber um “schnell” an die Daten zu kommen.

3) Datenbank recovern

MySQL Dump zurückspielen. Der DUMP liegt unter “/mnt/restore/root”. Die alte Datenbank muss gelöscht werde und eine neue, leere, erstellt werden. Die Rechte müssen für den Benutzer nochmals angepasst werden. Hat sich der Benutzer geändert, muss dieser im mysql-Befehl angepasst werden.

mysql -u root -p
DROP DATABASE nextcloud;
CREATE DATABASE nextcloud;
exit
mysql -u root -p nextcloud < /mnt/restore/root/nextcloud-db.sql
mysql -u root -p
GRANT ALL PRIVILEGES on nextcloud.* to ncdbuser@localhost; FLUSH privileges; quit;

4) Abschluss

Backups umounten

borg umount /mnt/restore/

Dienste starten

systemctl restart nginx redis mysql

Troubleshooting

Permission Fehler

Der Pfad im Script zu den Nextcloud Daten muss angepasst werden.

nano /root/permission.sh
chmod +x /root/permission.sh
#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
chmod ug+x /var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt 
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0

DB-Root Passwort

Durch die Neuinstallation der Nextcloud, wurde durch das Script ein neues root-Passwort vergeben.

Pfade prüfen

Durch die Script Installation müssen die Pfade in Nginx und in der Nextcloud-Konfiguration geprüft werden. Eventuell hat sich das Datenverzeichnis geändert.

DB Passwort prüfen

Durch die Installation mit dem Script, muss das DB-Passwort und DB-User unter: /var/www/nextcloud/config/config.php angepasst werden.

Wartungsmodus ausschalten

sudo -u www-data php /var/www/nextcloud/occ maintenance:mode —off

Dienste Neustarten

systemctl restart mysql.service
systemctl restart php8.1-fpm.service
systemctl restart redis-server.service
systemctl restart nginx.service



Älterer Beitrag
PHP Update bei Nextcloud
Neuerer Beitrag
Proxmox LVM erweitern