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.
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
- Kein eigener Lock: Das Script verhindert keine parallelen Läufe.
- Keine Rotation der Log-Dateien.
- Eine Konfiguration entspricht einem Repository. Mehrere Ziele brauchen mehrere Konfigurationsdateien, die Du mit
--configangibst. - Es werden keine Benachrichtigungen verschickt.
Exit-Codes
| Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| ungleich 0 | Fehler, siehe Monitoring |