Eine Nextcloud ist eine schöne Sache. Aber was wenn ein Benutzer ausversehen Daten löscht oder bei einem Update etwas verherrend schief läuft?
Aus solchen Gründen erstellt man Backups.
Das wollen wir mit diesem Blogeintrag auch einmal gemeinsam machen und das möglichst automatisch.
Ziel des Backupskripts wird es sein die Cloud in einen sauberen Zustand zu versetzen, die Datenbank zu exportieren, die veränderten Clouddaten zu sichern und danach die Cloud wieder in Betrieb zu nehmen.
Mein Vorschlag für ein solches Bash Backupskript sieht wie folgt aus (Extra mit vielen „Kommentaren“ versehen) (Skript für eine Nextcloud mit seperaten Datenverzeichnis findet ir weiter unten) :
#!/bin/bash #Hier sind alle anzupassenden Variablen---- clouddir=/var/www/nextcloud backupdir=/var/cloudbackup dbname=cloud #--------------------------------------- #Erstelle Backupverzeichnisstruktur falls noch nicht voranden mkdir $backupdir mkdir $backupdir/www mkdir $backupdir/db echo Schalte Cloud in den Maintanence Mode... cd $clouddir sudo -u www-data php occ maintenance:mode --on echo Sichere Webverzeichnis... rsync --progress -h -a --delete $clouddir $backupdir/www echo Lösche alte SQL Backup... rm $backupdir/db/cloud.sql echo Erstelle neues SQL Backup... mysqldump --single-transaction $dbname > $backupdir/db/cloud.sql echo Schalte Cloud wieder aktiv... sudo -u www-data php occ maintenance:mode --off echo Sicherung abgeschlossen
Wenn ihr nun das Skript übernommen habt, die Variablen angepasst und das ganze Skript mit dem Befehl chmod +x <scriptname>
ausführbar gemacht habt, so solltet ihr nach dem ersten Ausführen es Skripts folgende Ordnerstruktur vorfinden.
- $backupdir/www
- Hier sollte sich nun das Cloudverzeichnis mit allen Daten befinden
- $backupdir/db
- Hier sollte sich nun eine export der Clouddatenbank befinden
- $backupdir/data
- Wird nur beim unteren Skript erstellt, wenn das Datenverzeichnis der Nextcloud seperat liegt (z.B. auf einer Festplatte). In dem Fall befindet sich im $backupdir/www keine Nutzerdaten.
Beim ersten Lauf des Skriptes wird es je nach Datenmenge etwas dauern. Beim zweiten Mal wird dank rsync dafür gesorgt, dass nur die Änderungen seit dem letzten Backup übertragen werden. Dies ist auch der Grund warum ich die Dateien nicht Zipe. Sonst wird das mit dem Prüfen auf Änderung schwierig.
Nun fehlt nur noch ein Eintrag als cronjob damit die Datensicherung automatisch durchgeführt wird. Daher geben wir crontab -e
ein und tragen dort für unser Skript folgende Zeile ein:
30 2 * * * <pfadZumSkript>
Dieser Eintrag führt nun dazu, dass jede Nacht um 2:30 Uhr das Skipt gestartet wird.
Sollte euer Cloud Datenverzeichnis seperat liegen, dann müsstet ihr das Skript um einen weiteren rsync erweitern (Siehe Skript unten), oder einfach nur das Datenverzeichnis sichern. Die Cloud lässt sich auch nur mit dem Datenverzeichnis und dem passenden SQL Export wiederherstellen. Aber mit ist es einfacher 😊
#!/bin/bash #Hier sind alle anzupassenden Variablen---- clouddir=/var/www/nextcloud clouddatadir=/media/festplatte/nextcloud backupdir=/media/festplatte/cloudbackup dbname=cloud #--------------------------------------- #Erstelle Backupverzeichnisstruktur falls noch nicht voranden mkdir $backupdir mkdir $backupdir/www mkdir $backupdir/db mkdir $backupdir/data echo Schalte Cloud in den Maintanence Mode... cd $clouddir sudo -u www-data php occ maintenance:mode --on echo Sichere Webverzeichnis... rsync --progress -h -a --delete $clouddir $backupdir/www echo Sichere das Datenverzeichnis... rsync --progress -h -a --delete $clouddatadir $backupdir/data echo Lösche alte SQL Backup... rm $backupdir/db/cloud.sql echo Erstelle neues SQL Backup... mysqldump --single-transaction $dbname > $backupdir/db/cloud.sql echo Schalte Cloud wieder aktiv... sudo -u www-data php occ maintenance:mode --off echo Sicherung abgeschlossen
Was noch zu erwähnen wäre: Mein Skript ist wirklich nur sehr simpel gehalten. Es finden keinerlei Fehlerbehandlungen statt. Es ist ganz nett für den Einstieg, sollte aber in professionellen Umgebungen mit kritischeren Daten definitiv erweitert werden.