Browse Source

修改脚本

zkn 1 month ago
parent
commit
e1776892d7
2 changed files with 203 additions and 91 deletions
  1. 102 45
      build_release.sh
  2. 101 46
      build_test.sh

+ 102 - 45
build_release.sh

@@ -4,20 +4,23 @@
 set -e
 
 echo "========================================================"
-echo "      ShuDao SafeAI 生产环境一键部署脚本 (Linux)"
+echo "      ShuDao SafeAI 生产环境一键部署脚本 (Python)"
 echo "========================================================"
 echo ""
 
 # 设置路径变量
 ROOT_DIR=$(pwd)
-FRONTEND_DIR="$ROOT_DIR/shudao-vue-frontend"
-BACKEND_DIR="$ROOT_DIR/shudao-go-backend"
-DEPLOY_DIR="/opt/www/shudao-go-backend"
-SERVICE_NAME="shudao-go-backend"
+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"
+SERVICE_NAME="shudao-chat-py"
 SERVICE_PORT=22001
+PYTHON_BIN="python3.11"
+VENV_DIR="$DEPLOY_DIR/venv"
 
 # 1. 前端构建
-echo "[1/8] 正在构建前端项目 (Vue)..."
+echo "[1/9] 正在构建前端项目 (Vue)..."
 cd "$FRONTEND_DIR"
 npm run build
 if [ $? -ne 0 ]; then
@@ -28,15 +31,15 @@ echo "[SUCCESS] 前端构建完成。"
 echo ""
 
 # 2. 清理后端旧资源
-echo "[2/8] 清理后端旧资源..."
-cd "$ROOT_DIR"
+echo "[2/9] 清理后端旧资源..."
+cd "$BACKEND_DIR"
 rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true
-rm -f "$BACKEND_DIR/views/index.html" 2>/dev/null || true
+rm -rf "$BACKEND_DIR/views" 2>/dev/null || true
 echo "[SUCCESS] 清理完成。"
 echo ""
 
 # 3. 复制新资源
-echo "[3/8] 整合前端资源到后端..."
+echo "[3/9] 整合前端资源到后端..."
 mkdir -p "$BACKEND_DIR/assets"
 mkdir -p "$BACKEND_DIR/views"
 cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/"
@@ -44,57 +47,105 @@ cp "$FRONTEND_DIR/dist/index.html" "$BACKEND_DIR/views/index.html"
 echo "[SUCCESS] 资源整合完成。"
 echo ""
 
-# 4. 复制生产环境配置
-echo "[4/8] 复制生产环境配置..."
-mkdir -p "$BACKEND_DIR/conf"
-cp "$BACKEND_DIR/conf/app.conf.prod" "$BACKEND_DIR/conf/app.conf"
-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
 
-# 5. 后端编译 (Linux amd64)
-echo "[5/8] 正在编译后端 (Target: Linux/amd64)..."
-cd "$BACKEND_DIR"
-GOOS=linux GOARCH=amd64 go build -o $SERVICE_NAME main.go
-if [ $? -ne 0 ]; then
-    echo "[ERROR] 后端编译失败!"
-    exit 1
+# 检查 .env 文件
+if [ ! -f "$BACKEND_DIR/.env" ]; then
+    echo "[WARNING] 未找到 .env 文件,请确保环境变量已正确配置!"
+    echo "[INFO] 可以从 .env.example 复制并修改"
 fi
-chmod +x $SERVICE_NAME
-echo "[SUCCESS] 后端编译完成。"
+echo "[SUCCESS] 配置检查完成。"
 echo ""
 
-# 6. 停止旧服务
-echo "[6/8] 停止旧服务..."
-pkill -f $SERVICE_NAME 2>/dev/null || true
-sleep 1
+# 5. 停止旧服务
+echo "[5/9] 停止旧服务..."
+pkill -f "uvicorn main:app" 2>/dev/null || true
+pkill -f "$SERVICE_NAME" 2>/dev/null || true
+sleep 2
+
 # 确认服务已停止
-if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+if pgrep -f "uvicorn main:app" > /dev/null 2>&1; then
     echo "[WARNING] 服务未完全停止,强制终止..."
-    pkill -9 -f $SERVICE_NAME 2>/dev/null || true
+    pkill -9 -f "uvicorn main:app" 2>/dev/null || true
     sleep 1
 fi
 echo "[SUCCESS] 旧服务已停止。"
 echo ""
 
-# 7. 部署到目标目录
-echo "[7/8] 部署到 $DEPLOY_DIR..."
+# 6. 部署到目标目录
+echo "[6/9] 部署到 $DEPLOY_DIR..."
 mkdir -p "$DEPLOY_DIR"
-cp "$BACKEND_DIR/$SERVICE_NAME" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/conf" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/assets" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/views" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/static" "$DEPLOY_DIR/" 2>/dev/null || true
+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 ""
 
-# 8. 启动新服务
-echo "[8/8] 启动新服务..."
+# 7. 创建/更新虚拟环境
+echo "[7/9] 配置 Python 虚拟环境..."
 cd "$DEPLOY_DIR"
-nohup ./$SERVICE_NAME > nohup.out 2>&1 &
+
+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"
+
+# 使用 nohup 启动服务(生产环境建议使用 systemd 或 supervisor)
+nohup "$VENV_DIR/bin/python" -m uvicorn main:app \
+    --host 0.0.0.0 \
+    --port $SERVICE_PORT \
+    --workers 4 \
+    > logs/app.log 2>&1 &
+
 sleep 3
 
 # 检查服务状态
-if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+if pgrep -f "uvicorn main:app" > /dev/null 2>&1; then
     echo "[SUCCESS] 服务已启动!"
     echo ""
     echo "========================================================"
@@ -104,13 +155,19 @@ if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
     echo "服务状态: 运行中"
     echo "服务端口: $SERVICE_PORT"
     echo "部署目录: $DEPLOY_DIR"
-    echo "日志文件: $DEPLOY_DIR/nohup.out"
+    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'"
     echo ""
-    echo "查看日志: tail -f $DEPLOY_DIR/nohup.out"
+    echo "[建议] 生产环境请使用 systemd 管理服务"
+    echo "       参考: $DEPLOY_DIR/deploy/shudao-chat-py.service"
     echo ""
 else
     echo "[ERROR] 服务启动失败!"
     echo "请检查日志:"
-    tail -20 "$DEPLOY_DIR/nohup.out"
+    tail -30 "$DEPLOY_DIR/logs/app.log"
     exit 1
 fi

+ 101 - 46
build_test.sh

@@ -4,20 +4,23 @@
 set -e
 
 echo "========================================================"
-echo "      ShuDao SafeAI 测试环境一键部署脚本 (Linux)"
+echo "      ShuDao SafeAI 测试环境一键部署脚本 (Python)"
 echo "========================================================"
 echo ""
 
 # 设置路径变量
 ROOT_DIR=$(pwd)
-FRONTEND_DIR="$ROOT_DIR/shudao-vue-frontend"
-BACKEND_DIR="$ROOT_DIR/shudao-go-backend"
-DEPLOY_DIR="/opt/www/shudao-go-backend"
-SERVICE_NAME="shudao-go-backend"
+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/8] 正在构建前端项目 (Vue)..."
+echo "[1/9] 正在构建前端项目 (Vue)..."
 cd "$FRONTEND_DIR"
 npm run build
 if [ $? -ne 0 ]; then
@@ -28,15 +31,15 @@ echo "[SUCCESS] 前端构建完成。"
 echo ""
 
 # 2. 清理后端旧资源
-echo "[2/8] 清理后端旧资源..."
-cd "$ROOT_DIR"
+echo "[2/9] 清理后端旧资源..."
+cd "$BACKEND_DIR"
 rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true
-rm -f "$BACKEND_DIR/views/index.html" 2>/dev/null || true
+rm -rf "$BACKEND_DIR/views" 2>/dev/null || true
 echo "[SUCCESS] 清理完成。"
 echo ""
 
 # 3. 复制新资源
-echo "[3/8] 整合前端资源到后端..."
+echo "[3/9] 整合前端资源到后端..."
 mkdir -p "$BACKEND_DIR/assets"
 mkdir -p "$BACKEND_DIR/views"
 cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/"
@@ -44,73 +47,125 @@ cp "$FRONTEND_DIR/dist/index.html" "$BACKEND_DIR/views/index.html"
 echo "[SUCCESS] 资源整合完成。"
 echo ""
 
-# 4. 复制测试环境配置
-echo "[4/8] 复制测试环境配置..."
-mkdir -p "$BACKEND_DIR/conf"
-cp "$BACKEND_DIR/conf/app.conf.test" "$BACKEND_DIR/conf/app.conf"
-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
 
-# 5. 后端编译 (Linux amd64)
-echo "[5/8] 正在编译后端 (Target: Linux/amd64)..."
-cd "$BACKEND_DIR"
-GOOS=linux GOARCH=amd64 go build -o $SERVICE_NAME main.go
-if [ $? -ne 0 ]; then
-    echo "[ERROR] 后端编译失败!"
-    exit 1
+# 检查 .env 文件
+if [ ! -f "$BACKEND_DIR/.env" ]; then
+    echo "[WARNING] 未找到 .env 文件,请确保环境变量已正确配置!"
+    echo "[INFO] 可以从 .env.example 复制并修改"
 fi
-chmod +x $SERVICE_NAME
-echo "[SUCCESS] 后端编译完成。"
+echo "[SUCCESS] 配置检查完成。"
 echo ""
 
-# 6. 停止旧服务
-echo "[6/8] 停止旧服务..."
-pkill -f $SERVICE_NAME 2>/dev/null || true
-sleep 1
+# 5. 停止旧服务
+echo "[5/9] 停止旧服务..."
+pkill -f "uvicorn main:app --port $SERVICE_PORT" 2>/dev/null || true
+sleep 2
+
 # 确认服务已停止
-if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
+if pgrep -f "uvicorn main:app --port $SERVICE_PORT" > /dev/null 2>&1; then
     echo "[WARNING] 服务未完全停止,强制终止..."
-    pkill -9 -f $SERVICE_NAME 2>/dev/null || true
+    pkill -9 -f "uvicorn main:app --port $SERVICE_PORT" 2>/dev/null || true
     sleep 1
 fi
 echo "[SUCCESS] 旧服务已停止。"
 echo ""
 
-# 7. 部署到目标目录
-echo "[7/8] 部署到 $DEPLOY_DIR..."
+# 6. 部署到目标目录
+echo "[6/9] 部署到 $DEPLOY_DIR..."
 mkdir -p "$DEPLOY_DIR"
-cp "$BACKEND_DIR/$SERVICE_NAME" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/conf" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/assets" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/views" "$DEPLOY_DIR/"
-cp -r "$BACKEND_DIR/static" "$DEPLOY_DIR/" 2>/dev/null || true
+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 ""
 
-# 8. 启动新服务
-echo "[8/8] 启动新服务..."
+# 7. 创建/更新虚拟环境
+echo "[7/9] 配置 Python 虚拟环境..."
 cd "$DEPLOY_DIR"
-nohup ./$SERVICE_NAME > nohup.out 2>&1 &
+
+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 $SERVICE_NAME > /dev/null 2>&1; then
+if pgrep -f "uvicorn main:app --port $SERVICE_PORT" > /dev/null 2>&1; then
     echo "[SUCCESS] 服务已启动!"
     echo ""
     echo "========================================================"
     echo "              测试环境部署完成!"
     echo "========================================================"
     echo ""
-    echo "服务状态: 运行中"
+    echo "服务状态: 运行中(热重载模式)"
     echo "服务端口: $SERVICE_PORT"
     echo "部署目录: $DEPLOY_DIR"
-    echo "日志文件: $DEPLOY_DIR/nohup.out"
+    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 "查看日志: tail -f $DEPLOY_DIR/nohup.out"
+    echo "[提示] 测试环境已启用代码热重载,修改代码后自动生效"
     echo ""
 else
     echo "[ERROR] 服务启动失败!"
     echo "请检查日志:"
-    tail -20 "$DEPLOY_DIR/nohup.out"
+    tail -30 "$DEPLOY_DIR/logs/app.log"
     exit 1
 fi