#!/bin/bash # start_all.sh - 整合启动脚本(API + 前端) # 前端使用 Vite 开发模式 (npm run dev) set -e VENV_DIR=".venv" LOG_DIR="logs" PID_FILE_API="$LOG_DIR/api.pid" PID_FILE_FRONTEND="$LOG_DIR/frontend.pid" LOG_FILE_API="$LOG_DIR/api.log" # 创建日志目录 mkdir -p $LOG_DIR # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' echo "" echo -e "${CYAN}========================================${NC}" echo -e "${CYAN} AI+合规智能中枢 - 服务启动${NC}" echo -e "${CYAN}========================================${NC}" echo "" # ===== 环境检查 ===== # 检查虚拟环境 if [ ! -d "$VENV_DIR" ]; then echo -e "${RED}错误: 虚拟环境不存在${NC}" echo "请先运行: ./quick_start.sh" exit 1 fi # 激活虚拟环境 source $VENV_DIR/bin/activate echo -e "${GREEN}✓ 虚拟环境已激活: $VENV_DIR${NC}" # 检查.env文件 if [ ! -f ".env" ]; then echo -e "${YELLOW}警告: .env文件不存在,使用默认配置${NC}" else echo -e "${GREEN}✓ 配置文件已加载: .env${NC}" fi # 加载环境变量 export $(grep -v '^#' .env | xargs 2>/dev/null || true) # 启动参数 API_HOST=${API_HOST:-0.0.0.0} API_PORT=${API_PORT:-8000} FRONTEND_PORT=${FRONTEND_PORT:-3000} echo "" # ===== 启动API服务 ===== echo -e "${YELLOW}[1/2] 启动API服务...${NC}" # 检查是否已运行 if [ -f "$PID_FILE_API" ]; then OLD_PID=$(cat $PID_FILE_API) if ps -p $OLD_PID > /dev/null 2>&1; then echo -e "${YELLOW}API服务已在运行 (PID: $OLD_PID)${NC}" else rm -f $PID_FILE_API fi fi # 启动API(后台模式) if [ ! -f "$PID_FILE_API" ]; then nohup $VENV_DIR/bin/python -m uvicorn src.api.main:app \ --host $API_HOST --port $API_PORT \ > $LOG_FILE_API 2>&1 & API_PID=$! echo $API_PID > $PID_FILE_API sleep 2 if ps -p $API_PID > /dev/null 2>&1; then echo -e "${GREEN}✓ API服务启动成功 (PID: $API_PID)${NC}" else echo -e "${RED}✗ API服务启动失败${NC}" echo "请查看日志: $LOG_FILE_API" exit 1 fi fi echo "" # ===== 启动前端服务 ===== echo -e "${YELLOW}[2/2] 启动前端服务...${NC}" # 检查前端目录 FRONTEND_DIR="frontend" if [ ! -d "$FRONTEND_DIR" ]; then echo -e "${RED}错误: 前端目录不存在${NC}" exit 1 fi # 检查是否已运行 if [ -f "$PID_FILE_FRONTEND" ]; then OLD_PID=$(cat $PID_FILE_FRONTEND) if ps -p $OLD_PID > /dev/null 2>&1; then echo -e "${YELLOW}前端服务已在运行 (PID: $OLD_PID)${NC}" else rm -f $PID_FILE_FRONTEND fi fi # 启动前端(后台模式) if [ ! -f "$PID_FILE_FRONTEND" ]; then cd $FRONTEND_DIR # 检查Node版本 NODE_VERSION=$(node -v 2>/dev/null || echo "v0") echo -e "${CYAN}Node版本: $NODE_VERSION${NC}" # 检查node_modules是否存在 if [ ! -d "node_modules" ]; then echo -e "${YELLOW}首次启动,安装前端依赖...${NC}" npm install if [ $? -ne 0 ]; then echo -e "${RED}✗ 前端依赖安装失败${NC}" echo "请手动安装: cd frontend && npm install" exit 1 fi echo -e "${GREEN}✓ 前端依赖安装完成${NC}" else echo -e "${GREEN}✓ 前端依赖已存在${NC}" # 检查vite是否已安装 if [ ! -d "node_modules/vite" ]; then echo -e "${YELLOW}vite未安装,重新安装依赖...${NC}" npm install if [ $? -ne 0 ]; then echo -e "${RED}✗ 前端依赖安装失败${NC}" exit 1 fi fi fi # 使用 npx vite 启动(确保能找到 vite 命令) echo -e "${CYAN}使用 Vite 开发模式 (端口: $FRONTEND_PORT)${NC}" nohup npx vite --host 0.0.0.0 --port $FRONTEND_PORT > ../$LOG_DIR/frontend.log 2>&1 & FRONTEND_PID=$! cd .. echo $FRONTEND_PID > $PID_FILE_FRONTEND sleep 3 # 检查进程 if ps -p $FRONTEND_PID > /dev/null 2>&1; then echo -e "${GREEN}✓ 前端服务启动成功 (PID: $FRONTEND_PID)${NC}" else # Vite 可能启动较慢,等待更长时间再检查 echo -e "${YELLOW}等待 Vite 启动完成...${NC}" sleep 5 # 检查是否有 vite 进程 VITE_PID=$(pgrep -f "vite" 2>/dev/null || true) if [ -n "$VITE_PID" ]; then echo $VITE_PID > $PID_FILE_FRONTEND echo -e "${GREEN}✓ Vite 已启动 (PID: $VITE_PID)${NC}" else echo -e "${RED}✗ 前端服务启动失败${NC}" echo "请查看日志: $LOG_DIR/frontend.log" echo "" echo "常见问题排查:" echo " 1. Node版本过低: 需要 Node 20+" echo " 当前版本: $NODE_VERSION" echo " 升级命令: curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - && sudo yum install -y nodejs" echo "" echo " 2. 查看详细错误:" echo " cat $LOG_DIR/frontend.log" exit 1 fi fi fi echo "" # ===== 输出访问地址 ===== echo -e "${CYAN}========================================${NC}" echo -e "${CYAN} 服务已启动${NC}" echo -e "${CYAN}========================================${NC}" echo "" echo -e "${GREEN}API服务:${NC}" echo " 地址: http://localhost:$API_PORT" echo " 文档: http://localhost:$API_PORT/docs" echo " 健康检查: http://localhost:$API_PORT/health" echo "" echo -e "${GREEN}前端测试页面:${NC}" echo " 地址: http://localhost:$FRONTEND_PORT" echo " 模式: Vite 开发模式" echo "" echo -e "${GREEN}日志文件:${NC}" echo " API: $LOG_FILE_API" echo " 前端: $LOG_DIR/frontend.log" echo "" echo -e "${YELLOW}管理命令:${NC}" echo " 查看状态: ./status.sh" echo " 查看日志: tail -f $LOG_DIR/frontend.log" echo " 停止服务: ./stop_all.sh" echo " 重启服务: ./restart_all.sh" echo ""