Nextcloud Backup (Borg) mit De-Duplizierung

Borg Backup mit De-Duplizierung

BorgBackup / Borg 1.1.11 ist eine Sicherungssoftware, die sehr platzsparende und schnelle, inkrementelle Sicherungen ermöglicht. Sichern Sie Ihren Nextcloudserver per cronjob einfach mittels Borg und profitieren Sie u.a. von der De-Duplizierung, Komprimierung und vielen weiteren Möglichkeiten dieser Backupsoftware. Probieren Sie es aus! Erzeugen Sie zu Beginn drei Verzeichnisse – das erste Verzeichnis (/backup/daten) für die zu sichernden Daten selbst, das zweite Verzeichnis (/backup/temp) als Arbeitsverzeichnis für das Borgbackup und das dritte Verzeichnis (/restore) für zukünftige Restores als borg mountpoint.

sudo -s
mkdir -p /backup/daten /backup/temp /restore

Optional (Einbinden eines NAS):
Ich habe die Verzeichnisse /backup/daten und /backup/temp per NFS auf mein NAS gemountet

apt install -y nfs-common
vi /etc/fstab
192.168.2.22:/volume1/backup /backup nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
mkdir -p /backup/daten /backup/temp /restore
mount -a

Ende des optionalen Teils.


Nun installieren wir die Backupsoftware borgbackup:

apt update && apt upgrade -y && apt install -y borgbackup

Im Anschluß erstellen wir das lokale Borg Backuprepository

borg init -e repokey-blake2 /backup/daten/

Unterhalb von /backup/daten finden Sie dann eine Dateistrutkur, die von Borg intern verwendet wird und Ihre Backups verschlüsselt und dedupliziert vorhält.

Sicherungsskript

Nachfolgend stelle ich Ihnen mein Beispielskript für die Sicherung der Nextcloud zur Verfügung, welches aber an Ihre Serverumgebung angepasst werden muss. Passen Sie dafür die rot markierten Werte an:

nano /root/backup.sh
#!/bin/bash
#### Passen Sie ihr BORG-Passwort an
export BORG_PASSPHRASE='IhrPasswortVonDerBorg-Initiierung'
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
startTime=$(date +%s)
currentDate=$(date --date @"$startTime" +"%Y%m%d_%H%M%S")
currentDateReadable=$(date --date @"$startTime" +"%d.%m.%Y - %H:%M:%S")
#### Passen Sie das Logverzeichnis an
logDirectory="/home/<IhrLokalerLinuxBenutzer>/backup_logs/"
logFile="${logDirectory}/${currentDate}.log"
localBackupDir="/backup/temp"
backupDiscMount="/backup/"
borgRepository="${backupDiscMount}/daten"
#### Passen Sie nachfolgend das Nextcloud-Datenverzeichnis und bei Bedarf weitere Verzeichnisse an:
borgBackupDirs="/etc/ /var/nc_data/ /root/ /var/www/nextcloud/ $localBackupDir/"
nextcloudFileDir='/var/www/nextcloud'
webserverServiceName='nginx'
webserverUser='www-data'
### Passen sie den Datenbanknamen an
nextcloudDatabase='nextcloud'
### Passen sie den Datenbankbenutzernamen an
dbUser='nextcloud'
### Passen sie das Datenbankpasswort an
dbPassword='nextcloud'
fileNameBackupDb='nextcloud-db.sql'
if [ ! -d "${logDirectory}" ]
then
	mkdir -p "${logDirectory}"
fi
errorecho() { cat <<< "$@" 1>&2; }
exec > >(tee -i "${logFile}")
exec 2>&1
if [ "$(id -u)" != "0" ]
then
	errorecho "ERROR: This script has to be run as root!"
	exit 1
fi
if [ ! -d "${localBackupDir}" ]
then
	errorecho "ERROR: The local backup directory ${localBackupDir} does not exist!"
	exit 1
fi
echo -e "\nStart des Backups: ${currentDateReadable}\n"
echo -e "Die Daten werden zusammengestellt"
dpkg --get-selections > "${localBackupDir}/software.list"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --on
echo "Der Webserver nginx wird gestoppt"
systemctl stop "${webserverServiceName}"
echo "Die Datenbanksicherung wird erstellt"
mysqldump --single-transaction -h localhost -u "${dbUser}" -p"${dbPassword}" "${nextcloudDatabase}" > "${localBackupDir}/${fileNameBackupDb}"
echo -e "\nBackup mit borgbackup"
# Möchte Sie Verzeichnisse vom Backup ausschließen, so würde die Zeile bspw. wie folgt aussehen
# borg create --exclude '/Verzeichnis1' --exclude '/Verzeichnis2/zwei' --stats \
borg create --stats \
    $borgRepository::"${currentDate}" \
	$localBackupDir \
	$borgBackupDirs 
echo
echo "Der Webserver nginx wird gestartet"
systemctl start "${webserverServiceName}"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --off
echo "Die temporären Daten werden bereinigt"
rm "${localBackupDir}"/software.list
rm -r "${localBackupDir}/${fileNameBackupDb}"
borg prune --progress --stats $borgRepository \
### tägliche Backups werden 1 Woche (7 Tage) vorgehalten
--keep-within=7d \
### wöchentliche Backups werden 4 Wochen vorgehalten
--keep-weekly=4 \
### monatliche Backups werden 6 Monate vorgehalten
--keep-monthly=6
endTime=$(date +%s)
endDateReadable=$(date --date @"$endTime" +"%d.%m.%Y - %H:%M:%S")
duration=$((endTime-startTime))
durationSec=$((duration % 60))
durationMin=$(((duration / 60) % 60))
durationHour=$((duration / 3600))
durationReadable=$(printf "%02d Stunden %02d Minuten %02d Sekunden" $durationHour $durationMin $durationSec)
echo -e "\nEnde des Backups: ${endDateReadable} (${durationReadable})\n"
echo -e "Die aktuelle Backup-Plattenbelegung:\n"
df -h ${backupDiscMount}
echo -e '\n\n(c) Carsten Rieger IT-Services\n'
### Passen Sie Ihre Emailadresse an oder kommentieren die Zeile aus
mail -s "Nextcloud-Backup beendet" ihre@email.de < "${logFile}"

Markieren Sie das Skript noch als ausführbar

chmod +x /root/backup.sh

Ein erfolgreicher Backuplauf wird beispielsweise wie folgt protokolliert:

Erstellen Sie einen cronjob, der das Backup automatisch täglich für Sie ausführt:

crontab -e
7 2 * * * /root/backup.sh > /dev/null 2>&1

Sie können sich die erstellten Backups auflisten lassen:

borg list /backup/daten

Möchten Sie nun ein Backupset durchsuchen, respektive Ihre Daten wieder herstellen, so mounten Sie das Backupset und stellen dann daraus Ihre Daten einzeln oder komplett wieder her:

borg mount /backup/daten::<date> /restore
Beispiel:
borg mount /backup/daten::20200602_084033 /restore/

Zum Beenden verlassen Sie das eingebundene Backupset mittels

borg umount /back/daten

wieder. Weitere Befehle können Sie der Borg-Dokumentation entnehmen.

© Carsten Rieger IT-Services

Carsten Rieger

Carsten Rieger ist ein angestellter Senior IT-Systemengineer und zudem auch als Kleinunternehmer (Freelancer) aktiv. Er arbeitet seit mehr als 15 Jahren im Linux- und Microsoftumfeld, ist ein Open Source Enthusiast und hoch motiviert, Linux Installationen und Troubleshooting durchzuführen. Dabei arbeitet er vorrangig mit Debian und Ubuntu Linux, Nginx und Apache Webservern, MariaDB/MySQL/PostgreSQL, PHP, Cloud Infrastrukturen (bspw. Nextcloud) und auch vielen anderen Open Source Projekten (bspw. Roundcube). Zudem engagiert er sich ehrenamtlich für die Dr. Michael & Angela Jacobi Stiftung - und das schon seit mehr als 7 Jahren.