Files
iam-service/scripts/db/rebuild_iam_db.sh
2026-01-30 16:31:53 +08:00

90 lines
2.6 KiB
Bash
Executable File

#!/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"