Add scripts/postgres_backup.sh
This commit is contained in:
@@ -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."
|
||||||
|
|
||||||
Reference in New Issue
Block a user