deploy.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #!/bin/bash
  2. # 部署脚本 - 有声书项目
  3. # 部署到 8.159.134.106:/data/ai
  4. # SSH端口: 22622
  5. # 后端域名: bookapi.rrbrr.com / book.rrbrr.com (API)
  6. # 前端域名: book.rrbrr.com
  7. set -e
  8. REMOTE_HOST="8.159.134.106"
  9. REMOTE_SSH_PORT="22622"
  10. REMOTE_PATH="/data/ai"
  11. LOCAL_PROJECT="c:/Users/caoyg/ai/audio-tts/audio_codebuddy"
  12. BACKEND_PORT="3100"
  13. echo "=== 开始部署有声书项目 ==="
  14. echo "时间: $(date)"
  15. echo "主机: $REMOTE_HOST"
  16. echo "路径: $REMOTE_PATH"
  17. # 1. 构建项目
  18. echo ""
  19. echo "=== 1. 构建项目 ==="
  20. cd "$LOCAL_PROJECT/server"
  21. npm run build
  22. echo "后端构建完成"
  23. cd "$LOCAL_PROJECT/my-uniapp-vue3"
  24. npm run build:h5
  25. echo "前端构建完成"
  26. # 2. 同步文件到服务器
  27. echo ""
  28. echo "=== 2. 同步文件到服务器 ==="
  29. # 创建临时目录
  30. TEMP_DIR="/tmp/deploy_$(date +%Y%m%d_%H%M%S)"
  31. ssh -p $REMOTE_SSH_PORT root@$REMOTE_HOST "mkdir -p $TEMP_DIR"
  32. # 同步后端(先打包排除node_modules/.git/.ts/test-*.js)
  33. echo "打包后端文件..."
  34. cd "$LOCAL_PROJECT/server"
  35. tar --exclude='node_modules' --exclude='.git' --exclude='*.ts' --exclude='test-*.js' -czf /tmp/server.tar.gz .
  36. cd "$LOCAL_PROJECT"
  37. echo "同步后端文件..."
  38. scp -P $REMOTE_SSH_PORT /tmp/server.tar.gz root@$REMOTE_HOST:$TEMP_DIR/server.tar.gz
  39. # 同步前端(dist 目录)
  40. echo "同步前端文件..."
  41. scp -P $REMOTE_SSH_PORT -r "$LOCAL_PROJECT/my-uniapp-vue3/dist" root@$REMOTE_HOST:$TEMP_DIR/
  42. # 3. 在服务器上执行部署
  43. echo ""
  44. echo "=== 3. 执行服务器部署 ==="
  45. ssh -p $REMOTE_SSH_PORT root@$REMOTE_HOST << 'ENDSSH'
  46. set -e
  47. TEMP_DIR=$(ls -td /tmp/deploy_* | head -1)
  48. REMOTE_PATH="/data/ai"
  49. BACKUP_DIR="$REMOTE_PATH/backup_$(date +%Y%m%d_%H%M%S)"
  50. echo "创建备份..."
  51. mkdir -p $BACKUP_DIR
  52. if [ -d "$REMOTE_PATH/server" ]; then
  53. cp -r $REMOTE_PATH/server $BACKUP_DIR/ 2>/dev/null || true
  54. fi
  55. if [ -d "$REMOTE_PATH/frontend" ]; then
  56. cp -r $REMOTE_PATH/frontend $BACKUP_DIR/ 2>/dev/null || true
  57. fi
  58. echo "移动新文件到目标目录..."
  59. rm -rf $REMOTE_PATH/server $REMOTE_PATH/frontend
  60. mkdir -p $REMOTE_PATH/server $REMOTE_PATH/frontend
  61. tar -xzf $TEMP_DIR/server.tar.gz -C $REMOTE_PATH/server
  62. mv $TEMP_DIR/dist/* $REMOTE_PATH/frontend/
  63. echo "安装后端依赖..."
  64. cd $REMOTE_PATH/server
  65. npm install --production
  66. echo "生成 Prisma Client..."
  67. npx prisma generate
  68. echo "清理临时文件..."
  69. rm -rf $TEMP_DIR
  70. echo "部署完成!"
  71. ENDSSH
  72. # 4. 配置 Nginx - 使用 html_book.rrbrr.com.conf
  73. echo ""
  74. echo "=== 4. 配置 Nginx ==="
  75. ssh -p $REMOTE_SSH_PORT root@$REMOTE_HOST << 'ENDSSH'
  76. set -e
  77. # 删除旧配置文件
  78. rm -f /www/server/panel/vhost/nginx/book.rrbrr.com.conf
  79. # 写入 html_book.rrbrr.com.conf(80重定向到443,443处理所有流量)
  80. cat > /www/server/panel/vhost/nginx/html_book.rrbrr.com.conf << 'EOF'
  81. server
  82. {
  83. listen 80;
  84. server_name book.rrbrr.com;
  85. return 301 https://$server_name$request_uri;
  86. }
  87. server
  88. {
  89. listen 443 ssl;
  90. http2 on;
  91. server_name book.rrbrr.com;
  92. index index.html index.htm default.htm default.html;
  93. root /data/ai/frontend/build/h5;
  94. include /www/server/panel/vhost/nginx/extension/book.rrbrr.com/*.conf;
  95. #CERT-APPLY-CHECK--START
  96. include /www/server/panel/vhost/nginx/well-known/book.rrbrr.com.conf;
  97. #CERT-APPLY-CHECK--END
  98. ssl_certificate /www/server/panel/vhost/cert/book.rrbrr.com/fullchain.pem;
  99. ssl_certificate_key /www/server/panel/vhost/cert/book.rrbrr.com/privkey.pem;
  100. ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  101. ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  102. ssl_prefer_server_ciphers on;
  103. ssl_session_tickets on;
  104. ssl_session_cache shared:SSL:10m;
  105. ssl_session_timeout 10m;
  106. add_header Strict-Transport-Security "max-age=31536000";
  107. add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
  108. error_page 497 https://$host$request_uri;
  109. location /api/ {
  110. proxy_pass http://127.0.0.1:3100;
  111. proxy_set_header Host $http_host;
  112. proxy_set_header X-Real-IP $remote_addr;
  113. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  114. proxy_set_header X-Forwarded-Proto $scheme;
  115. }
  116. include /www/server/panel/vhost/rewrite/html_book.rrbrr.com.conf;
  117. location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
  118. {
  119. return 404;
  120. }
  121. location ~ \.well-known{
  122. allow all;
  123. }
  124. if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
  125. return 403;
  126. }
  127. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  128. {
  129. expires 30d;
  130. error_log /dev/null;
  131. access_log /dev/null;
  132. }
  133. location ~ .*\.(js|css)?$
  134. {
  135. expires 12h;
  136. error_log /dev/null;
  137. access_log /dev/null;
  138. }
  139. access_log /www/wwwlogs/book.rrbrr.com.log;
  140. error_log /www/wwwlogs/book.rrbrr.com.error.log;
  141. }
  142. EOF
  143. nginx -t && nginx -s reload
  144. echo "Nginx 配置已更新"
  145. ENDSSH
  146. # 5. 启动后端服务
  147. echo ""
  148. echo "=== 5. 启动后端服务 ==="
  149. ssh -p $REMOTE_SSH_PORT root@$REMOTE_HOST << 'ENDSSH'
  150. cd /data/ai/server
  151. # 使用 PM2 管理进程
  152. if ! command -v pm2 &> /dev/null; then
  153. echo "安装 PM2..."
  154. npm install -g pm2
  155. fi
  156. # 停止旧服务
  157. pm2 delete server 2>/dev/null || true
  158. # 启动服务(监听3100端口)
  159. PORT=3100 pm2 start dist/app.js --name server
  160. # 保存并设置开机启动
  161. pm2 save
  162. pm2 startup
  163. echo "后端服务已启动! 端口: 3100"
  164. ENDSSH
  165. echo ""
  166. echo "=== 部署完成 ==="
  167. echo "后端地址: http://book.rrbrr.com (API via HTTPS)"
  168. echo "前端地址: https://book.rrbrr.com"
  169. echo "后端端口: 3100"
  170. echo "SSH端口: $REMOTE_SSH_PORT"