initial commit
This commit is contained in:
69
scripts/backup/pg-dump.sh
Executable file
69
scripts/backup/pg-dump.sh
Executable file
@@ -0,0 +1,69 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user