#!/bin/sh set -eu # Minimal PATH for cron-like environments PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin log() { printf '%s %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$*" } err() { log "ERROR: $*" >&2 } log "pg-dump.sh starting" # Validate required env vars : "${POSTGRES_USER:?POSTGRES_USER not set}" : "${POSTGRES_HOST:?POSTGRES_HOST not set}" date_formatted() { local format="${1:-%F_%H-%M}" # Use TIMEZONE env var if present; fall back to UTC if [ -n "${TIMEZONE:-}" ]; then TZ="$TIMEZONE" date +"$format" else date +"$format" fi } BACKUP_DIR=/backups/databases mkdir -p "$BACKUP_DIR" log "Using backup dir: $BACKUP_DIR" STATUS_FILE="$BACKUP_DIR/.last_backup_complete" # Function to dump a specific database dump_database() { local db=$1 log "Checking existence of $db database..." local db_exists db_exists=$(psql -U "$POSTGRES_USER" -h "$POSTGRES_HOST" -tAc "SELECT 1 FROM pg_database WHERE datname='$db'") if [[ "$db_exists" != "1" ]]; then err "Database '$db' does not exist. Skipping dump." return 2 fi log "Dumping $db database..." local outfile="$BACKUP_DIR/${db}_$(date_formatted).sql.gz" if pg_dump -U "$POSTGRES_USER" -h "$POSTGRES_HOST" "$db" | gzip > "$outfile"; then log "$db database dumped and compressed: $outfile" return 0 else err "Failed to dump $db database" return 1 fi } # Dump each database for db in $DB_LIST; do dump_database "$db" || exit 1 done tmp_status=$(mktemp "$BACKUP_DIR/.last_backup_complete.XXXXXX") date -u +%s > "$tmp_status" mv "$tmp_status" "$STATUS_FILE" log "Recorded database backup completion marker at $STATUS_FILE" log "pg-dump.sh finished successfully"