|
@@ -4,20 +4,23 @@
|
|
|
set -e
|
|
set -e
|
|
|
|
|
|
|
|
echo "========================================================"
|
|
echo "========================================================"
|
|
|
-echo " ShuDao SafeAI 生产环境一键部署脚本 (Linux)"
|
|
|
|
|
|
|
+echo " ShuDao SafeAI 生产环境一键部署脚本 (Python)"
|
|
|
echo "========================================================"
|
|
echo "========================================================"
|
|
|
echo ""
|
|
echo ""
|
|
|
|
|
|
|
|
# 设置路径变量
|
|
# 设置路径变量
|
|
|
ROOT_DIR=$(pwd)
|
|
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
|
|
SERVICE_PORT=22001
|
|
|
|
|
+PYTHON_BIN="python3.11"
|
|
|
|
|
+VENV_DIR="$DEPLOY_DIR/venv"
|
|
|
|
|
|
|
|
# 1. 前端构建
|
|
# 1. 前端构建
|
|
|
-echo "[1/8] 正在构建前端项目 (Vue)..."
|
|
|
|
|
|
|
+echo "[1/9] 正在构建前端项目 (Vue)..."
|
|
|
cd "$FRONTEND_DIR"
|
|
cd "$FRONTEND_DIR"
|
|
|
npm run build
|
|
npm run build
|
|
|
if [ $? -ne 0 ]; then
|
|
if [ $? -ne 0 ]; then
|
|
@@ -28,15 +31,15 @@ echo "[SUCCESS] 前端构建完成。"
|
|
|
echo ""
|
|
echo ""
|
|
|
|
|
|
|
|
# 2. 清理后端旧资源
|
|
# 2. 清理后端旧资源
|
|
|
-echo "[2/8] 清理后端旧资源..."
|
|
|
|
|
-cd "$ROOT_DIR"
|
|
|
|
|
|
|
+echo "[2/9] 清理后端旧资源..."
|
|
|
|
|
+cd "$BACKEND_DIR"
|
|
|
rm -rf "$BACKEND_DIR/assets" 2>/dev/null || true
|
|
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 "[SUCCESS] 清理完成。"
|
|
|
echo ""
|
|
echo ""
|
|
|
|
|
|
|
|
# 3. 复制新资源
|
|
# 3. 复制新资源
|
|
|
-echo "[3/8] 整合前端资源到后端..."
|
|
|
|
|
|
|
+echo "[3/9] 整合前端资源到后端..."
|
|
|
mkdir -p "$BACKEND_DIR/assets"
|
|
mkdir -p "$BACKEND_DIR/assets"
|
|
|
mkdir -p "$BACKEND_DIR/views"
|
|
mkdir -p "$BACKEND_DIR/views"
|
|
|
cp -r "$FRONTEND_DIR/dist/assets/"* "$BACKEND_DIR/assets/"
|
|
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 "[SUCCESS] 资源整合完成。"
|
|
|
echo ""
|
|
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
|
|
fi
|
|
|
-chmod +x $SERVICE_NAME
|
|
|
|
|
-echo "[SUCCESS] 后端编译完成。"
|
|
|
|
|
|
|
+echo "[SUCCESS] 配置检查完成。"
|
|
|
echo ""
|
|
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] 服务未完全停止,强制终止..."
|
|
echo "[WARNING] 服务未完全停止,强制终止..."
|
|
|
- pkill -9 -f $SERVICE_NAME 2>/dev/null || true
|
|
|
|
|
|
|
+ pkill -9 -f "uvicorn main:app" 2>/dev/null || true
|
|
|
sleep 1
|
|
sleep 1
|
|
|
fi
|
|
fi
|
|
|
echo "[SUCCESS] 旧服务已停止。"
|
|
echo "[SUCCESS] 旧服务已停止。"
|
|
|
echo ""
|
|
echo ""
|
|
|
|
|
|
|
|
-# 7. 部署到目标目录
|
|
|
|
|
-echo "[7/8] 部署到 $DEPLOY_DIR..."
|
|
|
|
|
|
|
+# 6. 部署到目标目录
|
|
|
|
|
+echo "[6/9] 部署到 $DEPLOY_DIR..."
|
|
|
mkdir -p "$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 "[SUCCESS] 部署完成。"
|
|
|
echo ""
|
|
echo ""
|
|
|
|
|
|
|
|
-# 8. 启动新服务
|
|
|
|
|
-echo "[8/8] 启动新服务..."
|
|
|
|
|
|
|
+# 7. 创建/更新虚拟环境
|
|
|
|
|
+echo "[7/9] 配置 Python 虚拟环境..."
|
|
|
cd "$DEPLOY_DIR"
|
|
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
|
|
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 "[SUCCESS] 服务已启动!"
|
|
|
echo ""
|
|
echo ""
|
|
|
echo "========================================================"
|
|
echo "========================================================"
|
|
@@ -104,13 +155,19 @@ if pgrep -f $SERVICE_NAME > /dev/null 2>&1; then
|
|
|
echo "服务状态: 运行中"
|
|
echo "服务状态: 运行中"
|
|
|
echo "服务端口: $SERVICE_PORT"
|
|
echo "服务端口: $SERVICE_PORT"
|
|
|
echo "部署目录: $DEPLOY_DIR"
|
|
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 ""
|
|
|
- echo "查看日志: tail -f $DEPLOY_DIR/nohup.out"
|
|
|
|
|
|
|
+ echo "[建议] 生产环境请使用 systemd 管理服务"
|
|
|
|
|
+ echo " 参考: $DEPLOY_DIR/deploy/shudao-chat-py.service"
|
|
|
echo ""
|
|
echo ""
|
|
|
else
|
|
else
|
|
|
echo "[ERROR] 服务启动失败!"
|
|
echo "[ERROR] 服务启动失败!"
|
|
|
echo "请检查日志:"
|
|
echo "请检查日志:"
|
|
|
- tail -20 "$DEPLOY_DIR/nohup.out"
|
|
|
|
|
|
|
+ tail -30 "$DEPLOY_DIR/logs/app.log"
|
|
|
exit 1
|
|
exit 1
|
|
|
fi
|
|
fi
|