feat(archive): BAK-07 gestaffelte Aufbewahrungsfrist fuer Backup-Snapshots

internal/backup.PruneTiered: reine GFS-Funktion (Tag/Woche/Monat) fuer
Datenbank-Generationen, behaelt strukturell immer die neueste Generation
(Sicherheitsnetz gegen Legal-Hold-Kollision). internal/objectbackup.
PruneTiered: duenner Wrapper um restics native --keep-daily/-weekly/
-monthly-Staffelung. Beide CLIs nutzen die Staffelung, wenn konfiguriert,
bleiben sonst abwaertskompatibel zur flachen "letzte N"-Regel. Real
gegen zeitversetzt erzeugte restic-Snapshots getestet (Fund: restics
--time-Flag erwartet eigenes Format, nicht RFC3339), Pruning-Sicherheit
nach dem Loeschen alter Snapshots ueber vollstaendigen Restore +
restic check --read-data bewiesen. Beide Rotationswege real ueber
systemd auf 131 ausgeloest.
This commit is contained in:
sysops
2026-08-30 00:49:23 +02:00
parent 80b0ca9176
commit 823a14ae12
8 changed files with 546 additions and 0 deletions
+25
View File
@@ -25,6 +25,17 @@ func loadConfig() objectbackup.Config {
return cfg
}
func envInt(name string, def int) int {
v := os.Getenv(name)
if v == "" {
return def
}
if n, err := strconv.Atoi(v); err == nil {
return n
}
return def
}
func main() {
if len(os.Args) < 2 {
log.Fatal("aufruf: objectbackup-cli <backup <quellverzeichnis>|check|rotate>")
@@ -58,6 +69,20 @@ func main() {
fmt.Println("verifikation (mit vollstaendigem lesen) erfolgreich")
case "rotate":
// BAK-07: gestaffelte Aufbewahrungsfrist, falls konfiguriert -
// ersetzt die flache "letzte N"-Regel, bleibt abwaertskompatibel.
policy := objectbackup.RetentionPolicy{
KeepDaily: envInt("NEXARCH_OBJECTBACKUP_KEEP_DAILY", 0),
KeepWeekly: envInt("NEXARCH_OBJECTBACKUP_KEEP_WEEKLY", 0),
KeepMonthly: envInt("NEXARCH_OBJECTBACKUP_KEEP_MONTHLY", 0),
}
if policy.KeepDaily > 0 || policy.KeepWeekly > 0 || policy.KeepMonthly > 0 {
if err := objectbackup.PruneTiered(ctx, cfg, policy); err != nil {
log.Fatalf("gestaffelte rotation fehlgeschlagen: %v", err)
}
fmt.Println("gestaffelte rotation abgeschlossen")
return
}
keep := 7
if v := os.Getenv("NEXARCH_OBJECTBACKUP_KEEP_SNAPSHOTS"); v != "" {
if n, err := strconv.Atoi(v); err == nil {