| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- #!/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"
- 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
|