#!/bin/bash # 部署脚本 - 有声书项目 # 部署到 8.159.134.106:/data/ai # 后端域名: bookapi.rrbrr.com # 前端域名: book.rrbrr.com set -e REMOTE_HOST="8.159.134.106" REMOTE_PATH="/data/ai" LOCAL_PROJECT="c:/Users/caoyg/ai/audio-tts/audio_codebuddy" echo "=== 开始部署有声书项目 ===" echo "时间: $(date)" echo "主机: $REMOTE_HOST" echo "路径: $REMOTE_PATH" # 1. 构建项目 echo "" echo "=== 1. 构建项目 ===" cd "$LOCAL_PROJECT/server" npm run build echo "后端构建完成" cd "$LOCAL_PROJECT/my-uniapp-vue3" npm run build:h5 echo "前端构建完成" # 2. 同步文件到服务器 echo "" echo "=== 2. 同步文件到服务器 ===" # 创建临时目录 TEMP_DIR="/tmp/deploy_$(date +%Y%m%d_%H%M%S)" ssh root@$REMOTE_HOST "mkdir -p $TEMP_DIR" # 同步后端 echo "同步后端文件..." rsync -azP --exclude='node_modules' --exclude='.git' --exclude='*.ts' --exclude='test-*.js' \ "$LOCAL_PROJECT/server/" root@$REMOTE_HOST:"$TEMP_DIR/server/" # 同步前端(dist 目录) echo "同步前端文件..." rsync -azP "$LOCAL_PROJECT/my-uniapp-vue3/dist/" root@$REMOTE_HOST:"$TEMP_DIR/frontend/" # 3. 在服务器上执行部署 echo "" echo "=== 3. 执行服务器部署 ===" ssh root@$REMOTE_HOST << 'ENDSSH' set -e TEMP_DIR=$(ls -td /tmp/deploy_* | head -1) REMOTE_PATH="/data/ai" BACKUP_DIR="$REMOTE_PATH/backup_$(date +%Y%m%d_%H%M%S)" echo "创建备份..." mkdir -p $BACKUP_DIR if [ -d "$REMOTE_PATH/server" ]; then cp -r $REMOTE_PATH/server $BACKUP_DIR/ 2>/dev/null || true fi if [ -d "$REMOTE_PATH/frontend" ]; then cp -r $REMOTE_PATH/frontend $BACKUP_DIR/ 2>/dev/null || true fi echo "移动新文件到目标目录..." rm -rf $REMOTE_PATH/server $REMOTE_PATH/frontend mv $TEMP_DIR/server $REMOTE_PATH/ mv $TEMP_DIR/frontend $REMOTE_PATH/ echo "安装后端依赖..." cd $REMOTE_PATH/server npm install --production echo "生成 Prisma Client..." npx prisma generate echo "清理临时文件..." rm -rf $TEMP_DIR echo "部署完成!" ENDSSH # 4. 配置 Nginx echo "" echo "=== 4. 配置 Nginx ===" ssh root@$REMOTE_HOST << 'ENDSSH' # 后端 API 反向代理 cat > /etc/nginx/sites-available/book-api << 'EOF' server { listen 80; server_name bookapi.rrbrr.com; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } } EOF # 前端静态文件 cat > /etc/nginx/sites-available/book-frontend << 'EOF' server { listen 80; server_name book.rrbrr.com; root /data/ai/frontend; index index.html; location / { try_files $uri $uri/ /index.html; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } } EOF # 启用站点 ln -sf /etc/nginx/sites-available/book-api /etc/nginx/sites-enabled/ ln -sf /etc/nginx/sites-available/book-frontend /etc/nginx/sites-enabled/ # 移除默认站点 rm -f /etc/nginx/sites-enabled/default # 测试 nginx 配置 nginx -t # 重载 nginx systemctl reload nginx echo "Nginx 配置完成!" ENDSSH # 5. 启动后端服务 echo "" echo "=== 5. 启动后端服务 ===" ssh root@$REMOTE_HOST << 'ENDSSH' cd /data/ai/server # 使用 PM2 管理进程 if ! command -v pm2 &> /dev/null; then echo "安装 PM2..." npm install -g pm2 fi # 停止旧服务 pm2 delete server 2>/dev/null || true # 启动服务 pm2 start dist/app.js --name server # 保存并设置开机启动 pm2 save pm2 startup echo "后端服务已启动!" ENDSSH echo "" echo "=== 部署完成 ===" echo "后端地址: http://bookapi.rrbrr.com" echo "前端地址: http://book.rrbrr.com" echo "后端 API: http://bookapi.rrbrr.com/api"