Backup Best Practices
Ein Backup ist nur so gut wie seine Umsetzung. Diese Best Practices machen den Unterschied.
🔐 Schritt 0: Verschlüsselung
Jedes Backup sollte verschlüsselt sein - besonders wenn es den eigenen Server verlässt.
Unverschlüsselte Backups sind ein Risiko
Verschlüsselung mit restic:
# Repository initialisieren (Passwort wird abgefragt)
restic init -r /mnt/backup/restic-repo
# Mit Passwort-Datei (für Cronjobs)
echo "mein-sicheres-passwort" > /root/.restic-password
chmod 600 /root/.restic-password
export RESTIC_PASSWORD_FILE=/root/.restic-password Verschlüsselung mit borg:
# Repository mit Verschlüsselung initialisieren
borg init --encryption=repokey /mnt/backup/borg-repo
# Key exportieren und sicher aufbewahren!
borg key export /mnt/backup/borg-repo > borg-key-backup.txt Passwort sicher aufbewahren!
📅 Schritt 1: Retention Policy
Wie lange bewahrst du Backups auf? Eine durchdachte Retention Policy spart Speicher und erfüllt Anforderungen.
Empfohlene Retention (GFS-Schema):
- 7 tägliche - letzte Woche komplett
- 4 wöchentliche - letzter Monat (Sonntage)
- 12 monatliche - letztes Jahr (Monatserste)
- Unbegrenzt jährliche - für Compliance (optional)
restic forget mit Policy:
# Alte Snapshots nach Policy löschen
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--keep-yearly 5 \
--prune
# --prune löscht die nicht mehr referenzierten Daten borg prune:
borg prune --list \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=12 \
/mnt/backup/borg-repo Gesetzliche Aufbewahrungsfristen
🧪 Schritt 2: Restore-Tests
Ein ungetestetes Backup ist kein Backup
Was du testen solltest:
- Kannst du das Backup überhaupt öffnen? (Passwort noch bekannt?)
- Sind alle erwarteten Dateien vorhanden?
- Lässt sich eine Datenbank aus dem Dump wiederherstellen?
- Funktioniert die Anwendung nach dem Restore?
- Wie lange dauert der Restore? (Ist das akzeptabel?)
Restore-Test mit restic:
# Snapshot-Liste anzeigen
restic snapshots
# Einzelne Datei wiederherstellen
restic restore latest --target /tmp/restore-test --include "/etc/nginx"
# Prüfen ob Dateien korrekt sind
diff -r /etc/nginx /tmp/restore-test/etc/nginx Datenbank-Restore testen:
# PostgreSQL Dump wiederherstellen (in Test-DB)
createdb test_restore
pg_restore -d test_restore /tmp/restore-test/backup.sql
# Prüfen ob Daten vorhanden
psql test_restore -c "SELECT COUNT(*) FROM wichtige_tabelle;"
# Test-DB wieder löschen
dropdb test_restore Restore-Test dokumentieren
📋 Schritt 3: Backup-Dokumentation
Was du dokumentieren solltest:
Backup-Dokumentation Checkliste:
- ☐ Was wird gesichert? (Verzeichnisse, Datenbanken, VMs)
- ☐ Wohin wird gesichert? (Pfade, Server, Credentials)
- ☐ Wann laufen die Backups? (Zeitplan)
- ☐ Wie lange werden Backups aufbewahrt? (Retention)
- ☐ Wie wird wiederhergestellt? (Schritt-für-Schritt)
- ☐ Wer ist verantwortlich?
- ☐ Wo liegt das Passwort/der Key?
Beispiel-Dokumentation:
# Backup-Dokumentation Server: web01
## Gesicherte Daten
- /etc (Konfiguration)
- /home (Benutzerdaten)
- /var/www (Webseiten)
- PostgreSQL Dump (alle Datenbanken)
## Backup-Ziele
1. Lokal: /mnt/backup (NAS via NFS)
2. Offsite: Hetzner Storage Box (sftp://u123456@u123456.your-storagebox.de)
## Zeitplan
- Täglich 03:00: Inkrementelles Backup
- Sonntag 04:00: Retention Cleanup
## Wiederherstellung
1. restic mount /mnt/backup /mnt/restore
2. Dateien kopieren
3. restic umount /mnt/restore
## Passwort
Passwort-Manager: "Backup/web01-restic"
Notfall-Kopie: Safe im Büro
## Letzter Restore-Test
Datum: 2026-01-10
Ergebnis: OK, 15 Minuten für Full Restore 🔔 Schritt 4: Monitoring & Alerts
Backups müssen überwacht werden. Stille Fehler sind die gefährlichsten.
Was überwachen:
- Backup gelaufen? - Exit-Code prüfen
- Backup-Größe plausibel? - Zu klein = Fehler
- Speicherplatz ausreichend? - Rechtzeitig warnen
- Letztes Backup wie alt? - Maximal 24h (bei täglichen)
Healthcheck-Script:
#!/bin/bash
# /usr/local/bin/backup-healthcheck.sh
REPO="/mnt/backup/restic-repo"
MAX_AGE_HOURS=26 # Etwas Puffer über 24h
# Letzten Snapshot prüfen
LAST_BACKUP=$(restic snapshots --json | jq -r '.[-1].time')
LAST_BACKUP_TS=$(date -d "$LAST_BACKUP" +%s)
NOW_TS=$(date +%s)
AGE_HOURS=$(( (NOW_TS - LAST_BACKUP_TS) / 3600 ))
if [ $AGE_HOURS -gt $MAX_AGE_HOURS ]; then
echo "CRITICAL: Letztes Backup ist $AGE_HOURS Stunden alt!"
# Alert senden
curl -X POST "https://ntfy.sh/dein-channel" \
-H "Priority: urgent" \
-d "Backup überfällig: $AGE_HOURS Stunden alt"
exit 1
fi
echo "OK: Letztes Backup vor $AGE_HOURS Stunden"
exit 0 Uptime Kuma Integration
🛡️ Schritt 5: Sicherheits-Checkliste
Backup Security Checkliste:
- ✓ Verschlüsselung: Backups sind verschlüsselt (AES-256)
- ✓ Passwort-Sicherheit: Starkes Passwort, sicher aufbewahrt
- ✓ Zugriffskontrolle: Nur root kann Backup-Configs lesen
- ✓ Transport: Übertragung via SSH/SFTP (nicht FTP!)
- ✓ Immutability: Offsite-Backups nicht vom Quellserver löschbar
- ✓ Isolation: Ransomware kann Backup nicht erreichen
Ransomware-Schutz