#!/bin/bash set -euo pipefail # Load environment variables from .env.docker if it exists if [ -f "/opt/memento/.env.docker" ]; then set -a source "/opt/memento/.env.docker" set +a fi BACKUP_DIR="/opt/memento/backups" WAL_DIR="$BACKUP_DIR/wal" PG_CONTAINER="memento-postgres" PG_USER="${POSTGRES_USER:-memento}" PG_DB="${POSTGRES_DB:-memento}" PG_PASSWORD="${POSTGRES_PASSWORD:-}" LOG_FILE="$BACKUP_DIR/backup.log" mkdir -p "$WAL_DIR" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } log "=== Setting up WAL archiving ===" docker exec "$PG_CONTAINER" bash -c "mkdir -p /var/lib/postgresql/backups/wal" log "Configuring PostgreSQL WAL parameters..." docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "ALTER SYSTEM SET wal_level = replica;" docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "ALTER SYSTEM SET archive_mode = on;" docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "ALTER SYSTEM SET archive_command = 'cp %p /var/lib/postgresql/backups/wal/%f';" docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "ALTER SYSTEM SET max_wal_senders = 3;" docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "ALTER SYSTEM SET wal_keep_size = '1GB';" log "Restarting PostgreSQL container to apply WAL parameters (required for wal_level)..." docker restart "$PG_CONTAINER" # Wait for PostgreSQL to be ready log "Waiting for PostgreSQL to be ready..." until docker exec "$PG_CONTAINER" pg_isready -U "$PG_USER" -d "$PG_DB" >/dev/null 2>&1; do sleep 1 done log "PostgreSQL is ready. Reloading config..." docker exec "$PG_CONTAINER" psql -U "$PG_USER" -d "$PG_DB" -c "SELECT pg_reload_conf();" log "WAL archiving enabled. Archives stored in /var/lib/postgresql/backups/wal/" WAL_COUNT=$(docker exec "$PG_CONTAINER" ls /var/lib/postgresql/backups/wal/ 2>/dev/null | wc -l) log "Existing WAL segments: $WAL_COUNT"