Backup-Strategie

Seit einigen Jahren habe ich ein Unraid-System im Einsatz. Auch wenn die Daten auf den Platten redundant gehalten werden, ist stets ein gewisser Nervenkitzel und die Angst vor Datenverlust vorhanden. Es gibt verschiedene Möglichkeiten ein Backup in die Cloud zu schreiben, aber auch wenn das Backup verschlüsselt ist, sind die Daten nur begrenzt unter meiner Kontrolle. In meiner “zu gut für den Elektroschrott”-Kiste fand sich noch eine in die Jahre gekommene Synology Diskstation DS-211, die für mein Offsite-Backup mit voller Kontrolle eine neue Lebensaufgabe bekommen soll.
1 Zielsetzung
Ziel ist ein zuverlässiges, wartungsarmes und langfristig stabiles Backup-Konzept für einen Unraid-Server mit folgenden Eigenschaften:
- Schutz vor Datenverlust (Hardwaredefekt, Bedienfehler, Ransomware)
- Physisch getrenntes Offsite-Backup
- Geringe laufende Kosten
- Vollständige Kontrolle über die Daten (keine Cloud-Abhängigkeit)
- Wiederherstellbarkeit auch nach mehreren Jahren
Der Unraid-Server ist der primäre Datenhalter. Die Synology DS212j1 dient ausschließlich als remote Backup-Speicher.
2 Ausgangslage
Daten auf dem Unraid-Server, die gesichert werden sollen
Shares:
- bilder (~250 GB)
- bilder2 (~80 GB)
- dms/export (~15 GB)
Datenbanken (Docker):
- 3× PostgreSQL-Datenbanken (logisches Backup per Dump)
- 1× InfluxDB v2 (zeitbasierte Messdaten)
Anwendungen:
- Immich (nutzt ausschließlich Bilder aus Share, keine zusätzlichen Originaldaten)
- Immich speichert in der Datenbank nur Metadaten zu Bildern (u.a. IDs, Thumbnails, Tags, eventuell Kameramodelle/EXIF), nicht die Originaldateien. Die tatsächlichen Fotos bleiben im Share.
- Paperless
- Paperless speichert die eigentlichen Dokumente physisch auf der Festplatte
- Metadaten zu den Dokumenten werden in einer eigenen PostgreSQL verwaltet
- mittels export-command lassen sich die Dokumente mit einem “passenden”, aber propietären Datenbank-Dump
- Gitea
- Vikunja
- Immich (nutzt ausschließlich Bilder aus Share, keine zusätzlichen Originaldaten)
Änderungsrate (realistisch):
- sehr gering, wenige GB pro Monat
3 Verfügbare Hardware
- Unraid-Server (Primärsystem)
- Synology DS-211 (alt, aber stabil)
- Neue NAS-Festplatten (RAID 1)
- FRITZ!Box am Remote-Standort
3.1 Festplattenwahl für die DS-211
- NAS-HDDs verwenden, keine Desktop-Platten
- Beispiele: WD Red Plus (CMR), Seagate IronWolf
- SMR-Platten vermeiden
- Kapazität: 2 × 6 TB (RAID 1) empfohlen, ausreichend für bestehende Daten (~345 GB + DB-Dumps) & Reserve für Wachstum und Restic-Overhead
4 Zentrale Entscheidungen
4.1 Backup-Software: Restic
Entscheidung:
- Einsatz von Restic als einziges Backup-Tool.
Begründung:
- Snapshots statt klassischer Voll-/Inkrementell-Backups
- Blockbasierte Deduplizierung
- Verschlüsselung by default
- Sehr gut geeignet für große, wenig veränderliche Daten
- Kein Single Point of Failure (keine zentrale DB)
- Hervorragend für Offsite-Backups über SSH/VPN
4.2 Kein direktes Backup von PostgreSQL- oder InfluxDB-Datenverzeichnissen
Entscheidung:
- PostgreSQL und InfluxDB werden logisch gesichert, nicht per Dateikopie.
Begründung:
- Laufende Datenbanken können bei Dateikopie inkonsistent sein
- Logische Backups sind portabel, robust und versionsunabhängig
Umsetzung PostgreSQL:
- Täglicher pg_dumpall für alle 3 Datenbanken
- Komprimierte Ablage als .sql.gz
Umsetzung InfluxDB v2:
- Nutzung des offiziellen influx backup Kommandos
- Vollständiges organisationsbasiertes Backup
- Ablage in einem dedizierten Backup-Verzeichnis
Alle Dump-Verzeichnisse werden anschließend mit Restic gesichert.
4.3 Synology DS212j als reines Backup-Ziel
Entscheidung:
- Die DS212j wird nicht produktiv genutzt, sondern ausschließlich als Backup-Speicher.
Begründung:
- Alte Hardware, aber ausreichend für Backup-Zugriffe
- Restic übernimmt CPU-Last auf dem Unraid-Server
- RAID 1 schützt das Backup selbst vor Plattenausfall
4.4 RAID 1 auf der DiskStation
Entscheidung:
- RAID 1 (oder SHR mit identischen Platten).
Begründung:
- Schutz vor Ausfall einer einzelnen HDD
- Backup bleibt verfügbar
- Einfach, transparent, wartungsarm
RAID ersetzt kein Backup – es schützt nur das Backup-Medium.
4.5 Sichere Verbindung: VPN statt Portfreigaben
Entscheidung:
- Verbindung über WireGuard-VPN via FRITZ!Box.
Begründung:
- Keine offenen Ports auf die DiskStation
- SSH nur innerhalb des VPNs
- Sehr geringe Angriffsfläche
- Stabil und wartungsarm
4.6 Zeitgesteuerter Betrieb der DiskStation
Entscheidung:
- DiskStation startet zeitgesteuert
- Unraid steuert Backup
- Nach erfolgreichem Backup fährt Unraid die DiskStation herunter
Begründung:
- Minimale Stromkosten
- Kein Risiko eines Shutdowns während laufendem Backup
- Klare Kontrolle über den Ablauf
5 Zielbild
6 Umsetzung
6.1 Backup-Ziel (Synology DiskStation)
- Vollständiges Reset (Einstellungen urücksetzen, Daten löschen)
- Diskstation initialisieren
- Firmware auf den aktuellen Stand bringen
- Speicherpool/Volume einrichten
- Hauptmenü -> Speicher-Manager
- Speicherpool erstellen (SHR oder RAID1)
- Volume erstellen
- Gesamten Speicher nutzen (ein Volume genügt)
- Neues Administrator-Konto anlegen (optional)
- Systemsteuerung -> Benutzer
- User:
, Passwort: - Administratorrechte
- User:
- Systemsteuerung -> Benutzer
- Backup-Benutzer anlegen
- Systemsteuerung -> Benutzer
- User: backup, Passwort:
- Administratorrechte (erforderlich für SSH)
- Applicationen -> alle “Verweigern”
- User: backup, Passwort:
- Systemsteuerung -> Benutzer
- Home-Verzeichnis aktivieren
- Systemsteuerung -> Benutzer -> Erweitert -> Benutzerbasis
- Benutzer-Home-Dienst aktivieren
- Systemsteuerung -> Benutzer -> Erweitert -> Benutzerbasis
- Backup-Ordner erstellen
- Systemsteuerung -> Gemeinsamer Ordner
- restic-repo
- Papirkorb deaktivieren
- keine Verschlüsselung (macht restic selbst)
- Systemsteuerung -> Gemeinsamer Ordner
- Unnötige Dienste deaktivieren
- Systemsteuerung -> Dateidienste
- SMB -> deaktiveren
- FTP -> deaktiveren
- SFTP -> aktiveren
- TFTP -> deaktiveren
- rsync -> deaktiveren
- Bonjour -> deaktiveren
- SSDP -> deaktiveren
- WS-Discovery -> deaktiveren
- Systemsteuerung -> Terminal & SNMP
- SSH-Dienst -> aktiveren
- Systemsteuerung -> Dateidienste
- SSH-Key konfigurieren
- im Terminal auf Unraid (Source)
- Key-Pair erzeugen
- ssh-keygen
- ggf. Dateinamen anpassen
- kein Passwort setzen (wichtig für Automation)
- Public-Key übertragen
ssh-copy-id [-i <Pfad zur pub-Datei (bspw: ~/.ssh/offsite.pub)>] backup@<IP-der-DS>
- Test:
ssh [-i <Pfad zur pub-Datei (bspw: ~/.ssh/offsite.pub)>] backup@<IP-der-DS>- “failed for /root/.ssh/known_hosts: Operation not permitted” ->
ssh-keyscan -p 22 <IP-der-DS> >> /root/.ssh/known_hosts
- “failed for /root/.ssh/known_hosts: Operation not permitted” ->
- Key-Pair erzeugen
- im Terminal auf Unraid (Source)
- ssh-config anlegen, auf Unraid (optional)
touch /root/.ssh/confignano /root/.ssh/configHost restic-backup-host Hostname <IP-der-DS> User backup Port 22 IdentityFile /root/.ssh/offsite
- Passwortlogin deaktivieren
- im Terminal auf Diskstation (Target)
- root werden, Passwort ist das des aktuell angemeldeten Benutzers
sudo -i - SSH-Config bearbeiten
vi /etc/ssh/sshd_config - diese Zeile suchen: “PasswordAuthentication yes” und ändern zu
PasswordAuthentication no - speichern und vi verlassen
:wq - DS neu starten
reboot
- root werden, Passwort ist das des aktuell angemeldeten Benutzers
- im Terminal auf Diskstation (Target)
- Restic-Repository initialisieren
- TBD
- Zeitplan konfigurieren
- Systemsteuerung -> Hardware & Energie -> Energie-Zeitplan
- Täglich um 12:00 starten
- Systemsteuerung -> Hardware & Energie -> Energie-Zeitplan
- backup-User berechtigen, die DiskStation herunterzufahren
ssh [-i <Pfad zur pub-Datei (bspw: ~/.ssh/offsite.pub)>] backup@<IP-der-DS>sudo mkdir -p /etc/sudoers.decho "backup ALL=(ALL) NOPASSWD: /sbin/poweroff" > /etc/sudoers.d/backupchmod 440 /etc/sudoers.d/backup
6.2 Backup-Quelle (Unraid)
6.2.1 Voraussetzungen prüfen
- FUSE grundsätzlich vorhanden?
ls -l /dev/fusesollte so aussehen:crw-rw-rw- ... /dev/fusesiehst → FUSE ist da - FUSE-Tools installiert?
which fusermount || which fusermount3→ wenigstens ein Tool sollte gefunden werden
6.2.2 restic installieren
Am einfachsten ist die Installation von restic direkt auf dem Unraid-Host, da
restic mount FUSE-Rechte benötigt, die so nicht umständlich in den Container gereicht werden müssen
allgemein weniger Docker-Sonderrechte erforderlich sind
bessere Integration in Unraid-Automation (User scripts/cron) möglich ist
Unraid /mnt/user über Docker zusätzlich Performance/Permission-Ecken haben kann
im Terminal
# Zielordner auf dem USB-Stick (bleibt über Reboot erhalten)
mkdir -p /boot/config/custom/restic
cd /boot/config/custom/restic
# Download restic + SHA256SUMS (offizielle Release-Artefakte)
wget -O restic_0.18.1_linux_amd64.bz2 https://github.com/restic/restic/releases/download/v0.18.1/restic_0.18.1_linux_amd64.bz2
wget -O SHA256SUMS https://github.com/restic/restic/releases/download/v0.18.1/SHA256SUMS
# Hash prüfen (muss "OK" melden)
grep "restic_0.18.1_linux_amd64.bz2" SHA256SUMS | sha256sum -c -
# Entpacken + ausführbar machen
bunzip2 -f restic_0.18.1_linux_amd64.bz2
chmod +x restic_0.18.1_linux_amd64
# Binary in ein ausführbares FS kopieren
cp -f /boot/config/custom/restic/restic /usr/local/bin/restic
chmod +x /usr/local/bin/restic
# Test
restic version- restic reboot-fest machen (!)
- in die Go-Datei eintragen, damit Unraid es bei jedem Start wieder nach /usr/local/bin kopiert:
nano /boot/config/go# restic (copy from USB to RAM on boot) cp -f /boot/config/custom/restic/restic /usr/local/bin/restic chmod +x /usr/local/bin/restic
- in die Go-Datei eintragen, damit Unraid es bei jedem Start wieder nach /usr/local/bin kopiert:
6.2.3 restic initialisieren
- Restic-Passwortdatei anlegen
mkdir -p /boot/config/restic
echo "DEIN-STARKES-PASSWORT" > /boot/config/restic/restic.pw
chmod 600 /boot/config/restic/restic.pw- Restic-Repo einmalig initialisieren
export RESTIC_PASSWORD_FILE="/boot/config/restic/restic.pw"
restic -r "sftp:restic-backup-host:restic-repo" initZugriff testen
restic -r "sftp:restic-backup-host:restic-repo" snapshotsEinmaliger Restore-Test, nach dem ersten echten Backup
mkdir -p /mnt/user/backup/restic-restore-test restic -r "sftp:restic-backup-host:restic-repo" restore latest --target /mnt/user/backup/restic-restore-test
6.2.4 User Scripts
Unraid läuft im RAM. Das heißt: alles außerhalb von /boot ist flüchtig und nach einem Reboot weg.
Um dieses Script auszuführen, installieren wir das Plugin “User Scripts”. Dadurch erhalten wir die Möglichkeit der Konfiguration innerhalb der Unraid-UI.
- Apps nach dem Plugin “User Scripts” suchen und installieren
- Settings -> “Add New Script”
- dann “Edit Script”
6.2.5 backrest installieren
TBD
6.2.6 Datenquellen
Gesichert werden:
- /mnt/user/bilder (~250 GB)
- /mnt/user/bilder2 (~80 GB)
- /mnt/user/dms/export (~15 GB)
- /mnt/user/backup/pg_backup (PostgreSQL-Dumps)
- /mnt/user/backup/influx_backup (InfluxDB-v2-Backups)
Nicht gesichert werden:
- direkte Datenbank-Verzeichnisse (appdata/db, InfluxDB-Data-Dir)
- Immich-Datenbank und Cache (werden über DB-Dumps abgedeckt)
6.2.7 Backup-Skripte
6.2.7.1 PostgreSQL (alle DBs)
#!/bin/bash
set -e
BACKUP_DIR="/mnt/user/backup/pg_backup"
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"
docker exec postgres \
pg_dumpall -U postgres | gzip > "$BACKUP_DIR/pg_dump_$DATE.sql.gz"6.2.7.2 InfluxDB v2
#!/bin/bash
set -e
BACKUP_DIR="/mnt/user/backup/influx_backup"
DATE=$(date +%F)
INFLUX_CONTAINER="influxdb"
INFLUX_TOKEN="<READ-ONLY-BACKUP-TOKEN>"
INFLUX_ORG="<ORG_NAME>"
mkdir -p "$BACKUP_DIR/$DATE"
docker exec "$INFLUX_CONTAINER" influx backup \
"$BACKUP_DIR/$DATE" \
--org "$INFLUX_ORG" \
--token "$INFLUX_TOKEN"Empfehlung: Token nur mit Backup-Rechten, nicht Admin.
6.3 Backup-Ablauf (täglich)
- DiskStation startet (Zeitplan DSM)
- WireGuard-VPN ist aktiv
- Unraid wartet, bis DS212j erreichbar ist
- PostgreSQL-Dumps werden erstellt
- InfluxDB-Backup wird ausgeführt
- Restic Backup läuft
- Retention (forget –prune) wird angewendet
- Unraid fährt die DiskStation herunter
6.4 Retention-Policy
restic forget
–keep-daily 7
–keep-weekly 4
–keep-monthly 1
–prune
7 Ergebnis & Bewertung
- robust (keine Single Points of Failure)
- transparent (klar nachvollziehbare Abläufe)
- kosteneffizient (keine Cloud-Gebühren)
- sicher (VPN, Verschlüsselung, Offsite)
- langfristig wartbar (auch in 5–10 Jahren noch verständlich)
Dieses Setup entspricht einem professionellen 3-2-1-Backup-Prinzip – umgesetzt mit vorhandener Hardware.
8 Nächste sinnvolle Schritte
- Restore-Test (Dateien + PostgreSQL + InfluxDB v2)
- Optional: zusätzliches Offline-Backup (USB-Rotation)
- Dokumentation der Zugangsdaten (Passwort-Manager / Offline-Kopie)


