deploy.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/bin/bash
  2. # 部署脚本 - 有声书项目
  3. # 部署到 8.159.134.106:/data/ai
  4. # 后端域名: bookapi.rrbrr.com
  5. # 前端域名: book.rrbrr.com
  6. set -e
  7. REMOTE_HOST="8.159.134.106"
  8. REMOTE_PATH="/data/ai"
  9. LOCAL_PROJECT="c:/Users/caoyg/ai/audio-tts/audio_codebuddy"
  10. echo "=== 开始部署有声书项目 ==="
  11. echo "时间: $(date)"
  12. echo "主机: $REMOTE_HOST"
  13. echo "路径: $REMOTE_PATH"
  14. # 1. 构建项目
  15. echo ""
  16. echo "=== 1. 构建项目 ==="
  17. cd "$LOCAL_PROJECT/server"
  18. npm run build
  19. echo "后端构建完成"
  20. cd "$LOCAL_PROJECT/my-uniapp-vue3"
  21. npm run build:h5
  22. echo "前端构建完成"
  23. # 2. 同步文件到服务器
  24. echo ""
  25. echo "=== 2. 同步文件到服务器 ==="
  26. # 创建临时目录
  27. TEMP_DIR="/tmp/deploy_$(date +%Y%m%d_%H%M%S)"
  28. ssh root@$REMOTE_HOST "mkdir -p $TEMP_DIR"
  29. # 同步后端
  30. echo "同步后端文件..."
  31. rsync -azP --exclude='node_modules' --exclude='.git' --exclude='*.ts' --exclude='test-*.js' \
  32. "$LOCAL_PROJECT/server/" root@$REMOTE_HOST:"$TEMP_DIR/server/"
  33. # 同步前端(dist 目录)
  34. echo "同步前端文件..."
  35. rsync -azP "$LOCAL_PROJECT/my-uniapp-vue3/dist/" root@$REMOTE_HOST:"$TEMP_DIR/frontend/"
  36. # 3. 在服务器上执行部署
  37. echo ""
  38. echo "=== 3. 执行服务器部署 ==="
  39. ssh root@$REMOTE_HOST << 'ENDSSH'
  40. set -e
  41. TEMP_DIR=$(ls -td /tmp/deploy_* | head -1)
  42. REMOTE_PATH="/data/ai"
  43. BACKUP_DIR="$REMOTE_PATH/backup_$(date +%Y%m%d_%H%M%S)"
  44. echo "创建备份..."
  45. mkdir -p $BACKUP_DIR
  46. if [ -d "$REMOTE_PATH/server" ]; then
  47. cp -r $REMOTE_PATH/server $BACKUP_DIR/ 2>/dev/null || true
  48. fi
  49. if [ -d "$REMOTE_PATH/frontend" ]; then
  50. cp -r $REMOTE_PATH/frontend $BACKUP_DIR/ 2>/dev/null || true
  51. fi
  52. echo "移动新文件到目标目录..."
  53. rm -rf $REMOTE_PATH/server $REMOTE_PATH/frontend
  54. mv $TEMP_DIR/server $REMOTE_PATH/
  55. mv $TEMP_DIR/frontend $REMOTE_PATH/
  56. echo "安装后端依赖..."
  57. cd $REMOTE_PATH/server
  58. npm install --production
  59. echo "生成 Prisma Client..."
  60. npx prisma generate
  61. echo "清理临时文件..."
  62. rm -rf $TEMP_DIR
  63. echo "部署完成!"
  64. ENDSSH
  65. # 4. 配置 Nginx
  66. echo ""
  67. echo "=== 4. 配置 Nginx ==="
  68. ssh root@$REMOTE_HOST << 'ENDSSH'
  69. # 后端 API 反向代理
  70. cat > /etc/nginx/sites-available/book-api << 'EOF'
  71. server {
  72. listen 80;
  73. server_name bookapi.rrbrr.com;
  74. location / {
  75. proxy_pass http://127.0.0.1:3000;
  76. proxy_http_version 1.1;
  77. proxy_set_header Upgrade $http_upgrade;
  78. proxy_set_header Connection 'upgrade';
  79. proxy_set_header Host $host;
  80. proxy_set_header X-Real-IP $remote_addr;
  81. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  82. proxy_set_header X-Forwarded-Proto $scheme;
  83. proxy_cache_bypass $http_upgrade;
  84. }
  85. }
  86. EOF
  87. # 前端静态文件
  88. cat > /etc/nginx/sites-available/book-frontend << 'EOF'
  89. server {
  90. listen 80;
  91. server_name book.rrbrr.com;
  92. root /data/ai/frontend;
  93. index index.html;
  94. location / {
  95. try_files $uri $uri/ /index.html;
  96. }
  97. location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
  98. expires 1y;
  99. add_header Cache-Control "public, immutable";
  100. }
  101. }
  102. EOF
  103. # 启用站点
  104. ln -sf /etc/nginx/sites-available/book-api /etc/nginx/sites-enabled/
  105. ln -sf /etc/nginx/sites-available/book-frontend /etc/nginx/sites-enabled/
  106. # 移除默认站点
  107. rm -f /etc/nginx/sites-enabled/default
  108. # 测试 nginx 配置
  109. nginx -t
  110. # 重载 nginx
  111. systemctl reload nginx
  112. echo "Nginx 配置完成!"
  113. ENDSSH
  114. # 5. 启动后端服务
  115. echo ""
  116. echo "=== 5. 启动后端服务 ==="
  117. ssh root@$REMOTE_HOST << 'ENDSSH'
  118. cd /data/ai/server
  119. # 使用 PM2 管理进程
  120. if ! command -v pm2 &> /dev/null; then
  121. echo "安装 PM2..."
  122. npm install -g pm2
  123. fi
  124. # 停止旧服务
  125. pm2 delete server 2>/dev/null || true
  126. # 启动服务
  127. pm2 start dist/app.js --name server
  128. # 保存并设置开机启动
  129. pm2 save
  130. pm2 startup
  131. echo "后端服务已启动!"
  132. ENDSSH
  133. echo ""
  134. echo "=== 部署完成 ==="
  135. echo "后端地址: http://bookapi.rrbrr.com"
  136. echo "前端地址: http://book.rrbrr.com"
  137. echo "后端 API: http://bookapi.rrbrr.com/api"