Einleitung #
Backups scheinen meistens nur ein Nice-to-have zu sein oder geraten gar ganz in Vergessenheit. Dabei ist es sehr wichtig Backups zu erstellen und sehr einfach diese einzurichten. Glauben Sie mir, Sie werden sehr dankbar sein, sollten Sie die Backups aus dieser Anleitung mal gebrauchen können.
Voraussetzungen #
Um diese Anleitung umsetzen zu können, brauchen Sie folgenden Dinge:
- Ein auf Linux basiertes Betriebssystem (Wir nutzen Debian)
- Einen S3 kompatiblen Speicher (z.B. Amazon AWS, Hetzner, Minio)
Vorbereitungen #
Wir wollen die Sicherung mit Restic umsetzen. Restic ist eine moderne Backuplösung, die unter allen gängigen Betriebssystemen lauffähig ist. Das Programm ist Open Source und bietet alle notwendigen Features um ein langfristiges Backupkonzept zu betrieben. Mehr zu Restic können Sie hier nachlesen.
Um Restic nutzen zu können, müssen Sie es über einen Paketmanager, wie apt
, apk
oder dnf
installieren.
Wir zeigen Ihnen hier für die Kommandozeilenbefehle für die genannten Paketmanager:
Debian/Ubuntu #
apt-get install restic
Alpine Linux #
apk add restic
Fedora #
dnf install restic
Weitere Installationslanleitung wie macOS, Windows und viele weitere, lassen sich der Installationsseite entnehmen.
Backup Skript #
Um das Backup zu erzeugen, nutzen wir ein Bash-Skript. Dieses Skript definiert die notwendigen Umgebungsbariablen, die zu sichernden Pfade und kümmert sich nach dem Backup auch um das Löschen alter Sicherungen.
Um das Skript ablegen zu können, müssen wir die entsprechende Ordnerstruktur vorbereiten:
mkdir /etc/restic
Skript #
/etc/restic/backup.sh
#!/usr/bin/bash
set -e
unset HISTFILE
export RESTIC_PASSWORD="<PASSWORD>"
export RESTIC_REPOSITORY="s3:<S3_PATH>"
export AWS_ACCESS_KEY_ID="<ACCESS_KEY>"
export AWS_SECRET_ACCESS_KEY="<ACCESS_SECRET>"
BACKUP_DIRS="<BACKUP_DIRECTORIES>"
/usr/bin/restic backup -v $BACKUP_DIRS 2>&1
/usr/bin/restic forget --keep-daily 14 --keep-monthly 12 --keep-yearly 3 --prune
Erläuterung #
Gehen wir das Skript im einzelnen durch:
#!/usr/bin/bash
set -e
In den ersten beiden Zeilen definieren wir den Shebang und definieren, dass Fehler zum sofortigen Abbruch des Skripts führen sollen.
unset HISTFILE
export RESTIC_PASSWORD="<PASSWORD>"
export RESTIC_REPOSITORY="s3:<S3_PATH>"
export AWS_ACCESS_KEY_ID="<ACCESS_KEY>"
export AWS_SECRET_ACCESS_KEY="<ACCESS_SECRET>"
In diesem Block sorgen wir mit unset HISTFILE
dafür, dass die Umgebungevariablen die im Skript definiert werden nicht in der Bash History
landen.
BACKUP_DIRS="<BACKUP_DIRECTORIES>"
Hiermit definieren wir alle Ordner, die Teil des Backups sein sollen. Es können hier beliebig viele Pfade die jeweils durch Leerzeichen getrennt sind, angegeben werden. Das kann dann z.B. so aussehen:
BACKUP_DIRS="/var/lib/mysql /home/username/Documents /mnt/data/myfiles"
Alle Pfade die hier hinterlegt werden, werden dann gemeinsam als Backup abgelegt. Wenn Sie bestimmte Daten getrennt voneinander ablegen wollen, können Sie das Skript entsprechend duplizieren oder erweitern.
/usr/bin/restic backup -v $BACKUP_DIRS 2>&1
Dieser Befehl startet das eigentliche Backup. Durch das Flag -v
bekommen wir einen Debugoutput, welcher mehr Informationen
zur Ausführung enthält. Über $BACKUP_DIRS
werden die in der vorigen Zeile definierten Pfade an Restic übergeben.
2>&1
sorgt dafür das Ausgaben für stderr
in stdout
verschoben werden. Wenn Sie mehr über dieses Thema erfahren wollen,
können Sie hier
nachschauen.
/usr/bin/restic forget --keep-daily 14 --keep-monthly 12 --keep-yearly 3 --prune
Die letzte Zeile ist dafür gedacht um nicht alle jemals erstellen Sicherungen zu speichern, sondern nur relevante Backups zu behalten. Dadurch sparen wir Speicherplatz und somit Kosten. Über die Flags können Sie definieren, wie viele Sicherungen behalten werden sollen.
Die hier gezeigte Kombination behält die Sicherungen der letzten 14 Tage. Außerdem wird von den letzten 12 Monaten
auch pro Monat das jeweils letzte Backup vorgehalten. Ähnlich verhält es sich mit den Jahresbackups, von denen
immer die letzte Sicherung des Kalenderjahres verbleibt. Dies wird dann auf die letzten 3 Jahre angewandt.
Zur Illustration, hier eine Beispielauflistung für die Backups die am 21.06.2025
behalten würden:
Flag | Zu behaltenden Sicherungen |
---|---|
keep-daily |
Alle Sicherungen vom 08.06.2025 bis einschließlich 21.06.2025 |
keep-monthly |
21.06.2025 , 31.05.2025 , 30.04.2025 , 31.03.2025 , 28.02.2025 ,31.01.2025 , 31.12.2024 , 30.11.2024 , 31.10.2025 , 30.09.2025 , 31.08.2025 , 31.07.2025 , |
keep-yearly |
21.06.2025 , 31.12.2024 , 31.12.2023 |
Weitere Parameter oder andere Kombinationen von zu behaltenden Daten können in der Dokumentation von Restic nachgelesen werden.
Testen des Skripts #
Bevor wir das Repository nutzen können, müssen wir es initialisieren. Setzen Sie dazu die Umgebungsvariablen aus dem Skript
und führen Sie restic init
aus. Die Ausgabe sollte ungefähr so ausschauen:
root@host:/etc/restic# restic init
created restic repository 67dc85d75b at s3:s3-location.de/bucket/blog
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.
Nach dem Speichern, machen Sie das Skript mittels chmod +x ./backup.sh
ausführbar und lassen Sie es durchlaufen.
Wenn alles korrekt eingerichtet ist, sollte die Ausgabe wie folgt aussehen und Sie können sich mit der Einrichtung des
Cronjobs beschäftigen.
root@msadm01:/etc/restic# ./backup.sh
open repository
repository 67dc85d7 opened (repository version 2) successfully, password is correct
created new cache in /root/.cache/restic
lock repository
no parent snapshot found, will read all files
load index files
start scan on [/tmp/test]
start backup on [/tmp/test]
scan finished in 0.619s: 0 files, 0 B
Files: 0 new, 0 changed, 0 unmodified
Dirs: 2 new, 0 changed, 0 unmodified
Data Blobs: 0 new
Tree Blobs: 3 new
Added to the repository: 710 B (673 B stored)
processed 0 files, 0 B in 0:00
snapshot 479420ac saved
repository 67dc85d7 opened (repository version 2) successfully, password is correct
Applying Policy: keep 14 daily, 12 monthly, 3 yearly snapshots
keep 1 snapshots:
ID Time Host Tags Reasons Paths
----------------------------------------------------------------------------------
479420ac 2025-06-26 14:18:08 hostname daily snapshot /tmp/test
monthly snapshot
yearly snapshot
----------------------------------------------------------------------------------
1 snapshots
Cronjob #
Um die Logdateien zu sichern, müssen wir vorher einmalig den Ordner anlegen:
mkdir /var/log/restic-client/
Um das Backup automatisch jede Nacht zu starten, nutzen wir in diesem Besipiel einen Cronjob. Dieser wird mittels
crontab -e
editiert und wie folgt eingerichtet:
10 0 * * * /etc/restic/backup.sh >> /var/log/restic-client/$(date '+\%Y-\%m-\%d_\%H-\%M-\%S').log 2>&1
| | | | |
| | | | |
| | | | +---- Day of the Week (range: 1-7 or SUN-SAT)
| | | +------ Month of the Year (range: 0-11 or JAN-DEC)
| | +-------- Day of the Month (range: 1-31)
| +---------- Hour (range: 0-23)
+------------ Minute (range: 0-59)
Unter dem Eintrag für den Job definiert, stehen die Erläuterungen der einzelnen Zeitmarker eingefügt.
Diese dienen nur der Information und sollen nicht übernommen werden.
Der Job wird jede Nacht um 00:10 Uhr
gestartet und führt unser Backup Shellskript aus.
Die Ausgabe wird mittels >>
in ein Log-Datei unter dem Pfad /var/log/restic-client/
geschrieben. Diese ist mit dem
entsprechenden Datum und der Uhrzeit, zu der der Job gestartet wird, versehen. Am Ende wird mittels 2>&1
angegeben,
dass alle Ausgaben nach stderr
ebenfalls nach stdout
umgeleitet werden. Dies garantiert, dass alle
Ausgaben im Logfile landen und gespeichert werden. Weitere Informationen hierzu unter erhalten Sie hier
Nun sollte die Einrichtung des Backups fertig sein und Ihre Pfad werden automatisch jede Nacht nach S3 gesichert.
Viel Erfolg bei der Umsetzung Ihrer Backupstrategie. Sollten Sie Fragen oder Anregungen haben, scheuen Sie nicht mich über die unten angegebenen Kanäle zu kontaktieren.