synops/docs/infra/backup.md
vegard f1e6355037 synops-backup: PG-dump + CAS-filiste + metadata-snapshot (oppgave 28.6)
Nytt Rust CLI-verktøy som erstatter scripts/backup-pg.sh:
- pg_dump -Fc via docker exec (konsistent snapshot)
- CAS-manifest: liste over alle filer med hash og størrelse
- Metadata-snapshot (JSON) med tidsstempel, modus, statistikk
- --full / --incremental / --payload-json for jobbkø
- Rotasjon av gamle dumper (30 dager, kun ved --full)

Output: strukturert JSON med backup-sti og detaljer.
2026-03-18 20:45:02 +00:00

3.1 KiB

Backup og gjenoppbygging

Filsti: docs/infra/backup.md

Synops sin backup-strategi bygger på én innsikt: PostgreSQL er den eneste autoriteten. Media-filer i CAS er innholdsadresserte og immutable.

Arkitektur

PostgreSQL (autoritativ kilde)
  │
  ├──→ pg_dump daglig (03:00 UTC)
  │       └──→ /srv/synops/backup/pg/sidelinja_YYYYMMDD_HHMMSS.dump
  │              └──→ Rotasjon: 30 dager
  │
  └──→ Sanntid via PG LISTEN/NOTIFY → WebSocket

1. Backup via synops-backup

Verktøy: tools/synops-backup/ (Rust CLI, erstatter scripts/backup-pg.sh) Cron: /etc/cron.d/synops-backup0 3 * * * Dumper: /srv/synops/backup/pg/ Manifester: /srv/synops/backup/manifests/

Prosess:

  1. Sjekker at PG-containeren kjører
  2. pg_dump -Fc (custom format, komprimert) — konsistent snapshot uten nedetid
  3. Verifiserer at dump-filen ikke er tom
  4. Bygger CAS-manifest (liste over alle filer med hash og størrelse)
  5. Skriver metadata-snapshot (JSON) med tidsstempel, modus og statistikk
  6. Roterer dumper eldre enn 30 dager (kun ved --full)

Moduser:

  • --full — Full PG-dump + komplett CAS-filiste + metadata
  • --incremental — PG-dump + kun nye CAS-filer siden forrige manifest
  • --payload-json '{"mode":"full"}' — Jobbkø-dispatch

Manuell kjøring:

synops-backup --full

Verifiser dump:

docker cp /srv/synops/backup/pg/DUMP.dump sidelinja-postgres-1:/tmp/test.dump
docker exec sidelinja-postgres-1 pg_restore --list /tmp/test.dump
docker exec sidelinja-postgres-1 rm /tmp/test.dump

2. Sanntid

Sanntid leveres via PG LISTEN/NOTIFY + WebSocket i portvokteren. Ingen separat sanntidstjeneste å gjenoppbygge — PG er eneste datakilde.

3. Restore fra backup

PostgreSQL

# Stopp maskinrommet (unngå skrivinger under restore)
sudo systemctl stop maskinrommet

# Restore fra dump
docker cp /srv/synops/backup/pg/sidelinja_YYYYMMDD.dump sidelinja-postgres-1:/tmp/restore.dump
docker exec sidelinja-postgres-1 pg_restore -U sidelinja -d sidelinja --clean /tmp/restore.dump
docker exec sidelinja-postgres-1 rm /tmp/restore.dump

# Start maskinrommet
sudo systemctl start maskinrommet

Komplett gjenoppbygging

Ved total serversvikt (ny VPS):

  1. Installer OS og Docker (se docs/setup/produksjon.md)
  2. Start PG-container
  3. Restore dump (se over)
  4. Start maskinrommet
  5. Avledede data (segmenter, søkeindeks) regenereres fra kildene

4. Overvåking

Health-dashboardet (/admin/health) viser backup-status:

  • ok — dump-fil er fersk (< 25 timer gammel)
  • stale — dump-fil er eldre enn 25 timer
  • missing — ingen dump-filer funnet

Metrikk-endepunktet (/metrics) inkluderer tjeneste-status som del av helsesjekken.

5. Hva som IKKE backupes (bevisst)

  • Redis — cache, regenereres automatisk
  • Caddy-data — sertifikater regenereres av Let's Encrypt
  • Whisper-modeller — re-download fra HuggingFace
  • Logger — rulleres med logrotate

Se docs/setup/produksjon.md § 11 for fullstendig backup-spesifikasjon inkludert off-site backup (rclone) og WAL-arkivering (fremtidig).