#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" load_database_url_from_env_file() { local env_file="$1" local line value while IFS= read -r line || [[ -n "${line}" ]]; do line="${line#"${line%%[![:space:]]*}"}" [[ -z "${line}" || "${line}" == \#* ]] && continue line="${line#export }" if [[ "${line}" == DATABASE_URL=* ]]; then value="${line#DATABASE_URL=}" value="${value%$'\r'}" value="${value%\"}" value="${value#\"}" value="${value%\'}" value="${value#\'}" printf '%s' "${value}" return 0 fi done < "${env_file}" return 1 } DATABASE_URL="${DATABASE_URL:-}" if [[ -z "${DATABASE_URL}" && -f "${ROOT_DIR}/.env" ]]; then DATABASE_URL="$(load_database_url_from_env_file "${ROOT_DIR}/.env" || true)" fi if [[ -z "${DATABASE_URL}" ]]; then echo "DATABASE_URL is required (export it, or set it in ${ROOT_DIR}/.env)" exit 1 fi if ! command -v psql >/dev/null 2>&1; then echo "psql not found in PATH" if [[ -r /etc/os-release ]]; then . /etc/os-release case "${ID:-}" in ubuntu|debian) echo "Install (Ubuntu/Debian): sudo apt-get update && sudo apt-get install -y postgresql-client" ;; centos|rhel|fedora) echo "Install (RHEL/CentOS/Fedora): sudo dnf install -y postgresql" ;; alpine) echo "Install (Alpine): sudo apk add postgresql-client" ;; *) echo "Install PostgreSQL client tools (psql) for your OS and retry" ;; esac else echo "Install PostgreSQL client tools (psql) for your OS and retry" fi exit 127 fi CHECK_ONLY="${CHECK_ONLY:-0}" if [[ "${CHECK_ONLY}" == "1" ]]; then echo "DATABASE_URL=${DATABASE_URL}" exit 0 fi BACKUP="${BACKUP:-0}" BACKUP_DIR="${BACKUP_DIR:-${ROOT_DIR}/backups}" if [[ "${BACKUP_DIR}" != /* ]]; then BACKUP_DIR="${ROOT_DIR}/${BACKUP_DIR}" fi if [[ "${BACKUP}" == "1" ]]; then if ! command -v pg_dump >/dev/null 2>&1; then echo "pg_dump not found; install postgres client or set BACKUP=0" exit 1 fi mkdir -p "${BACKUP_DIR}" ts="$(date +%Y%m%d_%H%M%S)" backup_file="${BACKUP_DIR}/iam_service_db_${ts}.dump" pg_dump "${DATABASE_URL}" -Fc -f "${backup_file}" echo "Backup written: ${backup_file}" fi psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -f "${ROOT_DIR}/sql/drop_iam_schema.sql" psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -f "${ROOT_DIR}/sql/schema_post_init.sql" psql "${DATABASE_URL}" -v ON_ERROR_STOP=1 -f "${ROOT_DIR}/sql/verify_iam_schema.sql" echo "Rebuild completed"