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