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.
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-backup — 0 3 * * *
Dumper: /srv/synops/backup/pg/
Manifester: /srv/synops/backup/manifests/
Prosess:
- Sjekker at PG-containeren kjører
pg_dump -Fc(custom format, komprimert) — konsistent snapshot uten nedetid- Verifiserer at dump-filen ikke er tom
- Bygger CAS-manifest (liste over alle filer med hash og størrelse)
- Skriver metadata-snapshot (JSON) med tidsstempel, modus og statistikk
- 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):
- Installer OS og Docker (se
docs/setup/produksjon.md) - Start PG-container
- Restore dump (se over)
- Start maskinrommet
- 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).