Files
nexarch/archive
sysops 80b0ca9176 feat(archive): BAK-04 Tenant-Backup & -Restore einzelner Mandant
internal/tenantbackup: datenbank-scharfes pg_dump/pg_restore statt
BAK-01s Cluster-weitem pg_basebackup - bei Modell C (TEN-01, physisch
isolierte DB je Mandant) wuerde ein Cluster-Restore zwangslaeufig ALLE
Mandanten ueberschreiben. Objekt-Seite nutzt BAK-02 direkt (Mandanten
haben eigene Buckets/Pfad-Roots). Eigene Postgres-Rolle
nexarch_tenantbackup (CREATEDB, kein Superuser, getrennt von
nexarch_backup). Zwei-Tenant-Isolation real in beide Richtungen
bewiesen (Markerwert-Nachweis), JSONL-Protokoll fuer Sicherung UND
Restore. Realer End-zu-Ende-Lauf ueber tenantbackup-cli auf 131.
2026-08-30 00:41:48 +02:00
..
2026-08-29 22:49:13 +02:00

NEXARCH Archive

Zentrales, modulübergreifendes Modul für Aufbewahrung, WORM, Compliance und Backup. Dieses Verzeichnis enthält bisher internal/backup (BAK-01, Datenbank-Backup-Strategie) — weitere Bausteine folgen ticketweise.

BAK-01: Datenbank-Backup

cmd/backup-cli — Aufrufpunkt für systemd-Timer (siehe ../deploy/systemd/nexarch-archive-backup-*.timer):

export NEXARCH_BACKUP_PG_USER=nexarch_backup
export NEXARCH_BACKUP_PG_PASSWORD=...
export NEXARCH_BACKUP_DIR=/var/nexarch-archiv/backups/postgres   # NICHT auf einem ephemeren Test-Dataset (siehe Betrieb)
export NEXARCH_BACKUP_KEEP_GENERATIONS=7   # optional, Default 7

backup-cli full          # neue Vollsicherung + Verifikation
backup-cli incremental   # inkrementelle Sicherung gegen die neueste Generation
backup-cli rotate        # entfernt alle bis auf die neuesten N Generationen

Voraussetzung: die konfigurierte Postgres-Rolle braucht das REPLICATION-Attribut (pg_basebackup nutzt eine Replikationsverbindung), und summarize_wal = on muss serverseitig gesetzt sein (PostgreSQL 17s natives inkrementelles Backup, keine WAL-Archivierung nötig).

BAK-02: Objekt-Storage-Backup

cmd/objectbackup-cli sichert einen lokalen Verzeichnisbaum (den FDN-03-LocalDriver-Basisordner direkt, oder — für S3-gestützte Deployments — einen vorgelagerten rclone-Spiegel) mit restic (Content-defined Chunking, verschlüsseltes Repository, geprüftes Tooling statt Eigenbau):

export NEXARCH_OBJECTBACKUP_REPO_DIR=/var/nexarch-archiv/backups/objects
export NEXARCH_OBJECTBACKUP_PASSWORD=...
export NEXARCH_OBJECTBACKUP_KEEP_SNAPSHOTS=30   # optional, Default 7

objectbackup-cli backup /var/nexarch-objects   # Sicherung + Verifikation
objectbackup-cli check                          # vollständiges Lesen aller Datenblöcke
objectbackup-cli rotate                          # restic forget --keep-last N --prune

Betrieb: Backup-Zielverzeichnis

Backup-Ziele liegen unter /var/nexarch-archiv/ (persistentes ZFS-Dataset, zfs/data/subvol-1131-disk-0 auf 192.168.1.131), NIEMALS unter /var/nexarch-test/ (ephemeres Dataset, wird von den reset-test-env.sh- Skripten der anderen Module geleert). ZFS-seitige Snapshots/Replikation dieses Datasets sind ein eigenständiges Infra-Runbook (siehe ../../STORAGE-KONZEPT.md Abschnitt 7), kein Ticket-Code — zfs dedup=on bewusst NICHT setzen (hoher RAM-Bedarf), Deduplizierung läuft ausschließlich App-seitig über restic.

Prüfungen

make check   # build + vet + lint + test, analog Core/DMS