- 添加 WeasyPrint 依赖以支持 PDF 导出功能 - 新增 docker-entrypoint.sh 统一管理容器启动流程 - 添加容器健康检查机制(/health 端点) - 配置容器自动重启策略(unless-stopped) - 优化日志输出,仅使用 stdout 适配容器环境 - 改进 update-and-run.sh 添加健康状态检查 - 统一脚本中的 sudo 使用规范
106 lines
3.3 KiB
Bash
106 lines
3.3 KiB
Bash
#!/bin/bash
|
||
# =============================================================================
|
||
# FA3 Datafetch 容器启动脚本
|
||
# 功能:启动后端 (FastAPI) 和前端 (Next.js),处理进程管理
|
||
# =============================================================================
|
||
|
||
set -e
|
||
|
||
# 信号处理函数
|
||
cleanup() {
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 收到停止信号,正在关闭服务..."
|
||
if [ -n "$BACKEND_PID" ]; then
|
||
kill "$BACKEND_PID" 2>/dev/null || true
|
||
fi
|
||
if [ -n "$FRONTEND_PID" ]; then
|
||
kill "$FRONTEND_PID" 2>/dev/null || true
|
||
fi
|
||
# 等待进程结束
|
||
wait $BACKEND_PID $FRONTEND_PID 2>/dev/null || true
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 所有服务已停止"
|
||
exit 0
|
||
}
|
||
|
||
trap cleanup SIGTERM SIGINT
|
||
|
||
# =============================================================================
|
||
# 1. 启动后端服务
|
||
# =============================================================================
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动后端服务 (FastAPI on :8000)..."
|
||
|
||
cd /app/backend
|
||
export PYTHONPATH=/app:/app/backend
|
||
|
||
# 启动后端,日志输出到stdout
|
||
/app/.venv/bin/python -m uvicorn app.main:app \
|
||
--host 0.0.0.0 \
|
||
--port 8000 \
|
||
--access-log &
|
||
|
||
BACKEND_PID=$!
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 后端PID: $BACKEND_PID"
|
||
|
||
# 等待后端启动
|
||
sleep 3
|
||
|
||
# 检查后端是否启动成功
|
||
if ! kill -0 "$BACKEND_PID" 2>/dev/null; then
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:后端启动失败!"
|
||
exit 1
|
||
fi
|
||
|
||
# =============================================================================
|
||
# 2. 启动前端服务
|
||
# =============================================================================
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动前端服务 (Next.js on :3001)..."
|
||
|
||
cd /app/frontend
|
||
|
||
# 设置生产环境变量
|
||
export NODE_ENV=production
|
||
export PORT=3001
|
||
|
||
# 启动前端,日志输出到stdout
|
||
npm start &
|
||
|
||
FRONTEND_PID=$!
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 前端PID: $FRONTEND_PID"
|
||
|
||
# 等待前端启动
|
||
sleep 3
|
||
|
||
# 检查前端是否启动成功
|
||
if ! kill -0 "$FRONTEND_PID" 2>/dev/null; then
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:前端启动失败!"
|
||
kill "$BACKEND_PID" 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
|
||
# =============================================================================
|
||
# 3. 监控服务状态
|
||
# =============================================================================
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ============================================"
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 所有服务启动成功!"
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 前端: http://localhost:3001 (通过隧道暴露)"
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - 后端: http://localhost:8000 (仅容器内部)"
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ============================================"
|
||
|
||
# 持续监控进程状态
|
||
while true; do
|
||
# 检查后端
|
||
if ! kill -0 "$BACKEND_PID" 2>/dev/null; then
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:后端进程已停止!"
|
||
kill "$FRONTEND_PID" 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
|
||
# 检查前端
|
||
if ! kill -0 "$FRONTEND_PID" 2>/dev/null; then
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:前端进程已停止!"
|
||
kill "$BACKEND_PID" 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
|
||
sleep 5
|
||
done
|