配置管理
本文引用的文件
- server/src/config/index.ts
- server/src/config/models.json
- server/src/config/models-validator.ts
- server/prisma/schema.prisma
- server/prisma/migrate-genstage.ts
- server/prisma/sync-genstage.ts
- server/prisma/migrate_publish.sql
- server/prisma/seed-test-user.js
- server/src/app.ts
- server/src/middleware/cache.ts
- server/src/services/redis.service.ts
- server/src/services/storage.service.ts
- server/src/models/index.ts
- server/package.json
目录
- 简介
- 项目结构
- 核心组件
- 架构总览
- 详细组件分析
- 依赖关系分析
- 性能考量
- 故障排查指南
- 结论
- 附录
简介
本文件系统性梳理 AI 有声书生成平台的配置管理体系,覆盖以下方面:
- 配置文件组织与加载机制(环境变量、模型配置、默认值)
- 配置合并策略与作用域边界(数据库、AI 模型、缓存、存储)
- 配置验证与类型检查(模型可用性验证)
- 运行时配置更新策略(存储模式切换、缓存中间件)
- Prisma ORM 的配置管理、迁移与种子数据
- 最佳实践(敏感信息保护、环境隔离、热更新)
项目结构
后端采用 Koa 应用入口集中初始化,配置集中在 server/src/config,数据库模型由 Prisma 定义与迁移驱动。
graph TB
A["应用入口<br/>server/src/app.ts"] --> B["配置中心<br/>server/src/config/index.ts"]
B --> C["模型配置(JSON)<br/>server/src/config/models.json"]
A --> D["数据库连接<br/>server/src/models/index.ts"]
D --> E["Prisma Schema<br/>server/prisma/schema.prisma"]
A --> F["缓存服务<br/>server/src/services/redis.service.ts"]
A --> G["存储服务<br/>server/src/services/storage.service.ts"]
A --> H["中间件缓存<br/>server/src/middleware/cache.ts"]
图示来源
- server/src/app.ts:1-194
- server/src/config/index.ts:1-117
- server/src/config/models.json:1-186
- server/src/models/index.ts:1-15
- server/prisma/schema.prisma:1-472
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
- server/src/middleware/cache.ts:1-98
章节来源
- server/src/app.ts:1-194
- server/src/config/index.ts:1-117
核心组件
- 配置中心:统一加载 .env、聚合模型配置、导出运行时配置对象;提供模型选择、切换与默认值。
- 模型配置与校验:models.json 定义供应商与模型清单,models-validator 提供批量可用性验证与报告。
- 数据库与迁移:Prisma schema 定义数据模型,迁移脚本负责字段演进与状态同步。
- 缓存与存储:Redis 作为缓存层,StorageService 统一封装 OSS/本地存储切换。
- 应用入口:集中初始化数据库、缓存、存储、队列、WebSocket,并暴露健康检查与指标接口。
章节来源
- server/src/config/index.ts:1-117
- server/src/config/models-validator.ts:1-178
- server/prisma/schema.prisma:1-472
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
- server/src/app.ts:132-194
架构总览
配置体系围绕“环境变量 + JSON 模型配置 + 运行时注入”的组合展开,形成可验证、可切换、可迁移的配置闭环。
graph TB
subgraph "配置层"
ENV[".env 环境变量"] --> CFG["配置中心 config 对象"]
JSONCFG["models.json 模型清单"] --> CFG
CFG --> MODELS["模型集合/默认模型/切换逻辑"]
end
subgraph "运行时"
APP["应用入口 app.ts"] --> CFG
APP --> DB["数据库连接"]
APP --> REDIS["Redis 缓存"]
APP --> STORE["存储服务"]
APP --> ROUTES["路由注册与中间件"]
end
subgraph "持久化与治理"
PRISMA["Prisma Schema"] --> DB
MIG1["迁移脚本 migrate-genstage.ts"] --> PRISMA
MIG2["迁移脚本 sync-genstage.ts"] --> PRISMA
SEED["种子脚本 seed-test-user.js"] --> PRISMA
end
CFG --> MODELS
MODELS --> APP
图示来源
- server/src/config/index.ts:1-117
- server/src/config/models.json:1-186
- server/src/app.ts:132-194
- server/prisma/schema.prisma:1-472
- server/prisma/migrate-genstage.ts:1-127
- server/prisma/sync-genstage.ts:1-158
- server/prisma/seed-test-user.js:1-82
详细组件分析
配置中心与加载机制
- 环境变量加载:优先加载项目根目录 .env,随后按模块化键名覆盖默认值。
- 模型配置:读取 models.json,扁平化为统一模型列表,支持按类型过滤、启用筛选、默认模型与语音配置。
- 默认值与回退:对端口、JWT、TTS 参数、上传大小等提供明确默认值,避免空值导致的异常。
模型切换策略:基于错误消息关键词判定是否需要切换模型,提供“下一个可用模型”选择器。
flowchart TD
Start(["启动"]) --> LoadEnv["加载 .env"]
LoadEnv --> LoadModels["读取 models.json 并扁平化"]
LoadModels --> BuildCfg["构建 config 对象<br/>含端口/JWT/数据库/TTS/模型/上传"]
BuildCfg --> ExportCfg["导出配置对象"]
ExportCfg --> UseInApp["应用入口使用配置"]
UseInApp --> End(["完成"])
图示来源
- server/src/config/index.ts:1-117
- server/src/config/models.json:1-186
章节来源
- server/src/config/index.ts:1-117
- server/src/config/models.json:1-186
模型配置与验证
- 模型清单:vendors 定义供应商、基础 URL、API 类型与模型列表;每条模型包含输入类型、上下文窗口、最大输出、温度、启用状态等。
- 默认模型:textGeneration、tts.defaultModel、tts.defaultVoice 在 JSON 中声明,运行时注入到 config。
- 可用性验证:models-validator 通过 LangChain OpenAI 客户端对 text 类模型进行连通性测试,记录耗时与错误;非 text 类模型标注“待验证”,并将报告写入 model-validation-report.json。
类型维度验证:支持按 text/tts/image/video 维度单独验证。
sequenceDiagram
participant CLI as "命令行"
participant Validator as "models-validator.ts"
participant Config as "config/index.ts"
participant LLM as "LangChain OpenAI"
participant FS as "文件系统"
CLI->>Validator : 运行验证(全部/按类型)
Validator->>Config : 读取启用模型列表
loop 遍历模型
Validator->>LLM : 调用测试(仅text)
alt 成功
LLM-->>Validator : 响应
else 失败
LLM-->>Validator : 错误(含HTTP/语义)
end
end
Validator->>FS : 写入 model-validation-report.json
Validator-->>CLI : 输出汇总与报告路径
图示来源
- server/src/config/models-validator.ts:1-178
- server/src/config/index.ts:1-117
章节来源
- server/src/config/models-validator.ts:1-178
- server/src/config/models.json:1-186
数据库与迁移
- Prisma Schema:以 provider=mysql、url=env("DATABASE_URL") 形式声明数据源,定义用户、订单、播放记录、书籍章节、视频工程、订阅计划、Token 用量等模型。
- 迁移脚本:
- migrate-genstage.ts:将旧状态字段映射到新的 genStage 字段,处理书籍与章节的状态推断与失败标记。
- sync-genstage.ts:使用安全转换函数同步现有数据,避免并发冲突,并做联动回退检查。
- migrate_publish.sql:补充视频发布模块相关表结构(平台账号、发布任务)。
种子脚本:seed-test-user.js 创建或升级测试用户与偏好,便于本地联调。
flowchart TD
S["启动迁移脚本"] --> ReadOld["读取旧字段状态"]
ReadOld --> InferNew["推断新 genStage"]
InferNew --> Apply["写入新字段(genStage/failedStage)"]
Apply --> Verify["一致性校验/回退检查"]
Verify --> Done["完成"]
图示来源
- server/prisma/schema.prisma:1-472
- server/prisma/migrate-genstage.ts:1-127
- server/prisma/sync-genstage.ts:1-158
- server/prisma/migrate_publish.sql:1-43
- server/prisma/seed-test-user.js:1-82
章节来源
- server/prisma/schema.prisma:1-472
- server/prisma/migrate-genstage.ts:1-127
- server/prisma/sync-genstage.ts:1-158
- server/prisma/migrate_publish.sql:1-43
- server/prisma/seed-test-user.js:1-82
缓存与存储配置
- 缓存中间件:基于 RedisService,支持自定义 TTL、键前缀与键生成器;命中返回缓存,未命中执行请求并缓存成功响应。
- Redis 服务:从环境变量读取主机、端口、密码、DB 索引,内置重试策略与连接状态管理;提供 get/set/getJSON/setJSON/del/delPattern 等常用操作。
存储服务:从 STORAGE_TYPE 读取存储类型(oss/local),统一封装上传/下载/删除/签名 URL 等能力;OSS 模式下委托 oss.service,本地模式下写入 uploads 目录并通过静态路由暴露。
classDiagram
class RedisService {
-client
-connected
+isAvailable() boolean
+get(key) Promise~string|null~
+set(key, value, ttl) Promise~boolean~
+getJSON(key) Promise~T|null~
+setJSON(key, value, ttl) Promise~boolean~
+del(key) Promise~boolean~
+delPattern(pattern) Promise~boolean~
+hset(key, field, value) Promise~boolean~
+hget(key, field) Promise~string|null~
+hgetall(key) Promise~Record~string,string~|null~
+incr(key) Promise~number~
+expire(key, seconds) Promise~boolean~
+exists(key) Promise~boolean~
+testConnection() Promise~boolean~
+disconnect() Promise~void~
}
class StorageService {
-storageType
+setStorageType(type)
+getStorageType() StorageType
+uploadAudio(localPath, audioId) Promise~string~
+uploadVideo(localPath, videoId) Promise~string~
+uploadCover(localPath, bookId) Promise~string~
+uploadFile(localPath, category, id) Promise~string~
+uploadBuffer(buffer, objectKey, contentType) Promise~string~
+deleteFile(url) Promise~void~
+deleteDirectory(prefix, id) Promise~void~
+downloadFile(url) Promise~Buffer~
+getSignedUrl(url, expires) Promise~string~
+testConnection() Promise~boolean~
}
RedisService <.. CacheMiddleware : "被中间件使用"
StorageService <.. App : "被应用初始化"
图示来源
- server/src/services/redis.service.ts:1-274
- server/src/middleware/cache.ts:1-98
- server/src/services/storage.service.ts:1-278
章节来源
- server/src/middleware/cache.ts:1-98
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
应用入口与配置使用
- 启动流程:初始化 Sentry、连接数据库、测试 Redis 与存储、初始化订阅套餐、启动 WebSocket、注册路由、启动队列处理器并恢复中断任务。
- 健康检查与指标:/health 返回服务健康状态;/api/metrics 暴露性能指标。
静态资源:/uploads 挂载上传目录,/videos 挂载公共视频目录。
sequenceDiagram
participant Boot as "应用启动"
participant Sentry as "Sentry 初始化"
participant DB as "数据库连接"
participant Cache as "Redis 连接测试"
participant Store as "存储连接测试"
participant WS as "WebSocket 初始化"
participant Routes as "路由注册"
participant Queue as "队列处理器"
Boot->>Sentry : initSentry()
Boot->>DB : connectDatabase()
Boot->>Cache : redisService.testConnection()
Boot->>Store : storageService.testConnection()
Boot->>WS : initWebSocket(server)
Boot->>Routes : 注册各模块路由
Boot->>Queue : initBookGenerationQueue()/resumeInterruptedTasks()
Boot-->>Boot : 监听端口并打印配置摘要
图示来源
- server/src/app.ts:132-194
- server/src/models/index.ts:1-15
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
章节来源
- server/src/app.ts:132-194
- server/src/models/index.ts:1-15
依赖关系分析
- 配置依赖:config/index.ts 依赖 dotenv 读取 .env,依赖 models.json 提供模型清单;导出的 config 被 app.ts、中间件与服务广泛使用。
- 数据库依赖:app.ts 依赖 models/index.ts 进行数据库连接;Prisma schema 与迁移脚本共同维护数据结构演进。
- 缓存与存储:中间件 cache.ts 依赖 redis.service;应用入口依赖 storage.service;两者均从环境变量读取配置。
工具链:package.json 声明 dotenv、prisma、@prisma/client、ioredis、langchain 等依赖,支撑配置加载、ORM、缓存与模型调用。
graph LR
Pkg["package.json 依赖声明"] --> Dotenv["dotenv"]
Pkg --> Prisma["prisma/@prisma/client"]
Pkg --> Redis["ioredis"]
Pkg --> LangChain["@langchain/*"]
Dotenv --> Cfg["config/index.ts"]
Cfg --> Models["models.json"]
Cfg --> App["app.ts"]
App --> RedisSvc["redis.service.ts"]
App --> StoreSvc["storage.service.ts"]
App --> ModelsIdx["models/index.ts"]
ModelsIdx --> PrismaSchema["prisma/schema.prisma"]
图示来源
- server/package.json:1-60
- server/src/config/index.ts:1-117
- server/src/config/models.json:1-186
- server/src/app.ts:132-194
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
- server/src/models/index.ts:1-15
- server/prisma/schema.prisma:1-472
章节来源
- server/package.json:1-60
- server/src/config/index.ts:1-117
性能考量
- 缓存命中率:通过中间件 TTL 与键前缀控制热点数据缓存,减少重复计算与外部调用。
- 连接池与重试:Redis 服务具备指数退避重试策略,降低瞬时故障对业务的影响。
- 数据库连接:Prisma 客户端在应用启动时建立连接,避免每次请求重复握手。
- 存储模式:本地存储适合开发调试,OSS 适合生产高可用与扩展性。
[本节为通用指导,无需具体文件引用]
故障排查指南
- 模型不可用:运行模型验证脚本,查看 model-validation-report.json,定位认证失败、限流或网络问题。
- 缓存异常:确认 Redis 连接状态与可用性,检查中间件是否被正确挂载,关注键空间与 TTL 设置。
- 存储异常:切换 STORAGE_TYPE 并测试连接,核对 OSS 凭证或本地目录权限。
- 数据迁移:若 genStage 显示异常,先执行 sync-genstage.ts,再检查回退逻辑;发布模块缺失表时执行 migrate_publish.sql。
- 应用启动失败:查看数据库连接日志、Redis/存储测试输出与队列关闭流程,结合 Sentry 错误日志定位根因。
章节来源
- server/src/config/models-validator.ts:1-178
- server/src/services/redis.service.ts:1-274
- server/src/services/storage.service.ts:1-278
- server/prisma/sync-genstage.ts:1-158
- server/prisma/migrate_publish.sql:1-43
- server/src/app.ts:132-194
结论
该配置管理体系以环境变量与 JSON 配置为核心,结合运行时注入与验证机制,实现了模型、数据库、缓存与存储的统一管理。配合完善的迁移与种子脚本,保障了数据结构演进与本地开发体验。建议在生产环境中强化敏感信息保护与环境隔离,并持续完善配置热更新与可观测性。
[本节为总结性内容,无需具体文件引用]
附录
配置项与默认值速览
- 服务器与环境
- 端口:优先使用 PORT/SERVER_PORT,否则默认 3000
- 环境:NODE_ENV,默认 development
- 数据库
- MongoDB URI:MONGODB_URI,默认本地地址
- Prisma 数据源:provider=mysql,url=env("DATABASE_URL")
- JWT
- secret:临时硬编码(建议替换)
- expiresIn:JWT 过期间隔,默认 7d
- 阿里云百炼(DashScope)
- apiKey:DASHSCOPE_API_KEY
- model:DASHSCOPE_MODEL,默认 qwen3-tts-instruct-flash
- voice:DASHSCOPE_VOICE,默认 Cherry
- ttsModels:DASHSCOPE_TTS_MODELS,默认逗号分隔字符串
- useRealtime:DASHSCOPE_USE_REALTIME,默认 false
- realtimeModel:DASHSCOPE_REALTIME_MODEL,默认 qwen3-tts-instruct-flash-realtime
- 模型配置(统一管理)
- vendors:来自 models.json
- list/enabled:运行时生成
- textGeneration.defaultModel:来自 models.json
- tts.defaultModel/defaultVoice:来自 models.json
- 上传
- dir:process.cwd()/uploads
- maxSize:50MB
章节来源
- server/src/config/index.ts:69-117
- server/prisma/schema.prisma:5-8
配置最佳实践
- 敏感信息保护
- 将密钥与令牌放入 .env,严格纳入 .gitignore;生产环境使用密钥管理服务或容器注入。
- 环境隔离
- 开发/测试/生产分别维护独立 .env 文件与数据库实例,避免交叉污染。
- 配置热更新
- 对于存储模式(STORAGE_TYPE)、缓存开关等可在运行时切换的服务,通过服务层方法动态生效(如 storageService.setStorageType)。
- 配置验证
- 定期运行模型验证脚本,生成报告并纳入 CI/CD 检查。
- 运行时可观测
- 启用 Sentry、性能中间件与健康检查接口,结合日志与指标监控配置变更影响。
[本节为通用指导,无需具体文件引用]