Doku/Backup Docker

Aus XccesS Wiki
Version vom 6. Juni 2025, 17:19 Uhr von Hendrik (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= Docker-Backups im Homelab = Diese Seite beschreibt die komplette Einrichtung und Funktionsweise des Scripts <code>backup_docker_rsync.sh</code>, mit dem alle Docker-Volumes, Compose-Dateien und die Docker-Daemon-Konfiguration täglich auf das QNAP-NAS gesichert werden. ; Repository <code>/usr/local/sbin/backup_docker_rsync.sh</code> (lokal) ; Zielpfad NAS <code>/mnt/Backup/Docker/YYYY-MM-DD-HHMM</code> ⇒ Symlink '''latest''' == 1 Voraussetzu…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Docker-Backups im Homelab

Diese Seite beschreibt die komplette Einrichtung und Funktionsweise des Scripts backup_docker_rsync.sh, mit dem alle Docker-Volumes, Compose-Dateien und die Docker-Daemon-Konfiguration täglich auf das QNAP-NAS gesichert werden.

Repository

/usr/local/sbin/backup_docker_rsync.sh (lokal)

Zielpfad NAS

/mnt/Backup/Docker/YYYY-MM-DD-HHMM ⇒ Symlink latest

1 Voraussetzungen

  • **Ubuntu 22.04 LTS** (Root-Zugriff)
  • NAS-Share unter /mnt/Backup gemountet
    • Empfohlen**: NFS (+ no_root_squash).

SMB/CIFS funktioniert mit den rsync-Optionen --no-owner --no-group.

  • Pakete:
apt install rsync jq

2 Script herunterladen

curl -o /usr/local/sbin/backup_docker_rsync.sh \
     https://<dein-git>/backup_docker_rsync.sh
chmod +x /usr/local/sbin/backup_docker_rsync.sh

2.1 Wichtige Variablen im Kopfbereich

Variable Standardwert Bedeutung
SNAPROOT /mnt/Backup/Docker Ablageort der Snapshots
RETENTION_DAYS 7 Aufbewahrung (ältere Snapshots werden gelöscht)
COMPOSE_BASE /data/compose Oberordner der Compose-Stacks

3 Cron Job (täglich 02:30 Uhr)

# crontab -e   (als root)
30 2 * * * /usr/local/sbin/backup_docker_rsync.sh \
           >> /var/log/backup_docker.log 2>&1
  • Logging: Alle Ausgaben in /var/log/backup_docker.log.
  • Bei Fehlercodes ≠0 wird der Cron-MTA eine Mail an root schicken (sofern konfiguriert).

4 Funktionsweise

  1. **Metadaten-Dump** (Docker info, Container-/Image-Listen, Compose-YAMLs).
  2. **Nur noch laufende Container** werden kurz mit docker pause eingefroren.
  3. **rsync Snapshot**
  * Hard-Links via --link-dest → jede Sicherung „Vollkopie“, aber nur Deltas belegen Platz.  
  * Ohne -o -g ⇒ kompatibel mit SMB/NFS-Shares.  
  1. **Unpause** der zuvor laufenden Container (Cleanup-Trap gewährleistet dies selbst bei Abbruch).
  2. **latest-Symlink** wird aktualisiert, alte Snapshots nach RETENTION_DAYS gelöscht.
  3. **Rechte 755/644** auf neuem Snapshot → Windows-Benutzer können per SMB browsen.

5 Snapshot-Struktur

/mnt/Backup/Docker/
└── 2025-06-06-0230/
    ├── volumes/                # kompletter Inhalt von /var/lib/docker/volumes
    ├── etc-docker/             # /etc/docker
    ├── docker-systemd/         # systemd-Drop-Ins (falls vorhanden)
    └── metadata/
        ├── docker-info.txt
        ├── images.txt
        ├── containers.txt
        └── compose/…           # alle docker-compose*.yml
latest -> 2025-06-06-0230

6 Manueller Testlauf

/usr/local/sbin/backup_docker_rsync.sh
echo $?
# → 0  = Erfolg

7 Wiederherstellung

Kurzfassung für „latest“:

restore_docker_rsync.sh  -s latest

8 Troubleshooting

Meldung Ursache / Lösung
--link-dest arg does not exist Erster Lauf → ignorieren.
Operation not permitted (chown) SMB-Share ohne Chown-Rechte → OK; Daten wurden trotzdem kopiert.
Container bleiben paused Script vor v1.1; aktualisieren ODER manuell
 docker unpause $(docker ps -q --filter status=paused)
Windows kann nicht lesen Fs-Rechte → Script ≥v1.2 setzt 755/644
 oder Share mit noperm mounten.

9 Versionshistorie

Datum Version Änderung
2025-06-06 1.2 Rechtefix (755/644), robustes Unpause, Link-Dest-Check
2025-06-05 1.1 Pausiere nur laufende Container, Cleanup-Trap
2025-06-04 1.0 Erste produktive Version

Seite zuletzt aktualisiert: 06 Juni 2025