# 部署与环境问题
**本文引用的文件**
- [DEPLOY.md](file://DEPLOY.md)
- [DEPLOY_PROD.md](file://DEPLOY_PROD.md)
- [deploy.sh](file://deploy.sh)
- [deploy-prod.sh](file://deploy-prod.sh)
- [deploy-server.sh](file://deploy-server.sh)
- [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/config/models.json](file://server/src/config/models.json)
- [server/package.json](file://server/package.json)
- [my-uniapp-vue3/package.json](file://my-uniapp-vue3/package.json)
- [server/webhook-deploy.py](file://server/webhook-deploy.py)
- [AUTO_DEPLOY.md](file://AUTO_DEPLOY.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的运维与开发团队,提供从开发到生产的全链路部署与环境问题排查指南。内容覆盖:
- Docker容器化部署与Nginx反向代理配置
- 环境变量与配置文件管理
- SSL证书与安全加固
- 数据库连接池与外部服务连通性问题
- 容器启动失败、端口冲突、文件权限、网络异常等常见故障定位
- 自动化部署脚本调试、环境一致性检查、服务健康检查与回滚策略
- 生产环境与开发环境差异处理
## 项目结构
该仓库包含后端Node.js服务、前端UniApp应用、Docker化的Nginx反代、部署脚本与自动化部署配置。关键目录与文件如下:
- 后端服务:server/src/app.ts、server/src/config/*
- 前端应用:my-uniapp-vue3/
- Docker反代:docker-nginx/
- 部署脚本:deploy.sh、deploy-prod.sh、deploy-server.sh
- 自动化部署:server/webhook-deploy.py、AUTO_DEPLOY.md
- 文档:DEPLOY.md、DEPLOY_PROD.md
```mermaid
graph TB
subgraph "前端"
FE["my-uniapp-vue3
构建产物 dist/"]
end
subgraph "后端"
APP["server/src/app.ts
Koa 应用"]
CFG[".env / models.json
配置加载"]
DB["MySQL 8.0 (Docker)"]
REDIS["Redis"]
OSS["阿里云 OSS"]
end
subgraph "反向代理"
NGINX["Nginx (宝塔/Compose)"]
end
subgraph "自动化"
WH["webhook-deploy.py"]
SCRIPTS["deploy.sh / deploy-prod.sh"]
end
FE --> NGINX
NGINX --> APP
APP --> DB
APP --> REDIS
APP --> OSS
WH --> SCRIPTS
SCRIPTS --> NGINX
SCRIPTS --> APP
```
图表来源
- [server/src/app.ts:132-194](file://server/src/app.ts#L132-L194)
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [server/webhook-deploy.py:38-78](file://server/webhook-deploy.py#L38-L78)
章节来源
- [DEPLOY.md:10-116](file://DEPLOY.md#L10-L116)
- [DEPLOY_PROD.md:33-46](file://DEPLOY_PROD.md#L33-L46)
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
## 核心组件
- 后端应用启动与健康检查
- 应用通过HTTP服务器监听配置端口,提供 /health 健康检查接口;启动时初始化数据库连接、Redis连接、存储连接,并注册路由与队列处理器。
- 配置体系
- 通过dotenv加载 .env;模型配置来自 models.json;支持多厂商TTS与文本模型自动切换。
- 反向代理
- 生产使用宝塔管理Nginx;开发使用Docker Compose运行Nginx并代理至宿主机3000端口。
- 自动化部署
- webhook服务接收Gogs/Gitea推送,校验签名后拉取代码并执行部署脚本,最终通过PM2管理后端进程。
章节来源
- [server/src/app.ts:91-98](file://server/src/app.ts#L91-L98)
- [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192)
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186)
- [server/webhook-deploy.py:79-138](file://server/webhook-deploy.py#L79-L138)
## 架构总览
下图展示生产与开发两种部署形态的关键交互:
```mermaid
graph TB
subgraph "开发环境"
D_NGINX["Docker Nginx
bookapi.conf -> host:3000"]
D_APP["后端容器
dist/app.js"]
D_DB["MySQL 容器"]
D_REDIS["Redis 容器"]
end
subgraph "生产环境"
P_NGINX["宝塔 Nginx
book.rrbrr.com -> /h5
bookapi.rrbrr.com -> 3100"]
P_FE["前端构建产物
/data/ai/audio/frontend/build/h5"]
P_APP["PM2 管理后端
dist/app.js"]
P_DB["MySQL 容器/主机"]
P_REDIS["Redis 容器/主机"]
P_OSS["阿里云 OSS"]
end
subgraph "自动化"
WEBHOOK["webhook-deploy.py"]
DEPLOY["deploy-prod.sh / deploy.sh"]
end
D_NGINX --> D_APP
D_APP --> D_DB
D_APP --> D_REDIS
P_NGINX --> P_FE
P_NGINX --> P_APP
P_APP --> P_DB
P_APP --> P_REDIS
P_APP --> P_OSS
WEBHOOK --> DEPLOY
DEPLOY --> P_APP
DEPLOY --> P_NGINX
```
图表来源
- [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)
- [DEPLOY_PROD.md:146-239](file://DEPLOY_PROD.md#L146-L239)
- [server/webhook-deploy.py:38-78](file://server/webhook-deploy.py#L38-L78)
- [deploy.sh:178-201](file://deploy.sh#L178-L201)
## 详细组件分析
### 组件A:后端应用启动与健康检查
- 启动流程要点
- 初始化Sentry错误监控
- 连接数据库(Prisma)
- 测试Redis与存储连接
- 初始化订阅套餐、WebSocket
- 监听配置端口,输出启动日志
- 注册优雅关闭钩子,释放资源
- 健康检查
- /health 返回标准响应体,便于Nginx/PM2探活
```mermaid
sequenceDiagram
participant Proc as "PM2/进程"
participant App as "server/src/app.ts"
participant DB as "MySQL"
participant Cache as "Redis"
participant Store as "OSS/本地"
Proc->>App : 启动 dist/app.js
App->>App : initSentry()
App->>DB : connectDatabase()
DB-->>App : OK
App->>Cache : testConnection()
Cache-->>App : OK/失败
App->>Store : testConnection()
Store-->>App : OK/失败
App->>App : initWebSocket()/initQueues()
App->>Proc : 监听配置端口
Proc-->>Proc : /health 健康检查
```
图表来源
- [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192)
章节来源
- [server/src/app.ts:91-98](file://server/src/app.ts#L91-L98)
- [server/src/app.ts:133-192](file://server/src/app.ts#L133-L192)
### 组件B:配置与环境变量
- 环境变量加载
- 通过dotenv加载 .env;端口优先级:PORT > SERVER_PORT > 默认值
- 模型配置
- models.json集中管理多厂商模型与默认参数,支持按类型筛选与自动切换
- 关键配置项
- JWT密钥、DashScope/TTS参数、数据库URL、Redis连接、OSS凭据等
```mermaid
flowchart TD
Start(["启动"]) --> LoadEnv["加载 .env"]
LoadEnv --> PortCfg["解析端口配置"]
PortCfg --> ModelsLoad["加载 models.json"]
ModelsLoad --> SwitchCheck{"是否需要模型切换?"}
SwitchCheck --> |是| NextModel["选择下一个可用模型"]
SwitchCheck --> |否| Ready["进入运行阶段"]
NextModel --> Ready
Ready --> End(["完成"])
```
图表来源
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186)
章节来源
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
- [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186)
### 组件C:Nginx反向代理与SSL
- 生产环境(宝塔)
- 前端:book.rrbrr.com -> /data/ai/audio/frontend/build/h5
- 后端:bookapi.rrbrr.com -> 3100
- HTTPS:证书路径与HSTS、HTTP/2、TLS策略配置
- 开发环境(Docker Compose)
- Nginx容器映射80:80,代理到 host.docker.internal:3000
```mermaid
flowchart TD
CfgStart["Nginx 配置"] --> Prod{"生产环境?"}
Prod --> |是| BT["宝塔 vhost 配置
ssl_certificate/key
/api -> 3100"]
Prod --> |否| Dev["Docker Compose
bookapi.conf -> 3000"]
BT --> Done["生效"]
Dev --> Done
```
图表来源
- [DEPLOY_PROD.md:146-239](file://DEPLOY_PROD.md#L146-L239)
- [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)
章节来源
- [DEPLOY_PROD.md:146-239](file://DEPLOY_PROD.md#L146-L239)
- [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)
### 组件D:自动化部署与回滚
- webhook服务
- 接收Gogs/Gitea推送,校验签名,执行部署脚本
- 部署脚本
- deploy.sh:本地构建后端与前端,同步至服务器,安装依赖,生成Prisma客户端,重启PM2
- deploy-prod.sh:生产专用脚本,检查/安装Node.js,复制生产.env,生成Prisma客户端,PM2启动
- 回滚策略
- 部署前自动创建备份目录,保留前后端目录,回滚时直接恢复对应备份
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Git as "Gogs/Gitea"
participant WH as "webhook-deploy.py"
participant Srv as "服务器"
participant Dep as "deploy-prod.sh"
participant PM2 as "PM2"
Dev->>Git : Push 代码
Git->>WH : POST webhook
WH->>WH : 校验签名
WH->>Dep : 执行部署脚本
Dep->>Srv : rsync/解压/安装依赖
Dep->>PM2 : pm2 restart server
PM2-->>Srv : 服务就绪
```
图表来源
- [server/webhook-deploy.py:79-138](file://server/webhook-deploy.py#L79-L138)
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
- [deploy.sh:54-90](file://deploy.sh#L54-L90)
章节来源
- [AUTO_DEPLOY.md:1-77](file://AUTO_DEPLOY.md#L1-L77)
- [server/webhook-deploy.py:38-78](file://server/webhook-deploy.py#L38-L78)
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
- [deploy.sh:54-90](file://deploy.sh#L54-L90)
## 依赖关系分析
- 后端依赖
- Koa、路由、中间件、Prisma、Sentry、Redis、OSS、队列、WebSocket等
- 前端依赖
- UniApp生态、Vue3、Pinia、vConsole等
- 部署与运维
- PM2、Nginx、宝塔、Docker、rsync、ssh、systemd
```mermaid
graph LR
S_PKG["server/package.json"] --> S_DEPS["后端依赖"]
F_PKG["my-uniapp-vue3/package.json"] --> F_DEPS["前端依赖"]
S_DEPS --> APP_TS["server/src/app.ts"]
S_DEPS --> CFG_TS["server/src/config/index.ts"]
CFG_TS --> MODELS["server/src/config/models.json"]
APP_TS --> PM2["PM2"]
PM2 --> NGINX["Nginx/宝塔"]
```
图表来源
- [server/package.json:1-60](file://server/package.json#L1-L60)
- [my-uniapp-vue3/package.json:1-65](file://my-uniapp-vue3/package.json#L1-L65)
- [server/src/app.ts:1-56](file://server/src/app.ts#L1-L56)
- [server/src/config/index.ts:1-117](file://server/src/config/index.ts#L1-L117)
章节来源
- [server/package.json:1-60](file://server/package.json#L1-L60)
- [my-uniapp-vue3/package.json:1-65](file://my-uniapp-vue3/package.json#L1-L65)
## 性能考虑
- 连接池与并发
- 数据库连接池大小与超时应结合负载评估;生产环境建议开启连接复用与超时控制
- 缓存策略
- Redis作为缓存层,需关注命中率与过期策略;对热点数据进行预热
- 存储与CDN
- 音频/视频文件走OSS,静态资源Nginx缓存;合理设置expires与压缩
- 监控与告警
- 启用Sentry错误监控、性能中间件与日志采集,建立阈值告警
## 故障排查指南
### 容器启动失败
- 检查容器日志
- Docker Compose:查看Nginx容器日志与启动状态
- 端口占用
- 确认宿主机80端口未被占用;若冲突,修改映射或释放端口
- 权限问题
- 确保挂载目录权限正确,避免容器内无法写入
章节来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
### 端口冲突
- 本地开发
- 将Nginx映射端口调整为非80或停止占用进程
- 生产环境
- 确认防火墙与安全组放行端口;宝塔面板检查端口占用
章节来源
- [docker-nginx/bookapi.conf:2-13](file://docker-nginx/bookapi.conf#L2-L13)
- [DEPLOY_PROD.md:348-362](file://DEPLOY_PROD.md#L348-L362)
### 文件权限问题
- 前端静态目录
- 确保Nginx可读;生产环境检查 /data/ai/audio/frontend/build/h5 权限
- 上传与视频目录
- 后端 uploads/public/videos 目录属主与权限需允许Node进程写入
章节来源
- [DEPLOY.md:206-209](file://DEPLOY.md#L206-L209)
- [DEPLOY_PROD.md:310-316](file://DEPLOY_PROD.md#L310-L316)
### 网络连接异常
- 后端无法访问
- 检查PM2状态与端口监听;直接curl 127.0.0.1:端口验证
- Nginx 502
- 检查后端进程、端口监听、Nginx配置语法与重载
章节来源
- [DEPLOY.md:201-204](file://DEPLOY.md#L201-L204)
- [DEPLOY_PROD.md:348-362](file://DEPLOY_PROD.md#L348-L362)
### 数据库连接池问题
- 连接失败
- 检查MySQL容器状态、密码、网络连通;执行SQL验证连接
- 迁移与初始化
- 使用Prisma迁移命令确保schema一致
章节来源
- [DEPLOY_PROD.md:332-346](file://DEPLOY_PROD.md#L332-L346)
- [DEPLOY_PROD.md:291-294](file://DEPLOY_PROD.md#L291-L294)
### 自动化部署脚本调试
- webhook服务
- 校验签名头字段(X-Hub-Signature-256/X-Gogs-Signature/X-Gitea-Signature);确认secret一致
- 查看日志文件与端口监听
- 部署脚本
- 检查rsync排除规则、远程执行顺序、PM2启动参数与环境变量
章节来源
- [AUTO_DEPLOY.md:68-77](file://AUTO_DEPLOY.md#L68-L77)
- [server/webhook-deploy.py:94-106](file://server/webhook-deploy.py#L94-L106)
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
### 环境一致性检查
- 环境变量
- 对比 .env.production 与 .env;核对数据库URL、Redis、OSS、TTS密钥
- 依赖版本
- server/package.json 与 my-uniapp-vue3/package.json 的关键依赖版本
- 构建产物
- 前端构建目录与后端dist目录完整性
章节来源
- [deploy-prod.sh:117-121](file://deploy-prod.sh#L117-L121)
- [server/package.json:1-60](file://server/package.json#L1-L60)
- [my-uniapp-vue3/package.json:1-65](file://my-uniapp-vue3/package.json#L1-L65)
### 服务健康检查与回滚策略
- 健康检查
- /health 接口、PM2状态、Nginx状态、后端端口监听
- 回滚
- 使用备份目录恢复;PM2回滚至上一个版本
章节来源
- [server/src/app.ts:91-98](file://server/src/app.ts#L91-L98)
- [DEPLOY.md:27-59](file://DEPLOY.md#L27-L59)
- [DEPLOY.md:220-250](file://DEPLOY.md#L220-L250)
### 生产环境与开发环境差异
- 端口与域名
- 生产:bookapi.rrbrr.com:3100;开发:bookapi.rrbrr.com:80 -> host:3000
- Nginx管理
- 生产:宝塔vhost;开发:Docker Compose
- 部署方式
- 生产:deploy-prod.sh(含Node.js检查、复制生产.env);开发:deploy.sh
- SSL与证书
- 生产:宝塔证书路径;开发:本地或跳过
章节来源
- [DEPLOY_PROD.md:146-239](file://DEPLOY_PROD.md#L146-L239)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
- [deploy.sh:178-201](file://deploy.sh#L178-L201)
## 结论
通过标准化的部署脚本、清晰的配置体系与完善的自动化流程,本项目可在生产与开发环境中稳定运行。建议持续完善监控与告警、定期演练回滚流程,并在变更前进行充分的环境一致性检查,以降低发布风险。
## 附录
- 常用命令与参考路径
- 后端管理:PM2日志、重启、状态
- Nginx管理:配置测试、重载、重启
- 日志查看:Nginx访问/错误日志、PM2后端日志
- 参考文档
- DEPLOY.md、DEPLOY_PROD.md、AUTO_DEPLOY.md