105 lines
2.9 KiB
Bash
105 lines
2.9 KiB
Bash
#!/bin/sh
|
||
# Docker 容器启动脚本
|
||
#
|
||
# 功能:
|
||
# 1. 自动执行数据库迁移
|
||
# 2. 自动初始化系统数据(内置模板等)
|
||
# 3. 启动 Next.js 应用
|
||
#
|
||
# 客户无需任何手动操作,只需启动容器即可
|
||
|
||
set -e
|
||
|
||
is_placeholder_value() {
|
||
value="$1"
|
||
case "$value" in
|
||
""|replace-with-*|your-*|*example.com*|*x.x*|*"<"*">"*|postgresql://username:password@host:5432/database)
|
||
return 0
|
||
;;
|
||
*)
|
||
return 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
require_real_env() {
|
||
name="$1"
|
||
eval "value=\${$name:-}"
|
||
if is_placeholder_value "$value"; then
|
||
echo "✗ 环境变量 $name 未配置为真实值,请先修正 .env 后再启动"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
case "${NODE_OPTIONS:-}" in
|
||
*--inspect*)
|
||
echo "✗ 生产环境禁止启用 Node inspector,请移除 NODE_OPTIONS 中的 --inspect 参数"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
echo "=========================================="
|
||
echo "FLNXI 素材库系统启动中..."
|
||
echo "=========================================="
|
||
|
||
echo "[0/3] 检查生产环境变量..."
|
||
require_real_env "DATABASE_URL"
|
||
require_real_env "APP_PUBLIC_URL"
|
||
require_real_env "NEXTAUTH_URL"
|
||
require_real_env "NEXTAUTH_SECRET"
|
||
require_real_env "LICENSE_SERVER_URL"
|
||
require_real_env "LICENSE_PROJECT_CODE"
|
||
require_real_env "LICENSE_REQUEST_SIGNING_SECRET"
|
||
require_real_env "LICENSE_PUBLIC_KEY"
|
||
require_real_env "LOCAL_ENCRYPTION_KEY"
|
||
require_real_env "S3_ENDPOINT"
|
||
require_real_env "S3_BUCKET"
|
||
require_real_env "S3_ACCESS_KEY_ID"
|
||
require_real_env "S3_SECRET_ACCESS_KEY"
|
||
require_real_env "S3_PUBLIC_DOMAIN"
|
||
echo "✓ 生产环境变量检查通过"
|
||
|
||
# 1. 等待数据库就绪
|
||
echo "[1/3] 检查数据库连接..."
|
||
MAX_RETRIES=30
|
||
RETRY_COUNT=0
|
||
|
||
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
|
||
if echo "SELECT 1" | npx prisma db execute --stdin > /dev/null 2>&1; then
|
||
echo "✓ 数据库连接成功"
|
||
break
|
||
fi
|
||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||
echo "等待数据库就绪... ($RETRY_COUNT/$MAX_RETRIES)"
|
||
sleep 2
|
||
done
|
||
|
||
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
|
||
echo "✗ 数据库连接超时,请检查 DATABASE_URL 配置"
|
||
exit 1
|
||
fi
|
||
|
||
# 2. 执行数据库迁移
|
||
echo "[2/3] 执行数据库迁移..."
|
||
if npx prisma migrate deploy; then
|
||
echo "✓ 数据库迁移完成"
|
||
else
|
||
echo "✗ 数据库迁移失败,已停止启动以保护数据一致性"
|
||
echo "请先检查迁移日志、数据库连接和备份状态,修复后再重新启动容器"
|
||
exit 1
|
||
fi
|
||
|
||
# 3. 启动应用(系统初始化会在首次请求时自动执行)
|
||
echo "[3/3] 启动应用服务..."
|
||
echo "=========================================="
|
||
echo "系统启动完成!"
|
||
echo "访问地址: http://localhost:${PORT:-3000}"
|
||
echo "=========================================="
|
||
|
||
trap '' USR1
|
||
node server.js &
|
||
app_pid="$!"
|
||
|
||
trap 'kill -TERM "$app_pid" 2>/dev/null || true' TERM INT
|
||
wait "$app_pid"
|