增加非白名单的日志
This commit is contained in:
1 parent
7f4adad7b1
commit
06bb066d82
7 files changed
+332
-28
No files matched your search
+26
-12
@@ -2,28 +2,30 @@
|
||||
|
||||
| 项 | 内容 |
|
||||
| --- | --- |
|
||||
| 最近更新 | 2026-09-06 |
|
||||
| 最近更新 | 2026-09-07 |
|
||||
| 当前分支 | `main` |
|
||||
| 当前阶段 | 对话、SuperAgent、空间 MCP、默认关闭的测试页面、无 Trace 兼容模式与测试环境容器部署基线已完成;7 个 MCP 工具的统一分页代码和自动化验证已完成,真实 PostGIS 与公网分页验收待完成 |
|
||||
| 当前重点 | 部署并验证 MCP 分页契约,再发布“小牟”消防 Profile 提示词,核对具体方案的多工具调用、分页提示和 WGS84 坐标输出 |
|
||||
| 当前阶段 | 对话、SuperAgent、空间 MCP、默认关闭的测试页面、无 Trace 兼容模式、测试环境容器部署基线与兼容 Chat 403 Origin 诊断日志已完成代码基线;7 个 MCP 工具的统一分页代码和自动化验证已完成,真实 PostGIS、公网分页与目标机 Origin 白名单验收待完成 |
|
||||
| 当前重点 | 在目标机用受限 403 诊断日志确认发送方精确 Origin 并完成白名单联调,再部署验证 MCP 分页契约、发布“小牟”消防 Profile,核对具体方案的多工具调用、分页提示和 WGS84 坐标输出 |
|
||||
|
||||
## 1. 当前 Checkpoint
|
||||
|
||||
- 名称:`fire-safety-ymd-mcp-pagination-v1`
|
||||
- 状态:Ready for Review(7 个工具的分页代码、自动化测试和文档已完成;分页版真实 PostGIS 查询、测试服务器部署和公网 SuperAgent 验收待执行)
|
||||
- 目标:为 7 个固定只读 MCP 工具提供兼容现有调用的有界 `limit/offset` 分页,返回过滤后 `total_count`、当前页 `result_count`、`has_more` 和 `next_offset`,确保 Agent 不再把默认前 10/20 条误报为全部结果。
|
||||
- 非目标:替用户提交或推送 Git、直接修改远程服务器、创建数据库容器、修改或迁移生产数据、实现任意 SQL/游标快照分页、改写 Chat 最终回答协议、实现真实用户认证、动态授权、会话持久化或生产审计。
|
||||
- 名称:`fire-safety-ymd-chat-origin-diagnostic-logging-v1`
|
||||
- 状态:代码、针对性自动化与本地全量验证已完成,待提交和测试服务器部署验收
|
||||
- 目标:在兼容 `completion` 返回 403 时提供可复制精确 Origin 的受限日志;普通拒绝记录有界 `origin`,预检拒绝再记录有界方法、请求头名称集合和稳定原因,同时不暴露任何 Secret、请求正文、会话或 Provider 数据。
|
||||
- 非目标:改变 Origin 白名单默认拒绝、放开 `*`、删除或改写 Origin、恢复旧 DashScope 全路径代理、修改 Nginx 保存 Secret、实现真实用户认证、动态授权、持久审计或直接修改远程服务器。
|
||||
|
||||
当前进展:
|
||||
|
||||
- 兼容 Chat 的普通 Origin 拒绝记录 `dashscope_chat_request result=forbidden_origin` 和经过引用/ASCII 转义的有界 `origin`;每个请求 Header 最多保留前 256 个输入字节,超长值追加 `[truncated]` 后再转义。CORS 预检拒绝记录 `result=preflight_forbidden`、有界 `origin`、`preflight_method`、`preflight_headers` 和 `reason`(`origin_missing`、`origin_not_allowed`、`method_not_allowed` 或 `headers_not_allowed`)。成功请求不记录 Origin,日志不记录 `xtoken`、`Authorization`、`Cookie`、prompt/body、会话或 Provider 数据。
|
||||
- 受限部署排障已补充:按 `request_id` 关联 403 响应和 Go 日志;从完整 Origin 确认后,以英文逗号分隔写入 `FIRE_SAFETY_CHAT_ALLOWED_ORIGINS`,每项规范形式为 `scheme://host[:port]`,不含非根路径、查询或片段,禁止 `*`;单个末尾 `/` 会被接受并规范化移除,配置时建议省略。修改代码需 build + recreate,修改环境值也需 recreate;目标服务器仍待实测。
|
||||
- 7 个 MCP 工具均已增加 `limit/offset` schema、服务端校验和稳定 SQL 分页;响应 `data` 仍为数组,metadata 已区分当前页数量与过滤后总量。自动化、竞态、vet 和 Linux 构建通过;开发机当前无法连接 `.env` 中的 PostGIS,分页版真实 SQL 尚未实库复验。
|
||||
- 用户报告测试页面已经能够正常输出内容,并确认对外身份应为“山东省烟台市牟平区森林防火平台 AI 助手小牟”。现有 Profile 更像泛化模板生成器,没有主动形成数据支撑的演练方案,也没有稳定展示工具坐标。仓库已新增可直接粘贴的消防 Profile 提示词 v2,明确“小牟”身份、“数据库事实 + 通用专业规划”的能力定位、坐标输出硬规则、纯文本结果格式、综合方案结构和能力边界;真实 Profile 尚未由用户发布和验收。
|
||||
- `Dockerfile` 使用显式 Go/Alpine 版本的多阶段构建,在构建阶段执行全部 Go 测试,最终镜像只包含静态服务二进制、CA 和时区数据,并以非 root 用户运行。
|
||||
- Docker build 支持通过 `FIRE_SAFETY_BUILD_GOPROXY` 选择目标机可达的可信 Go module proxy;默认仍为官方代理并保留 checksum database,`git` 只存在于 builder,构建代理配置在运行容器中强制清空。
|
||||
- `compose.yaml` 只运行一个 API 实例,从未提交的 `.env` 注入配置,强制清空一次性迁移 DSN,把容器内 8080 发布到宿主机 `127.0.0.1:16587`,并设置健康检查、只读文件系统、权限收紧和日志轮转。
|
||||
- 现有 PostgreSQL/PostGIS 不进入 Compose;同宿主机数据库需要使用容器可达的宿主机地址,且仍需受 `listen_addresses`、`pg_hba.conf` 和防火墙约束。
|
||||
- Nginx 示例增加 HTTP 到 HTTPS 跳转和 HTTP 429 JSON 限流响应,精确反代 `/chat`、`/chat/`、`/chat/app.css`、`/chat/app.js`、兼容 completion 和 `/mcp`,仍不比较、保存或注入 Chat、MCP、SuperAgent 或数据库 Secret。
|
||||
- 运维手册记录 Git 前置条件、服务器目录、Secret 权限、Compose/Nginx 启停、页面开关、Chat/MCP 冒烟、SuperAgent 回调、更新和回滚。
|
||||
- Nginx 示例增加 HTTP 到 HTTPS 跳转和 HTTP 429 JSON 限流响应,精确反代 `/chat`、`/chat/`、`/chat/app.css`、`/chat/app.js`、兼容 completion 和 `/mcp`,仍不比较、保存或注入 Chat、MCP、SuperAgent 或数据库 Secret;代理必须保留客户端 Origin 交给 Go。
|
||||
- 运维手册记录 Git 前置条件、服务器目录、Secret 权限、Compose/Nginx 启停、页面开关、Chat/MCP 冒烟、403 Origin 排障、SuperAgent 回调、更新和回滚。
|
||||
- SuperAgent 无法在其配置中指定 MCP 协议版本;同一 SuperAgent 中 `th-hotel-simple-superagent` 已稳定启用/调用,现场实现不读取 `initialize.params.protocolVersion`,不读取或校验 `MCP-Protocol-Version` Header,并固定返回 `2025-06-18`。消防 MCP 按该 proven profile 兼容:版本字段和 Header 不作为拒绝门禁,响应固定为 `2025-06-18`。这不表示支持任意其他版本,也不是追求最新协议;日志只使用 `direct_success`/`compatibility_success`,不记录原始版本值。
|
||||
- SuperAgent Open API 现在由 `FIRE_SAFETY_SUPERAGENT_INCLUDE_TRACE` 控制消息流查询参数,默认 false。无 Trace 严格成功要求最终 AI 消息 `finish_reason=stop`、非空顶层 `message.final` 和顶层 `end`;Trace=true 时仍要求 `run.completed(status=success)`。无 Trace 不返回公开工具/步骤轨迹,但不等于禁止 Agent 调 MCP。受控诊断中,同一 Key 的 `include_trace=true` 因应用策略返回 HTTP 403 `open_agent_trace_disabled`;改用 false 后,真实探针返回严格成功,兼容 Chat 本地 SSE 也完成 `null -> stop`。公网完整 MCP 对话仍待验证。
|
||||
|
||||
@@ -65,7 +67,7 @@
|
||||
- 服务默认监听 `:8080`;`GET /health` 仍只是 liveness,不访问外部依赖。
|
||||
- 用户对话 API、SuperAgent Open API Adapter、默认关闭的 `/chat` 测试页面和 MCP endpoint 都默认关闭;Chat Bearer、页面手动输入的 xtoken、Open API Key 和 MCP Token 属于三个独立信任方向并禁止复用。
|
||||
- `/api/chat` 已实现单进程内存会话映射、同会话并发 Run 冲突和严格 SSE 最终回答;模拟 Provider 端到端测试通过,真实 SuperAgent 尚未通过该入口联调。
|
||||
- 可选兼容入口已实现截图所示路径、`xtoken`、`input.prompt/session_id` 和 `event: result` 外形;正文仍只在严格成功的 `stop` 事件中出现,不是 DashScope 全量 API。
|
||||
- 可选兼容入口已实现截图所示路径、`xtoken`、`input.prompt/session_id` 和 `event: result` 外形;正文仍只在严格成功的 `stop` 事件中出现,不是 DashScope 全量 API。403 Origin/预检拒绝仅记录有界、引用/转义的诊断字段,不记录 Secret、正文或会话/Provider 数据。
|
||||
- 可选 `/chat` 测试页面已纳入 Go 路由边界:页面开关默认关闭,关闭时 `/chat`、`/chat/`、`/chat/app.css`、`/chat/app.js` 均直接 404;开启时 `/chat` 返回 308 到 `/chat/`,`/chat/` 与 `/chat/app.css`、`/chat/app.js` 提供同源页面资源。页面不嵌入或持久化 Token,用户手动输入 xtoken,页面仅在内存中复用 `session_id`。
|
||||
- `Dockerfile`、`.dockerignore` 和 `compose.yaml` 已建立测试部署基线;容器单实例运行,容器内 8080 仅发布到宿主机 `127.0.0.1:16587`,一次性迁移 DSN 在服务容器中强制为空。
|
||||
- `deploy/nginx/fire-safety-ymd.conf.example` 已将公网页面/资源、兼容对话和 MCP 调用指向宿主机 `127.0.0.1:16587`,再由 Docker 映射到容器 8080;配置不保存或注入任何 Provider/Chat/MCP Secret。目标机仅 `nginx -t` 语法检查已通过,reload、页面资源和 HTTPS 实际响应尚未验证。
|
||||
@@ -83,7 +85,7 @@
|
||||
- 除防火网格外 7 张表缺少 GiST 几何索引;当前 geography 距离表达式的生产索引方案需根据实库查询计划确认。
|
||||
- 水源/设施 `syzt`、水源 `hc_datetime` 等字段的枚举、单位、时区和更新责任人尚未确认。
|
||||
- SuperAgent MCP 的公网 URL 已有现场成功证据:Bearer、`Content-Type`、JSON-RPC 通过,随后记录了 `initialize`、`notifications/initialized`、`tools/list`,并于 2026-09-05 22:35 成功调用 `fire_safety_search_place_candidates`。同一 SuperAgent 的 th-hotel 服务已稳定调用,为 proven profile 参照;消防服务其余 6 个工具、完整多工具链、TLS、网络白名单和 Token 轮换仍待联调。是否发送协议 Header 不构成兼容阻塞。
|
||||
- `/api/chat` 静态 Bearer、兼容路径 `xtoken` 和 `/chat` 测试页面只适用于受控联调,浏览器用户可以看到手动输入的 Token;页面默认关闭,开启时要求 `FIRE_SAFETY_CHAT_ALLOWED_ORIGINS` 包含精确 `https://agent.nianxx.com`。真实用户身份、动态授权、生产速率限制和滥用防护尚未实现。Chat 短凭证仅可通过默认关闭的显式 legacy 开关在受控测试/迁移窗口使用,MCP Token 仍要求至少 32 个可打印 ASCII 字符,三种凭证必须不同。
|
||||
- `/api/chat` 静态 Bearer、兼容路径 `xtoken` 和 `/chat` 测试页面只适用于受控联调,浏览器用户可以看到手动输入的 Token;页面默认关闭,开启时要求 `FIRE_SAFETY_CHAT_ALLOWED_ORIGINS` 包含精确 `https://agent.nianxx.com`,复杂网络下其他浏览器来源须按 403 诊断日志和 Network 面板确认后追加。真实用户身份、动态授权、生产速率限制和滥用防护尚未实现。Chat 短凭证仅可通过默认关闭的显式 legacy 开关在受控测试/迁移窗口使用,MCP Token 仍要求至少 32 个可打印 ASCII 字符,三凭证必须不同。
|
||||
- SuperAgent Trace 策略当前不对本项目开放:同一 Key 请求 `include_trace=true` 返回 403 `open_agent_trace_disabled`;改为 `include_trace=false` 后真实探针已严格成功。无 Trace 只影响工具/步骤轨迹返回和成功判定,不禁止 Agent 调用 MCP;实际消防 Profile 的无 Trace 多工具对话和工具轨迹替代证据仍待公网验收。
|
||||
- 目标公网机器的 Docker/Compose 和 Nginx 版本、配置 include 层级、证书、DNS、安全组及 PostgreSQL 网络拓扑尚未完整验证;用户已开始远程部署,仓库资产与服务器现场配置仍需完成一致性核验。
|
||||
- 目标服务器此前连续两次访问 `proxy.golang.org:443` 均在约 91 秒后超时,随后已通过可达的构建路径完成 Docker 镜像构建;该事实不代表所有外部 HTTPS 都可达。
|
||||
@@ -92,7 +94,7 @@
|
||||
- 当前 `all`/`town_allowlist` 都是服务账号静态范围,不是最终用户级授权;`all` 会授权当前数据库中 MCP 固定查询表内所有镇街和镇街字段为空的记录,身份提供方、角色、租户和精确位置权限尚未确定。
|
||||
- 地名搜索是无索引的有界包含匹配;真实数据量下的耗时、重名率和名称字段质量尚未验证,生产优化可能需要标准地名表、别名词典或 `pg_trgm` 索引。
|
||||
- 镇街或村庄名称可能匹配多条资源/网格;线面只返回只读计算的代表点,不能直接作为真实演练点。
|
||||
- 只实现最小结构化运行日志,没有持久审计、指标、限流网关或数据源版本。
|
||||
- 仅实现结构化运行日志和兼容 Chat 拒绝场景的有界诊断字段,没有持久审计、指标、限流网关或数据源版本;403 日志不是最终审计方案。
|
||||
- 路线规划缺少路网拓扑、坡度、路面、宽度、车辆限制、封路、实时火场和天气数据。
|
||||
- 队伍集结缺少正式集结点、实时定位、战备状态、人员/车辆/装备和容量数据。
|
||||
- `fire-safety-ymd` 正式 module path 与 CI/部署 Go 版本仍待确认。
|
||||
@@ -109,6 +111,7 @@
|
||||
- 在目标机替换安全 App ID、执行 `nginx -t` 后 reload,并验证 TLS、HTTP 到 HTTPS 跳转、429 和未列出路径 404。
|
||||
- 验证页面开关关闭时 `/chat`、`/chat/`、`/chat/app.css` 和 `/chat/app.js` 均直接返回 404;开启并 recreate 后 `/chat` 返回 308、`/chat/` 返回 200,两个资源也返回 200;页面 Origin 白名单包含 `https://agent.nianxx.com`。
|
||||
- 使用无敏感信息的问题验证兼容首轮 `null -> stop`、后续 `session_id` 复用、错误 xtoken、断流和超时。
|
||||
- 验证兼容 Chat 403 Origin/预检日志:仅拒绝场景记录有界、引用/转义后的 Origin;预检附有界方法、请求头名称集合和原因;日志不出现 Token、Cookie、prompt/body、会话或 Provider 数据。
|
||||
- 使用浏览器测试页面手动输入静态测试 xtoken,确认页面不写入 Token、同源发送兼容 completion SSE,并在第二轮复用内存 `session_id`;页面不作为生产认证。
|
||||
- 配置 SuperAgent 对公网 `/mcp` 的独立 Bearer,验证真实工具调用、TLS 和 warning 保留。
|
||||
- 不在输出、命令历史、Nginx、镜像层或 Git 中记录任何 Secret。
|
||||
@@ -118,6 +121,8 @@
|
||||
- MCP 分页:`gofmt`、`GOCACHE=/private/tmp/fire-safety-ymd-pagination-go-cache go test -count=1 ./...`、`go vet ./...`、`go test -race -count=1 ./...` 和 Linux 静态服务构建通过;覆盖 7 个工具的 schema、默认值、边界校验、透传、当前页/总量元数据、末页、超尾页、稳定排序与只读 SQL 参数化。开发机使用现有 `.env` 尝试真实分页冒烟时无法连接已配置 PostGIS,因此分页版真实 SQL 和公网链路仍待测试服务器验证。
|
||||
- `gofmt -w ./cmd ./internal`:通过。
|
||||
- `GOCACHE=/private/tmp/fire-safety-ymd-go-cache go test -count=1 ./...`:通过;新增覆盖页面开关依赖、开启/关闭路由、HTML/静态资源、安全响应头和应用装配;原有 Chat、SuperAgent、MCP/PostGIS 覆盖继续通过。
|
||||
- `GOCACHE=/private/tmp/fire-safety-ymd-origin-log-go-cache go test -count=1 ./internal/handler -run 'TestDashScopeChatForbidden(OriginLogIsActionableAndSafe|PreflightLogIdentifiesCause)$'`:通过;覆盖 403 Origin 日志的引用/转义、前 256 个输入字节截断边界、恶意换行隔离、预检方法/请求头/原因和 Token/Cookie/prompt 不落日志。
|
||||
- 403 Origin 诊断日志全量回归:`go test -count=1 ./...`、`go vet ./...`、`go test -race -count=1 ./...`、`gofmt -l ./cmd ./internal`、Linux amd64 静态服务构建和 `git diff --check` 均通过;沙箱内完整测试因既有 `httptest` 无权绑定回环端口失败,获准在沙箱外重跑后通过。
|
||||
- `GOCACHE=/private/tmp/fire-safety-ymd-go-cache go vet ./...`:通过。
|
||||
- `GOCACHE=/private/tmp/fire-safety-ymd-go-cache go test -race -count=1 ./...`:通过。
|
||||
- SuperAgent 无 Trace:自动化覆盖 `include_trace=false` 请求参数、最终 AI 消息 `finish_reason=stop` + 非空顶层 `message.final` + 顶层 `end` 成功,以及 Trace=true 仍要求 `run.completed(status=success)`;真实同一 Key 诊断为 true=403 `open_agent_trace_disabled`,false 模式下 `cmd/superagent-probe` 严格成功并返回最终回答,本地兼容 Chat SSE 也完成 `finish_reason=null -> stop`,公网完整 MCP 对话仍待验证。
|
||||
@@ -154,3 +159,12 @@
|
||||
- 状态语义:仅 `total_count=0` 使用 `status=no_results`;总量大于零但请求超出末页时仍为 `status=ok`,返回空数组和 `has_more=false`。
|
||||
- Agent 规则:`has_more=true` 时说明当前展示数/总数;用户要求继续时使用上一页 `next_offset`;综合方案默认不自动拉取全部页。
|
||||
- 实现范围:Domain/Service/Handler/Repository 已统一分页;Repository 使用过滤后的窗口总量、稳定排序和参数化 `LIMIT/OFFSET`,超尾空页通过相同条件的只读首页探测恢复准确 `total_count`。同步更新了项目上下文、架构、空间 MCP Spec、SuperAgent 接入指南、演练证据流程、消防 Profile 提示词和本状态记录。
|
||||
|
||||
## 8. 2026-09-07 Chat 403 Origin 诊断日志 checkpoint
|
||||
|
||||
- 名称:`fire-safety-ymd-chat-origin-diagnostic-logging-v1`
|
||||
- 状态:Handler 实现、针对性自动化与本地全量回归已完成;提交、目标机重建和公网 Origin 白名单验收待完成。
|
||||
- 诊断契约:普通兼容 Chat POST 仅在非空 Origin 不被允许时记录 `result=forbidden_origin` 与有界 `origin`;预检拒绝记录 `result=preflight_forbidden`、`origin`、`preflight_method`、`preflight_headers` 和稳定 `reason`。每个请求 Header 最多保留前 256 个输入字节,超长值追加 `[truncated]` 后再引用/ASCII 转义,不能伪造额外日志行。
|
||||
- 安全边界:诊断字段仅用于定位来源,不改变授权;成功请求不记录 Origin,任何场景均不记录 `xtoken`、`Authorization`、`Cookie`、prompt/body、会话或 Provider 数据。日志无持久审计、保留周期和访问角色设计,生产前仍需另行审查。
|
||||
- 白名单契约:从完整、可信的浏览器 Network Origin 或未截断日志确认后,才把规范形式 `scheme://host[:port]` 写入 `FIRE_SAFETY_CHAT_ALLOWED_ORIGINS`;多个来源英文逗号分隔,不得带非根路径、查询或片段,也不得使用 `*`;单个末尾 `/` 会被接受并规范化移除,配置时建议省略。修改 `.env` 需 recreate;修改代码需 build + recreate;目标服务器真实日志、Nginx 链路和公网联调仍待验证。
|
||||
- 本地验证:目标 Handler 回归、全量测试、竞态测试、vet、格式检查、Linux amd64 静态服务构建和 diff 检查均通过;目标机 Docker build/recreate、Nginx reload、浏览器实际 Origin、复杂网络来源和公网 HTTPS 响应尚未形成证据。
|
||||
Reference in new issue
Block a user