flnxi-Wu/scripts/docker-entrypoint.sh
2026-06-02 22:37:52 +08:00

105 lines
2.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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