# 容器化部署
**本文引用的文件**
- [DEPLOY.md](file://DEPLOY.md)
- [docker-nginx/docker-compose.yml](file://docker-nginx/docker-compose.yml)
- [docker-nginx/bookapi.conf](file://docker-nginx/bookapi.conf)
- [docker-nginx/README.md](file://docker-nginx/README.md)
- [server/package.json](file://server/package.json)
- [server/src/config/index.ts](file://server/src/config/index.ts)
- [server/src/middleware/security.ts](file://server/src/middleware/security.ts)
- [server/src/middleware/cache.ts](file://server/src/middleware/cache.ts)
- [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts)
- [server/src/services/logger.service.ts](file://server/src/services/logger.service.ts)
- [server/src/middleware/rate-limiter.ts](file://server/src/middleware/rate-limiter.ts)
- [server/src/middleware/auth.js](file://server/src/middleware/auth.js)
- [server/test-api.js](file://server/test-api.js)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的容器化部署,围绕以下目标展开:
- Docker镜像构建流程与多阶段优化思路
- 镜像安全配置与最小权限原则
- docker-compose编排:服务依赖、网络与卷挂载
- Nginx反向代理:负载均衡、SSL终止、静态资源处理
- 容器健康检查、资源限制与日志收集
- 监控指标、性能调优与故障排查
## 项目结构
本仓库包含后端服务、前端UniApp工程、部署文档与Nginx容器化代理样例。与容器化部署直接相关的关键位置如下:
- 后端服务位于 server 目录,包含应用入口、中间件、配置与服务模块
- Nginx容器化代理位于 docker-nginx 目录,提供本地开发环境下的反向代理
- 部署文档 DEPLOY.md 提供了传统PM2部署与Docker方案的参考
```mermaid
graph TB
subgraph "宿主机"
Dev["开发者工作站"]
Prod["生产服务器"]
end
subgraph "容器编排"
NGINX["Nginx 反向代理
端口映射 80:80"]
BACKEND["后端服务
端口映射 3000:3000"]
REDIS["Redis 缓存"]
MYSQL["MySQL 数据库"]
end
Dev --> |"HTTP/HTTPS"| NGINX
NGINX --> |"反代 /api"| BACKEND
BACKEND --> |"读写"| REDIS
BACKEND --> |"读写"| MYSQL
Prod --> |"运维/监控"| NGINX
Prod --> |"运维/监控"| BACKEND
```
图示来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
章节来源
- [DEPLOY.md:1-251](file://DEPLOY.md#L1-L251)
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
## 核心组件
- Nginx反向代理:负责域名解析、静态资源分发、WebSocket升级、上游健康转发
- 后端服务:基于Koa框架的应用,提供API、鉴权、限流、缓存、日志与安全中间件
- 缓存与数据库:Redis用于限流与缓存,MySQL用于持久化
- 健康检查与日志:通过/health端点与日志中间件输出运行状态与请求详情
章节来源
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154)
- [server/src/middleware/cache.ts:1-45](file://server/src/middleware/cache.ts#L1-L45)
- [server/src/middleware/performance.ts:1-109](file://server/src/middleware/performance.ts#L1-L109)
- [server/src/services/logger.service.ts:39-92](file://server/src/services/logger.service.ts#L39-L92)
- [server/src/middleware/rate-limiter.ts:1-119](file://server/src/middleware/rate-limiter.ts#L1-L119)
## 架构总览
下图展示容器化部署的典型拓扑:Nginx作为入口,后端服务提供API与业务逻辑,Redis与MySQL分别承担缓存与数据存储。
```mermaid
graph TB
Client["客户端浏览器/小程序"] --> Nginx["Nginx 反向代理"]
Nginx --> API["后端服务 /api/*"]
Nginx --> Static["静态资源 / (前端构建产物)"]
API --> Redis["Redis 缓存"]
API --> DB["MySQL 数据库"]
API --> Logger["日志服务"]
API --> Monitor["性能监控"]
```
图示来源
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
## 详细组件分析
### Nginx反向代理(docker-compose)
- 服务名称与镜像:使用官方nginx:latest
- 端口映射:宿主80映射容器80
- 卷挂载:将本地bookapi.conf挂载至/etc/nginx/conf.d/bookapi.conf,实现热更新
- 上游地址:通过host.docker.internal:3000指向宿主机后端(开发环境)
- 重启策略:unless-stopped
- 验证方式:curl http://bookapi.rrbrr.com/api/health
```mermaid
sequenceDiagram
participant C as "客户端"
participant N as "Nginx 容器"
participant B as "后端容器"
C->>N : "HTTP 请求 (bookapi.rrbrr.com)"
N->>N : "解析 conf.d/bookapi.conf"
N->>B : "proxy_pass http : //host.docker.internal : 3000"
B-->>N : "响应 (JSON/HTML)"
N-->>C : "返回响应"
```
图示来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
章节来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
- [docker-nginx/README.md:1-41](file://docker-nginx/README.md#L1-L41)
### 后端服务(Koa应用)
- 应用入口与脚本:通过package.json的scripts控制开发、构建与启动
- 配置加载:dotenv加载环境变量,config/index.ts集中管理端口、JWT、模型、上传等配置
- 中间件体系:
- 安全中间件:XSS防护、SQL注入检测、敏感数据脱敏、安全响应头
- 缓存中间件:基于Redis的读写缓存
- 速率限制:内存/Redis双栈限流,支持按IP、用户、接口维度
- 性能监控:统计总请求数、平均响应时间、慢请求、错误率
- 日志中间件:统一格式化HTTP请求日志
- 鉴权中间件:支持可选鉴权与Token校验
```mermaid
flowchart TD
Start(["请求进入"]) --> Security["安全中间件
XSS/SQL注入/响应头"]
Security --> Cache["缓存中间件
命中则返回"]
Cache --> Rate["限流中间件
内存/Redis"]
Rate --> Perf["性能监控中间件
统计指标"]
Perf --> Handler["业务处理器
控制器/服务层"]
Handler --> Log["日志中间件
HTTP日志"]
Log --> Resp(["返回响应"])
```
图示来源
- [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154)
- [server/src/middleware/cache.ts:1-45](file://server/src/middleware/cache.ts#L1-L45)
- [server/src/middleware/rate-limiter.ts:1-119](file://server/src/middleware/rate-limiter.ts#L1-L119)
- [server/src/middleware/performance.ts:1-109](file://server/src/middleware/performance.ts#L1-L109)
- [server/src/services/logger.service.ts:39-92](file://server/src/services/logger.service.ts#L39-L92)
- [server/src/middleware/auth.js:1-35](file://server/src/middleware/auth.js#L1-L35)
章节来源
- [server/package.json:1-60](file://server/package.json#L1-L60)
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [server/src/middleware/security.ts:1-154](file://server/src/middleware/security.ts#L1-L154)
- [server/src/middleware/cache.ts:1-45](file://server/src/middleware/cache.ts#L1-L45)
- [server/src/middleware/rate-limiter.ts:1-119](file://server/src/middleware/rate-limiter.ts#L1-L119)
- [server/src/middleware/performance.ts:1-109](file://server/src/middleware/performance.ts#L1-L109)
- [server/src/services/logger.service.ts:39-92](file://server/src/services/logger.service.ts#L39-L92)
- [server/src/middleware/auth.js:1-35](file://server/src/middleware/auth.js#L1-L35)
### 健康检查与日志
- 健康检查:后端提供/health端点,Nginx可据此进行健康探测
- 日志:统一使用winston输出到文件,支持HTTP请求日志与错误日志
章节来源
- [server/test-api.js:8-15](file://server/test-api.js#L8-L15)
- [server/src/services/logger.service.ts:39-92](file://server/src/services/logger.service.ts#L39-L92)
## 依赖关系分析
- 服务依赖
- 后端依赖Redis与MySQL(由配置与中间件使用体现)
- Nginx依赖后端容器(通过proxy_pass指向)
- 网络设置
- Nginx容器暴露80端口;后端容器暴露3000端口
- 开发环境通过extra_hosts将host.docker.internal解析为宿主机网关
- 卷挂载
- Nginx挂载conf.d配置文件以实现热更新
- 后端可通过卷挂载上传目录或日志目录(依据实际部署)
```mermaid
graph LR
NGINX["Nginx 容器"] -- "80/tcp" --> Host["宿主机:80"]
BACKEND["后端容器"] -- "3000/tcp" --> Host
NGINX --> |"proxy_pass"| BACKEND
BACKEND --> |"Redis"| REDIS["Redis 容器"]
BACKEND --> |"MySQL"| MYSQL["MySQL 容器"]
```
图示来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
章节来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
## 性能考虑
- 限流策略
- 全局限流、登录限流、短信验证码限流、TTS生成限流、文件上传限流
- Redis可用时优先使用Redis限流,否则回退到内存限流
- 缓存策略
- 对热点接口使用Redis缓存,命中即返回,降低后端压力
- 性能监控
- 统计总请求数、平均响应时间、慢请求阈值、错误率,并通过响应头返回响应时间
- 日志与追踪
- HTTP请求日志统一格式化,便于聚合与检索
章节来源
- [server/src/middleware/rate-limiter.ts:1-119](file://server/src/middleware/rate-limiter.ts#L1-L119)
- [server/src/middleware/cache.ts:1-45](file://server/src/middleware/cache.ts#L1-L45)
- [server/src/middleware/performance.ts:1-109](file://server/src/middleware/performance.ts#L1-L109)
- [server/src/services/logger.service.ts:39-92](file://server/src/services/logger.service.ts#L39-L92)
## 故障排查指南
- 后端无法启动
- 检查端口占用与环境变量(.env)
- 查看PM2日志或容器日志
- 前端无法访问
- 检查Nginx配置语法与静态资源路径
- 查看Nginx访问/错误日志
- 数据库连接失败
- 检查MySQL服务状态与连接串配置
- 健康检查失败
- 使用curl验证/health端点
- 检查后端日志定位异常
章节来源
- [DEPLOY.md:199-214](file://DEPLOY.md#L199-L214)
- [server/test-api.js:8-44](file://server/test-api.js#L8-L44)
## 结论
本容器化方案以Nginx为入口,后端采用Koa中间件体系实现安全、限流、缓存与可观测性,结合Redis与MySQL满足高并发与可靠性需求。通过docker-compose实现快速编排与热更新,配合健康检查与日志采集,可支撑生产级部署与运维。
## 附录
### Docker镜像构建与多阶段优化(建议)
- 基础镜像选择:使用官方Node.js Alpine作为基础镜像,减小体积
- 多阶段构建建议:
- 构建阶段:安装依赖并执行构建,产出dist
- 运行阶段:仅复制dist与运行时依赖,避免打包源码与开发依赖
- 最小权限与非root运行:以非root用户运行应用,限制文件权限
- 安全扫描:在CI中集成镜像漏洞扫描
- 健康检查:在Dockerfile中添加HEALTHCHECK,探测/health端点
- 资源限制:在docker-compose中设置CPU/内存限制与重启策略
### docker-compose编排要点
- 服务命名与重启策略:unless-stopped
- 网络隔离:使用自定义bridge网络,限制容器间直接通信
- 卷管理:明确声明卷(如上传目录、日志目录)并设置权限
- 环境变量:通过env文件集中管理,避免明文硬编码
### Nginx反向代理配置要点
- 负载均衡:多实例后端时使用upstream与轮询/权重策略
- SSL终止:在Nginx层启用TLS,使用Let’s Encrypt自动化证书
- 静态资源:开启缓存与压缩,分离前端构建产物与后端API
- WebSocket:正确传递Upgrade/Connection头部,保持长连接
### 容器健康检查、资源限制与日志
- 健康检查:/api/health或/health端点,返回200即健康
- 资源限制:CPU/内存/文件描述符上限,避免资源争抢
- 日志:stdout/stderr结合集中日志采集(如Fluent Bit/ELK)