feat(feishu): 添加飞书入站事件inbox和混合数据库协调功能

- 实现飞书入站事件持久化inbox机制,支持状态管理、租约锁定和重试退避
- 添加混合数据库基线协调工具,确保平台PostgreSQL结构安全对齐
- 增加运行组件心跳检测和readiness就绪检查机制
- 实现app_ticket事件的安全轮换和验证处理
- 添加生产环境运行编排和fail-closed安全机制
- 支持webhook快速确认和长连接独立进程处理
- 完善个人数据擦除时的待处理事件清理功能
```
This commit is contained in:
2026-07-27 17:14:37 +08:00
parent d7db84571d
commit eb8267ed18
61 changed files with 8703 additions and 183 deletions

View File

@@ -211,3 +211,57 @@
飞书非零业务码和数据库迁移一致性。
6. WHEN 完整验证运行 THEN Ruff、Python 编译检查、Alembic 元数据一致性测试和全部 pytest
测试 SHALL 通过。
### 需求 11混合数据库安全基线
**用户故事:** 作为维护人员,我希望现有未登记 Alembic 版本的混合平台数据库可以安全
协调到当前模型,而不丢失已有平台数据或误操作业务数据库。
#### 验收条件
1. WHEN 协调工具连接数据库 THEN 系统 SHALL 只接受平台 PostgreSQL且不得连接或修改
`LEGACY_DATABASE_URL`
2. WHEN 数据库版本为空且结构符合已审核的混合基线 THEN 系统 SHALL 在事务锁内仅执行
允许列表中的结构补齐、旧约束替换和已确认空表清理。
3. IF 实际结构指纹、数据行数、依赖关系、权限或 Alembic 版本不符合预检 THEN 系统 SHALL
中止且不得留下部分 DDL 或版本记录。
4. WHEN 协调完成 THEN 系统 SHALL 验证 SQLAlchemy metadata 无漂移,再原子登记 Alembic
版本IF 任一步失败 THEN 全部变更 SHALL 回滚。
5. WHEN 常规数据库已经位于受支持 revision THEN 系统 SHALL 继续使用标准 Alembic 升级,
不得重复执行一次性基线协调。
### 需求 12生产运行与就绪判定
**用户故事:** 作为运维人员,我希望 API、飞书事件、调度器和任务执行进程可以持续运行
且系统只在依赖和迁移真正就绪时接收流量。
#### 验收条件
1. WHEN 启用飞书用户功能 THEN 系统 SHALL 明确选择 `webhook``long_connection` 事件入口;
IF 对应凭据或进程未就绪 THEN production 配置或 readiness SHALL 失败关闭。
2. WHEN 使用长连接部署 THEN 运行编排 SHALL 启动独立飞书事件进程,并为 API、事件进程、
scheduler 和 worker 配置重启策略。
3. WHEN scheduler、worker 或长连接属于当前配置期望组件 THEN 系统 SHALL 要求其存在新鲜
heartbeat缺失或过期 SHALL 使 readiness 返回 HTTP 503。
4. WHEN readiness 检查平台数据库 THEN 系统 SHALL 验证当前 Alembic revision 与 head 一致,
而不只执行 `SELECT 1`
5. WHEN 生成部署配置样例 THEN 系统 SHALL 只包含占位符和安全默认值,不得提交真实密钥;
外部 PostgreSQL 部署 SHALL 能避免被 Compose 内部数据库 URL 强制覆盖。
### 需求 13可靠的飞书入站事件
**用户故事:** 作为飞书用户,我希望机器人在临时故障或进程重启后仍能处理我的消息,
同时不会因飞书重复投递而重复执行命令。
#### 验收条件
1. WHEN webhook 或长连接收到已经验证的事件 THEN 系统 SHALL 先以唯一事件键持久化 inbox
状态,再快速确认接收,不得在 webhook 请求内同步等待 AI 或飞书回复。
2. IF 多个进程并发接收相同事件 THEN 系统 SHALL 只创建一个 inbox 记录,并只允许一个
有效租约执行命令。
3. IF 命令执行发生可重试失败或执行进程在完成前退出 THEN 事件 SHALL 回到持久化重试状态,
不得因为 receipt 已登记而永久丢失。
4. WHEN 命令执行成功 THEN 系统 SHALL 原子标记成功;后续重复事件 SHALL 返回已接收且不得
再次执行命令。
5. WHEN 重试超过上限 THEN 系统 SHALL 标记最终失败、保存最小错误摘要并提供运行指标,
不得记录密钥或完整敏感消息内容。