Inhalt

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.


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.


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
  • Änderungsrate (realistisch):

    • sehr gering, wenige GB pro Monat

  • Unraid-Server (Primärsystem)
  • Synology DS-211 (alt, aber stabil)
    • Neue NAS-Festplatten (RAID 1)
  • FRITZ!Box am Remote-Standort
  • 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

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

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.

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

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.

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

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

Ziel-Architektur

  • 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
  • Backup-Benutzer anlegen
    • Systemsteuerung -> Benutzer
      • User: backup, Passwort:
      • Administratorrechte (erforderlich für SSH)
      • Applicationen -> alle “Verweigern”
  • Home-Verzeichnis aktivieren
    • Systemsteuerung -> Benutzer -> Erweitert -> Benutzerbasis
      • Benutzer-Home-Dienst aktivieren
  • Backup-Ordner erstellen
    • Systemsteuerung -> Gemeinsamer Ordner
      • restic-repo
      • Papirkorb deaktivieren
      • keine Verschlüsselung (macht restic selbst)
  • 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
  • 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
  • ssh-config anlegen, auf Unraid (optional)
    • touch /root/.ssh/config
    • nano /root/.ssh/config
      Host 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
  • Restic-Repository initialisieren
    • TBD
  • Zeitplan konfigurieren
    • Systemsteuerung -> Hardware & Energie -> Energie-Zeitplan
      • Täglich um 12:00 starten
  • 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.d
    • echo "backup ALL=(ALL) NOPASSWD: /sbin/poweroff" > /etc/sudoers.d/backup
    • chmod 440 /etc/sudoers.d/backup
  • FUSE grundsätzlich vorhanden? ls -l /dev/fuse sollte so aussehen: crw-rw-rw- ... /dev/fuse siehst → FUSE ist da
  • FUSE-Tools installiert? which fusermount || which fusermount3 → wenigstens ein Tool sollte gefunden werden

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
  • 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" init
  • Zugriff testen restic -r "sftp:restic-backup-host:restic-repo" snapshots

  • Einmaliger 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
Note

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”
Important

TBD

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)
#!/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"
#!/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.

  1. DiskStation startet (Zeitplan DSM)
  2. WireGuard-VPN ist aktiv
  3. Unraid wartet, bis DS212j erreichbar ist
  4. PostgreSQL-Dumps werden erstellt
  5. InfluxDB-Backup wird ausgeführt
  6. Restic Backup läuft
  7. Retention (forget –prune) wird angewendet
  8. Unraid fährt die DiskStation herunter

restic forget
–keep-daily 7
–keep-weekly 4
–keep-monthly 1
–prune


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


  • Restore-Test (Dateien + PostgreSQL + InfluxDB v2)
  • Optional: zusätzliches Offline-Backup (USB-Rotation)
  • Dokumentation der Zugangsdaten (Passwort-Manager / Offline-Kopie)

Titelbild von MH Rhee auf Pixabay