Files
Momento/scripts/backup/backup.sh
Antigravity 8950e83db5
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Test & Build (push) Has been cancelled
feat: P0 backup system (WAL+snapshot+restore+verify), monitoring stack, admin health API
2026-05-17 14:13:01 +00:00

61 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
BACKUP_DIR="/opt/memento/backups"
WAL_DIR="$BACKUP_DIR/wal"
SNAPSHOT_DIR="$BACKUP_DIR/snapshots"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7
RETENTION_WEEKS=4
PG_CONTAINER="memento-postgres"
PG_USER="${POSTGRES_USER:-memento}"
PG_DB="${POSTGRES_DB:-memento}"
LOG_FILE="$BACKUP_DIR/backup.log"
mkdir -p "$WAL_DIR" "$SNAPSHOT_DIR"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Starting backup ==="
SNAPSHOT_FILE="$SNAPSHOT_DIR/memento-$TIMESTAMP.sql.gz"
log "Creating snapshot: $SNAPSHOT_FILE"
docker exec "$PG_CONTAINER" pg_dump -U "$PG_USER" -d "$PG_DB" --format=custom | gzip > "$SNAPSHOT_FILE"
SNAPSHOT_SIZE=$(stat -c%s "$SNAPSHOT_FILE" 2>/dev/null || echo 0)
if [ "$SNAPSHOT_SIZE" -lt 1048576 ]; then
log "ERROR: Snapshot is only $SNAPSHOT_SIZE bytes (< 1MB). Possible failure!"
exit 1
fi
log "Snapshot OK: $(( SNAPSHOT_SIZE / 1024 ))KB"
log "Verifying snapshot integrity..."
if gzip -t "$SNAPSHOT_FILE" 2>/dev/null; then
log "Integrity check: PASSED"
else
log "ERROR: Snapshot integrity check FAILED!"
exit 1
fi
log "Cleaning old snapshots (keeping $RETENTION_DAYS days + $RETENTION_WEEKS weekly)..."
cd "$SNAPSHOT_DIR"
find . -name "*.sql.gz" -mtime +$RETENTION_DAYS ! -name "*-000000.sql.gz" -delete 2>/dev/null || true
for i in $(seq 1 $RETENTION_WEEKS); do
WEEK_DATE=$(date -d "$RETENTION_DAYS + $((i-1)) * 7 days" +%Y%m%d)
WEEK_FILE=$(ls -t memento-${WEEK_DATE}*.sql.gz 2>/dev/null | head -1)
if [ -n "$WEEK_FILE" ]; then
touch "$WEEK_FILE"
fi
done
SNAPSHOT_COUNT=$(ls -1 "$SNAPSHOT_DIR"/*.sql.gz 2>/dev/null | wc -l)
log "Cleanup done. $SNAPSHOT_COUNT snapshots remaining"
log "=== Backup complete ==="