deploy-remote.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/bin/bash
  2. # 线上 pull 代码 + 编译部署脚本
  3. # 用法: bash deploy-remote.sh
  4. # 或者: ssh -p 22622 root@8.159.134.106 "cd /data/ai/audio_codebuddy && bash deploy-remote.sh"
  5. set -e
  6. # ========== 配置 ==========
  7. SERVER_PATH="/data/ai/audio_codebuddy"
  8. FRONTEND_PATH="/data/ai/frontend"
  9. BACKEND_PORT="3100"
  10. # ========== 颜色输出 ==========
  11. RED='\033[0;31m'
  12. GREEN='\033[0;32m'
  13. YELLOW='\033[1;33m'
  14. NC='\033[0m'
  15. log_info() { echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; }
  16. log_warn() { echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; }
  17. log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"; }
  18. # ========== 日志 ==========
  19. DEPLOY_LOG="/tmp/deploy-remote.log"
  20. exec > >(tee -a "$DEPLOY_LOG") 2>&1
  21. # ========== 0. 检查是否在服务器上运行 ==========
  22. if [[ ! -d "$SERVER_PATH/.git" ]]; then
  23. log_error "不在正确的服务器目录: $SERVER_PATH"
  24. exit 1
  25. fi
  26. # ========== 1. 拉取代码 ==========
  27. log_info "========== 1. 拉取代码 =========="
  28. cd "$SERVER_PATH"
  29. git fetch origin master
  30. git pull origin master
  31. log_info "当前版本: $(git log --oneline -1)"
  32. # ========== 2. 构建前端 ==========
  33. log_info "========== 2. 构建前端 =========="
  34. # 检查前端依赖
  35. if [[ ! -f "my-uniapp-vue3/package.json" ]]; then
  36. log_error "前端 package.json 不存在,请先同步本地文件"
  37. exit 1
  38. fi
  39. cd my-uniapp-vue3
  40. npm install
  41. npm run build:h5
  42. cd ..
  43. # 部署前端
  44. log_info "部署前端..."
  45. rm -rf "$FRONTEND_PATH/build/h5"
  46. mkdir -p "$FRONTEND_PATH/build/h5"
  47. cp -r my-uniapp-vue3/dist/build/h5/* "$FRONTEND_PATH/build/h5/"
  48. log_info "前端部署完成"
  49. # ========== 3. 构建后端 ==========
  50. log_info "========== 3. 构建后端 =========="
  51. cd server
  52. # 安装依赖
  53. npm install
  54. # 生成 Prisma Client
  55. npx prisma generate
  56. # 构建
  57. npm run build
  58. # 复制配置文件
  59. mkdir -p dist/config
  60. cp src/config/models.json dist/config/models.json 2>/dev/null || true
  61. cd ..
  62. # ========== 4. 重启服务 ==========
  63. log_info "========== 4. 重启服务 =========="
  64. # 检查 PM2 是否安装
  65. if command -v pm2 &> /dev/null; then
  66. # 停止旧服务
  67. pm2 delete server 2>/dev/null || true
  68. # 启动新服务
  69. SERVER_PORT=$BACKEND_PORT pm2 start server/dist/app.js --name server
  70. # 保存
  71. pm2 save
  72. # 查看状态
  73. pm2 status
  74. else
  75. log_warn "PM2 未安装,跳过进程管理"
  76. fi
  77. # ========== 5. 验证 ==========
  78. log_info "========== 5. 验证服务 =========="
  79. sleep 2
  80. # 检查端口
  81. if ss -tlnp | grep -q ":$BACKEND_PORT"; then
  82. log_info "端口 $BACKEND_PORT 已监听"
  83. else
  84. log_warn "端口 $BACKEND_PORT 未监听"
  85. fi
  86. # 检查 API
  87. API_RESULT=$(curl -s --connect-timeout 5 http://127.0.0.1:$BACKEND_PORT/health || echo "FAILED")
  88. if [[ "$API_RESULT" != "FAILED" ]]; then
  89. log_info "API 健康检查: $API_RESULT"
  90. else
  91. log_warn "API 健康检查失败"
  92. fi
  93. # ========== 完成 ==========
  94. log_info "========== 部署完成 =========="
  95. log_info "前端: https://book.rrbrr.com"
  96. log_info "后端: https://bookapi.rrbrr.com"
  97. log_info "日志: $DEPLOY_LOG"