#!/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 -delete 2>/dev/null || true SNAPSHOT_COUNT=$(ls -1 "$SNAPSHOT_DIR"/*.sql.gz 2>/dev/null | wc -l) log "Cleanup done. $SNAPSHOT_COUNT snapshots remaining" log "=== Backup complete ==="