Sichern Sie bspw. Ihre Cloud mit Borg Backup und profitieren dabei von inkrementellen und komprimierten Sicherungen, De-Duplizierung (Deduplication), Verschlüsselung und vielen weiteren Features.

Deduplicating archiver with compression and encryption

https://www.borgbackup.org/

BorgBackup / Borg 1.4 (v. 2.0 beta) ist eine Sicherungssoftware, die sehr platzsparende und schnelle, inkrementelle Sicherungen ermöglicht.

Borg-Manual: https://borgbackup.readthedocs.io/en/stable/
Borg-GIT: https://github.com/borgbackup/borg

Nutzen Sie die Hetzner StorageBox, so sehen Sie sich diesen Artikel an:

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!

HINWEIS:
Möchten Sie Ihre Daten auf einer Hetzner Storagebox sichern, so folgen Sie dieser Anleitung.

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
mount -a

Ende des optionalen Teils.


Nun installieren wir die Backupsoftware borgbackup:

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

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"
mariadb-dump --single-transaction --routines -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.