FA3-Datafetch/docker-entrypoint.sh
xucheng 2a02a4030a feat: 优化 Docker 部署配置和健康检查
- 添加 WeasyPrint 依赖以支持 PDF 导出功能
- 新增 docker-entrypoint.sh 统一管理容器启动流程
- 添加容器健康检查机制(/health 端点)
- 配置容器自动重启策略(unless-stopped)
- 优化日志输出,仅使用 stdout 适配容器环境
- 改进 update-and-run.sh 添加健康状态检查
- 统一脚本中的 sudo 使用规范
2026-01-16 12:14:43 +08:00

106 lines
3.3 KiB
Bash
Raw 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/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