start_prod.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #!/bin/bash
  2. # 生产环境启动脚本
  3. # 使用 .env.lyrria 作为环境配置文件
  4. set -e # 遇到错误立即退出
  5. # 获取脚本所在目录(backend 目录)
  6. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  7. cd "$SCRIPT_DIR"
  8. # 颜色输出
  9. GREEN='\033[0;32m'
  10. YELLOW='\033[1;33m'
  11. RED='\033[0;31m'
  12. NC='\033[0m' # No Color
  13. echo -e "${GREEN}🚀 启动 Lyrria 生产环境服务...${NC}"
  14. # 检查 .env.lyrria 文件是否存在
  15. ENV_FILE="$SCRIPT_DIR/.env.lyrria"
  16. if [ ! -f "$ENV_FILE" ]; then
  17. echo -e "${RED}❌ 错误: 未找到环境配置文件 $ENV_FILE${NC}"
  18. echo -e "${YELLOW}提示: 请确保 .env.lyrria 文件存在于 backend 目录${NC}"
  19. exit 1
  20. fi
  21. echo -e "${GREEN}✅ 找到环境配置文件: $ENV_FILE${NC}"
  22. # 检查 Python 环境
  23. if ! command -v python3 &> /dev/null; then
  24. echo -e "${RED}❌ 错误: 未找到 python3 命令${NC}"
  25. exit 1
  26. fi
  27. # 检查虚拟环境(可选,如果使用虚拟环境)
  28. if [ -d "venv" ] || [ -d ".venv" ]; then
  29. VENV_DIR=""
  30. if [ -d "venv" ]; then
  31. VENV_DIR="venv"
  32. else
  33. VENV_DIR=".venv"
  34. fi
  35. echo -e "${GREEN}✅ 激活虚拟环境: $VENV_DIR${NC}"
  36. source "$VENV_DIR/bin/activate"
  37. fi
  38. # 检查依赖是否已安装
  39. if ! python3 -c "import fastapi" &> /dev/null; then
  40. echo -e "${YELLOW}⚠️ 警告: 未检测到 FastAPI,正在安装依赖...${NC}"
  41. pip install -r requirements.txt
  42. fi
  43. # 检查 gunicorn 是否已安装
  44. if ! command -v gunicorn &> /dev/null; then
  45. echo -e "${YELLOW}⚠️ 警告: 未检测到 gunicorn,正在安装...${NC}"
  46. pip install gunicorn
  47. fi
  48. # 设置环境变量,指定使用 .env.lyrria
  49. export ENV_FILE=".env.lyrria"
  50. # 设置生产环境标志
  51. export DEBUG="false"
  52. # 检查服务是否已在运行
  53. PID_FILE="$SCRIPT_DIR/backend.pid"
  54. if [ -f "$PID_FILE" ]; then
  55. OLD_PID=$(cat "$PID_FILE")
  56. if ps -p "$OLD_PID" > /dev/null 2>&1; then
  57. echo -e "${YELLOW}⚠️ 服务已在运行 (PID: $OLD_PID)${NC}"
  58. echo -e "${YELLOW}如需重启,请先执行: ./stop_prod.sh${NC}"
  59. exit 1
  60. else
  61. # PID 文件存在但进程不存在,清理旧文件
  62. rm -f "$PID_FILE"
  63. fi
  64. fi
  65. # 启动服务(后台运行)
  66. echo -e "${GREEN}✅ 启动 FastAPI 服务(后台模式)...${NC}"
  67. echo -e "${YELLOW}环境文件: $ENV_FILE${NC}"
  68. echo -e "${YELLOW}工作目录: $SCRIPT_DIR${NC}"
  69. echo ""
  70. # 尝试使用 gunicorn 多进程模式(2核4G优化配置)
  71. if command -v gunicorn &> /dev/null && python3 -c "import uvicorn.workers" &> /dev/null; then
  72. echo -e "${GREEN}✅ 使用 gunicorn 多进程模式(4个worker)...${NC}"
  73. nohup gunicorn main:app \
  74. --worker-class uvicorn.workers.UvicornWorker \
  75. --workers 4 \
  76. --bind 0.0.0.0:8766 \
  77. --max-requests 1000 \
  78. --max-requests-jitter 50 \
  79. --access-logfile - \
  80. --log-level info \
  81. > backend_nohup.log 2>&1 &
  82. else
  83. echo -e "${YELLOW}⚠️ gunicorn 或 uvicorn-worker 不支持,回退到 uvicorn 单进程模式...${NC}"
  84. # 回退到 uvicorn 单进程模式
  85. nohup python3 -m uvicorn main:app \
  86. --host 0.0.0.0 \
  87. --port 8766 \
  88. --workers 1 \
  89. --no-access-log \
  90. --log-level info \
  91. > backend_nohup.log 2>&1 &
  92. fi
  93. BACKEND_PID=$!
  94. echo $BACKEND_PID > "$PID_FILE"
  95. echo -e "${GREEN}✅ 服务已启动,PID: $BACKEND_PID${NC}"
  96. echo -e "${YELLOW}后台日志: backend_nohup.log${NC}"
  97. echo -e "${YELLOW}查看状态: ./status_prod.sh${NC}"
  98. echo -e "${YELLOW}停止服务: ./stop_prod.sh${NC}"
  99. echo ""
  100. echo -e "${GREEN}🚀 服务启动完成!${NC}"