Add scripts/postgres_backup.sh

This commit is contained in:
2026-04-18 23:31:21 -03:00
parent e1597c3ca7
commit 3808efdbdd
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
#
# Create a compressed PostgreSQL backup and remove old backup files.
#
# Required environment variables:
# PGHOST PostgreSQL host.
# PGUSER PostgreSQL user.
# PGPASSWORD PostgreSQL password.
# PGDATABASE Database name to back up.
#
# Usage:
# PGHOST=localhost PGUSER=app PGPASSWORD=secret PGDATABASE=appdb \
# bash postgres_backup.sh --destination /backups/postgres
#
# Options:
# --destination DIR Backup directory. Default: ./backups
# --retention-days N Delete backups older than N days. Default: 14.
# --help Show this help message.
set -Eeuo pipefail
destination="./backups"
retention_days="14"
usage() {
sed -n '2,24p' "$0" | sed 's/^# \{0,1\}//'
}
log() {
printf '[%s] %s\n' "$(date -Is)" "$*"
}
require_env() {
local name="$1"
if [[ -z "${!name:-}" ]]; then
printf 'ERROR: required environment variable is missing: %s\n' "$name" >&2
exit 1
fi
}
while [[ "$#" -gt 0 ]]; do
case "$1" in
--destination)
destination="${2:-}"
[[ -n "$destination" ]] || { printf 'ERROR: --destination requires a directory.\n' >&2; exit 1; }
shift 2
;;
--retention-days)
retention_days="${2:-}"
[[ "$retention_days" =~ ^[0-9]+$ ]] || { printf 'ERROR: retention must be a positive integer.\n' >&2; exit 1; }
shift 2
;;
--help|-h)
usage
exit 0
;;
*)
printf 'ERROR: unknown option: %s\n' "$1" >&2
usage >&2
exit 1
;;
esac
done
command -v pg_dump >/dev/null 2>&1 || { printf 'ERROR: pg_dump command not found.\n' >&2; exit 1; }
command -v gzip >/dev/null 2>&1 || { printf 'ERROR: gzip command not found.\n' >&2; exit 1; }
require_env PGHOST
require_env PGUSER
require_env PGPASSWORD
require_env PGDATABASE
mkdir -p "$destination"
timestamp="$(date +%Y%m%d-%H%M%S)"
backup_file="${destination}/${PGDATABASE}-${timestamp}.sql.gz"
log "Starting PostgreSQL backup for database '${PGDATABASE}'."
pg_dump --format=plain --no-owner --no-privileges "$PGDATABASE" | gzip -9 > "$backup_file"
if [[ ! -s "$backup_file" ]]; then
printf 'ERROR: backup file was not created or is empty: %s\n' "$backup_file" >&2
exit 1
fi
log "Backup created: ${backup_file}"
log "Removing backups older than ${retention_days} days from ${destination}."
find "$destination" -type f -name "${PGDATABASE}-*.sql.gz" -mtime "+${retention_days}" -print -delete
log "Backup job completed successfully."