#!/bin/bash # 遇到错误立即退出 set -e echo "========================================================" echo " ShuDao SafeAI 测试环境一键部署脚本 (Python)" echo "========================================================" echo "" # 设置路径变量 ROOT_DIR=$(pwd) PARENT_DIR=$(dirname "$ROOT_DIR") FRONTEND_DIR="$PARENT_DIR/shudao-main/shudao-vue-frontend" BACKEND_DIR="$ROOT_DIR" DEPLOY_DIR="/opt/www/shudao-chat-py-test" SERVICE_NAME="shudao-chat-py-test" SERVICE_PORT=22001 PYTHON_BIN="python3.11" VENV_DIR="$DEPLOY_DIR/venv" # 1. 前端构建 echo "[1/9] 正在构建前端项目 (Vue)..." cd "$FRONTEND_DIR" npm run build if [ $? -ne 0 ]; then echo "[ERROR] 前端构建失败!请检查错误信息。" exit 1 fi echo "[SUCCESS] 前端构建完成。" echo "" # 2. 清理后端旧资源 echo "[2/9] 清理后端旧资源..." cd "$BACKEND_DIR" rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true rm -rf "$BACKEND_DIR/views" 2>/dev/null || true echo "[SUCCESS] 清理完成。" echo "" # 3. 复制新资源 echo "[3/9] 整合前端资源到后端..." mkdir -p "$BACKEND_DIR/assets" mkdir -p "$BACKEND_DIR/views" cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/" cp "$FRONTEND_DIR/dist/index.html" "$BACKEND_DIR/views/index.html" echo "[SUCCESS] 资源整合完成。" echo "" # 4. 检查并复制测试环境配置 echo "[4/9] 配置测试环境..." if [ -f "$BACKEND_DIR/config.yaml" ]; then echo "[INFO] 使用现有 config.yaml" else if [ -f "$BACKEND_DIR/config.example.yaml" ]; then cp "$BACKEND_DIR/config.example.yaml" "$BACKEND_DIR/config.yaml" echo "[WARNING] 已从 config.example.yaml 创建 config.yaml,请手动配置!" else echo "[ERROR] 未找到配置文件模板!" exit 1 fi fi # 检查 .env 文件 if [ ! -f "$BACKEND_DIR/.env" ]; then echo "[WARNING] 未找到 .env 文件,请确保环境变量已正确配置!" echo "[INFO] 可以从 .env.example 复制并修改" fi echo "[SUCCESS] 配置检查完成。" echo "" # 5. 停止旧服务 echo "[5/9] 停止旧服务..." pkill -f "uvicorn main:app --port $SERVICE_PORT" 2>/dev/null || true sleep 2 # 确认服务已停止 if pgrep -f "uvicorn main:app --port $SERVICE_PORT" > /dev/null 2>&1; then echo "[WARNING] 服务未完全停止,强制终止..." pkill -9 -f "uvicorn main:app --port $SERVICE_PORT" 2>/dev/null || true sleep 1 fi echo "[SUCCESS] 旧服务已停止。" echo "" # 6. 部署到目标目录 echo "[6/9] 部署到 $DEPLOY_DIR..." mkdir -p "$DEPLOY_DIR" rsync -av --exclude='__pycache__' \ --exclude='*.pyc' \ --exclude='venv' \ --exclude='.git' \ --exclude='logs/*.log' \ --exclude='.env' \ "$BACKEND_DIR/" "$DEPLOY_DIR/" # 如果 .env 存在,复制过去 if [ -f "$BACKEND_DIR/.env" ]; then cp "$BACKEND_DIR/.env" "$DEPLOY_DIR/" fi echo "[SUCCESS] 部署完成。" echo "" # 7. 创建/更新虚拟环境 echo "[7/9] 配置 Python 虚拟环境..." cd "$DEPLOY_DIR" if [ ! -d "$VENV_DIR" ]; then echo "[INFO] 创建新的虚拟环境..." $PYTHON_BIN -m venv "$VENV_DIR" fi # 激活虚拟环境并安装依赖 source "$VENV_DIR/bin/activate" pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple if [ $? -ne 0 ]; then echo "[ERROR] 依赖安装失败!" exit 1 fi echo "[SUCCESS] Python 环境配置完成。" echo "" # 8. 创建日志目录 echo "[8/9] 准备运行环境..." mkdir -p "$DEPLOY_DIR/logs" mkdir -p "$DEPLOY_DIR/static" chmod +x "$DEPLOY_DIR/main.py" 2>/dev/null || true echo "[SUCCESS] 运行环境准备完成。" echo "" # 9. 启动新服务(测试环境启用热重载) echo "[9/9] 启动新服务..." cd "$DEPLOY_DIR" # 测试环境使用 reload 模式,方便调试 nohup "$VENV_DIR/bin/python" -m uvicorn main:app \ --host 0.0.0.0 \ --port $SERVICE_PORT \ --reload \ > logs/app.log 2>&1 & sleep 3 # 检查服务状态 if pgrep -f "uvicorn main:app --port $SERVICE_PORT" > /dev/null 2>&1; then echo "[SUCCESS] 服务已启动!" echo "" echo "========================================================" echo " 测试环境部署完成!" echo "========================================================" echo "" echo "服务状态: 运行中(热重载模式)" echo "服务端口: $SERVICE_PORT" echo "部署目录: $DEPLOY_DIR" echo "日志文件: $DEPLOY_DIR/logs/app.log" echo "虚拟环境: $VENV_DIR" echo "" echo "查看日志: tail -f $DEPLOY_DIR/logs/app.log" echo "查看进程: ps aux | grep uvicorn" echo "停止服务: pkill -f 'uvicorn main:app --port $SERVICE_PORT'" echo "" echo "[提示] 测试环境已启用代码热重载,修改代码后自动生效" echo "" else echo "[ERROR] 服务启动失败!" echo "请检查日志:" tail -30 "$DEPLOY_DIR/logs/app.log" exit 1 fi