Januar 8

0 Kommentare

Automatisierte Backups mit Restic und Minio im Home-Lab

By Olaf Buwen

Januar 8, 2025


Nachdem meine Workstation endlich auf neue Hardware umgezogen ist, wurde es Zeit, ein stündliches inkrementelles Backup aufzubauen, das die bisherige, auf rsnapshot basierende Lösung ersetzen kann. So kam ich zu diesem Ansatz mit restic und Minio – eine Kombination, die mir nicht nur mehr Flexibilität bietet, sondern auch Speicherplatz spart und einfacher zu verwalten ist.

Ich wollte eine Lösung, die sicher, schnell und leicht automatisierbar ist. Restic hat sich als genau das richtige Tool erwiesen, besonders in Kombination mit Minio als selbstgehostetem S3-Backend. Das Schöne daran? Die ersten Backups dauern lange, aber alle weiteren laufen blitzschnell.

Falls du ebenfalls nach einer zuverlässigen Backup-Lösung suchst, zeige ich dir hier meinen Ansatz – von der ersten Einrichtung bis zur Automatisierung mit Cron.

Vorbereitungen

Warum Restic?

  • Alle Backups sind automatisch verschlüsselt.
  • Durch Deduplizierung wird nur das gespeichert, was sich wirklich geändert hat.
  • Perfekt für Cloud- und lokale Backups.

Warum Minio?

  • Ein S3-kompatibler Storage-Server, den ich selbst hosten kann.
  • Funktioniert nahtlos mit restic.
  • Ideal für ein selbstbestimmtes Backup-Setup.

Restic installieren

Je nach Linux-Distribution kannst du restic ganz einfach installieren:

Debian/Ubuntu:

sudo apt update && sudo apt install restic -y

Arch Linux:

sudo pacman -S restic

RHEL-basiert:

sudo dnf install restic -y

Umgebung konfigurieren

Damit Restic mit Minio kommunizieren kann, muss eine .env-Datei mit den erforderlichen Zugangsdaten erstellt werden:

export RESTIC_PASSWORD_FILE=/root/.restic 
export RESTIC_REPOSITORY=s3:http://minio:9000/tardis-backup
export AWS_SECRET_ACCESS_KEY=<aws-secret>
export AWS_ACCESS_KEY_ID=tardis

Die Datei sollte aus Sicherheitsgründen mit eingeschränkten Berechtigungen versehen werden:

chmod 600 .env

Restic initialisieren

Bevor das Backup starten kann, muss das Repository initialisiert werden. Dazu wird zunächst die .env-Datei geladen und dann das Repository eingerichtet:

source .env 
restic init

Falls das Repository bereits existiert, gibt Restic eine entsprechende Meldung aus. Andernfalls wird das neue Repository erstellt und kann direkt genutzt werden.

Backup-Skript mit Restic

Mein Backup-Skript musste einfach sein: Es sollte alle relevanten Daten sichern, unnötige Dateien ignorieren und sich problemlos in meine bestehende Infrastruktur einfügen.

Hier ist mein aktuelles Backup-Skript:

#!/bin/bash 
# Verzeichnisse, die gesichert werden sollen

dirs="/etc /home /root /home/olaf/Nextcloud/Keepass"

# Logfile erweitern
exec >> /tmp/cron.hourly 2>&1

# Umgebungsvariablen laden 
source $(dirname "$0")/.env

# Lock-Datei erstellen, um doppelte Ausführung zu verhindern 
mkdir /tmp/restic-backup || { echo "$0 already running" exit 1 }
trap "rm -r /tmp/restic-backup" EXIT

echo "Starting backup at $(date)" 
time /usr/bin/restic --verbose backup --exclude-caches $dirs

echo "Pruning old snapshots" 
time /usr/bin/restic --verbose forget --keep-last 4 --keep-hourly 24 --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 4 --prune

echo "Backup finished at $(date)"

Wichtiger Hinweis zum ersten Backup

Ich war beim ersten Backup ehrlich gesagt etwas nervös, weil es mehrere Stunden gedauert hat. Restic musste ja alles von Grund auf speichern. Doch danach war ich beeindruckt: Die folgenden Backups liefen in wenigen Sekunden, da restic nur noch die geänderten Daten sichert. Falls du also denkst, dass es hängen geblieben ist – keine Sorge, das ist völlig normal!

Automatisierung mit Cron

Nachdem das Backup-Skript lief, wollte ich es automatisch ausführen lassen. Dafür eignet sich Cron perfekt:

echo "0 * * * * root /root/backup.sh" >> /etc/crontab

So wird das Backup stündlich angestoßen.

E-Mail-Benachrichtigung bei Fehlern

Ich wollte sichergehen, dass ich informiert werde, falls ein Backup fehlschlägt. Daher habe ich die MAILTO-Variable in die Crontab gesetzt:

MAILTO="admin@example.com" 
0 * * * * root /root/backup.sh

Jetzt bekomme ich automatisch eine Mail, falls etwas schiefgeht.

CACHEDIR.TAG nutzen, um unnötige Backups zu vermeiden

Damit Restic nicht sinnlos temporäre Dateien sichert, kannst du bestimmte Verzeichnisse mit einer CACHEDIR.TAG-Datei ausschließen:

echo "Signature: 8a477f597d28d172789f06886806bc55" > /home/user/.cache/CACHEDIR.TAG

Dadurch ignoriert restic dieses Verzeichnis automatisch, wenn du --exclude-caches verwendest.

Mehrere Clients ins Backup einbinden

Sobald mein Workstation-Backup lief, wollte ich auch meine anderen Rechner ins System einbinden. Dafür gibt es zwei Möglichkeiten:

  • Per SSH-Tunnel zu Minio
  • Minio über ein VPN erreichbar machen

Diese Lösungen werde ich in einem eigenen Beitrag detailliert beschreiben.

Troubleshooting & häufige Fehler

Hier sind einige Probleme, über die ich gestolpert bin – und wie ich sie gelöst habe:

  • 403 Forbidden bei Minio: Stelle sicher, dass die Access-Keys korrekt sind.
  • "Is there a repository at this location?" Falls du das Repository noch nicht initialisiert hast, führe restic init erneut aus.
  • Cronjob läuft nicht? Prüfe, ob restic im PATH liegt und das Skript ausführbar ist (chmod +x backup.sh).

Fazit & Ausblick

Ich bin mit meiner neuen Backup-Lösung mehr als zufrieden: Sie ist automatisiert, sicher und performant. Jetzt kann ich ruhig schlafen, weil ich weiß, dass meine Daten zuverlässig gesichert sind.

Aber das hier war nur der Anfang:

  • Ohne Wiederherstellung kein echtes Backup! Im nächsten Beitrag zeige ich, wie du deine Backups problemlos zurückspielst.
  • Minio von Grund auf installieren? Die Anleitung dazu findet ihr hier.
  • Mehrere Clients effizient sichern? Ein weiteres spannendes Thema!

Bleib dran – und sichere dein Home-Lab!

Falls du Fragen oder eigene Erfahrungen teilen möchtest, hinterlasse gerne einen Kommentar oder diskutiere mit uns im Forum!

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
>