53 lines
1.4 KiB
Bash
Executable File
53 lines
1.4 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 -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 ==="
|