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.
Update
28.01.2021 | Fehler im Skript verbessert. Danke an die Hinweise. |
08.04.2020 | Erstellung dieser Anleitung. |
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 "${dockerapp}" 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 "${dockerdb}" /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 "${dockerapp}" 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
Hallo Christian,
ich nutze Nextcloud mit Docker auf meinem Synology DS220+ und habe es jetzt auch hinbekommen dein Skript so anzupassen, dass Backups in einem lokalen Ordner erstellt werden. Das Problem ist, dass ich jetzt gerne dieses Backup verschlüsselt in die Cloud legen möchte, weil eine lokale Kopie auf dem gleichen Gerät bietet ja so gut wie keine Sicherheit. Derzeit sind die Files rund 75 GB groß, was zu einem Problem beim Upload führt. Gibt es die Möglichkeit, das irgendwie zu splitten? Und würden auch inkrementelle Backups funktionieren? Denn bei einem inkrementellen Backup wäre ja nur das erstmalige Hochladen der Daten ein Problem. Außerdem müssen ja Daten, die schon einmal hochgeladen wurden, nicht noch einmal gesichert werden.
Gruß Dirk
Hallo Christian,
vielen Dank für das Skript und die Anleitung.
Ich hatte folgenden Fehler beim Aktivieren des Wartungsmodus: “Too many arguments, expected arguments “command”.”
Folgende Anpassung hat geholfen “– on” durch “–on” ersetzen.
vorher: -c “php occ maintenance:mode – on”
nachher: -c “php occ maintenance:mode –on”
Das gleiche muss auch beim Verlassen des Wartungsmodus angepasst werden.
LG Daniel
Hi. Hat denn jemand schon einmal ein Restore gemacht? Ich sitze an einem Testsystem und bin fast am Verzweifeln. Der Backup-Guide funktioniert. Ich habe jeweils im tar-Befehl die Zusatzvariable v am Anfang eingefügt, damit ich sehe, ob da auch etwas passiert. Soweit gut. Auch der Restore-Guide funktioniert – jedenfalls kommen keine Fehlermeldungen, das etwas nicht richtig ist. Inkl. Fingerprint und Maintenance. Alles gut.
Aber:
Wo sind im “Neuen” Nextcloud meine angelegten Benutzer und meine Daten hin? Ich erstellte Testweise 2 zusätzliche Benutzer und legte bei jedem Benutzer Testordner und Testdateien an. Auch im root-Benutzer. Aber die sind im “Neuem” Nextcloud nicht da. Wäre katastrophal, wenn man sich auf ein Backup verlässt, was nur im Dateiverzeichnis gut aussieht 🙂
Mein System: mariadb, redis:alpine und nextcloud (nicht linuxserver/nextcloud – da würden einige Befehle anders aussehen)
Meine Vorgehensweise:
– Backup auf dem bestehendem System erstellt (auf ext. Festplatte)
– Auf einem weiteren Testserver Nextcloud installiert und vorkonfiguriert (nur root-Zugang eingestellt und kurz eingeloggt)
– Restore angeschoben (Daten, Config und Datenbank inkl. Datenbank-Import)
– Fingerprint
– Maintnance -off
– Docker neu gestartet
Das war’s soweit. Mache ich die Nextcloud-Erstkonfiguration am neuem Server nicht, erscheint nach dem Restore ein Datenbankfehler.
Könnte mir jemand weiterhelfen? Ich möchte das Backup/Restore produktiv verwenden. Auf Dauer kann man sich nicht auf ZFS oder Raid verlassen 🙂
Ich freue mich auf Antworten.
Hans
Hi, was spricht denn eigentlich dagegen die NC Instanz in den Wartungsmodus zu versetzen und dann einfach die Docker Volumes zu sichern (Data, InstallDir und DB, wahlweise mit rsync inkrementell)? Oder übersehe ich hier was?
Liebe Grüße
Moin,
die Anleitungen haben mir geholfen einen guten Einstieg in das Thema Docker(-Compose) und Nextcloud zu finden. Das System lief jetzt auch einen Monat sehr gut. Allerdings scheint es jetzt ein dickes Problem beim Backup gegeben zu haben.
Im Backup log steh:
Backup vom 20210317_040001
Wartungsmodus fuer Nextcloud wird aktiviert
Maintenance mode enabled
Status: OK
Erstellung des Backups eurer Nextcloud Installation
Status: OK
Erstellung des Backups eurer Nextcloud Daten
Status: OK
Erstellung des Backups eurer Nextcloud Datenbank
Backup vom 20210318_040001
Wartungsmodus fuer Nextcloud wird aktiviert
Maintenance mode already enabled
Status: OK
Erstellung des Backups eurer Nextcloud Installation
Status: OK
Erstellung des Backups eurer Nextcloud Daten
Status: OK
Erstellung des Backups eurer Nextcloud Datenbank
Status: OK
Dateien ueber 4 Tage loeschen
Loesche leere Ordner
Deaktivierung des Wartungsmodus
Maintenance mode disabled
Status: OK
Status: OK
Dateien ueber 4 Tage loeschen
Loesche leere Ordner
Deaktivierung des Wartungsmodus
Nextcloud is not installed – only a limited number of commands are available
Command “maintenance:mode” is not defined.
Do you want to run “maintenance:install” instead? (yes/no) [no]:
> Status: OK
Die Nextcloud Oberfläche meldet:
Backup vom 20210317_040001
Wartungsmodus fuer Nextcloud wird aktiviert
Maintenance mode enabled
Status: OK
Erstellung des Backups eurer Nextcloud Installation
Status: OK
Erstellung des Backups eurer Nextcloud Daten
Status: OK
Erstellung des Backups eurer Nextcloud Datenbank
Backup vom 20210318_040001
Wartungsmodus fuer Nextcloud wird aktiviert
Maintenance mode already enabled
Status: OK
Erstellung des Backups eurer Nextcloud Installation
Status: OK
Erstellung des Backups eurer Nextcloud Daten
Status: OK
Erstellung des Backups eurer Nextcloud Datenbank
Status: OK
Dateien ueber 4 Tage loeschen
Loesche leere Ordner
Deaktivierung des Wartungsmodus
Maintenance mode disabled
Status: OK
Status: OK
Dateien ueber 4 Tage loeschen
Loesche leere Ordner
Deaktivierung des Wartungsmodus
Nextcloud is not installed – only a limited number of commands are available
Command “maintenance:mode” is not defined.
Do you want to run “maintenance:install” instead? (yes/no) [no]:
> Status: OK
Die nextcloud Web-Oberfläche meldet:
Fehler
Es sieht so aus, als ob Du Nextcloud erneut installieren möchtest. Es fehlt jedoch die Datei CAN_INSTALL in Deinem Konfigurationsordner. Bitte erstelle die Datei CAN_INSTALL im Konfigurationsordner um fortzufahren.
Wenn ich versuche den Maintenance Modus manuell zu beenden bekomme ich die gleiche Meldung:
docker exec -it nextcloud-app su -s /bin/bash www-data -c “php occ maintenance:mode –off”
Nextcloud is not installed – only a limited number of commands are available
Command “maintenance:mode” is not defined.
Do you want to run “maintenance:install” instead? (yes/no) [no]:
Hat jemand etwas ähnliches schon mal beobachtet und kennt einen Ausweg?
Als Tipp:
wenn ihr, warum denn auch nicht!?, genauso paranoid seid wie ich und die Kennwörter zur vorherigen DB und dem Redis jedes mal ändert.
Solltet ihr nach dem zurück spielen der DB Daten, auch die alten Kennwörter durch die neuen ersetzen…
Wenn man alles von Christian verwendet, geht das unter:
/opt/containers/nextcloud/app/config/config.php
Danke für deine super Anleitung.
Hätte noch eine Frage. Ist es leicht möglich, das Skript so umzuschreiben, dass die Backups in einen gemeinsamen Ordner sind. Sprich die Backups werden in Backup.tar.gz gepackt und in diesem Ordner befinden sich dann datadir und filedir und db.
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.
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 🙂