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