Vorbereitung
- SSH muss in der StorageBox aktivert sein.
für SSH muss der Port 23 verwendet werden.
- BorgBackup muss auf dem Server installiert sein
apt install -y borgbackup
- Username, 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-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