Ich habe bereits hier eine Anleitung geschrieben, wie ihr auf eurem Server ein Backup von Nextcloud erstellen könnt. Diese Anleitung habe ich nun angepasst, damit ihr auch Backups von Nextcloud Containern erstellen könnt.
Inhaltsverzeichnis
Nextcloud ist ein optimaler Speicherort für eure Daten oder Termine. Aber auch hier gilt, dass man IMMER Backups erstellen soll. Bei Nextcloud sollten folgende Verzeichnisse gesichert werden:
- das Installationsverzeichnis (z. B. /var/containers/nextcloud/app)
- das Datenverzeichnis (z. B. /opt/nextcloud)
- die Datenbank von Nextcloud
Bei meiner Anleitung beziehe ich mich auf die offizielle Anleitung von Nextcloud (v18), die ihr hier finden könnt.
1. Backup per Skript erstellen
Mit Hilfe von diesem Skript könnt ihr alles wichtige sichern. Das Skript habe ich hier aus meiner vorherigen Anleitung genommen und angepasst.
Zuerst erstellen wir uns eine neue Datei:
nano /home/Benutzername/nextcloud-backup.sh
Inhalt:
### Namen der Sicherungsdateien fileNameBackupFileDir="nextcloud-filedir.tar.gz" fileNameBackupDataDir="nextcloud-datadir.tar.gz" fileNameBackupDb="nextcloud-db.sql" ### Datum auslesen currentDate=$(date +"%Y%m%d_%H%M%S") # # Bitte ab hier alles anpassen an eure Konfiguration # #loescht Backups, die aelter als 14 Tage sind backupalter="14" # Verzeichnis, wo eure Daten gesichert werden sollen backupMainDir="/sicherung/" backupdir="${backupMainDir}/${currentDate}/" # Verzeichnis, in dem eure Nextcloud Installation liegt nextcloudFileDir="/opt/containers/nextcloud/app" # Verzeichnis, in dem eure Nextcloud User Daten liegen nextcloudDataDir="/opt/nextcloud" # Name eurer Nextcloud Datenbank nextcloudDatabase="nextcloud" # Name eures Nextcloud Datenbank Users dbUser="nextcloud" # Passwort eures Nextcloud Datenbank Users dbPassword="geheim" webserverUser="www-data" # Name eures Nextcloud DB Containers dockerdb="Name eures Nextcloud DB Containers" #Name eures Nextcloud App Containers dockerapp="Name eures Nextcloud App Containers" ##### Ende der Anpassungen ###### # # Ausgabe des Datums # echo echo Backup vom $currentDate echo # # Check for root # if [ "$(id -u)" != "0" ] then errorecho "ERROR: This script has to be run as root!" exit 1 fi # # Check if backup dir already exists # if [ ! -d "${backupdir}" ] then mkdir -p "${backupdir}" else errorecho "ERROR: The backup directory ${backupdir} already exists!" exit 1 fi # # Set maintenance mode # echo "Wartungsmodus fuer Nextcloud wird aktiviert" docker exec nextcloud_nextcloud-app_1 su -s /bin/bash "${webserverUser}" -c "php occ maintenance:mode --on" echo "Status: OK" echo # # Backup file and data directory # echo "Erstellung des Backups eurer Nextcloud Installation" tar -cpzf "${backupdir}/${fileNameBackupFileDir}" -C "${nextcloudFileDir}" . echo "Status: OK" echo echo "Erstellung des Backups eurer Nextcloud Daten" tar -cpzf "${backupdir}/${fileNameBackupDataDir}" -C "${nextcloudDataDir}" . echo "Status: OK" echo # # Backup DB # echo "Erstellung des Backups eurer Nextcloud Datenbank" docker exec nextcloud_nextcloud-db_1 /usr/bin/mysqldump -u "${dbUser}" -p"${dbPassword}" "${nextcloudDatabase}" > "${backupdir}/${fileNameBackupDb}" echo "Status: OK" echo # # Alte Dateien loeschen # echo "Dateien ueber" "${backupalter}" "Tage loeschen" find "${backupMainDir}" -type f -mtime +"${backupalter}" -delete echo "Loesche leere Ordner" find "${backupMainDir}" -type d -empty -delete # # Disable maintenance mode # echo "Deaktivierung des Wartungsmodus" docker exec nextcloud_nextcloud-app_1 su -s /bin/bash "${webserverUser}" -c "php occ maintenance:mode --off" echo "Status: OK" echo
Notwendige Anpassungen
- Alle Werte im oberen Bereich des Skriptes. Dieser Bereich ist extra gekennzeichnet. Der Containername könnte beispielsweise „nextcloud_nextcloud-app_1“ lauten. Diesen erfahrt ihr durch den Befehl „docker ps“.
Nun müsst ihr das Skript noch ausführbar machen.
chmod +x /home/Benutzername/nextcloud-backup.sh
2. Backup Skript automatisch starten per Cron
Nachdem ihr den obigen Befehl erfolgreich ausprobiert habt, legen wir jetzt einen Cronjob an, damit dieser automatisch ausgeführt wird.
Das geht mit
crontab -e
Wenn ihr noch keinen Crontab angelegt habt, dann sollte folgende Meldung erscheinen. Hier drückt ihr einfach „1“.
Nun solltet ihr folgendes sehen.
Mein Backup Script liegt unter „/home/Benutzername/nextcloud-backup.sh“.
Fügt am Ende der Datei folgende Zeile ein:
0 4 * * * /home/Benutzername/nextcloud-backup.sh >> /home/Benutzername/Log.txt Erklärung: >> /home/Benutzername/Log.txt bewirkt, dass die Ausgaben des Skripts in die Datei Log.txt geschrieben werden
Erklärung der obigen Zeile:
1. Stelle: Minute -> 0 2. Stelle: Stunde -> 4 3. Stelle: Tag des Monats -> * 4. Stelle: Monat -> * 5. Stelle: Wochentag -> *
Das Skript wird also jeden Tag nachts um 4 Uhr gestartet.
3. Backup wiederherstellen in neuem Container / Server
Hier gehe ich davon aus, dass ihr eine neue Docker / Server erstellt habt. Für die Einrichtung von Nextcloud unter Docker könnt ihr diese Anleitung verwenden.
3.1 Dateien wiederherstellen
Ich gehe davon aus, dass die entsprechenden Ordner bereits vorhanden sind, in die ihr euer Backup wiederherstellen möchtet.
Ihr entpackt also nun die Dateien in die entsprechenden Verzeichnisse:
Installationsdateien tar -xpzf /sicherung/Datum/nextcloud-filedir.tar.gz -C /opt/containers/nextcloud/app/
Nutzerdaten tar -xpzf /sicherung/Datum/nextcloud-datadir.tar.gz -C /opt/nextcloud/
3.2 Docker Containernamen ermitteln
Nun ermitteln wir noch die Namen unserer Container. Diese benötigen wir in den späteren Schritten. Dazu gebt ihr folgenden Befehl ein:
docker ps --no-trunc
Nun solltet ihr folgendes sehen.
Die Namen meiner beiden Container lauten also: „nextcloud_nextcloud-app_1“ und „nextcloud_nextcloud-db_1“. Diese können bei euch varieren.
3.3 Datenbank wiederherstellen
Nachdem alle Daten wieder vorhanden sind, müsst ihr nur noch die Datenbank wiederherstellen.
Nun kopieren wir unser SQL Backup in diesen Container:
docker cp /sicherung/Datum/nextcloud-db.sql nextcloud_nextcloud-db_1:/dmp
Nun ist die Datei im Container „nextcloud_nextcloud-db_1“. Jetzt können wir diese importieren.
docker exec nextcloud_nextcloud-db_1 /bin/bash -c "/usr/bin/mysql -u nextcloud -ptest nextcloud < /dmp"
Anschließend könnt ihr die Datenbank Sicherung innerhalb von Docker wieder löschen.
docker exec nextcloud_nextcloud-db_1 /bin/bash -c "rm /dmp"
3.4 Fingerprint updaten
Diese Schritt ist notwendig, dass eure Clients die Datenbank wieder korrekt erkennen.
docker exec nextcloud_nextcloud-app_1 su -s /bin/bash www-data -c "php occ maintenance:data-fingerprint"
3.5 Wartungsmodus beenden
Wenn ihr mit eurem Webbrowser auf eure Nextcloud Instanz geht, sollte die Meldung erscheinen, dass diese im Wartungsmodus ist. Daher deaktivieren wir diesen nun.
docker exec nextcloud_nextcloud-app_1 su -s /bin/bash www-data -c "php occ maintenance:mode --off"
Jetzt habt ihr eurer Nextcloud Backup erfolgreich wiederhergestellt.
4. Quellen
https://docs.nextcloud.com/server/18/admin_manual/maintenance/backup.html
https://docs.nextcloud.com/server/18/admin_manual/maintenance/restore.html
- ncdu – Speicherverbrauch auf Linux Konsole anzeigen - 23. Januar 2021
- Rocket.Chat – mit Docker Compose und Traefik installieren - 23. Januar 2021
- Raspberry Pi – Nextcloud Backup mittels rclone erstellen - 18. Januar 2021
3 Kommentare
Hi Christian,
wow, du hast mir mit diesem Beitrag bei meinem kleinen Nextcloud Projektchen massiv geholfen.
Vielen vielen Dank, das ist eine wirklich gute Anleitung!
Zum Hintergrund: ich bin alles andere als ein Informatiker und für mich sind das alles Bömische Dörfer. Aber aus persönlichem Interesse hirsche ich gerne in Unix Bashes herum und befasse mich zur Zeit mit der Docker Thematik.
Ich habe diese gedockerte Nextcloud Variante auf einem x86 Einplatinenrechner unter Debian:
https://github.com/nextcloud/docker/tree/master/.examples/docker-compose/with-nginx-proxy/mariadb-cron-redis/fpm
Die Daten liegen auf einem externen NAS auf welchem auch die Backups abgelegt werden:
volumes:
nextcloud-data:
driver-opts:
type: „nfs“
o: „addr=1.2.3.4,rw“
device: „:/pfad“
Ich musste dein Script zusätzlich noch in Zeile 91 und Zeile 108 anpassen, damit der Container Name stimmt.
Das Backup der Nutzerdaten habe ich auskommentiert, da diese sowieso auf dem NAS liegen.
Ich habe alles durchexerziert, sprich alle Container zerstört, Volumes gelöscht und neu eingerichtet. Der Restore lief einwandfrei!
Vielen Dank, dass du dein Wissen und deine Erfahrung mit dem Internet teilst. Das hilft Noobs wie mir ungemein 🙂
Mit freundlichen Grüßen, Schorsch
P.S. Nächstes Projekt: Pull-Backup von meinem NAS auf ein weiteres NAS an einem anderen Standort 🙂
Update:
nutzt man die neueste redis Version, verlangt redis ein Passwort.
Das Backup Script scheitert dann in Zeile 108.
Die Restore Schritte 3.4 und 3.5 scheitern ebenfalls.
Lösungsansätze gibt es hier: https://github.com/nextcloud/docker/issues/1179
( Weitere Infos gibt es hier: https://github.com/nextcloud/server/issues/21913 )
Ich habe gemäß dem folgenden Kommentar auf eine ältere redis Version gewechselt: https://github.com/nextcloud/docker/issues/1179#issuecomment-671207691
Jetzt funktioniert das Script (und meine Nextcloud) wieder.
Moin Christian,
erst einmal vielen Dank für die Anleitung. Der Umzug von einer ’normalen‘ NC Instanz in eine Docker basierte ist dadurch wirklich schmerzfrei gelungen.
Eine Kleinigkeit zum Backup Skript: mir ist nur aufgefallen, dass die Containernamen, die im Initialisierungsbereich eingetragen werden sollen, im weiteren Verlauf nicht benutzt werden. Daher schlug bei mir das Skript zunächst fehl. Für mich kein Problem, aber vielleicht stolpert der ein oder andere erst mal darüber. Vorschlag: in den Zeilen 69/91/108 die Variablen anstatt der Containernamen eintragen.