217 lines
5.9 KiB
Bash
217 lines
5.9 KiB
Bash
#!/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 "" |