#!/bin/bash # 线上 pull 代码 + 编译部署脚本 # 用法: bash deploy-remote.sh # 或者: ssh -p 22622 root@8.159.134.106 "cd /data/ai/audio_codebuddy && bash deploy-remote.sh" set -e # ========== 配置 ========== SERVER_PATH="/data/ai/audio_codebuddy" FRONTEND_PATH="/data/ai/frontend" BACKEND_PORT="3100" # ========== 颜色输出 ========== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; } # ========== 日志 ========== DEPLOY_LOG="/tmp/deploy-remote.log" exec > >(tee -a "$DEPLOY_LOG") 2>&1 # ========== 0. 检查是否在服务器上运行 ========== if [[ ! -d "$SERVER_PATH/.git" ]]; then log_error "不在正确的服务器目录: $SERVER_PATH" exit 1 fi # ========== 1. 拉取代码 ========== log_info "========== 1. 拉取代码 ==========" cd "$SERVER_PATH" git fetch origin master git pull origin master log_info "当前版本: $(git log --oneline -1)" # ========== 2. 构建前端 ========== log_info "========== 2. 构建前端 ==========" # 检查前端依赖 if [[ ! -f "my-uniapp-vue3/package.json" ]]; then log_error "前端 package.json 不存在,请先同步本地文件" exit 1 fi cd my-uniapp-vue3 npm install npm run build:h5 cd .. # 部署前端 log_info "部署前端..." rm -rf "$FRONTEND_PATH/build/h5" mkdir -p "$FRONTEND_PATH/build/h5" cp -r my-uniapp-vue3/dist/build/h5/* "$FRONTEND_PATH/build/h5/" log_info "前端部署完成" # ========== 3. 构建后端 ========== log_info "========== 3. 构建后端 ==========" cd server # 安装依赖 npm install # 生成 Prisma Client npx prisma generate # 构建 npm run build # 复制配置文件 mkdir -p dist/config cp src/config/models.json dist/config/models.json 2>/dev/null || true cd .. # ========== 4. 重启服务 ========== log_info "========== 4. 重启服务 ==========" # 检查 PM2 是否安装 if command -v pm2 &> /dev/null; then # 停止旧服务 pm2 delete server 2>/dev/null || true # 启动新服务 SERVER_PORT=$BACKEND_PORT pm2 start server/dist/app.js --name server # 保存 pm2 save # 查看状态 pm2 status else log_warn "PM2 未安装,跳过进程管理" fi # ========== 5. 验证 ========== log_info "========== 5. 验证服务 ==========" sleep 2 # 检查端口 if ss -tlnp | grep -q ":$BACKEND_PORT"; then log_info "端口 $BACKEND_PORT 已监听" else log_warn "端口 $BACKEND_PORT 未监听" fi # 检查 API API_RESULT=$(curl -s --connect-timeout 5 http://127.0.0.1:$BACKEND_PORT/health || echo "FAILED") if [[ "$API_RESULT" != "FAILED" ]]; then log_info "API 健康检查: $API_RESULT" else log_warn "API 健康检查失败" fi # ========== 完成 ========== log_info "========== 部署完成 ==========" log_info "前端: https://book.rrbrr.com" log_info "后端: https://bookapi.rrbrr.com" log_info "日志: $DEPLOY_LOG"