synops/docs/infra/backup.md
vegard b5aa5bb243 Fjern SpacetimeDB komplett (oppgave 22.4)
SpacetimeDB er nå helt fjernet fra Synops. Sanntid håndteres av
PG LISTEN/NOTIFY + WebSocket i portvokteren (maskinrommet).

Kode fjernet:
- spacetimedb/ Rust-modul og spacetime.json
- maskinrommet/src/stdb.rs (HTTP-klient for STDB-reducers)
- frontend module_bindings/ (23 auto-genererte filer)
- spacetimedb npm-avhengighet fra package.json
- scripts/test-sanntid.sh (testet STDB-flyt)

Infrastruktur:
- Docker-container stoppet og fjernet fra docker-compose.yml
- Caddy: fjernet /spacetime/* reverse proxy
- maskinrommet-env.sh: fjernet STDB_IP og SPACETIMEDB_*-variabler
- .env.example: fjernet SpacetimeDB-seksjoner

Dokumentasjon oppdatert:
- CLAUDE.md: stack, lagmodell, kjerneprinsipper, driftsmodell
- docs/arkitektur.md: skrivestien, lesestien, datalag, teknologivalg
- docs/retninger/datalaget.md: migrasjonshistorikk, status "fjernet"
- 37 andre docs oppdatert (features, concepts, infra, ops, retninger)
- Alle kode-kommentarer med STDB-referanser oppdatert

Verifisert: maskinrommet bygger og starter OK, frontend bygger OK,
helsesjekk returnerer 200. Caddy reloadet.
2026-03-18 13:39:09 +00:00

92 lines
2.7 KiB
Markdown

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