# 多环境部署
**本文引用的文件**
- [server/src/config/index.ts](file://server/src/config/index.ts)
- [deploy-package/server/config/index.js](file://deploy-package/server/config/index.js)
- [DEPLOY.md](file://DEPLOY.md)
- [DEPLOY_PROD.md](file://DEPLOY_PROD.md)
- [AUTO_DEPLOY.md](file://AUTO_DEPLOY.md)
- [server/webhook-deploy.py](file://server/webhook-deploy.py)
- [deploy-prod.sh](file://deploy-prod.sh)
- [deploy.sh](file://deploy.sh)
- [docker-nginx/docker-compose.yml](file://docker-nginx/docker-compose.yml)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台,提供覆盖开发、测试、生产的多环境部署策略与实施指南。内容涵盖:
- 环境差异化配置(数据库、API端点、第三方服务密钥)
- 环境变量使用模式与配置文件加载优先级
- CI/CD流水线(自动化测试、构建、打包、部署触发)
- 环境切换最佳实践(配置热更新、蓝绿/灰度发布)
- 监控与告警(性能指标、错误日志、容量规划)
## 项目结构
该仓库包含后端服务、前端应用、部署脚本与Nginx/Docker配置。关键部署相关目录与文件如下:
- server/src/config:运行时配置加载与模型管理
- deploy-package/server/config:打包后配置(兼容JS)
- docker-nginx:本地开发反向代理示例
- 自动化部署脚本:deploy-prod.sh、deploy.sh、webhook-deploy.py
- 文档:DEPLOY.md、DEPLOY_PROD.md、AUTO_DEPLOY.md
```mermaid
graph TB
A["开发环境
本地/容器"] --> B["测试环境
测试服务器"]
B --> C["生产环境
线上服务器"]
A --> D["构建产物
server/dist, frontend/build/h5"]
D --> E["部署脚本
deploy.sh / deploy-prod.sh"]
E --> F["PM2 进程管理
server"]
F --> G["Nginx 反向代理
book.rrbrr.com / bookapi.rrbrr.com"]
G --> H["后端服务
监听端口"]
G --> I["静态资源
前端H5"]
```
图表来源
- [DEPLOY.md:1-251](file://DEPLOY.md#L1-L251)
- [DEPLOY_PROD.md:1-393](file://DEPLOY_PROD.md#L1-L393)
- [deploy.sh:1-209](file://deploy.sh#L1-L209)
- [deploy-prod.sh:1-171](file://deploy-prod.sh#L1-L171)
章节来源
- [DEPLOY.md:1-251](file://DEPLOY.md#L1-L251)
- [DEPLOY_PROD.md:1-393](file://DEPLOY_PROD.md#L1-L393)
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
## 核心组件
- 配置加载与模型管理
- 通过dotenv加载根目录环境变量,结合models.json统一管理模型清单与默认值
- 提供模型切换逻辑(基于错误类型判断是否切换)
- 自动化部署链路
- 一键部署脚本负责构建、打包、同步、安装依赖、生成Prisma客户端、PM2启动
- Webhook服务接收Gogs/GitHub推送,执行部署脚本
- 反向代理与域名
- Nginx配置后端API与前端静态资源分发;生产环境由宝塔面板管理
章节来源
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [deploy-package/server/config/index.js:1-111](file://deploy-package/server/config/index.js#L1-L111)
- [AUTO_DEPLOY.md:1-142](file://AUTO_DEPLOY.md#L1-L142)
- [DEPLOY.md:61-116](file://DEPLOY.md#L61-L116)
## 架构总览
多环境部署采用“脚本驱动 + 反向代理 + 进程管理”的组合模式,支持一键部署与Webhook触发部署。
```mermaid
graph TB
Dev["开发者"] --> SCM["代码仓库(Gogs/GitHub)"]
SCM --> WH["Webhook 接收器
webhook-deploy.py"]
WH --> Deploy["部署脚本
deploy.sh / deploy-prod.sh"]
Deploy --> Build["构建产物
server/dist, frontend/build/h5"]
Build --> PM2["PM2 进程管理"]
PM2 --> Nginx["Nginx 反向代理"]
Nginx --> API["后端API"]
Nginx --> FE["前端静态资源"]
```
图表来源
- [AUTO_DEPLOY.md:3-85](file://AUTO_DEPLOY.md#L3-L85)
- [server/webhook-deploy.py:1-139](file://server/webhook-deploy.py#L1-L139)
- [deploy.sh:1-209](file://deploy.sh#L1-L209)
- [deploy-prod.sh:1-171](file://deploy-prod.sh#L1-L171)
## 详细组件分析
### 环境变量与配置加载
- 加载顺序与优先级
- 项目根目录加载 .env(dotenv)
- 读取 models.json 作为模型配置源
- 运行时通过 process.env 覆盖默认值(端口、数据库、JWT、TTS等)
- 关键配置项
- 服务端口与环境:NODE_ENV、SERVER_PORT
- 数据库连接:MONGODB_URI(开发)/ DATABASE_URL(生产)
- JWT:JWT_SECRET、JWT_EXPIRES_IN
- 第三方服务:DASHSCOPE_API_KEY、DASHSCOPE_MODEL、DASHSCOPE_TTS_MODELS、DASHSCOPE_USE_REALTIME、DASHSCOPE_REALTIME_MODEL
- 存储与缓存:STORAGE_TYPE、REDIS_*、OSS_*(生产)
- 模型管理
- 统一列出vendors/models,按类型过滤启用模型,支持自动切换
```mermaid
flowchart TD
Start(["启动"]) --> LoadEnv["加载 .env"]
LoadEnv --> ReadModels["读取 models.json"]
ReadModels --> MergeCfg["合并默认配置与环境变量"]
MergeCfg --> Export["导出 config 对象"]
Export --> End(["运行"])
```
图表来源
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [deploy-package/server/config/index.js:1-111](file://deploy-package/server/config/index.js#L1-L111)
章节来源
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [DEPLOY_PROD.md:105-144](file://DEPLOY_PROD.md#L105-L144)
### 开发环境
- 本地开发
- 使用 docker-nginx 本地反向代理,映射80端口,便于联调
- 通过 .env 注入开发数据库与第三方服务密钥
- 前后端联调
- 前端H5直连后端API(通过Nginx转发),便于调试
章节来源
- [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)
### 测试环境
- 配置要点
- 使用独立数据库(MySQL 8.0 Docker容器)
- 通过 .env 设置 DATABASE_URL、Redis、OSS等
- Nginx配置与生产类似,但指向测试后端端口
- 部署流程
- rsync同步前后端产物至测试服务器
- 安装依赖、生成Prisma客户端、PM2启动
- 验证健康检查与API连通性
章节来源
- [DEPLOY_PROD.md:264-294](file://DEPLOY_PROD.md#L264-L294)
- [DEPLOY.md:105-116](file://DEPLOY.md#L105-L116)
### 生产环境
- 服务器与端口
- 服务器IP:8.159.134.106
- 前端路径:/data/ai/audio/frontend/build/h5
- 后端端口:3100(PM2启动时指定)
- SSH端口:22622
- 配置要点
- .env中设置 NODE_ENV=production、SERVER_PORT=3100、JWT_SECRET、DASHSCOPE_*、DATABASE_URL、REDIS_*、OSS_*
- Nginx由宝塔面板管理,配置文件位于 /www/server/panel/vhost/nginx/
- 健康检查:/api/health
- 部署流程
- 一键脚本 deploy-prod.sh 完成构建、打包、同步、安装依赖、复制生产配置、生成Prisma客户端、PM2启动
- 手动部署步骤与一键脚本等价,便于理解与排障
章节来源
- [DEPLOY_PROD.md:3-65](file://DEPLOY_PROD.md#L3-L65)
- [DEPLOY_PROD.md:105-144](file://DEPLOY_PROD.md#L105-L144)
- [deploy-prod.sh:1-171](file://deploy-prod.sh#L1-L171)
### CI/CD流水线
- 触发机制
- Git Push → Gogs Webhook → 服务器 webhook-deploy.py → 自动部署脚本 → PM2重启
- 服务配置
- systemd服务:webhook.service,监听本地端口(默认8080),读取WEBHOOK_SECRET与WEBHOOK_PORT
- Nginx转发:/webhook → 127.0.0.1:8080
- 安全建议
- 使用HTTPS与强Secret
- 可限制IP仅允许Gogs服务器访问 /webhook
- 替代方案
- 无Python环境时,可用Git post-receive hook + Nginx + Bash脚本实现
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Gogs as "Gogs 仓库"
participant Nginx as "Nginx"
participant WH as "webhook-deploy.py"
participant Script as "deploy.sh"
participant PM2 as "PM2"
participant Srv as "后端服务"
Dev->>Gogs : 推送代码
Gogs->>Nginx : 触发 /webhook
Nginx->>WH : 转发请求
WH->>Script : 执行部署脚本
Script->>PM2 : 重启 server
PM2->>Srv : 启动/重启进程
Dev-->>Gogs : 部署完成
```
图表来源
- [AUTO_DEPLOY.md:3-85](file://AUTO_DEPLOY.md#L3-L85)
- [server/webhook-deploy.py:1-139](file://server/webhook-deploy.py#L1-L139)
- [deploy.sh:178-201](file://deploy.sh#L178-L201)
章节来源
- [AUTO_DEPLOY.md:1-142](file://AUTO_DEPLOY.md#L1-L142)
- [server/webhook-deploy.py:1-139](file://server/webhook-deploy.py#L1-L139)
- [deploy.sh:178-201](file://deploy.sh#L178-L201)
### 环境切换最佳实践
- 配置热更新
- 通过 .env 分环境管理,生产环境使用 .env.production 并在部署时复制为 .env
- 第三方服务密钥与数据库连接字符串按环境隔离
- 蓝绿/灰度发布
- 建议:使用多实例+负载均衡(Nginx upstream)进行蓝绿切换;灰度发布可通过Nginx基于Header/Cookie分流
- 当前脚本未内置蓝绿/灰度逻辑,可在Nginx层扩展
- 模型自动切换
- 基于错误类型判断(限流、配额、服务不可用等)自动切换可用模型,提升稳定性
章节来源
- [server/src/config/index.ts:45-67](file://server/src/config/index.ts#L45-L67)
- [DEPLOY_PROD.md:115-144](file://DEPLOY_PROD.md#L115-L144)
### 监控与告警
- 性能指标
- Nginx访问/错误日志:/var/log/nginx/ 与宝塔日志目录
- PM2进程状态与日志:pm2 status / pm2 logs server
- 错误日志监控
- 后端:pm2 logs server --lines 50
- Nginx:tail -f /var/log/nginx/access.log / error.log
- 容量规划建议
- CPU/内存:根据并发请求与TTS生成任务峰值评估
- 存储:上传文件与生成视频目录容量监控
- 数据库:MySQL 8.0容器资源与备份策略
章节来源
- [DEPLOY.md:187-197](file://DEPLOY.md#L187-L197)
- [DEPLOY_PROD.md:318-375](file://DEPLOY_PROD.md#L318-L375)
## 依赖关系分析
- 配置模块
- server/src/config/index.ts 读取 .env 与 models.json,导出统一配置对象
- deploy-package/server/config/index.js 为打包后JS版本,行为一致
- 部署脚本
- deploy.sh:通用部署脚本(本地Windows路径示例)
- deploy-prod.sh:生产一键脚本(含Node.js检测、复制生产配置、PM2启动)
- 自动化
- webhook-deploy.py:HTTP服务,校验签名后执行部署脚本
- systemd服务:webhook.service,随系统启动
```mermaid
graph LR
Env[".env"] --> Cfg["server/src/config/index.ts"]
Models["models.json"] --> Cfg
Cfg --> App["后端应用"]
Deploy["deploy.sh"] --> PM2["PM2"]
Prod["deploy-prod.sh"] --> PM2
WH["webhook-deploy.py"] --> Deploy
SVC["webhook.service"] --> WH
```
图表来源
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [deploy.sh:1-209](file://deploy.sh#L1-L209)
- [deploy-prod.sh:1-171](file://deploy-prod.sh#L1-L171)
- [server/webhook-deploy.py:1-139](file://server/webhook-deploy.py#L1-L139)
章节来源
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [deploy.sh:1-209](file://deploy.sh#L1-L209)
- [deploy-prod.sh:1-171](file://deploy-prod.sh#L1-L171)
- [server/webhook-deploy.py:1-139](file://server/webhook-deploy.py#L1-L139)
## 性能考量
- 反向代理
- Nginx开启HTTP/2、缓存静态资源、压缩与安全头,降低后端压力
- 进程管理
- PM2自动重启与开机自启,保障高可用
- 数据库
- 生产使用Docker MySQL 8.0,建议开启慢查询日志与连接池参数优化
- 存储
- OSS对象存储与Redis缓存配合,减少IO压力
## 故障排查指南
- 后端无法启动
- 检查端口占用与 .env 配置,查看PM2日志
- 前端无法访问
- 检查Nginx配置与静态资源路径
- 数据库连接失败
- 检查MySQL容器状态与 .env 中 DATABASE_URL
- Nginx 502
- 检查后端进程监听端口与PM2状态
- Webhook部署失败
- 检查签名、日志与系统服务状态
章节来源
- [DEPLOY.md:199-251](file://DEPLOY.md#L199-L251)
- [DEPLOY_PROD.md:318-375](file://DEPLOY_PROD.md#L318-L375)
- [AUTO_DEPLOY.md:97-142](file://AUTO_DEPLOY.md#L97-L142)
## 结论
本部署文档提供了从开发到生产的完整配置与流程说明,并给出了CI/CD自动化与监控告警建议。建议在现有脚本基础上扩展蓝绿/灰度发布能力,并完善测试环境的自动化回归与性能压测流程,以进一步提升交付质量与稳定性。
## 附录
- 常用命令
- PM2:status、logs、restart、save、startup
- Nginx:-t、reload、restart
- MySQL(Docker):进入容器、备份、迁移
- 安全加固
- 强制HTTPS、强Secret、IP白名单、定期审计日志