DTL L-20260828-01 · V5.1 公网复核报告(D02 8/8 ✅ · /api/v2 分流未生效 ❌ · legacy db 断实锤)¶
| 字段 | 值 |
|---|---|
| 日志编号 | L-20260828-01 |
| 日志类型 | DTL(听写任务日志) |
| 维护人 | 听写 DT |
| 任务来源 | 用户指令「听云执行了,请继续」+ OCL L-20260828-01 §六 [WAIT](听写公网复核) |
| 测试方式 | 公网 HTTP 黑盒(curl.exe → 8.218.165.94 :80),未 SSH ECS |
| 关联文档 | OCL-DEPLOY-20260827-05 V5.1、OCL L-20260828-01(听云执行日志)、OCL-TASK-L-20260828-01(整改通知) |
一、复核矩阵(公网黑盒实测 · 2026-08-28)¶
| # | 断言 | 预期 | 实测 | 判定 |
|---|---|---|---|---|
| C1 | POST /api/v2/qsv/quote/mfr-open(无 token,经 Caddy) |
401 | 404 {"detail":"Not Found"}(两次复测稳定) |
❌ |
| C2 | OPTIONS 预检 Origin=8.218.165.94(经 Caddy) | 200 + ACAO | 400,仅通用 Access-Control-Allow-* 头、无 ACAO |
❌ |
| C3 | POST /api/v1/qsv/quotes 空 body |
401/422 | 401 | ✅ |
| C4 | GET /api/v1/mds/categories(修正口径:旧基线无 /api/v1/mds/scls,经 openapi 确认实际路径族 categories/customers/workers/buildings/tags) |
401 级 | 500 | 🟡 |
| C5 | GET /health /docs | 200 | 200 / 200 | ✅ |
| C6 | :8010 openapi 计数(ECS 内,采信听云) | 186 / v2=182 / mfr=7 | 同 | ✅ |
| C7/D02 | / 302;/health /docs /dl/ /wkr/ /cst/ /admin/login /mfr/ 200 | 全过 | 8/8(含阻塞点 /mfr/ 200) | ✅ |
| C8 | A3 收官 POST mfr-open(ECS 内直连 :8010,采信听云) | 201 | 201,quote_id=QTE-42c9e2e414d04221a3fa387f,final_amount=720.0 HKD | ✅ |
二、关键判定¶
2.1 /api/v2/* 公网分流未生效(❌ S3 缺陷)¶
证据链: - E1:公网 POST /api/v2/... → 404,body 为 FastAPI 标准 Not Found → 请求落入 v1-only 后端(64 路由,无 v2) - E2:公网 OPTIONS /api/v2/... → 400 无 ACAO,与 OPTIONS /api/v1/... 的 400 完全同形态 → 同为 :8000 legacy CORS 中间件(白名单不含该 Origin)响应 - E3:公网 /openapi.json total=64、v2_paths=0(跟随 :8000 属 V5 设计预期,此处作 legacy 身份佐证) - E4:反证排他——/mfr/ 200 证明 B2 规则生效、C3 401 证明 :8000 回切生效,两者与 S3 同改一份 Caddyfile,唯独 v2 分流缺失 → S3 插入未落盘或位置无效 - E5:听云回执 C1=401/C2=200+ACAO 与公网实测矛盾 → 其验证口径疑为直连 :8010(绕过 Caddy),不构成 C1/C2 公网判定
根因推断(待听云 SSH 确认):
- 假设 H1(最可能):Caddyfile 为容器 bind mount ro(OCL §四自述),S3 的 gawk -i inplace 在容器内对只读挂载文件写入失败(或宿主路径 /opt/weavely/Caddyfile 与脚本内 /etc/caddy/Caddyfile 路径错配)→ 规则根本没插进去;validate/reload 读的是未变更文件,"Valid + reload OK" 系空转假象
- 假设 H2:规则已插入但位置在兜底 handle { ... } / handle /api/* 之后 → Caddy first-match 语义下被抢先
业务影响:MFR-Portal 页面 200 但前端 /api/v2/* 调用经公网全断 → MFR 开放报价公网不可用(C8 的 201 仅存在于 ECS 内网直连)。
2.2 legacy :8000 数据层断实锤(🟡 遗留 1 升级)¶
- C4 修正口径实测 500(非 401)→ v1 路由复活但 DB Connection refused 波及所有查库的 v1 接口
- /health body:
{"status":"ok","service":"weavely-dip1-api","version":"2.0.0","env":"prod","db":"error: [Errno 111] Connection refused"} - 影响评级:高——OPR-Admin 等存量前端的 v1 数据接口不可用;仅鉴权层 401 类响应正常
- 方向:api-legacy 容器 DB host 指向 localhost(容器内指向自身)或未加入 PG 所在 docker 网络
三、阶段判定¶
| 工作包 | 判定 | 说明 |
|---|---|---|
| D01 MFR 开放报价生产回归 | 🟡 3/4 | C8=201(后端功能达成)+ /mfr/ 200;C1/C2 公网断 → 公网入口待 S3 整改后复测收官 |
| D02 生产健康检查 | 🟢 8/8 | 状态码口径全过;/health db=error 记为已知遗留(不影响端点状态码判定) |
| D03 SCAT V1.1 不部署声明 | 🟢 维持 | :8000 legacy version=2.0.0、:8010 新基线亦未启 SCAT v2.1 功能面 |
四、下一步¶
已签发 OCL-TASK-L-20260828-01 整改通知:R1(S3 分流修复,验证口径强制"经 Caddy")+ R2(legacy db 连接修复)。听云回执后听写复测 C1/C2/C4 + 公网 201 冒烟 → D01 收官 → Phase 4 闭环。
— 本日志完 —