# 部署指南 - 有声书项目

## 部署信息

- **服务器**: 8.159.134.106
- **部署路径**: /data/ai
- **后端域名**: bookapi.rrbrr.com
- **前端域名**: book.rrbrr.com

## 第一步：准备部署包

从本地上传部署包到服务器：

```bash
# 在本地执行
scp -r deploy-package root@8.159.134.106:/tmp/
```

## 第二步：在服务器上执行部署

SSH 连接到服务器：

```bash
ssh root@8.159.134.106
```

### 2.1 备份旧文件

```bash
cd /data/ai
BACKUP_DIR="/data/ai/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR

# 备份现有文件
if [ -d "server" ]; then cp -r server $BACKUP_DIR/; fi
if [ -d "frontend" ]; then cp -r frontend $BACKUP_DIR/; fi

echo "备份完成: $BACKUP_DIR"
```

### 2.2 部署新文件

```bash
cd /data/ai

# 移动临时文件到目标位置
rm -rf server frontend
mv /tmp/deploy-package/server .
mv /tmp/deploy-package/frontend .

# 安装依赖
cd server
npm install --production

# 生成 Prisma Client
npx prisma generate

echo "文件部署完成!"
```

### 2.3 配置 Nginx

```bash
# 后端 API 反向代理 (bookapi.rrbrr.com)
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

# 前端静态文件 (book.rrbrr.com)
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 -t
systemctl reload nginx

echo "Nginx 配置完成!"
```

### 2.4 启动后端服务

```bash
cd /data/ai/server

# 安装 PM2
npm install -g pm2

# 停止旧服务
pm2 delete server 2>/dev/null || true

# 启动服务
pm2 start dist/app.js --name server

# 保存并设置开机启动
pm2 save
pm2 startup

# 查看服务状态
pm2 status
```

### 2.5 配置域名 DNS

在域名管理后台添加 DNS 记录：

- **bookapi.rrbrr.com** → A 记录 → 8.159.134.106
- **book.rrbrr.com** → A 记录 → 8.159.134.106

### 2.6 验证部署

```bash
# 检查后端服务状态
pm2 status
curl http://localhost:3000/api/health

# 检查前端
curl http://localhost/

# 检查 nginx 状态
systemctl status nginx
```

## 常用命令

### 后端管理
```bash
# 查看日志
pm2 logs server

# 重启服务
pm2 restart server

# 停止服务
pm2 stop server
```

### Nginx 管理
```bash
# 测试配置
nginx -t

# 重载配置
systemctl reload nginx

# 重启 Nginx
systemctl restart nginx
```

### 日志查看
```bash
# Nginx 访问日志
tail -f /var/log/nginx/access.log

# Nginx 错误日志
tail -f /var/log/nginx/error.log

# 后端日志
pm2 logs server --lines 50
```

## 故障排除

### 后端无法启动
1. 检查端口占用: `lsof -i:3000`
2. 检查环境变量: 确保 `.env` 文件存在
3. 查看错误日志: `pm2 logs server`

### 前端无法访问
1. 检查文件权限: `ls -la /data/ai/frontend/`
2. 检查 Nginx 配置: `nginx -t`
3. 查看 Nginx 错误日志

### 数据库连接失败
1. 检查 MySQL 服务: `systemctl status mysql`
2. 检查连接配置: `cat /data/ai/server/.env`

## 一键部署脚本

在服务器上创建并执行：

```bash
cat > /data/ai/deploy.sh << 'EOFSCRIPT'
#!/bin/bash
set -e

echo "开始部署..."

# 备份
BACKUP_DIR="/data/ai/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR
[ -d "server" ] && cp -r server $BACKUP_DIR/
[ -d "frontend" ] && cp -r frontend $BACKUP_DIR/

# 部署
rm -rf server frontend
mv /tmp/deploy-package/server .
mv /tmp/deploy-package/frontend .

# 安装依赖
cd server
npm install --production
npx prisma generate

# 重启服务
pm2 restart server

echo "部署完成!"
EOFSCRIPT

chmod +x /data/ai/deploy.sh
/data/ai/deploy.sh
```
