Markus Michalski FAQ

restic-backup-suite: Technische Details

Technische Details zu restic-backup-suite: Ablauf von backup.sh, restic-Aufrufe, Retention und Prüfung, SSH-Konfiguration, Cleanup, Temp-Verzeichnisse, Dateistruktur und Exit-Codes.

English Version

Zurück zur Übersicht


Technische Details

Dateien im Repository

Datei Zweck
backup.sh Backup, Retention, Prüfung
restore.sh Interaktive Wiederherstellung
inspect.sh Snapshot-Browser
install.sh Installer und Deinstallation
config.example.sh Konfigurationsvorlage
Makefile Abkürzungen für Installer und ShellCheck
.github/workflows/shellcheck.yml CI: Syntax-Prüfung und ShellCheck für alle .sh-Dateien

Alle vier Scripts laufen mit set -o errexit -o nounset -o pipefail. backup.sh, restore.sh und inspect.sh haben zusätzlich einen Cleanup-Handler auf EXIT, ERR, INT und TERM. Der Cleanup läuft, wenn das Script endet. Bei einem Exit-Code ungleich 0 loggt der Handler Script exited with code: N. install.sh hat keinen Trap.

Ablauf von backup.sh

graph TD
    A["Start"] --> B["Optionen lesen, Config laden, root und restic prüfen"]
    B --> C["Temp-Verzeichnis für Dumps anlegen"]
    C --> D{"dump-only?"}
    D -->|ja| E["Nur Datenbank-Dumps, Ende"]
    D -->|nein| F["SSH-Config schreiben und SFTP testen, nur bei sftp"]
    F --> G["Repository prüfen, bei Bedarf initialisieren"]
    G --> H["systemd-Services stoppen"]
    H --> I["Docker-Services stoppen"]
    I --> J["Datenbank-Dumps"]
    J --> K["restic backup"]
    K --> L["restic forget mit prune"]
    L --> M["restic check, stats, snapshots"]
    M --> N["Erfolgs-Marker schreiben"]
    N --> O["Cleanup: Temp löschen, Services starten"]

Aufgerufene restic-Befehle

Schritt Befehl
Repository prüfen restic snapshots. Schlägt der Befehl aus irgendeinem Grund fehl, folgt restic init
Backup restic backup --compression max --exclude-caches --exclude-if-present <Name> --one-file-system --verbose <Excludes> <Pfade> <Dump-Verzeichnis> --tag automated
Retention restic forget --keep-daily <n> --keep-weekly <n> --keep-monthly <n> --prune --cleanup-cache
Prüfung restic check --read-data-subset=<REPO_CHECK_SUBSET>
Ausgabe restic stats --mode restore-size und restic snapshots --last 5

Retention und Prüfung laufen nur, wenn restic backup erfolgreich war. Schlagen sie fehl, loggt das Script eine Warnung, der Exit-Code bleibt 0. Ein Fehler in restic stats oder restic snapshots danach beendet das Script dagegen mit einem Fehlercode, und der Marker wird nicht geschrieben.

restic forget läuft ohne Filter. Es gruppiert nach restics Standard (Host und Pfade) und wirkt auf alle Snapshots des Repositorys, nicht nur auf die mit dem Tag automated.

SSH-Konfiguration

Bei sftp:-Repositories legt backup.sh das Verzeichnis config.d neben der Datei SSH_KEY_FILE an (bei /root/.ssh/id_ed25519 also /root/.ssh/config.d) und schreibt dort die Datei restic-backup mit dem Host-Block (Rechte 600). Fehlt in der config desselben Verzeichnisses die Zeile Include <Verzeichnis>/config.d/*, setzt das Script sie an den Anfang, ohne den Rest zu verändern. Fehlt der Schlüssel, loggt es eine Warnung und den passenden ssh-keygen-Befehl.

Temporäre Verzeichnisse

Verzeichnis Inhalt Lebensdauer
/tmp/restic-db-dump-XXXXXX SQL-Dumps Wird im Cleanup gelöscht
/tmp/restic-restore-XXXXXX Wiederhergestellte Dateien Bleibt bestehen, bis Du es löschst

Weil der Dump-Pfad im Snapshot unter /tmp/restic-db-dump-XXXXXX steht, findet restic-inspect (Punkt 6) und der Restore die Dumps über dieses Muster.

Eingebaute Grenzen

Exit-Codes

Code Bedeutung
0 Erfolg
ungleich 0 Fehler, siehe Monitoring