#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BACKUP_DIR="${BACKUP_DIR:-$ROOT_DIR/deploy/trialrun/backups}" mkdir -p "$BACKUP_DIR" TS="$(date +%Y%m%d_%H%M%S)" OUT_FILE="${OUT_FILE:-$BACKUP_DIR/hyb-oa-db-${TS}.dump}" if [[ -e "$OUT_FILE" ]]; then echo "[ERR] backup output already exists: $OUT_FILE" >&2 exit 1 fi mkdir -p "$(dirname "$OUT_FILE")" if [[ -z "${DATABASE_URL:-}" ]]; then echo "[ERR] DATABASE_URL is required" >&2 exit 1 fi DB_TOOL_MODE="${DB_TOOL_MODE:-auto}" if [[ "$DB_TOOL_MODE" != "auto" && "$DB_TOOL_MODE" != "host" && "$DB_TOOL_MODE" != "docker" ]]; then echo "[ERR] DB_TOOL_MODE must be auto, host, or docker" >&2 exit 1 fi echo "[INFO] DB backup start: $OUT_FILE" if [[ "$DB_TOOL_MODE" != "docker" ]] && command -v pg_dump >/dev/null 2>&1; then if pg_dump "$DATABASE_URL" --format=c --no-owner --no-acl --file "$OUT_FILE"; then if [[ ! -s "$OUT_FILE" ]]; then echo "[ERR] DB backup is empty: $OUT_FILE" >&2 exit 1 fi echo "[OK] DB backup done (pg_dump): $OUT_FILE" exit 0 fi rm -f -- "$OUT_FILE" if [[ "$DB_TOOL_MODE" == "host" ]]; then echo "[ERR] host pg_dump failed" >&2 exit 1 fi echo "[WARN] host pg_dump failed; trying docker fallback" >&2 fi if [[ "$DB_TOOL_MODE" == "host" ]]; then echo "[ERR] DB_TOOL_MODE=host requires pg_dump" >&2 exit 1 fi if ! command -v docker >/dev/null 2>&1; then echo "[ERR] pg_dump not found and docker not available" >&2 exit 1 fi DB_CONTAINER="${DB_CONTAINER:-}" POSTGRES_DB="${POSTGRES_DB:-}" POSTGRES_USER="${POSTGRES_USER:-}" POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-}" if [[ -z "$DB_CONTAINER" ]]; then echo "[ERR] Using docker fallback requires explicit DB_CONTAINER" >&2 exit 1 fi if [[ -z "$POSTGRES_DB" || -z "$POSTGRES_USER" || -z "$POSTGRES_PASSWORD" ]]; then echo "[ERR] Using docker fallback requires POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORD" >&2 exit 1 fi if ! PGPASSWORD="$POSTGRES_PASSWORD" docker exec -e PGPASSWORD "$DB_CONTAINER" \ pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" --format=c --no-owner --no-acl \ >"$OUT_FILE"; then rm -f -- "$OUT_FILE" echo "[ERR] docker pg_dump failed" >&2 exit 1 fi if [[ ! -s "$OUT_FILE" ]]; then echo "[ERR] DB backup is empty: $OUT_FILE" >&2 exit 1 fi echo "[OK] DB backup done (docker exec): $OUT_FILE"