Effizientes Systembackup mit Restic, NFS und Rclone

Effizientes Systembackup mit Restic, NFS und Rclone

von der Erstellung inkrementeller Backups mit Restic über die Einbindung eines entfernten Backup-Speichers per NFS bis hin zur Synchronisation mit Rclone und der Wiederherstellung im Notfall.


In diesem Beitrag zeige ich, wie ich meinen 43-GB-Server (mit 99 % Docker Compose-Apps und Cronjobs) effizient sichere – und das inkrementell, sodass nur geänderte Daten gespeichert werden. Mit einem Zielspeicher von 5 TB steht uns reichlich Platz zur Verfügung. Dabei kommen Restic, NFS und Rclone zum Einsatz.

1. Vollständige Systembackups mit Restic

Warum Restic?

Restic ist ein modernes Backup-Tool, das:

  • Deduplizierung unterstützt (nur geänderte Daten werden gespeichert)
  • Verschlüsselung und Komprimierung bietet
  • Einfach per Skript automatisiert werden kann

Repository-Passwort sichern

Um zu vermeiden, dass bei jedem Backup das Passwort manuell eingegeben werden muss, speichern wir es in einer geschützten Datei (z. B. /etc/restic-password). Wichtig: Die Datei sollte nur für root lesbar sein:

sudo sh -c 'echo "dein_geheimes_passwort" > /etc/restic-password'
sudo chmod 600 /etc/restic-password

Backup-Skript

Das folgende Skript führt das Backup, entfernt alte Snapshots und säubert unreferenzierte Daten. Es nutzt sudo -E, um Umgebungsvariablen (wie das Passwort) an Restic weiterzureichen.

#!/bin/bash

# Konfiguration
REPO_PATH="/mnt/backup_new/backup-server/"
EXCLUDE_FILE="/mnt/backup_new/excludes.txt"
LOG_FILE="restic-backup.log"
KEEP_DAILY=7
KEEP_WEEKLY=4
KEEP_MONTHLY=6
PASSWORD_FILE="/etc/restic-password"

# Sicherstellen, dass Restic installiert ist
if ! command -v restic &>/dev/null; then
    echo "Restic ist nicht installiert. Bitte zuerst installieren." | tee -a "$LOG_FILE"
    exit 1
fi

# Restic-Passwort laden
if [ -f "$PASSWORD_FILE" ]; then
    export RESTIC_PASSWORD_FILE="$PASSWORD_FILE"
else
    echo "Restic-Passwortdatei nicht gefunden unter $PASSWORD_FILE" | tee -a "$LOG_FILE"
    exit 1
fi

# Backup starten
echo "[$(date)] Starte Restic-Backup..." | tee -a "$LOG_FILE"
sudo -E restic backup -r "$REPO_PATH" --exclude-file="$EXCLUDE_FILE" / 2>&1 | tee -a "$LOG_FILE"

# Alte Snapshots löschen (Forget + Prune)
echo "[$(date)] Lösche alte Snapshots..." | tee -a "$LOG_FILE"
sudo -E restic forget -r "$REPO_PATH" --keep-daily "$KEEP_DAILY" --keep-weekly "$KEEP_WEEKLY" --keep-monthly "$KEEP_MONTHLY" --prune 2>&1 | tee -a "$LOG_FILE"

# Unreferenzierte Daten entfernen
echo "[$(date)] Führe Prune aus, um nicht referenzierte Daten zu löschen..." | tee -a "$LOG_FILE"
sudo -E restic prune -r "$REPO_PATH" 2>&1 | tee -a "$LOG_FILE"

# Repository-Integrität prüfen
echo "[$(date)] Überprüfe die Repository-Integrität..." | tee -a "$LOG_FILE"
sudo -E restic check -r "$REPO_PATH" 2>&1 | tee -a "$LOG_FILE"

# Besitzrechte fuer rclone aendern
echo "[$(date)] Changing ownership for rclone access..." | tee -a "$LOG_FILE"
sudo chown -R "$BACKUP_USER":"$BACKUP_USER" "$REPO_PATH"

echo "[$(date)] Backup erfolgreich abgeschlossen." | tee -a "$LOG_FILE"

Exclude-Datei anlegen

Die Datei /mnt/backup_new/excludes.txt sollte dynamische und nicht benötigte Verzeichnisse ausschließen:

/dev
/proc
/sys
/tmp
/run
/mnt
/media
/lost+found
/var/lib/docker  # Docker-Container und Images können separat gesichert werden

Automatisierung per Cron

Um das Backup täglich um 3 Uhr nachts auszuführen, fügen wir folgenden Eintrag zur Crontab hinzu (crontab -e):

0 3 * * * /pfad/zum/backup_script.sh >> restic-cron.log 2>&1

2. Backup-Speicher auf einem entfernten Server per NFS

Für den zweiten Server, der im selben Netzwerk ist, aber keinen direkt angebundenen Speicher hat, empfiehlt sich ein NFS-Mount. Damit wird der Speicher, der an Server 1 angeschlossen ist, über NFS freigegeben und auf Server 2 eingebunden.

Einrichtung auf dem Speicher-Server (Server 1)

Exports aktivieren:

sudo exportfs -ra
sudo systemctl restart nfs-server

Exports konfigurieren: Bearbeite /etc/exports:

/mnt/backup_new 192.168.1.<Server2-IP>(rw,sync,no_root_squash,no_subtree_check)

NFS-Server installieren:

sudo apt install nfs-kernel-server   # Debian/Ubuntu
sudo dnf install nfs-utils           # Fedora
sudo pacman -S nfs-utils             # Arch

Einrichtung auf dem Backup-Client (Server 2)

Automatisches Mounten via fstab: Füge in /etc/fstab hinzu:

192.168.1.10:/mnt/backup_new /mnt/backup_new nfs defaults,_netdev 0 0

Mount-Punkt erstellen und NFS-Freigabe einbinden:

sudo mkdir -p /mnt/backup_new
sudo mount -t nfs -o tcp 192.168.1.10:/mnt/backup_new /mnt/backup_new

Tipp: Falls DNS oder Port-Probleme auftreten, überprüfe Firewall-Einstellungen auf Server 1 und verwende die IP-Adresse anstelle des Hostnamens.

NFS-Client installieren:

sudo apt install nfs-common   # Debian/Ubuntu
sudo dnf install nfs-utils    # Fedora
sudo pacman -S nfs-utils      # Arch

Auf Server 2 greifen wir dann in unserem Backup-Skript auf den Pfad /mnt/backup_new/backup-server-2/ zu.


3. Synchronisation mit der Cloud via Rclone

Zusätzlich zur lokalen Sicherung synchronisieren wir die Backups mit der Cloud – etwa via Rclone:

rclone sync /mnt/backup_new/backup-server remote:/backup-location

Tipp: Wenn es zu "Permission Denied"-Fehlern kommt, prüfe die Dateiberechtigungen. In meinem Fall half es, den Besitz des Backup-Verzeichnisses zu ändern:

sudo chown -R deinuser:deinuser /mnt/backup_new/backup-server

4. Wiederherstellung im Notfall

Sollte einmal das System ausfallen, lässt sich das Backup mit Restic einfach wiederherstellen.

Gesamtes System wiederherstellen

Um das komplette System an einem bestimmten Tag wiederherzustellen, führe folgenden Befehl aus:

sudo -E restic restore latest --target /

Dieser Befehl stellt alle Dateien des letzten Snapshots in das Root-Verzeichnis (/) wieder her.
Hinweis: Für eine selektive Wiederherstellung kannst du den --include-Parameter nutzen:

sudo -E restic restore latest --target / --include /etc/

Zusammenfassung

  • Restic sorgt für ein sicheres, inkrementelles Backup, das nur Änderungen speichert.
  • Das Backup-Skript automatisiert den Prozess, inklusive Aufräumen alter Snapshots und Prüfen der Repository-Integrität.
  • NFS ermöglicht es, den an einem anderen Server angeschlossenen Speicher in das Netzwerk einzubinden.
  • Rclone synchronisiert die Backups zusätzlich mit der Cloud – nach Korrektur der Berechtigungen.
  • Im Notfall kann das System einfach mit restic restore wiederhergestellt werden.

Diese Lösung ist robust, effizient und automatisiert – ideal für Server, die in produktiven Umgebungen laufen. Ich hoffe, diese Dokumentation hilft euch dabei, eure eigenen Backups aufzusetzen und zu verstehen, wie ihr im Ernstfall schnell wiederherstellen könnt.