Files
Lannamokia 803e6cdaee feat: 添加PostgreSQL数据库集成和机台管理功能
- 新增PostgreSQL数据库支持,包含内置和外部数据库两种部署模式
- 实现机台管理功能,包括保护状态控制和VHD关键词设置
- 添加用户认证系统,支持会话管理和权限控制
- 更新Docker配置,支持数据库持久化和健康检查
- 扩展API接口,提供完整的RESTful API文档
- 更新客户端代码以支持机台ID和保护检查功能
- 添加数据库初始化脚本和配置指南
2025-10-21 20:10:18 +08:00

153 lines
5.0 KiB
Bash

#!/bin/bash
set -e
# 日志函数
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}
# 等待外部数据库连接
wait_for_external_db() {
log "等待外部数据库连接..."
local max_attempts=30
local attempt=1
while [ $attempt -le $max_attempts ]; do
if pg_isready -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" 2>/dev/null; then
log "外部数据库连接成功"
return 0
fi
log "尝试连接外部数据库 ($attempt/$max_attempts)..."
sleep 2
attempt=$((attempt + 1))
done
log "错误: 无法连接到外部数据库"
exit 1
}
# 初始化内置PostgreSQL数据库
init_embedded_db() {
log "初始化内置PostgreSQL数据库..."
# 检查数据目录是否已初始化
if [ ! -f "$POSTGRES_DATA_DIR/PG_VERSION" ]; then
log "初始化PostgreSQL数据目录..."
su-exec postgres initdb -D "$POSTGRES_DATA_DIR" --auth-local=trust --auth-host=md5
# 配置PostgreSQL
echo "host all all 0.0.0.0/0 md5" >> "$POSTGRES_DATA_DIR/pg_hba.conf"
echo "listen_addresses = '*'" >> "$POSTGRES_DATA_DIR/postgresql.conf"
echo "port = $DB_PORT" >> "$POSTGRES_DATA_DIR/postgresql.conf"
echo "max_connections = 100" >> "$POSTGRES_DATA_DIR/postgresql.conf"
echo "shared_buffers = 128MB" >> "$POSTGRES_DATA_DIR/postgresql.conf"
echo "log_statement = 'all'" >> "$POSTGRES_DATA_DIR/postgresql.conf"
echo "logging_collector = on" >> "$POSTGRES_DATA_DIR/postgresql.conf"
fi
# 启动PostgreSQL
log "启动PostgreSQL服务..."
su-exec postgres pg_ctl -D "$POSTGRES_DATA_DIR" -l "$POSTGRES_DATA_DIR/postgresql.log" start
# 等待PostgreSQL启动
local max_attempts=30
local attempt=1
while [ $attempt -le $max_attempts ]; do
if su-exec postgres pg_isready -h localhost -p "$DB_PORT" 2>/dev/null; then
log "PostgreSQL启动成功"
break
fi
log "等待PostgreSQL启动 ($attempt/$max_attempts)..."
sleep 1
attempt=$((attempt + 1))
done
if [ $attempt -gt $max_attempts ]; then
log "错误: PostgreSQL启动失败"
log "PostgreSQL日志内容:"
cat "$POSTGRES_DATA_DIR/postgresql.log" || true
exit 1
fi
# 创建数据库用户和数据库
log "创建数据库用户和数据库..."
su-exec postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';" 2>/dev/null || true
su-exec postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" 2>/dev/null || true
su-exec postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" 2>/dev/null || true
# 初始化数据库表结构
log "初始化数据库表结构..."
if [ -f "/app/init-db.sql" ]; then
# 使用postgres用户通过本地socket连接执行初始化脚本
su-exec postgres psql -d "$DB_NAME" -f /app/init-db.sql
su-exec postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $DB_USER;"
su-exec postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $DB_USER;"
fi
log "内置数据库初始化完成"
}
# 初始化外部数据库表结构
init_external_db() {
log "初始化外部数据库表结构..."
# 检查是否需要初始化表结构
if ! PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1 FROM machines LIMIT 1;" 2>/dev/null; then
log "创建数据库表结构..."
PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f /app/scripts/init-db.sql
log "外部数据库表结构初始化完成"
else
log "外部数据库表结构已存在,跳过初始化"
fi
}
# 启动Node.js应用
start_app() {
log "启动VHD Select Server应用..."
cd /app
su-exec nodejs npm start
}
# 优雅关闭处理
cleanup() {
log "接收到关闭信号,正在优雅关闭..."
# 关闭Node.js应用
if [ ! -z "$APP_PID" ]; then
kill -TERM "$APP_PID" 2>/dev/null || true
wait "$APP_PID" 2>/dev/null || true
fi
# 如果使用内置数据库,关闭PostgreSQL
if [ "$USE_EMBEDDED_DB" = "true" ]; then
log "关闭内置PostgreSQL数据库..."
su-exec postgres pg_ctl -D "$POSTGRES_DATA_DIR" stop -m fast 2>/dev/null || true
fi
log "应用已关闭"
exit 0
}
# 设置信号处理
trap cleanup SIGTERM SIGINT
# 主逻辑
log "VHD Select Server Docker容器启动"
log "USE_EMBEDDED_DB: $USE_EMBEDDED_DB"
if [ "$USE_EMBEDDED_DB" = "true" ]; then
log "使用内置PostgreSQL数据库"
init_embedded_db
else
log "使用外部数据库: $DB_HOST:$DB_PORT/$DB_NAME"
wait_for_external_db
init_external_db
fi
# 启动应用(在后台运行以便处理信号)
start_app &
APP_PID=$!
# 等待应用进程
wait "$APP_PID"