Files
2025-11-25 12:27:53 +03:30

69 lines
1.7 KiB
Bash
Executable File

#!/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"