Nextcloud Backup mit Borg
Ein automatisches Backup deiner Nextcloud Daten mit Borg erstellen
Vorbereitung¶
SSH muss in der StorageBox aktivert sein.
BorgBackup muss auf dem Server installiert sein
apt install -y borgbackupUsername, URL liegen und Passwort liegen bereit
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-keyBackup Repo anlegen¶
Backup Repo anlegen:
borg init --encryption=repokey --remote-path=borg-1.2 ssh://XXXXX@XXXXX.your-storagebox.de:23/./nextcloud-backupBackup 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>&1Das 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¶
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-backupBackups mit dem gewählten Datum mounten
borg mount ssh://xxxx@xxxx.your-storagebox.de:23/./nextcloud-backup::20230104_103705 /mnt/restoreAls 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-data3) 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 mysqlTroubleshooting¶
Permission Fehler¶
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 0DB-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