Anleitung - Restic basiertes VM Backup
Diese Anleitung zeigt, wie Sie auf Ihrer VM automatisiert und sicher ein Restic-Backup Ihres gewünschten Verzeichnisses (z. B. /srv) in ein S3-Repository durchführen lassen.
Durch die Kombination eines systemd-Timers und eines Bash-Skripts startet das Backup jeden Tag zufällig zu einem Zeitpunkt zwischen 2:00 Uhr und 4:00 Uhr nachts.
Das Backup-Skript liest vor dem Start die S3- und Restic-Zugangsdaten sowie das Backup-Zielverzeichnis aus konfigurierbaren Variablen bzw. einem Environment-File.
Achtung
Es ist nicht sinnvoll, das gesamte System in das Backup aufzunehmen, sondern lediglich die Daten zu sichern, die für den Betrieb der Anwendung oder der virtuellen Maschine (VM) notwendig sind. Der Grund dafür ist, dass die vollständigen VM-Images bereits auf Storage-Ebene in einem täglichen Backup gesichert werden. Diese System-Backups werden zentral verwaltet und stehen im Notfall zur Wiederherstellung der gesamten VM bereit, auch wenn Nutzer darauf keinen direkten Zugriff haben. Das Backup auf Nutzerebene sollte sich deshalb auf individuelle Konfigurationsdateien, Anwendungsdaten und sonstige wichtige eigene Inhalte beschränken. Dadurch wird das Backup effizienter, benötigt weniger Speicherplatz und lässt sich im Fehlerfall gezielter und schneller wiederherstellen. Systemdateien und generische Betriebssystemdaten sind meist identisch und können bei Bedarf aus Standard-Images oder aus dem zentralen Storage-Backup wiederhergestellt werden.
Restic-Backup für VM-Nutzer: Kurzanleitung
Grundlegende Restic-Befehle
Backup anlegen:
restic backup /srv
Snapshots anzeigen:
restic snapshots
Snapshot löschen:
restic forget <SNAPSHOT_ID>
restic prune
Snapshot wiederherstellen:
restic restore <SNAPSHOT_ID> --target /pfad/zum/wiederherstellen
Hier sei weiterhin auf die Restic Documentation verwiesen.
Wozu dient das Restic-Passwort?
Restic verschlüsselt alle Ihre Backups standardmäßig Ende-zu-Ende.
Ohne das Passwort können Ihre Daten nicht wiederhergestellt werden, auch nicht von der RBG
Das Passwort dient als Schlüssel für die Verschlüsselung und den Zugriff auf das Backup-Repository.
Bewahren Sie das Passwort sicher auf! Wenn Sie es verlieren, können Ihre Backups nicht mehr entschlüsselt werden.
Sicheres Passwort generieren (128 Zeichen, Einzeiler):
tr -dc 'A-Za-z0-9!#$%&()*+,-./:;<=>?@[]^_{|}~' < /dev/urandom | head -c128 > /etc/restic/restic-secret.txt
- Damit wird ein 128-stelliges, sicheres Passwort in die Datei
/etc/restic/restic-secret.txtgeschrieben. - Der Ort der Datei ist hierbei willkürlich gewählt und nicht restic speziefisch
- Schützen Sie die Datei vor unberechtigtem Zugriff:
chmod 600 /etc/restic/restic-secret.txt
Restic-Umgebungsskript anlegen und schützen
Speichern Sie das folgende Beispiel als /etc/restic/restic.env und passen Sie es an:
#!/bin/bash
export AWS_ACCESS_KEY_ID="IHR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="IHR_SECRET_KEY"
export RESTIC_REPOSITORY="s3:https://tf-main-1.s3.techfak.net/backup"
export RESTIC_PASSWORD_FILE="/etc/restic/restic-secret.txt"
Schützen Sie auch dieses Environment-Skript:
chmod 600 /etc/restic/restic.env
Vor jeder interaktiven restic Nutzung:
source /etc/restic/restic.env
Beispiel Backup-Skript
Hier soll ein Beispiel-Script entstehen das veranschaulicht wie ein tägliches Backup durchgeführt werden kann
Speichern Sie das folgende Skript als /usr/local/sbin/restic-backup.sh
Passen Sie die Pfade und Variablen nach Bedarf an.
#!/bin/bash
# Restic Backup Script mit zufälliger Startzeit
# === KONFIGURATION ===
# Zu sicherndes Verzeichnis (anpassen!)
BACKUP_DIR="/srv"
# Pfad zum Restic-Environment-File (anpassen!)
ENV_FILE="/etc/restic/restic.env"
# Wieviele Daily Snapshots sollen aufbewahrt werden?
KEEP_DAILY=7
# Wieviele Weekly Snapshots sollen aufbewahrt werden?
KEEP_WEEKLY=5
# Wieviele Monthly Snapshots sollen aufbewahrt werden?
KEEP_MONTHLY=3
# Backup initialisieren?
INIT_BACKUP=True
# Tägliches Cleanup durchführen?
DAILY_CLEANUP=True
# === SCRIPT-LOGIK ===
# Umgebung setzen
source "$ENV_FILE"
# Repository initialisieren
if [ "${INIT_BACKUP}"="True" ]; then
restic snapshots > /dev/null 2>&1 || restic init
fi
# Backup durchführen
echo "$(date): Starte Restic Backup von $BACKUP_DIR ..."
restic backup "$BACKUP_DIR"
BACKUP_STATUS=$?
if [ $BACKUP_STATUS -eq 0 ]; then
echo "$(date): Restic Backup erfolgreich abgeschlossen."
else
echo "$(date): Restic Backup FEHLGESCHLAGEN (Status $BACKUP_STATUS)."
fi
# Cleanup durchführen
if [ "${DAILY_CLEANUP}"="True" ]; then
echo "$(date): Starte Restic Cleanup ..."
restic forget --keep-daily ${KEEP_DAILY} --keep-weekly ${KEEP_WEEKLY} --keep-monthly ${KEEP_MONTHLY} --prune
CLEANUP_STATUS=$?
if [ $CLEANUP_STATUS -eq 0 ]; then
echo "$(date): Restic Cleanup erfolgreich abgeschlossen."
else
echo "$(date): Restic Cleanup FEHLGESCHLAGEN (Status $CLEANUP_STATUS)."
fi
fi
Dateirechte setzen:
chmod 700 /usr/local/sbin/restic-backup.sh
Systemd-Timer und Service
Hier wird eine Systemd-Unit erzeugt die durch einen Systemd-Timer jeweils Täglich ausgeführt wird.
Backup-Service-Unit
Erstellen Sie die Datei /etc/systemd/system/restic-backup-randomized.service:
[Unit]
Description=Restic Backup (randomized start time)
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/restic-backup.sh
StandardOutput=append:/var/log/restic-backup.log
StandardError=append:/var/log/restic-backup.log
Timer-Unit
Erstellen Sie die Datei /etc/systemd/system/restic-backup-randomized.timer:
[Unit]
Description=Starte Restic Backup zufällig zwischen 02:00 und 04:00 Uhr
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=7200
Persistent=true
[Install]
WantedBy=timers.target
- Der Timer startet das Skript um 2:00 Uhr verzögert zufällig um bis zu 2 Stunden (oder 7200 Sekunden).
Timer aktivieren
systemctl daemon-reload
systemctl enable --now restic-backup-randomized.timer