synops/scripts/backup-pg.sh
vegard 0f03886091 Backup: daglig PG-dump, STDB-krasj-recovery, helsesjekk (oppgave 12.2)
Tre ting implementert:

1. PG-dump rutine (scripts/backup-pg.sh):
   - Daglig cron kl. 03:00 UTC via /etc/cron.d/synops-backup
   - pg_dump -Fc (custom format, komprimert), konsistent uten nedetid
   - Rotasjon: beholder 30 dager, sletter eldre
   - Verifiserer at dump-filen er gyldig (ikke tom)

2. STDB → PG gjenoppbygging ved krasj (stdb_monitor.rs):
   - Bakgrunnsmonitor sjekker STDB hvert 30. sekund
   - Oppdager krasj (var oppe → nå nede)
   - Venter på at containeren restarter (maks 10 min)
   - Kjører warmup (PG → STDB) automatisk
   - Hele prosessen logges

3. Forbedret backup-helsesjekk (health.rs):
   - Sjekker /srv/synops/backup/pg/ for nyeste dump
   - Rapporterer ok/stale/missing i /admin/health
2026-03-18 11:11:32 +00:00

56 lines
1.7 KiB
Bash
Executable file

#!/bin/bash
# backup-pg.sh — Daglig PostgreSQL-dump med rotasjon.
#
# Kjøres via cron (03:00 UTC). Dumper synops-databasen med pg_dump -Fc
# (custom format, komprimert). Beholder 30 dager, sletter eldre.
#
# Ref: docs/setup/produksjon.md § 11.1, docs/infra/backup.md
set -euo pipefail
BACKUP_DIR="/srv/synops/backup/pg"
CONTAINER="sidelinja-postgres-1"
DB_USER="sidelinja"
DB_NAME="sidelinja"
RETAIN_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DUMP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.dump"
LOG_FILE="/srv/synops/logs/backup-pg.log"
log() {
echo "$(date -Iseconds) $1" | tee -a "$LOG_FILE"
}
# Sjekk at backup-katalog finnes
mkdir -p "$BACKUP_DIR"
# Sjekk at PG-containeren kjører
if ! docker inspect "$CONTAINER" --format '{{.State.Running}}' 2>/dev/null | grep -q true; then
log "FEIL: PostgreSQL-container $CONTAINER kjører ikke"
exit 1
fi
# Kjør pg_dump (konsistent snapshot, ingen nedetid)
log "Starter PG-dump → $DUMP_FILE"
if docker exec "$CONTAINER" pg_dump -U "$DB_USER" -Fc "$DB_NAME" > "$DUMP_FILE" 2>>"$LOG_FILE"; then
# Verifiser at filen ikke er tom
FILESIZE=$(stat -c%s "$DUMP_FILE" 2>/dev/null || echo 0)
if [ "$FILESIZE" -lt 100 ]; then
log "FEIL: Dump-filen er for liten (${FILESIZE} bytes), noe gikk galt"
rm -f "$DUMP_FILE"
exit 1
fi
log "PG-dump ferdig: ${DUMP_FILE} ($(numfmt --to=iec "$FILESIZE"))"
else
log "FEIL: pg_dump feilet"
rm -f "$DUMP_FILE"
exit 1
fi
# Rotasjon: slett dumper eldre enn $RETAIN_DAYS dager
DELETED=$(find "$BACKUP_DIR" -name "*.dump" -mtime +${RETAIN_DAYS} -print -delete | wc -l)
if [ "$DELETED" -gt 0 ]; then
log "Rotasjon: slettet $DELETED dump(er) eldre enn $RETAIN_DAYS dager"
fi
log "Backup fullført OK"