Borg Backup mit Deduplication

Nextcloud Borg Backup mit Deduplication

BorgBackup / Borg 1.1.14 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.

Letzte Aktualisierung:
Im Beispielskript wurden die Zeilenumbrüche entfernt,
(borg prune –progress –stats $borgRepository –keep-within=7d –keep-weekly=4 –keep-monthly=6)
da diese WordPress-formatbedingt zu Fehlern geführt haben.

07. August 2020
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
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
##################################
### Beispieldaten:
### logDirectory="/backup_logs/"
### backupDiscMount="/backup/"
### localBackupDir="/backup/temp"
##################################
export BORG_PASSPHRASE='<DAS-BORG-PASSWORT>'
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")
logDirectory="/<BORG-LOGVERZEICHNIS>/"
logFile="${logDirectory}/${currentDate}.log"
backupDiscMount="/<BACKUP-VERZEICHNIS>/"
localBackupDir="/<BACKUP-VERZEICHNIS>/temp"
borgRepository="${backupDiscMount}/daten"
borgBackupDirs="/etc/ /var/nc_data/ /root/ /var/www/nextcloud/ $localBackupDir/"
nextcloudFileDir='/var/www/nextcloud'
webserverServiceName='nginx'
webserverUser='www-data'
nextcloudDatabase='nextcloud'
dbUser='<NEXTCLOUD-DATENBANKBENUTZER>'
dbPassword='<NEXTCLOUD-DATENBANKBENUTZER-PASSWORT>'
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 "\n###### Start des Backups: ${currentDateReadable} ######\n"
echo -e "Daten werden zusammengestellt"
dpkg --get-selections > "${localBackupDir}/software.list"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --on
echo "nginx wird gestoppt"
systemctl stop "${webserverServiceName}"
echo "Datenbanksicherung wird erstellt"
mysqldump --single-transaction -h localhost -u "${dbUser}" -p"${dbPassword}" "${nextcloudDatabase}" > "${localBackupDir}/${fileNameBackupDb}"
echo -e "\nBackup mit borgbackup"
borg create --stats \
    $borgRepository::"${currentDate}" \
	$localBackupDir \
	$borgBackupDirs 
echo
echo "nginx wird gestartet"
systemctl start "${webserverServiceName}"
sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --off
rm "${localBackupDir}"/software.list
rm -r "${localBackupDir}/${fileNameBackupDb}"
borg prune --progress --stats $borgRepository --keep-within=7d --keep-weekly=4 --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 "\n###### Ende des Backups: ${endDateReadable} (${durationReadable}) ######\n"
echo -e "Plattenbelegung:\n"
df -h ${backupDiscMount}
mail -s "Nextcloud-Backup beendet" <IHRE@EMAILADRESSE.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 /restore/

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

© Carsten Rieger IT-Services