#!/bin/bash # 生产环境启动脚本 # 使用 .env.lyrria 作为环境配置文件 set -e # 遇到错误立即退出 # 获取脚本所在目录(backend 目录) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}🚀 启动 Lyrria 生产环境服务...${NC}" # 检查 .env.lyrria 文件是否存在 ENV_FILE="$SCRIPT_DIR/.env.lyrria" if [ ! -f "$ENV_FILE" ]; then echo -e "${RED}❌ 错误: 未找到环境配置文件 $ENV_FILE${NC}" echo -e "${YELLOW}提示: 请确保 .env.lyrria 文件存在于 backend 目录${NC}" exit 1 fi echo -e "${GREEN}✅ 找到环境配置文件: $ENV_FILE${NC}" # 检查 Python 环境 if ! command -v python3 &> /dev/null; then echo -e "${RED}❌ 错误: 未找到 python3 命令${NC}" exit 1 fi # 检查虚拟环境(可选,如果使用虚拟环境) if [ -d "venv" ] || [ -d ".venv" ]; then VENV_DIR="" if [ -d "venv" ]; then VENV_DIR="venv" else VENV_DIR=".venv" fi echo -e "${GREEN}✅ 激活虚拟环境: $VENV_DIR${NC}" source "$VENV_DIR/bin/activate" fi # 检查依赖是否已安装 if ! python3 -c "import fastapi" &> /dev/null; then echo -e "${YELLOW}⚠️ 警告: 未检测到 FastAPI,正在安装依赖...${NC}" pip install -r requirements.txt fi # 设置环境变量,指定使用 .env.lyrria export ENV_FILE=".env.lyrria" # 设置生产环境标志 export DEBUG="false" # 检查服务是否已在运行 PID_FILE="$SCRIPT_DIR/backend.pid" if [ -f "$PID_FILE" ]; then OLD_PID=$(cat "$PID_FILE") if ps -p "$OLD_PID" > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ 服务已在运行 (PID: $OLD_PID)${NC}" echo -e "${YELLOW}如需重启,请先执行: ./stop_prod.sh${NC}" exit 1 else # PID 文件存在但进程不存在,清理旧文件 rm -f "$PID_FILE" fi fi # 启动服务(后台运行) echo -e "${GREEN}✅ 启动 FastAPI 服务(后台模式)...${NC}" echo -e "${YELLOW}环境文件: $ENV_FILE${NC}" echo -e "${YELLOW}工作目录: $SCRIPT_DIR${NC}" echo "" # 使用 uvicorn 启动(生产环境建议使用 gunicorn + uvicorn workers) # 如果已安装 gunicorn,可以使用以下命令: # nohup gunicorn main:app --worker-class uvicorn.workers.UvicornWorker --workers 4 --bind 0.0.0.0:8766 > backend_nohup.log 2>&1 & # 直接使用 uvicorn 启动(适合单进程或小规模部署) nohup python3 -m uvicorn main:app \ --host 0.0.0.0 \ --port 8766 \ --workers 1 \ --no-access-log \ --log-level info \ > backend_nohup.log 2>&1 & BACKEND_PID=$! echo $BACKEND_PID > "$PID_FILE" echo -e "${GREEN}✅ 服务已启动,PID: $BACKEND_PID${NC}" echo -e "${YELLOW}后台日志: backend_nohup.log${NC}" echo -e "${YELLOW}查看状态: ./status_prod.sh${NC}" echo -e "${YELLOW}停止服务: ./stop_prod.sh${NC}" echo "" echo -e "${GREEN}🚀 服务启动完成!${NC}"