# 生产部署 **本文引用的文件** - [DEPLOY_PROD.md](file://DEPLOY_PROD.md) - [DEPLOY.md](file://DEPLOY.md) - [deploy-prod.sh](file://deploy-prod.sh) - [deploy.sh](file://deploy.sh) - [docker-nginx/docker-compose.yml](file://docker-nginx/docker-compose.yml) - [docker-nginx/bookapi.conf](file://docker-nginx/bookapi.conf) - [AUTO_DEPLOY.md](file://AUTO_DEPLOY.md) - [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/rate-limiter.ts](file://server/src/middleware/rate-limiter.ts) - [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.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/services/redis.service.ts](file://server/src/services/redis.service.ts) - [server/src/services/storage.service.ts](file://server/src/services/storage.service.ts) - [server/src/modules/book-generator/FAULT_TOLERANCE.md](file://server/src/modules/book-generator/FAULT_TOLERANCE.md) - [server/src/modules/book-generator/README.md](file://server/src/modules/book-generator/README.md) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向AI有声书生成平台的生产部署,覆盖从服务器准备、CI/CD流水线、自动化部署与回滚、负载均衡与SSL、安全加固、监控与告警到A/B、蓝绿与金丝雀发布策略,以及应急响应与灾备方案。文档严格依据仓库现有部署脚本、配置与模块化实现进行梳理,并提供可操作的流程图与时序图帮助工程团队落地。 ## 项目结构 - 后端服务位于 server 目录,采用 Node.js + Koa 架构,使用 PM2 管理进程;生产部署脚本负责构建、同步、安装依赖、生成Prisma客户端、启动服务与Nginx重载。 - 前端为 uni-app-vue3 构建产物,部署于 Nginx 静态目录。 - Nginx 通过宝塔面板管理,提供HTTP/HTTPS、反向代理、HSTS、缓存与访问日志。 - 自动化部署通过 Gogs Webhook + Python Webhook 服务或 Git Hook 实现,支持一键触发与回滚。 - 安全与性能方面包含安全中间件、速率限制、Sentry 错误监控、Winston 日志、Redis 缓存与 OSS/本地存储抽象。 ```mermaid graph TB subgraph "生产服务器" FE["前端静态资源
/data/ai/audio/frontend/build/h5"] BE["后端服务
PM2 + dist/app.js"] DB["MySQL 8.0 (Docker)
single-mysql"] REDIS["Redis"] OSS["阿里云 OSS"] Nginx["Nginx (宝塔面板)"] end Internet["互联网"] --> Nginx Nginx --> FE Nginx --> BE BE --> DB BE --> REDIS BE --> OSS ``` **图表来源** - [DEPLOY_PROD.md: 36-46:36-46](file://DEPLOY_PROD.md#L36-L46) - [DEPLOY.md: 64-116:64-116](file://DEPLOY.md#L64-L116) - [docker-nginx/docker-compose.yml: 1-12:1-12](file://docker-nginx/docker-compose.yml#L1-L12) **章节来源** - [DEPLOY_PROD.md: 3-46:3-46](file://DEPLOY_PROD.md#L3-L46) - [DEPLOY.md: 3-116:3-116](file://DEPLOY.md#L3-L116) ## 核心组件 - 自动化部署脚本 - deploy-prod.sh:本地构建前端与后端,打包上传,服务器侧安装 Node.js/PM2,安装依赖,复制生产环境配置,生成Prisma客户端,启动PM2服务,提示Nginx配置位置。 - deploy.sh:与 deploy-prod.sh 类似,但更强调宝塔面板配置与HTTPS重定向。 - Nginx 配置 - 宝塔面板管理,80重定向至443,配置SSL证书、HSTS、缓存、访问/错误日志、API反向代理。 - docker-nginx 提供独立容器化示例,bookapi.conf 将 /api 代理至后端。 - 安全与性能 - 安全中间件:XSS/SQL注入防护、敏感数据脱敏、安全响应头。 - 速率限制:内存/Redis双栈限流器,支持API、登录、短信、TTS、上传等维度。 - Sentry:生产采样率与错误过滤,配合Koa中间件捕获异常。 - 性能监控:请求计数、平均耗时、慢请求、端点级指标与HTTP日志。 - Redis:连接池、重试策略、键操作、批量删除、过期控制。 - 存储:OSS/本地存储统一抽象,支持上传、下载、删除、签名URL。 - 容错与可靠性 - 书籍生成容错:AI调用指数退避重试、节点级超时、进度监控三级告警、自动恢复、WebSocket实时通知。 - CI/CD 与回滚 - Gogs Webhook + Python Webhook 服务或 Git Post-Receive Hook,支持一键部署与回滚。 - 一键部署脚本 deploy.sh 与 deploy-prod.sh 提供回滚与重试能力。 **章节来源** - [deploy-prod.sh: 1-171:1-171](file://deploy-prod.sh#L1-L171) - [deploy.sh: 1-209:1-209](file://deploy.sh#L1-L209) - [server/src/middleware/security.ts: 1-154:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/rate-limiter.ts: 1-120:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/services/sentry.service.ts: 1-113:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/middleware/performance.ts: 1-110:1-110](file://server/src/middleware/performance.ts#L1-L110) - [server/src/services/logger.service.ts: 1-114:1-114](file://server/src/services/logger.service.ts#L1-L114) - [server/src/services/redis.service.ts: 1-274:1-274](file://server/src/services/redis.service.ts#L1-L274) - [server/src/services/storage.service.ts: 1-278:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/modules/book-generator/FAULT_TOLERANCE.md: 1-334:1-334](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L1-L334) ## 架构总览 生产环境采用“Nginx + 后端PM2 + MySQL + Redis + OSS”的组合,Nginx统一入口,负责TLS终止、静态资源缓存、API反向代理与访问日志。后端通过速率限制、安全中间件与Sentry保障稳定性与可观测性。书籍生成模块具备完善的容错与进度监控,确保长耗时任务的可靠性。 ```mermaid graph TB Client["客户端"] --> Nginx["Nginx (HTTPS/HSTS)"] Nginx --> API["后端API (/api/*)"] Nginx --> Static["静态资源 (/)"] API --> Koa["Koa 应用"] Koa --> Security["安全中间件"] Koa --> Limiter["速率限制"] Koa --> Perf["性能监控"] Koa --> Sentry["Sentry 错误监控"] Koa --> Redis["Redis 缓存"] Koa --> Storage["存储服务 (OSS/本地)"] Koa --> DB["MySQL (Docker)"] ``` **图表来源** - [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239) - [server/src/middleware/security.ts: 6-27:6-27](file://server/src/middleware/security.ts#L6-L27) - [server/src/middleware/rate-limiter.ts: 49-72:49-72](file://server/src/middleware/rate-limiter.ts#L49-L72) - [server/src/middleware/performance.ts: 29-76:29-76](file://server/src/middleware/performance.ts#L29-L76) - [server/src/services/sentry.service.ts: 7-43:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/services/redis.service.ts: 3-38:3-38](file://server/src/services/redis.service.ts#L3-L38) - [server/src/services/storage.service.ts: 13-35:13-35](file://server/src/services/storage.service.ts#L13-L35) ## 详细组件分析 ### 自动化部署与回滚(CI/CD) - Gogs Webhook 集成 - 服务器端部署 webhook-deploy.py,systemd 服务自启动,Nginx 将 /webhook 转发至本地端口。 - Gogs 仓库配置 Webhook URL 与 Secret,触发后自动拉取代码、构建、PM2 重启。 - Git Hook 回退方案 - 若无Python,可在服务器 Git 仓库设置 post-receive Hook,检测 master 分支推送并执行构建与重启。 - 一键部署脚本 - deploy.sh:备份旧文件,解压新包,安装依赖,生成Prisma客户端,PM2重启,Nginx重载。 - deploy-prod.sh:本地构建,打包上传,服务器侧安装 Node.js/PM2,复制 .env.production -> .env,生成Prisma客户端,PM2启动。 ```mermaid sequenceDiagram participant Dev as "开发者" participant Gogs as "Gogs 仓库" participant Nginx as "Nginx" participant Webhook as "Webhook 服务" participant Server as "服务器" participant PM2 as "PM2" Dev->>Gogs : 推送代码 Gogs->>Nginx : Webhook 请求 (URL+Secret) Nginx->>Webhook : 反向代理 /webhook Webhook->>Server : 拉取代码/执行部署脚本 Server->>Server : 备份/解压/安装依赖/生成Prisma Server->>PM2 : 重启后端服务 PM2-->>Dev : 服务可用 ``` **图表来源** - [AUTO_DEPLOY.md: 5-66:5-66](file://AUTO_DEPLOY.md#L5-L66) - [AUTO_DEPLOY.md: 68-78:68-78](file://AUTO_DEPLOY.md#L68-L78) - [deploy.sh: 54-89:54-89](file://deploy.sh#L54-L89) - [deploy-prod.sh: 79-127:79-127](file://deploy-prod.sh#L79-L127) **章节来源** - [AUTO_DEPLOY.md: 1-142:1-142](file://AUTO_DEPLOY.md#L1-L142) - [deploy.sh: 1-209:1-209](file://deploy.sh#L1-L209) - [deploy-prod.sh: 1-171:1-171](file://deploy-prod.sh#L1-L171) ### Nginx 与 SSL/TLS - 宝塔面板管理,80端口重定向至443,启用TLSv1.2/1.3、HSTS、Alt-Svc,配置SSL证书与私钥。 - API反向代理:将 /api/ 请求转发至后端 3100 端口,设置真实IP与协议头。 - 静态资源:前端H5构建产物目录,开启缓存与访问/错误日志。 - docker-nginx 提供容器化示例,将 /api 代理至 host.docker.internal:3000。 ```mermaid flowchart TD Start(["请求进入"]) --> Port80{"是否HTTP 80?"} Port80 --> |是| Redirect["301 重定向到 HTTPS"] Port80 --> |否| TLS["TLS 终止 (宝塔)"] TLS --> APIProxy{"路径是否 /api/* ?"} APIProxy --> |是| ProxyToBE["代理到 127.0.0.1:3100"] APIProxy --> |否| ServeStatic["返回前端静态资源"] ProxyToBE --> End(["响应"]) ServeStatic --> End ``` **图表来源** - [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) **章节来源** - [DEPLOY_PROD.md: 146-245:146-245](file://DEPLOY_PROD.md#L146-L245) - [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) ### 安全加固与合规 - 安全中间件 - XSS防护:递归清理请求体与查询参数,设置安全响应头。 - SQL注入检测:正则匹配常见攻击模式,拦截非法输入。 - 敏感数据脱敏:对密码、令牌等字段进行脱敏输出。 - 速率限制 - 内存/Redis双栈限流器,支持API、登录、短信、TTS、上传等维度,自动设置 Retry-After。 - Sentry 错误监控 - 生产环境采样率与错误过滤,结合Koa中间件捕获异常并附带上下文。 - 日志与审计 - Winston 统一日志格式,分别输出到控制台、错误文件、综合日志与HTTP请求日志。 - Redis 安全 - 连接重试策略、错误日志、连接状态监控,避免因缓存不可用导致服务降级。 **章节来源** - [server/src/middleware/security.ts: 1-154:1-154](file://server/src/middleware/security.ts#L1-L154) - [server/src/middleware/rate-limiter.ts: 1-120:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/services/sentry.service.ts: 1-113:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/services/logger.service.ts: 1-114:1-114](file://server/src/services/logger.service.ts#L1-L114) - [server/src/services/redis.service.ts: 1-274:1-274](file://server/src/services/redis.service.ts#L1-L274) ### 性能监控与可观测性 - 性能中间件:统计总请求数、平均响应时间、慢请求、端点级指标与错误率,输出响应头。 - HTTP日志中间件:记录请求方法、URL、状态、耗时、IP与UA,便于审计与分析。 - Sentry:异常捕获与性能采样,辅助定位热点问题。 - Prometheus/Grafana(建议):可扩展指标采集与可视化(本仓库未提供具体配置文件)。 **章节来源** - [server/src/middleware/performance.ts: 1-110:1-110](file://server/src/middleware/performance.ts#L1-L110) - [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: 7-43:7-43](file://server/src/services/sentry.service.ts#L7-L43) ### 存储与缓存 - 存储服务:统一抽象 OSS 与本地存储,支持上传、下载、删除、签名URL与目录级操作。 - Redis:连接池、重试、键操作、批量删除、过期控制与连接测试,保证高可用与可维护性。 **章节来源** - [server/src/services/storage.service.ts: 1-278:1-278](file://server/src/services/storage.service.ts#L1-L278) - [server/src/services/redis.service.ts: 1-274:1-274](file://server/src/services/redis.service.ts#L1-L274) ### 书籍生成容错与长耗时任务 - AI调用重试:指数退避(最多3次),记录错误并WebSocket通知。 - 节点级超时:大纲/节/小节/内容等节点设定不同超时阈值,超时触发自动恢复。 - 进度监控:10/20/30分钟三级告警,自动恢复最多2次,避免无限循环。 - WebSocket通知:12种通知类型,覆盖重试、失败、超时、恢复等场景。 ```mermaid flowchart TD Start(["开始节点"]) --> CallLLM["调用 LLM (指数退避重试)"] CallLLM --> Retry{"重试次数 < 3 ?"} Retry --> |是| Wait["等待 2^n 秒"] --> CallLLM Retry --> |否| Fail["标记失败 + 通知用户"] CallLLM --> Timeout{"节点超时?"} Timeout --> |是| AutoRecovery["自动恢复 (最多2次)"] Timeout --> |否| Complete["节点完成 + 通知用户"] AutoRecovery --> Requeue["重新入队"] --> CallLLM ``` **图表来源** - [server/src/modules/book-generator/FAULT_TOLERANCE.md: 13-84:13-84](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L13-L84) - [server/src/modules/book-generator/FAULT_TOLERANCE.md: 86-146:86-146](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L86-L146) **章节来源** - [server/src/modules/book-generator/FAULT_TOLERANCE.md: 1-334:1-334](file://server/src/modules/book-generator/FAULT_TOLERANCE.md#L1-L334) ### A/B、蓝绿与金丝雀发布策略 - A/B 测试 - 通过 Nginx upstream 分流或后端灰度路由,按用户特征/实验组分配流量。 - 建议:结合 Cookie/Header 标识分流,逐步扩大流量比例。 - 蓝绿部署 - 预热新版本服务与数据库迁移,Nginx 切换到新实例,失败快速切回。 - 建议:使用 PM2 集群与健康检查,确保零停机切换。 - 金丝雀发布 - 以小比例流量(如 5%-10%)导入新版本,结合Sentry与性能指标观察,逐步放大。 [本节为通用发布策略说明,未直接分析具体源码文件,故不附加“章节来源”] ## 依赖关系分析 - 后端依赖 - 环境变量与模型配置:从 .env 与 models.json 加载,支持DashScope TTS与多模型切换。 - 速率限制依赖 Redis(可用时)或内存限流器。 - 存储服务依赖 OSS SDK 或本地文件系统。 - Nginx 依赖 - 宝塔面板配置文件与证书路径,API反向代理与静态资源根目录。 - 自动化依赖 - Gogs Webhook、Python Webhook 服务、systemd 服务单元、PM2。 ```mermaid graph LR Env[".env / models.json"] --> Config["配置加载"] Redis["Redis"] --> Limiter["速率限制"] OSS["OSS"] --> Storage["存储服务"] LocalFS["本地文件系统"] --> Storage Nginx["Nginx 配置"] --> API["后端API"] API --> Limiter API --> Storage API --> DB["MySQL"] ``` **图表来源** - [server/src/config/index.ts: 1-117:1-117](file://server/src/config/index.ts#L1-L117) - [server/src/middleware/rate-limiter.ts: 1-43:1-43](file://server/src/middleware/rate-limiter.ts#L1-L43) - [server/src/services/storage.service.ts: 13-35:13-35](file://server/src/services/storage.service.ts#L13-L35) - [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239) **章节来源** - [server/src/config/index.ts: 1-117:1-117](file://server/src/config/index.ts#L1-L117) - [server/src/middleware/rate-limiter.ts: 1-120:1-120](file://server/src/middleware/rate-limiter.ts#L1-L120) - [server/src/services/storage.service.ts: 1-278:1-278](file://server/src/services/storage.service.ts#L1-L278) - [DEPLOY_PROD.md: 146-239:146-239](file://DEPLOY_PROD.md#L146-L239) ## 性能考量 - 限流与熔断 - 全局限流与登录/短信/TTS/上传等专项限流,避免突发流量冲击。 - Redis可用时优先使用分布式限流器,不可用时回退内存限流器。 - 缓存与存储 - Redis 作为热点数据缓存,减少数据库压力;存储服务统一对接OSS/本地,降低耦合。 - 日志与监控 - HTTP请求日志与性能指标结合,识别慢端点与异常峰值。 - Nginx 缓存 - 静态资源长期缓存与HSTS,降低带宽与CPU消耗。 [本节提供通用指导,未直接分析具体源码文件,故不附加“章节来源”] ## 故障排查指南 - 后端服务无法启动 - 查看 PM2 日志与错误日志,手动运行验证端口占用与 .env 配置。 - 数据库连接失败 - 检查 Docker 容器状态、重启容器、测试连接与 .env 配置。 - Nginx 502 错误 - 检查后端进程、端口监听、本地健康检查与 Nginx 配置语法。 - 重启所有服务 - PM2 重启后端、Nginx 重载、必要时重启 MySQL 容器。 - 自动化部署失败 - 检查 webhook 服务状态与日志、PM2 日志、Nginx 访问/错误日志。 **章节来源** - [DEPLOY_PROD.md: 318-393:318-393](file://DEPLOY_PROD.md#L318-L393) - [AUTO_DEPLOY.md: 97-111:97-111](file://AUTO_DEPLOY.md#L97-L111) ## 结论 本部署文档基于仓库现有脚本与模块,给出了生产环境的部署流程、自动化与回滚策略、安全加固、监控与可观测性实践,并提供了A/B、蓝绿与金丝雀发布的实施建议。建议在现有基础上补充Prometheus/Grafana指标采集、数据库备份与灾备演练,持续完善生产治理。 ## 附录 ### 部署前检查清单 - 服务器与网络 - 服务器可达、防火墙开放、SSH密钥配置正确。 - Nginx 与宝塔面板可用,SSL证书已配置。 - 后端 - Node.js/PM2 已安装,.env 生产配置齐全,数据库与Redis连通。 - Prisma schema 与迁移已准备,OSS/本地存储可用。 - 前端 - H5 构建产物已生成,静态资源目录权限正确。 - CI/CD - Gogs Webhook 已配置,Secret 一致,Nginx 反代 /webhook。 - Git Hook(可选)已设置,post-receive 脚本可执行。 **章节来源** - [DEPLOY.md: 140-159:140-159](file://DEPLOY.md#L140-L159) - [AUTO_DEPLOY.md: 68-78:68-78](file://AUTO_DEPLOY.md#L68-L78) ### 部署后验证步骤 - 健康检查 - 访问后端健康端点与前端首页,确认 Nginx 与后端均正常。 - 日志与监控 - 查看 PM2 日志、Nginx 访问/错误日志、Sentry 异常与性能指标。 - 功能验证 - 登录、书籍生成、TTS、播放、支付(如涉及)等关键路径验证。 **章节来源** - [DEPLOY.md: 147-159:147-159](file://DEPLOY.md#L147-L159) - [DEPLOY_PROD.md: 18-25:18-25](file://DEPLOY_PROD.md#L18-L25) ### 监控配置建议 - 指标采集 - 使用 Prometheus 抓取后端性能指标与HTTP日志,结合 Grafana 可视化。 - 告警策略 - 基于错误率、P95/P99 延迟、Redis/DB 连接失败、Nginx 5xx 等设置告警。 - 日志聚合 - 将 Winston 日志与 Nginx 日志接入集中式日志系统,支持检索与告警。 [本节为通用建议,未直接分析具体源码文件,故不附加“章节来源”]