# 部署架构
**本文档引用的文件**
- [DEPLOY.md](file://DEPLOY.md)
- [DEPLOY_PROD.md](file://DEPLOY_PROD.md)
- [docker-nginx/docker-compose.yml](file://docker-nginx/docker-compose.yml)
- [docker-nginx/bookapi.conf](file://docker-nginx/bookapi.conf)
- [server/src/app.ts](file://server/src/app.ts)
- [server/src/config/index.ts](file://server/src/config/index.ts)
- [server/src/services/logger.service.ts](file://server/src/services/logger.service.ts)
- [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.ts)
- [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts)
- [server/prisma/schema.prisma](file://server/prisma/schema.prisma)
- [server/package.json](file://server/package.json)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与监控](#性能与监控)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的运维与开发团队,提供一套完整的部署架构文档,覆盖容器化部署策略、Nginx反向代理配置、多环境差异化配置、数据库部署与备份恢复、以及监控与日志体系。文档以仓库中的实际部署脚本、Nginx配置、后端应用入口与服务模块为依据,结合Prisma数据库模型,形成可落地的实施蓝图。
## 项目结构
该仓库包含后端服务、前端构建产物、Nginx代理配置与多套部署文档。后端采用Koa框架,通过PM2进行进程守护;Nginx负责反向代理与静态资源服务;数据库使用Prisma管理MySQL;日志与错误监控分别由Winston与Sentry提供。
```mermaid
graph TB
subgraph "服务器"
FE["前端静态资源
/data/ai/audio/frontend/build/h5"]
BE["后端服务
server/dist/app.js"]
DB["MySQL 8.0
单容器 single-mysql"]
REDIS["Redis 缓存"]
OSS["阿里云 OSS"]
end
subgraph "反向代理"
NGINX["Nginx
book.rrbrr.com -> /api -> 3100"]
end
Client["客户端浏览器"] --> NGINX
NGINX --> BE
BE --> DB
BE --> REDIS
BE --> OSS
FE -. 静态直出 .-> NGINX
```
**图表来源**
- [DEPLOY_PROD.md: 35-46:35-46](file://DEPLOY_PROD.md#L35-L46)
- [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239)
- [server/src/app.ts: 133-166:133-166](file://server/src/app.ts#L133-L166)
**章节来源**
- [DEPLOY_PROD.md: 33-46:33-46](file://DEPLOY_PROD.md#L33-L46)
- [DEPLOY.md: 10-116:10-116](file://DEPLOY.md#L10-L116)
## 核心组件
- 反向代理与负载均衡
- Nginx作为统一入口,负责HTTP/HTTPS终止、静态资源缓存、API反向代理与基础安全头设置。
- 生产环境使用宝塔面板管理Nginx配置,支持SSL证书与HTTP/2。
- 应用服务
- 后端基于Koa,提供REST接口、健康检查、性能指标、静态文件挂载与WebSocket。
- 使用PM2进行进程守护、开机自启与日志采集。
- 数据层
- Prisma管理MySQL Schema,支持迁移与查询。
- 支持本地存储与阿里云OSS两种存储后端。
- 监控与日志
- Winston统一日志输出至控制台与文件,包含HTTP请求日志。
- Sentry进行错误监控与性能采样,支持过滤与上下文注入。
- 配置与模型
- 环境变量驱动端口、数据库URL、存储类型等关键参数。
- 统一的模型配置与切换逻辑,便于多供应商TTS能力扩展。
**章节来源**
- [server/src/app.ts: 57-131:57-131](file://server/src/app.ts#L57-L131)
- [server/src/config/index.ts: 69-117:69-117](file://server/src/config/index.ts#L69-L117)
- [server/src/services/logger.service.ts: 67-114:67-114](file://server/src/services/logger.service.ts#L67-L114)
- [server/src/services/sentry.service.ts: 7-43:7-43](file://server/src/services/sentry.service.ts#L7-L43)
- [server/prisma/schema.prisma: 1-8:1-8](file://server/prisma/schema.prisma#L1-L8)
## 架构总览
下图展示了服务器拓扑、网络配置与服务依赖关系,映射到实际的部署文档与配置文件。
```mermaid
graph TB
Client["客户端"] --> |"HTTP/HTTPS"| NGINX["Nginx 反向代理"]
NGINX --> |"反代 /api/*"| APP["后端应用 server/dist/app.js"]
APP --> |"Prisma"| MYSQL["MySQL 单实例"]
APP --> |"Redis"| REDIS["Redis 缓存"]
APP --> |"OSS"| OSS["阿里云 OSS"]
FE["前端静态资源"] --> |"静态直出"| NGINX
```
**图表来源**
- [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239)
- [server/src/app.ts: 133-166:133-166](file://server/src/app.ts#L133-L166)
- [server/prisma/schema.prisma: 5-8:5-8](file://server/prisma/schema.prisma#L5-L8)
## 详细组件分析
### Nginx反向代理与静态资源服务
- 生产环境配置
- 域名book.rrbrr.com,强制跳转HTTPS,启用TLSv1.1/1.2/1.3与HSTS头。
- 前端静态资源根目录指向/data/ai/audio/frontend/build/h5,开启缓存与压缩。
- /api前缀反向代理至后端3100端口,透传Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto。
- 开发环境配置
- docker-nginx提供最小化Nginx容器,将bookapi.rrbrr.com:80代理至宿主机3000端口,便于本地联调。
- 负载均衡策略
- 当前为单实例部署,未见多实例LB配置;若需扩展,可在Nginx层增加upstream与轮询/权重策略。
```mermaid
sequenceDiagram
participant C as "客户端"
participant N as "Nginx(book.rrbrr.com)"
participant A as "后端应用(3100)"
participant D as "数据库/存储"
C->>N : "GET /api/health"
N->>A : "proxy_pass /api/..."
A->>D : "Prisma/Redis/OSS访问"
A-->>N : "200 {status : healthy}"
N-->>C : "200 OK"
```
**图表来源**
- [DEPLOY_PROD.md: 194-201:194-201](file://DEPLOY_PROD.md#L194-L201)
- [server/src/app.ts: 92-94:92-94](file://server/src/app.ts#L92-L94)
**章节来源**
- [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239)
- [docker-nginx/bookapi.conf: 1-15:1-15](file://docker-nginx/bookapi.conf#L1-L15)
- [docker-nginx/docker-compose.yml: 1-12:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
### 容器化与编排策略
- Docker Compose(开发)
- 单容器Nginx,映射80端口,挂载bookapi.conf,通过host.docker.internal访问宿主机服务。
- 适用于本地联调,无需生产级SSL与高可用。
- 生产编排现状
- 文档未提供生产级Docker Compose或Kubernetes清单;当前为传统PM2+Nginx部署。
- 若引入容器化,建议:
- 将后端、Nginx、MySQL、Redis分别容器化,并通过网络隔离。
- 使用卷管理持久化数据(uploads、videos、logs)。
- 使用环境变量与Secrets管理敏感配置。
- 引入健康检查与重启策略,配合负载均衡。
**章节来源**
- [docker-nginx/docker-compose.yml: 1-12:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [docker-nginx/bookapi.conf: 1-15:1-15](file://docker-nginx/bookapi.conf#L1-L15)
### 多环境部署架构
- 开发环境
- 本地Docker Nginx + 本地后端3000端口,便于快速迭代。
- 可通过hosts解析bookapi.rrbrr.com至127.0.0.1。
- 测试/预发布环境
- 建议复用生产Nginx配置模板,但将后端指向测试集群或独立容器。
- 生产环境
- 宝塔面板管理Nginx,HTTPS/TLS、HSTS、HTTP/2、缓存头齐全。
- 后端PM2守护,端口3100,/api反代至该端口。
- 数据库存放在Docker单实例容器,提供备份与迁移命令。
```mermaid
flowchart TD
Dev["开发环境
Docker Nginx -> 3000"] --> Test["测试环境
独立容器/Nginx"]
Test --> Prod["生产环境
宝塔Nginx -> 3100"]
```
**图表来源**
- [docker-nginx/README.md:1-41](file://docker-nginx/README.md#L1-L41)
- [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239)
**章节来源**
- [docker-nginx/README.md: 1-41:1-41](file://docker-nginx/README.md#L1-L41)
- [DEPLOY.md: 10-116:10-116](file://DEPLOY.md#L10-L116)
- [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239)
### 数据库部署策略
- 部署形态
- 生产使用Docker单实例MySQL 8.0(容器名single-mysql),端口映射至主机3306。
- 数据库名为audio_book,默认root密码为password。
- 读写分离与主从复制
- 当前未见主从复制或读写分离配置;如需扩展,建议:
- 引入主从拓扑或Galera Cluster/ProxySQL。
- 在应用侧区分只读查询走从库,写操作走主库。
- 备份与恢复
- 提供mysqldump备份命令与迁移命令,建议纳入自动化脚本与定时任务。
- 建议对uploads、videos、logs等目录做独立备份。
```mermaid
erDiagram
USER {
int id PK
string phone
string openid
}
BOOK {
int id PK
int user_id FK
string title
}
BOOK_CHAPTER {
int id PK
int book_id FK
string title
}
USER ||--o{ BOOK : "创建"
BOOK ||--o{ BOOK_CHAPTER : "包含"
```
**图表来源**
- [server/prisma/schema.prisma: 10-38:10-38](file://server/prisma/schema.prisma#L10-L38)
- [server/prisma/schema.prisma: 130-194:130-194](file://server/prisma/schema.prisma#L130-L194)
**章节来源**
- [DEPLOY_PROD.md: 266-294:266-294](file://DEPLOY_PROD.md#L266-L294)
- [server/prisma/schema.prisma: 1-8:1-8](file://server/prisma/schema.prisma#L1-L8)
### 监控与日志系统
- Winston日志
- 输出至控制台与多个文件(error/combined/http),支持按级别滚动与时间戳。
- 提供HTTP请求日志中间件,记录方法、URL、状态、耗时、IP与UA。
- Sentry错误监控
- 初始化时根据SENTRY_DSN决定是否启用;生产环境降低采样率。
- 提供Koa错误中间件,自动附加请求方法、URL、用户上下文。
- 内置错误过滤(如忽略特定Redis连接拒绝错误)。
- 性能指标
- 提供/health健康检查与/api/metrics指标端点,便于接入Prometheus/Grafana。
```mermaid
sequenceDiagram
participant C as "客户端"
participant N as "Nginx"
participant A as "后端应用"
participant L as "Winston日志"
participant S as "Sentry"
C->>N : "请求 /api/..."
N->>A : "反向代理"
A->>L : "记录HTTP请求日志"
A->>S : "捕获异常/错误上下文"
A-->>N : "响应"
N-->>C : "响应"
```
**图表来源**
- [server/src/app.ts: 64-130:64-130](file://server/src/app.ts#L64-L130)
- [server/src/services/logger.service.ts: 74-102:74-102](file://server/src/services/logger.service.ts#L74-L102)
- [server/src/services/sentry.service.ts: 92-110:92-110](file://server/src/services/sentry.service.ts#L92-L110)
**章节来源**
- [server/src/services/logger.service.ts: 67-114:67-114](file://server/src/services/logger.service.ts#L67-L114)
- [server/src/services/sentry.service.ts: 7-43:7-43](file://server/src/services/sentry.service.ts#L7-L43)
- [server/src/app.ts: 92-98:92-98](file://server/src/app.ts#L92-L98)
## 依赖关系分析
- 后端服务依赖
- 数据库:Prisma驱动MySQL连接。
- 缓存:Redis用于会话/限流/队列等场景。
- 存储:支持本地存储与阿里云OSS。
- 监控:Sentry与Winston。
- 外部依赖
- Nginx作为统一入口,负责TLS终止与静态资源缓存。
- Docker(开发)或宝塔面板(生产)管理Nginx配置。
```mermaid
graph LR
APP["server/src/app.ts"] --> PRISMA["Prisma(schema.prisma)"]
APP --> REDIS["Redis"]
APP --> OSS["OSS"]
APP --> WINSTON["Winston"]
APP --> SENTRY["Sentry"]
NGINX["Nginx配置"] --> APP
```
**图表来源**
- [server/src/app.ts: 12-25:12-25](file://server/src/app.ts#L12-L25)
- [server/prisma/schema.prisma: 1-8:1-8](file://server/prisma/schema.prisma#L1-L8)
- [server/src/services/logger.service.ts: 67-72:67-72](file://server/src/services/logger.service.ts#L67-L72)
- [server/src/services/sentry.service.ts: 7-43:7-43](file://server/src/services/sentry.service.ts#L7-L43)
**章节来源**
- [server/src/app.ts: 12-25:12-25](file://server/src/app.ts#L12-L25)
- [server/package.json: 11-44:11-44](file://server/package.json#L11-L44)
## 性能与监控
- 性能监控
- /api/metrics端点可用于采集性能指标;建议接入Prometheus与Grafana。
- Nginx层面可统计请求量、响应时间与错误率。
- 日志轮转与保留
- Winston按大小与文件数限制滚动,建议结合系统日志服务集中化。
- 错误采样与过滤
- Sentry在生产降低采样率,避免噪声;内置过滤提升关键问题可见性。
[本节为通用指导,无需具体文件引用]
## 故障排查指南
- 后端无法启动
- 检查端口占用与环境变量(尤其是DATABASE_URL与SENTRY_DSN)。
- 查看PM2日志与后端HTTP日志。
- 前端无法访问
- 检查Nginx配置语法与静态资源目录权限。
- 关注Nginx访问/错误日志。
- 数据库连接失败
- 检查Docker容器状态与mysqldump连通性。
- 对比.env中DATABASE_URL与容器内连接方式。
**章节来源**
- [DEPLOY.md: 199-250:199-250](file://DEPLOY.md#L199-L250)
- [DEPLOY_PROD.md: 318-375:318-375](file://DEPLOY_PROD.md#L318-L375)
## 结论
本部署架构以Nginx为入口、PM2守护后端、Prisma管理MySQL为核心,辅以Winston与Sentry实现可观测性。当前生产环境采用宝塔面板管理Nginx,具备完善的TLS与缓存策略。建议后续引入容器化编排、主从复制与读写分离、自动化备份与灰度发布流程,以进一步提升稳定性与可扩展性。
[本节为总结性内容,无需具体文件引用]
## 附录
- 关键端点与文件
- 健康检查:/api/health
- 指标端点:/api/metrics
- 日志目录:server/logs(error/combined/http)
- Nginx配置:宝塔面板vhost目录或docker-nginx配置
- 常用命令
- PM2:status、logs、restart、save、startup
- Nginx:-t、-s reload
- MySQL:docker exec进入容器、mysqldump备份、npx prisma migrate deploy
[本节为补充信息,无需具体文件引用]