Nextcloud ist ein optimaler Speicherort für eure Daten oder Termine. Aber auch hier gilt, dass man IMMER Backups erstellen soll. Hier zeige ich euch, wie ihr dies per Hand oder automatisch per Skript realisieren könnt.

Update

07.04.2020Skript erweitert um alte Backups nach x Tagen zu löschen.
02.10.2018Erstellung des Artikels

Bei Nextcloud sollten folgende Verzeichnisse gesichert werden:

  • das Installationsverzeichnis (z. B. /var/www/html/nextcloud)
  • das Datenverzeichnis (z. B. /opt/nextcloud)
  • die Datenbank von Nextcloud

Bei meiner Anleitung beziehe ich mich auf die offizielle Anleitung von Nextcloud, die ihr hier finden könnt. In dieser Anleitung werden jedoch Befehle wie „sudo“ genutzt, die unter Debian standardmäßig so nicht möglich sind. Daher schreibe ich immer noch die Befehle dazu, die ihr unter Debian eingeben müsst.

Backup erstellen

1. Wartungsmodus aktivieren

Zuerst solltet ihr in Nextcloud den Wartungsmodus aktivieren. Dieser sorgt dafür, dass die Daten konsistent sind, d.h. dass nichts mehr verändert werden kann. Die Verzeichnisse zu eurer Nextcloud-Installation müssen hier angepasst werden !

Linux:

sudo -u www-data /var/www/html/nextcloud/php occ maintenance:mode – on

Debian:

 su -s /bin/bash www-data -c "php /var/www/html/nextcloud/occ maintenance:mode – on"

Nun sollte in eurer Konsole folgende Meldung erscheinen:

Maintenance mode enabled

2. Backup erstellen

2.1 Backup des Installationsverzeichnisses

In diesem Schritt erstellt ihr ein Backup eures Nextcloud-Installationsverzeichnisses. Diesen Code müsst ihr ebenfalls wieder anpassen.

tar -cpzf /opt/Sicherungen/Backup_Nextcloud-Install_`date +"%Y%m%d"`.tar.gz -C /var/www/html/nextcloud .

Erklärung:
/opt/Sicherungen/ – > Speicherort des Backups

Backup_Nextcloud-Install_`date +"%Y%m%d"`.tar.gz – > Name des Backups. Hier wird das aktuelle Datum verwendet.

/var/www/html/nextcloud – > gibt den Pfad eurer Nextcloud Daten an. Diese werden gesichert.

2.2 Backup des Nextcloud-Datenverzeichnisses

Nun erstellen wir ein Backup von dem Verzeichnis, in welchem alle eure persönlichen Daten gespeichert werden. Auch hier gilt, dass ihr den Code wieder auf eure Bedürfnisse anpassen müsst.

tar -cpzf /opt/Sicherungen/Backup_Nextcloud-Daten_`date +"%Y%m%d"`.tar.gz -C /var/www/html/nextcloud_data .

2.3 Datenbank Backup

Im letzten Schritt müsst ihr nur noch ein Backup eurer Datenbank anlegen. In dieser Anleitung geht nur auf die Datenbanken MySQL/MariaDB ein.

ACHTUNG !!
KEIN LEERZEICHEN ZWISCHEN -P UND DEM PASSWORT

mysqldump – single-transaction -h localhost -u nextadmin -pgeheimesPasswort nextcloud > /opt/Sicherungen/Nextcloud-DB_`date +"%Y%m%d"`.sql

Erklärungen:
-h localhost  – > gibt den Speicherort der Datenbank an. Localhost heißt, dass es sich auf dem selben Server befindet.
-u nextadmin  – > gibt den Nextcloud SQL Benutzer an
-pgeheimesPasswort – > gibt das Passwort für den Benutzer nextadmin an. HIER DARF KEIN LEERZEICHEN SEIN !!!
nextcloud – > Name der Datenbank

2.4 Wartungsmodus abschalten

Nachdem ihr alles gesichert habt, könnt ihr den Wartungsmodus wieder abschalten. Dazu gebt ihr folgendes ein:

Linux:

sudo -u www-data /var/www/html/nextcloud/php occ maintenance:mode – off

Debian:

 su -s /bin/bash www-data -c "php /var/www/html/nextcloud/occ maintenance:mode – off"

Nun sollte in eurer Konsole folgendes stehen:

Nextcloud is in maintenance mode - no apps have been loaded

Maintenance mode disabled

Backup wiederherstellen auf NEUEM Server

Diese Anleitung bezieht sich auf einen Server, auf dem noch NIE Nextcloud installiert wurde.

0. Server vorbereiten

Unter diesen Punkt zählt, dass Ihr alle benötigten Programme wie Webserver / Datenbank installiert habt. Ebenfalls müsst ihr zum Beispiel für nginx eine Konfiguration für Nextcloud hinterlegen. Dazu habe ich hier eine Anleitung geschrieben.

1. Verzeichnisse erstellen

Zuerst erstellen wir die Verzeichnisse und legen die Rechte fest, die wir später für Nextcloud benötigen.

Verzeichnisse erstellen:
mkdir -p /var/www/html/nextcloud/   – > Installationsverzeichnis
mkdir -p /opt/nextcloud/            – > Datenverzeichnis

Rechte vergeben:
chown -R www-data:www-data /var/www/html/nextcloud
chown -R www-data:www-data /opt/nextcloud/

2. Dateien wiederherstellen

Nun beginnen wir damit die Daten wiederherzustellen. Hier muss zwischen den Daten und den Installationsdaten unterschieden werden. Hier müsst ihr auch wieder die entsprechenden Werte anpassen.

tar -xpzf /opt/Sicherungen/Backup_Nextcloud-Install_xxxxxxx.tar.gz -C /var/www/html/nextcloud/
tar -xpzf /opt/Sicherungen/Backup_Nextcloud-Daten_xxxxxxx.tar.gz -C /opt/nextcloud/

3. Datenbank wiederherstellen

Nachdem alle Daten wieder vorhanden sind, müsst ihr nur noch die Datenbank wiederherstellen. Dazu müsst ihr jedoch erst einen Benutzer für Nextcloud SQL anlegen und diesem Rechte vergeben.

3.1 SQL Benutzer anlegen

Administrator: nextadmin
Datenbankname: nextcloud
Passwort: geheimesPasswort

mysql -u root -p
create database nextcloud;
create user nextadmin@localhost identified by 'geheimesPasswort';
grant all privileges on nextcloud.* to nextadmin@localhost identified by 'geheimesPasswort';
flush privileges;
exit

3.2 SQL Backup wiederherstellen

Hier müsst ihr den Befehl entsprechend eurer Daten anpassen:

mysql -h localhost -unextadmin -pgeheimesPasswort nextcloud < /opt/Sicherungen/Nextcloud-DB_xxxx.sql

3.3 Fingerprint updaten

Diese Schritt ist notwendig, dass eure Clients die Datenbank wieder korrekt erkennen.

Linux:

sudo -u www-data /var/www/html/nextcloud/php occ maintenance:data-fingerprint

Debian:

 su -s /bin/bash www-data -c "php /var/www/html/nextcloud/occ maintenance:data-fingerprint"

4. Backup per Skript erstellen

Ich habe dieses Skript als Grundlage geholt und es für Debian angepasst. Alle gelben Zeilen müsst ihr anpassen !

Hier mein Skript:

## loescht Backups, die aelter als 14 Tage sind
backupalter="14"                                
currentDate=$(date +"%Y%m%d_%H%M%S")
# Verzeichnis, wo eure Daten gesichert werden sollen
backupMainDir="/sicherung/"
backupdir="${backupMainDir}/${currentDate}/"
# Verzeichnis, in dem eure Nextcloud Installation liegt
nextcloudFileDir="/var/www/html/nextcloud"
# Verzeichnis, in dem eure Nextcloud User Daten liegen
nextcloudDataDir="/opt/nextcloud-daten"
# Name eurer Nextcloud Datenbank
nextcloudDatabase="nextcloud"
# Name eures Nextcloud Datenbank Users
dbUser="nextadmin"
# Passwort eures Nextcloud Datenbank Users
dbPassword="geheimesPasswort"
webserverUser="www-data"

### Namen der Sicherungsdateien 
fileNameBackupFileDir="nextcloud-filedir.tar.gz"
fileNameBackupDataDir="nextcloud-datadir.tar.gz"
fileNameBackupDb="nextcloud-db.sql"


#
# 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"
cd "${nextcloudFileDir}"
su -s /bin/bash "${webserverUser}" -c "php occ maintenance:mode – on"
cd ~
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"
mysqldump – single-transaction -h localhost -u "${dbUser}" -p"${dbPassword}" "${nextcloudDatabase}" > "${backupdir}/${fileNameBackupDb}"
echo "Status: OK"
echo


#
# Loeschen alter Dateien
#
echo "Dateien ueber 14 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"
cd "${nextcloudFileDir}"
su -s /bin/bash "${webserverUser}" -c "php occ maintenance:mode – off"
cd ~
echo "Status: OK"
echo

Dies Skript kopiert ihr in eine Datei.

Dazu erstellt ihr eine neue Datei und kopiert obigen Inhalt hinein.

nano /home/Benutzername/nextcloud-backup.sh

Danach macht ihr die Datei noch ausführbar mittels folgendem Befehl:

chmod +x /home/Benutzername/nextcloud-backup.sh

Dieses Skript könnt ihr dann automatisiert mittels Cronjob starten lassen.

4.1 Skript automatisiert starten

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

cert_3

Nun solltet ihr folgendes sehen.

cert_4

Mein Backup Script liegt unter „/home/user/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.

Teile diesen Beitrag
Christian

5 Kommentare

  1. Hallo Christian,

    erst einmal danke für die schöne Anleitung, die hat mir sehr geholfen. Aber eine Sache bezüglich des automatisierten Scripts: man benötigt doch root (vor allem für das Backup der Database), aber ich steh ja jetzt nicht nachts um 04 Uhr auf, um das Passwort einzugeben…Gibt es dafür eine Lösung?

    Liebe Grüße,

    Matthias

  2. Hallo nochmal,

    also dieses Root Problem, welches ich gestern hier gepostet habe, hat sich erledigt. Cron übernimmt den Vorgang ja und hat logischerweise root Rechte 😉 Da habe ich wohl nicht ganz zu Ende gedacht.

    Jetzt wird ja jeden Tag immer ein neues Backup erstellt, in einem neuen Ordner. Das ist ja auch gut so. Aber ist es irgendwie möglich, mithilfe dieses Scripts, ältere Backups automatisch zu löschen?

Schreibe einen Kommentar

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