跳转至

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 闭环。

— 本日志完 —