feat: P0 backup system (WAL+snapshot+restore+verify), monitoring stack, admin health API
This commit is contained in:
60
scripts/backup/backup.sh
Executable file
60
scripts/backup/backup.sh
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/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 ==="
|
||||
Reference in New Issue
Block a user