feat(db): add setup_postgres_local.sh for local PostgreSQL initialization

This commit is contained in:
Haitao Pan 2025-10-30 15:35:13 +08:00
parent 3edad8474c
commit 22254c18de

View File

@ -0,0 +1,90 @@
#!/usr/bin/env bash
#
# ============================================
# 🧱 setup_postgres_local.sh
# 初始化本地 PostgreSQL 数据库 (开发环境)
# --------------------------------------------
# 支持 Ubuntu / macOS
# 创建用户 + 数据库 + 导入 schema
# ============================================
set -euo pipefail
# -----------------------------------------------------------------------------
# 配置参数(可通过环境变量覆盖)
# -----------------------------------------------------------------------------
DB_NAME="${DB_NAME:-account}"
DB_USER="${DB_USER:-shenlan}"
DB_PASS="${DB_PASS:-password}"
DB_PORT="${DB_PORT:-5432}"
DB_HOST="${DB_HOST:-127.0.0.1}"
SCHEMA_FILE="${SCHEMA_FILE:-./sql/schema.sql}"
PG_SERVICE_NAME="${PG_SERVICE_NAME:-postgresql}"
OS=$(uname -s)
# -----------------------------------------------------------------------------
# 通用函数
# -----------------------------------------------------------------------------
log() { echo -e "[$(date '+%H:%M:%S')] $*"; }
require_postgres() {
if ! command -v psql >/dev/null; then
log "⚠️ 未检测到 psql开始安装 PostgreSQL..."
if [[ "$OS" == "Darwin" ]]; then
brew install postgresql@16 || brew install postgresql
else
sudo apt-get update -y
sudo apt-get install -y postgresql postgresql-contrib
fi
else
log "✅ psql 已存在"
fi
}
start_postgres() {
if [[ "$OS" == "Darwin" ]]; then
brew services start postgresql@16 || brew services start postgresql || true
else
sudo systemctl enable --now "${PG_SERVICE_NAME}" || true
fi
}
create_user_and_db() {
log "🧩 检查并创建数据库用户 ${DB_USER}"
if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${DB_USER}'" | grep -q 1; then
sudo -u postgres psql -c "CREATE ROLE ${DB_USER} LOGIN PASSWORD '${DB_PASS}';"
else
log "✅ 用户 ${DB_USER} 已存在"
fi
log "🧩 检查并创建数据库 ${DB_NAME}"
if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='${DB_NAME}'" | grep -q 1; then
sudo -u postgres createdb -O "${DB_USER}" "${DB_NAME}"
else
log "✅ 数据库 ${DB_NAME} 已存在"
fi
log "🔑 授权 ${DB_USER} 对数据库 ${DB_NAME} 拥有全部权限"
sudo -u postgres psql -d "${DB_NAME}" -c "GRANT ALL PRIVILEGES ON DATABASE ${DB_NAME} TO ${DB_USER};" >/dev/null || true
}
import_schema() {
if [[ -f "${SCHEMA_FILE}" ]]; then
log "📦 导入 schema 文件: ${SCHEMA_FILE}"
PGPASSWORD="${DB_PASS}" psql "postgres://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=disable" \
-v ON_ERROR_STOP=1 -f "${SCHEMA_FILE}"
log "✅ schema 导入成功"
else
log "⚠️ 未找到 schema 文件: ${SCHEMA_FILE},跳过导入"
fi
}
# -----------------------------------------------------------------------------
# 主流程
# -----------------------------------------------------------------------------
log "🚀 开始初始化 PostgreSQL 本地数据库"
require_postgres
start_postgres
create_user_and_db
import_schema
log "🎉 PostgreSQL 本地数据库初始化完成"