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

Teile diesen Beitrag
Christian

Categories:

12 Kommentare

  1. 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 🙂

  2. 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.

  3. 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.

  4. 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

    • Und apropos @Christian:

      EIN RICHTIG FETTES DANKE!!!
      Deine Anleitungen haben mich richtig gut in die Thematik Docker und Traefik eingearbeitet.
      Ebenso dieser Post mit dem Backup.
      Konnte so an meine aktuell 100GB Nextcloud Instanz kommen <3

      Werde jetzt gleich auch was spenden!
      Gute Arbeit muss belohnt werden 🙂

      Grüße Mathias

  5. 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?

    • Moin,
      ich nochmal. Habe den Fehler gefunden.

      Durch irgend einen magischen Zufall, hat sich die config.php in nexcloudapp:config/config.php zerlegt. Es war nur noch die halbe Datei im Dateisystem vorhanden. Wie das passieren kann, weiß ich nicht. Ich vermute, dass dies bei dem Backup passiert ist, weil der Maintenace Mode sich noch einschalten lies, aber nicht mehr beenden lies…

      Ich werde mir künftig das log wohl häufiger ansehen…
      Schönes Wochenende!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.