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
56 lines
1.7 KiB
Bash
Executable file
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"
|