127 lines
3.5 KiB
Bash
Executable File
127 lines
3.5 KiB
Bash
Executable File
#!/bin/sh
|
||
|
||
set -e
|
||
|
||
# 获取脚本所在目录
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
BUILD_DIR="$SCRIPT_DIR"
|
||
|
||
# 存储所有子进程的 PID
|
||
pids=""
|
||
|
||
# 清理函数:优雅关闭所有服务
|
||
cleanup() {
|
||
echo ""
|
||
echo "🛑 正在关闭所有服务..."
|
||
|
||
# 发送 SIGTERM 信号给所有子进程
|
||
for pid in $pids; do
|
||
if kill -0 "$pid" 2>/dev/null; then
|
||
service_name=$(ps -p "$pid" -o comm= 2>/dev/null || echo "unknown")
|
||
echo " 关闭进程 $pid ($service_name)..."
|
||
kill -TERM "$pid" 2>/dev/null
|
||
fi
|
||
done
|
||
|
||
# 等待所有进程退出(最多等待 5 秒)
|
||
sleep 1
|
||
for pid in $pids; do
|
||
if kill -0 "$pid" 2>/dev/null; then
|
||
# 如果还在运行,等待最多 4 秒
|
||
timeout=4
|
||
while [ $timeout -gt 0 ] && kill -0 "$pid" 2>/dev/null; do
|
||
sleep 1
|
||
timeout=$((timeout - 1))
|
||
done
|
||
# 如果仍然在运行,强制关闭
|
||
if kill -0 "$pid" 2>/dev/null; then
|
||
echo " 强制关闭进程 $pid..."
|
||
kill -KILL "$pid" 2>/dev/null
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo "✅ 所有服务已关闭"
|
||
exit 0
|
||
}
|
||
|
||
echo "🚀 开始启动所有服务..."
|
||
echo ""
|
||
|
||
# 切换到构建目录
|
||
cd "$BUILD_DIR" || exit 1
|
||
|
||
ls -lah
|
||
|
||
# 初始化数据库(如果存在)
|
||
if [ -d "./next-service-dist/db" ] && [ "$(ls -A ./next-service-dist/db 2>/dev/null)" ] && [ -d "/db" ]; then
|
||
echo "🗄️ 初始化数据库从 ./next-service-dist/db 到 /db..."
|
||
cp -r ./next-service-dist/db/* /db/ 2>/dev/null || echo " ⚠️ 无法复制到 /db,跳过数据库初始化"
|
||
echo "✅ 数据库初始化完成"
|
||
fi
|
||
|
||
# 启动 Next.js 服务器
|
||
if [ -f "./next-service-dist/server.js" ]; then
|
||
echo "🚀 启动 Next.js 服务器..."
|
||
cd next-service-dist/ || exit 1
|
||
|
||
# 设置环境变量
|
||
export NODE_ENV=production
|
||
export PORT=${PORT:-3000}
|
||
export HOSTNAME=${HOSTNAME:-0.0.0.0}
|
||
|
||
# 后台启动 Next.js
|
||
bun server.js &
|
||
NEXT_PID=$!
|
||
pids="$NEXT_PID"
|
||
|
||
# 等待一小段时间检查进程是否成功启动
|
||
sleep 1
|
||
if ! kill -0 "$NEXT_PID" 2>/dev/null; then
|
||
echo "❌ Next.js 服务器启动失败"
|
||
exit 1
|
||
else
|
||
echo "✅ Next.js 服务器已启动 (PID: $NEXT_PID, Port: $PORT)"
|
||
fi
|
||
|
||
cd ../
|
||
else
|
||
echo "⚠️ 未找到 Next.js 服务器文件: ./next-service-dist/server.js"
|
||
fi
|
||
|
||
# 启动 mini-services
|
||
if [ -f "./mini-services-start.sh" ]; then
|
||
echo "🚀 启动 mini-services..."
|
||
|
||
# 运行启动脚本(从根目录运行,脚本内部会处理 mini-services-dist 目录)
|
||
sh ./mini-services-start.sh &
|
||
MINI_PID=$!
|
||
pids="$pids $MINI_PID"
|
||
|
||
# 等待一小段时间检查进程是否成功启动
|
||
sleep 1
|
||
if ! kill -0 "$MINI_PID" 2>/dev/null; then
|
||
echo "⚠️ mini-services 可能启动失败,但继续运行..."
|
||
else
|
||
echo "✅ mini-services 已启动 (PID: $MINI_PID)"
|
||
fi
|
||
elif [ -d "./mini-services-dist" ]; then
|
||
echo "⚠️ 未找到 mini-services 启动脚本,但目录存在"
|
||
else
|
||
echo "ℹ️ mini-services 目录不存在,跳过"
|
||
fi
|
||
|
||
# 启动 Caddy(如果存在 Caddyfile)
|
||
echo "🚀 启动 Caddy..."
|
||
|
||
# Caddy 作为前台进程运行(主进程)
|
||
echo "✅ Caddy 已启动(前台运行)"
|
||
echo ""
|
||
echo "🎉 所有服务已启动!"
|
||
echo ""
|
||
echo "💡 按 Ctrl+C 停止所有服务"
|
||
echo ""
|
||
|
||
# Caddy 作为主进程运行
|
||
exec caddy run --config Caddyfile --adapter caddyfile
|