69 lines
1.7 KiB
Bash
Executable File
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" |