Files
transcription/deploy/backup/create_postgres_backup.sh
T
Jim Lancaster 96bb80d91f
Quality Gate / gate (push) Successful in 2m29s
V6.1 backups: once more into the breach.
2026-09-02 10:59:28 -05:00

68 lines
2.1 KiB
Bash

#!/usr/bin/env sh
set -eu
BACKUP_DIR="${BACKUP_DIR:-./data/backups}"
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-14}"
UPLOAD_DIR="${UPLOAD_DIR:-/app/uploads}"
PROMPT_DIR="${PROMPT_DIR:-/app/prompts}"
timestamp="$(date -u +%Y%m%d-%H%M%S)"
postgres_file="postgres-${timestamp}.dump"
manifest_file="backup-${timestamp}.manifest"
mkdir -p "${BACKUP_DIR}"
: "${POSTGRES_HOST:=postgres}"
: "${POSTGRES_PORT:=5432}"
if [ -z "${POSTGRES_DB:-}" ] || [ -z "${POSTGRES_USER:-}" ] || [ -z "${POSTGRES_PASSWORD:-}" ]; then
echo "POSTGRES_DB, POSTGRES_USER, and POSTGRES_PASSWORD must be set." >&2
exit 1
fi
if ! command -v pg_dump >/dev/null 2>&1; then
echo "pg_dump is not installed in this environment." >&2
exit 1
fi
PGPASSWORD="${POSTGRES_PASSWORD}" pg_dump \
-h "${POSTGRES_HOST}" \
-p "${POSTGRES_PORT}" \
-U "${POSTGRES_USER}" \
-d "${POSTGRES_DB}" \
-Fc \
> "${BACKUP_DIR}/${postgres_file}"
cat > "${BACKUP_DIR}/${manifest_file}" <<EOF
created_at_utc=${timestamp}
postgres_dump=${postgres_file}
backup_dir=${BACKUP_DIR}
uploads_backup_dir=${BACKUP_DIR}/uploads
prompts_backup_dir=${BACKUP_DIR}/prompts
EOF
find "${BACKUP_DIR}" -type f \( \
-name 'postgres-*.dump' -o \
-name 'backup-*.manifest' \
\) -mtime +"${RETENTION_DAYS}" -delete
uploads_backup_dir="${BACKUP_DIR}/uploads"
mkdir -p "${uploads_backup_dir}/documents" "${uploads_backup_dir}/photos"
if [ -f "${UPLOAD_DIR}/homepage.md" ] && [ ! -f "${uploads_backup_dir}/homepage.md" ]; then
cp "${UPLOAD_DIR}/homepage.md" "${uploads_backup_dir}/homepage.md"
fi
if [ -d "${UPLOAD_DIR}/documents" ]; then
cp -an "${UPLOAD_DIR}/documents/." "${uploads_backup_dir}/documents/"
fi
if [ -d "${UPLOAD_DIR}/photos" ]; then
cp -an "${UPLOAD_DIR}/photos/." "${uploads_backup_dir}/photos/"
fi
prompts_backup_dir="${BACKUP_DIR}/prompts"
mkdir -p "${prompts_backup_dir}"
if [ -d "${PROMPT_DIR}" ]; then
cp -a "${PROMPT_DIR}/." "${prompts_backup_dir}/"
fi
echo "Created backup set:"
echo " ${BACKUP_DIR}/${postgres_file}"
echo " ${BACKUP_DIR}/${manifest_file}"
echo " ${uploads_backup_dir}/ (incremental uploads mirror)"
echo " ${prompts_backup_dir}/ (prompts mirror)"