docs(i6): UAT closeout, architecture review, Runbook internal token

Made-with: Cursor
This commit is contained in:
2026-04-06 22:46:31 +08:00
parent 841bd3e0bd
commit 78433faa89
5 changed files with 334 additions and 108 deletions
+38
View File
@@ -95,3 +95,41 @@ java -jar license-webhook-ingress-0.1.0-SNAPSHOT.jar
- 应用:回退上一版 JAR 并重启。
- 数据库:Flyway **无自动 down**;回滚需 **人工迁移脚本** 或从备份恢复(生产变更前应备份)。
## 10. I5/I6:内部 Token、Webhook → 平台与轮换
### 10.1 变量对照
| 组件 | 变量 / 配置键 | 说明 |
|------|----------------|------|
| **平台** `delivery-platform-api` | `PLATFORM_INTERNAL_TOKEN``CRAFTLABS_PLATFORM_INTERNAL_TOKEN``platform.internal.token` | 校验入站 `X-Platform-Internal-Token` |
| **Webhook** `license-webhook-ingress` | `CRAFTLABS_PLATFORM_INTERNAL_TOKEN``craftlabs.platform.internal.token` | 出站请求头,**须与平台一致** |
| **Webhook** | `PLATFORM_INTERNAL_BASE_URL``craftlabs.platform.internal.base-url` | 平台根 URL,无尾斜杠;转发 `POST …/internal/v1/callback-events` |
未配置 `base-url` 或 token 时,Webhook **仅落库收据**,不向平台投递(本地可只验 bitanswer token)。
### 10.2 连通性自检(平台已启动)
```bash
# 将 <TOKEN> 与平台环境变量一致
curl -sS -o /dev/null -w "%{http_code}\n" \
-X POST "http://127.0.0.1:8080/internal/v1/callback-events" \
-H "Content-Type: application/json" \
-H "X-Platform-Internal-Token: <TOKEN>" \
-H "Idempotency-Key: runbook-probe-$(date +%s)" \
-d '{"schemaVersion":"1.0","sourceSystem":"BITANSWER","externalMessageId":"runbook-probe-msg","eventType":"probe","rawPayload":{}}'
```
期望:**401** 表示路由可达但 Token 错误;**400** 可能为体缺字段;**200** 且 JSON 含 `inboxId` 表示鉴权与入队逻辑正常。
### 10.3 Token 轮换(简要)
1. 在平台与 Webhook **同时**配置新 Token(滚动窗口内可同时接受旧+新需改代码时另议;**MVP 为单值**,应选维护窗**同步切换**)。
2. 重启 **平台** API,再重启 **Webhook**(避免 Webhook 仍用旧值调用已切换的平台)。
3.**§10.2** 探测;再在 UI **Callback 收件箱** 验证新事件可见。
4. 审计:记录轮换时间与操作人(可另走工单)。
### 10.4 Flyway 历史表
- 平台:`flyway_platform_api`(迁移含 `platform_callback_inbox`、M6 表等)。
- Webhook`flyway_webhook`(收据表)。**同一 PostgreSQL 实例** 下两表共存,**勿**手动改名或合并。