Springe zum Inhalt

Linux-Backup mit duplicity

Ein Grundsatz in der IT lautet: Backup, Backup, Backup. Auch wenn die ganze Zeit über alles normal läuft, wird die Katastrophe genau dann eintreffen, wenn kein Backup zur Verfügung steht. Dabei sind Festplatten-Crashes evtl. noch die Ausnahme, vielmehr werden sicherlich Bedienungsfehler oder ein unachtsames Kommando zum rekursiven Löschen von Verzeichnissen die Katastrophe auslösen. Wichtige Arbeiten sind verschwunden, ganze Projekte werden zurückgeworfen, die private Bilder- oder Musiksammlung ist verloren. Diesem Horrorszenario begegnet man mit einem regelmäßigem Backup der wichtigen Daten. Ebenso sollte das Backup automatisch ausgeführt werden und nicht per Hand ausgelöst werden müssen. Für Serverbetreiber ist ein automatisches Backup ebenso Pflicht, um im Fehlerfall schnell wieder den gewohnten Service zur Verfügung stellen zu können.

Bei der Suche nach einem geeigneten Backup-Tool stieß ich auf duplicity. Nach dem Studium diverser Howtos zu duplicity und besonders als ich las, dass mein Hosting-Provider in seinem Wiki explizit duplicity inkl. ein paar Beispielen erwähnt, hatte ich meine Lösung gefunden. duplicity kann die Backups über eine Vielzahl von Protokollen übertragen. Aktuell werden HTTP, FILE, FTP, HSI, IMAP(S), RSYNC, S3, SCP, SSH, TAHOE und WEBDAV(S) unterstützt. Die Backups werden vor der Übertragung lokal mit GPG verschlüsselt. duplicity unterstützt das Erstellen von inkrementalen Backups und erstellt mit entsprechenden Optionen automatisch wieder ein Full-Backup nach einer angegebenen Zeitspanne.

Unter Ubuntu kann duplicity direkt aus den Paketquellen installiert werden. Falls man den Backup-Space per FTP erreichen möchte, ist zusätzlich das Paket NcFTP erforderlich:

sudo apt-get install duplicity
sudo apt-get install ncftp

Ein einfaches Backup kann anschließend mit folgendem Kommando durchgeführt werden:

export PASSPHRASE=SomeLongGeneratedHardToCrackKey
export FTP_PASSWORD=WhateverPasswordYouSetUp
duplicity /etc ftp://FtpUserID@ftp.domain.com/etc
unset PASSPHRASE
unset FTP_PASSWORD

Mit der ersten Zeile wird ein Passwort festgelegt, mit dem der Backup-Satz verschlüsselt wird. In der zweiten Zeile wird das Passwort des FTP-Servers gesetzt. Dieses sollte nicht direkt in der Backup-URL eingegeben werden, denn dann wäre es von anderen Usern auf dem Server durch die Ausgabe der Prozessliste lesbar.

Ein Restore einzelner Dateien ist ebenso möglich:

export PASSPHRASE=SomeLongGeneratedHardToCrackKey
export FTP_PASSWORD=WhateverPasswordYouSetUp
duplicity --file-to-restore apt/sources.list ftp://FtpUserID@ftp.domain.com/etc /home/user/sources.list
unset PASSPHRASE
unset FTP_PASSWORD

Mit diesem Skript wird der letzte gesicherte Stand der Datei apt/sources.list aus dem Backup-Satz /etc nach /home/user/sources.list zurückgespeichert. Mit folgendem Kommando kann z.B. der Stand von vor vier Tagen zurückgespeichert werden (vorausgesetzt, man erstellt tägliche Backups):

duplicity -t4D --file-to-restore apt/sources.list ftp://FtpUserID@ftp.domain.com/etc /home/user/sources.list

Ein komplettes Beispiel aus dem Ubuntu-Hilfeforum kann als Grundlage für eigene Anpassungen dienen:

export PASSPHRASE=(insert your value here)
export FTP_PASSWORD=(insert your value here)

# doing a monthly full backup (1M)
duplicity --full-if-older-than 1M /etc ftp://(insert your FTP server here)/etc
# exclude /var/tmp from the backup
duplicity --full-if-older-than 1M --exclude /var/tmp /var ftp://(insert your FTP server here)/var
duplicity --full-if-older-than 1M /root ftp://(insert your FTP server here)/root

# cleaning the remote backup space (deleting backups older than 6 months (6M, alternatives would 1Y fo 1 year etc.)
duplicity remove-older-than 6M --force ftp://(insert your FTP server here)/etc
duplicity remove-older-than 6M --force ftp://(insert your FTP server here)/var
duplicity remove-older-than 6M --force ftp://(insert your FTP server here)/root

unset PASSPHRASE
unset FTP_PASSWORD

Die Option --full-if-older-than erstellt nach der angegebenen Zeitspanne automatisch wieder ein Full-Backup. Ist die Zeitspanne zum letzten Full-Backup noch nicht überschritten, werden inkrementale Backups erstellt. Das Kommando remove-older-than aus dem zweiten Teil des Skripts sorgt anschließend dafür, dass Backups, die älter als 6 Monate sind gelöscht werden.