# 技术侧落地方案 ## 目标 本文档用于把当前项目从“可运行”推进到“可公开发布、可持续运维、可支持收费”的技术形态。重点覆盖以下模块: - 安全整改 - Docker 化部署 - 配额和限流 - 用量统计 - 异步任务队列 - 更稳定的缓存策略 - 管理员后台完善 - 监控和日志 本文默认当前项目栈为: - 后端:`FastAPI` - 前端:`PDF.js + 自定义页面` - 数据库:`MySQL` - TTS:本地 `Kororo ONNX` 上游服务 ## 1. 安全整改 ### 目标 让项目达到最基本的公开部署和收费使用标准,避免明显的密码、权限、接口暴露问题。 ### 当前问题 - [config.py](/home/service/reader_pro/config.py:1) 写有默认数据库密码 - 默认管理员账号 `admin/admin` - 密码哈希仍为简单 `sha256` - `CORS = *` - Cookie `secure=False` - 缺少上传、登录、生成接口限流 ### 落地方案 #### 1. 配置安全 改为环境变量加载: - 新增 `.env.example` - 所有数据库、Cookie、TTS 上游地址改为环境变量 - 正式环境禁止提交真实 `.env` 建议变量: - `READER_PRO_DB_HOST` - `READER_PRO_DB_PORT` - `READER_PRO_DB_USER` - `READER_PRO_DB_PASSWORD` - `READER_PRO_DB_NAME` - `READER_PRO_TTS_API_BASE_URL` - `READER_PRO_SESSION_SECRET` - `READER_PRO_ALLOWED_ORIGINS` #### 2. 认证安全 - 密码哈希改为 `bcrypt` 或 `argon2` - 默认不创建弱口令管理员 - 第一次启动通过初始化命令创建管理员 - 登录失败增加限次和冷却 建议实现: - 新增 `scripts/create_admin.py` - 仅在初始化阶段人工创建管理员 #### 3. 接口安全 - 上传接口限制文件大小 - 生成接口限制请求频率 - 管理接口仅管理员可访问 - 增加基础审计日志 #### 4. 浏览器安全 - HTTPS 环境下 Cookie 使用 `secure=True` - 设置 `httponly=True` - 设置 `samesite=lax` 或更严格 - CORS 不再默认全开放 ### 分阶段实现 #### 第一阶段 - 环境变量改造 - 去除默认密码 - 去除默认弱口令管理员 - 升级密码哈希 #### 第二阶段 - 登录和生成接口限流 - 文件上传大小限制 - 基础审计日志 ## 2. Docker 化部署 ### 目标 降低部署成本,提高可复现性,方便开源用户试用,也方便后续商业托管和私有部署。 ### 推荐结构 建议至少提供以下文件: - `Dockerfile` - `docker-compose.yml` - `.env.example` - `deploy/nginx.conf` - `deploy/systemd/` 或部署说明 ### 落地方式 #### 1. 后端镜像 封装 FastAPI 服务: - 安装 Python 依赖 - 暴露服务端口 - 使用 `uvicorn` 或 `gunicorn + uvicorn worker` 建议: - 开发环境可用 `uvicorn` - 生产环境建议 `gunicorn` #### 2. 依赖服务 初期 `docker-compose.yml` 建议包括: - `app` - `mysql` - `redis` - `tts`,如果本地 TTS 也能容器化则一起封装 #### 3. 存储卷 需要挂载的数据目录: - `static/files/` - `audio_cache/` - 日志目录 #### 4. 反向代理 建议由 `Nginx` 负责: - HTTPS - 静态资源缓存 - 请求体大小限制 - 基础限流 ### 分阶段实现 #### 第一阶段 - 单机 `docker-compose` - 一条命令启动 #### 第二阶段 - Nginx 反向代理 - 数据卷标准化 - 生产部署说明 ## 3. 配额和限流 ### 目标 防止免费用户滥用资源,控制 TTS 成本,并为收费功能提供边界。 ### 推荐设计 配额和限流分开设计: - 配额:用户每天/月总可用量 - 限流:单位时间内请求频率限制 ### 配额维度建议 - 每日生成字符数 - 每日生成次数 - 单次最大文本长度 - 同时进行中的任务数 ### 用户等级建议 - 匿名用户:禁止使用或仅试用 - 免费用户:低配额 - Pro 用户:中高配额 - 团队用户:更高配额 ### 数据设计建议 建议新增数据表: - `plan` - `user_plan` - `usage_daily` - `usage_monthly` 核心字段: - `user_id` - `usage_date` - `tts_chars` - `tts_requests` - `audio_seconds` ### 限流实现建议 初期可以基于: - 用户 ID - IP - 接口路径 可用方式: - Redis 计数器 - Nginx 限流 - 应用层中间件 推荐策略: - 登录接口:防爆破 - 注册接口:防批量注册 - `/generate`:防刷资源 - 上传接口:防大文件和频繁上传 ### 分阶段实现 #### 第一阶段 - 每日字符配额 - 单次文本长度限制 - 登录和生成接口限流 #### 第二阶段 - 月度配额 - 套餐绑定 - 后台可调额度 ## 4. 用量统计 ### 目标 支撑配额、后台运营、问题定位和商业化决策。 ### 最低可用统计项 - 日活用户数 - 生成请求数 - 生成字符数 - 音频总时长 - 缓存命中率 - 失败率 - 平均生成耗时 ### 数据来源 建议在每次 TTS 请求完成后记录: - 用户 ID - 文档 ID 或文件名 - 文本长度 - 是否命中缓存 - 音频时长 - 请求开始和结束时间 - 结果状态 ### 建议表结构 - `tts_request_log` - `usage_daily` - `system_metrics_snapshot` ### 后台可展示内容 - 今日生成量 - 本月生成量 - 用户排行 - 峰值时段 - 缓存命中率 - 错误统计 ### 分阶段实现 #### 第一阶段 - 请求日志表 - 每日汇总表 - 管理员后台可查看基础统计 #### 第二阶段 - 趋势图 - 导出 CSV - 套餐使用率和续费辅助数据 ## 5. 异步任务队列 ### 目标 避免长文本生成阻塞接口,提高并发稳定性,便于后续扩容。 ### 什么时候必须上任务队列 以下场景建议引入: - 整页或长段落生成 - 多用户同时生成 - 需要重试机制 - 需要任务状态反馈 ### 推荐架构 建议引入: - `Redis` 作为 broker - `Celery` 或 `RQ` 作为任务队列 如果你想保持轻量,早期建议: - `RQ + Redis` 如果后续需要复杂任务流和计划任务: - `Celery + Redis` ### 任务拆分建议 - 短句请求:可同步返回 - 长文本请求:进入队列异步处理 - 预热缓存:后台异步任务 - 清理缓存:定时任务 ### 用户体验建议 前端展示: - 任务提交成功 - 当前状态:排队中、处理中、已完成、失败 - 可轮询或 WebSocket 更新状态 ### 分阶段实现 #### 第一阶段 - 长文本进入队列 - 返回 `task_id` - 前端轮询任务状态 #### 第二阶段 - 重试机制 - 优先级队列 - 失败重放 ## 6. 更稳定的缓存策略 ### 目标 降低重复生成成本,提升起播速度,提高系统稳定性。 ### 当前缓存方向是正确的 目前已有 `audio_cache/`,说明项目已经具备成本控制基础,但需要进一步规范化。 ### 推荐缓存策略 #### 1. 句级缓存优先 缓存 key 建议由以下内容组成: - 文本内容 - voice - speed - 模型版本 - 音频格式 这样相同句子可直接复用。 #### 2. 缓存层级 - L1:内存元数据缓存 - L2:磁盘音频缓存 - L3:可选对象存储缓存 #### 3. 缓存元数据表 建议增加: - `audio_cache_index` 字段建议: - `cache_key` - `file_path` - `text_length` - `voice` - `speed` - `hit_count` - `created_at` - `last_hit_at` #### 4. 清理策略 - 按最近最少使用清理 - 按总容量阈值清理 - 按过期时间清理 #### 5. 预生成策略 适合热门文档: - 翻页后预生成下一句 - 用户停留当前页时预生成后续句子 ### 分阶段实现 #### 第一阶段 - 统一缓存 key 规则 - 建立缓存索引表 - 加入命中统计 #### 第二阶段 - LRU 清理 - 热点句预生成 - 后台缓存维护任务 ## 7. 管理员后台完善 ### 目标 让后台不只是“用户管理入口”,而是一个可用于运营、限额、排错、客服支持的管理系统。 ### 当前应补的能力 - 用户列表 - 用户状态管理 - 套餐管理 - 用量查询 - 请求日志查看 - 任务查看 - 缓存查看 - 系统运行状态查看 ### 推荐后台页面模块 #### 1. 仪表盘 - 今日活跃用户 - 今日生成次数 - 缓存命中率 - 当前排队任务数 - 错误数 #### 2. 用户管理 - 用户列表 - 搜索用户 - 重置密码 - 启用/禁用 - 查看套餐和使用量 #### 3. 套餐和配额管理 - 创建套餐 - 绑定用户套餐 - 调整配额 - 查看剩余额度 #### 4. 请求与任务中心 - 查看最近生成任务 - 查看失败任务 - 手动重试 - 查看耗时 #### 5. 缓存管理 - 缓存容量 - 命中率 - 热门缓存项 - 手动清理 ### 分阶段实现 #### 第一阶段 - 用户管理 - 基础统计 - 用量查看 #### 第二阶段 - 套餐与任务管理 - 缓存管理 - 系统健康页 ## 8. 监控和日志 ### 目标 让系统在真实用户环境中可观测,能快速发现瓶颈和异常。 ### 日志建议 至少分为: - 应用日志 - 错误日志 - TTS 请求日志 - 管理员操作日志 ### 关键日志字段 - 请求时间 - 用户 ID - 接口路径 - 文件名 - 字符数 - 缓存是否命中 - 耗时 - 状态码 - 错误信息 ### 监控建议 至少监控: - CPU - 内存 - 磁盘 - 请求量 - 错误率 - 平均响应时间 - TTS 队列长度 - 缓存目录容量 ### 推荐实现方式 初期轻量方案: - `Prometheus + Grafana` - `Loki` 或文件日志 更轻量的第一阶段: - 结构化日志写文件 - 定时脚本采样系统指标 - 后台展示最近指标 ### 告警建议 建议对以下情况告警: - TTS 连续失败 - 队列积压过多 - CPU 长时间满载 - 缓存磁盘接近上限 - 数据库连接失败 ### 分阶段实现 #### 第一阶段 - 结构化日志 - 日志分级 - 后台显示最近错误 #### 第二阶段 - Prometheus 指标 - Grafana 面板 - 基础告警 ## 推荐实施顺序 如果按当前项目现实情况推进,建议顺序如下: 1. 安全整改 2. Docker 化部署 3. 配额和限流 4. 用量统计 5. 稳定缓存策略 6. 异步任务队列 7. 管理员后台完善 8. 监控和日志 ## 建议里程碑 ### 里程碑一:可公开部署 - 安全整改完成 - Docker 部署完成 - 限流与基础日志完成 ### 里程碑二:可控试运营 - 配额和统计完成 - 缓存策略增强 - 后台可查看关键数据 ### 里程碑三:可收费运营 - 队列机制完成 - 管理后台完善 - 监控和告警完善 ## 总结 技术侧的重点不是一次把所有系统做重,而是先把“安全、部署、可控成本、可观测”补齐。对于你当前这个 CPU TTS 场景,最优先的是安全整改、Docker 化、配额限流和缓存优化,这几项直接决定你能不能放心开放给用户使用。