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