Skip to content

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.txt geschrieben.
  • 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