# 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. PG-dump (daglig) **Script:** `scripts/backup-pg.sh` **Cron:** `/etc/cron.d/synops-backup` — `0 3 * * *` **Logg:** `/srv/synops/logs/backup-pg.log` **Dumper:** `/srv/synops/backup/pg/` 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. Sletter dumper eldre enn 30 dager Manuell kjøring: ```bash /home/vegard/synops/scripts/backup-pg.sh ``` Verifiser dump: ```bash 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 ```bash # 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).