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.

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

Teile diesen Beitrag
Christian

Categories:

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

Schreibe einen Kommentar

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