# 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:
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:
```bash
synops-backup --full
```

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).
