# 目标与网关连接测试 ## 编辑页草稿测试恢复(2026-10-07) 原因:详情页可测试已保存配置,但 React 目标编辑页曾强制先保存,未调用已有草稿接口,结果也仅以 JSON 展示。 现在目标编辑页通过 `POST /api/v1/targets/test` 测试当前输入,携带 config、accountId,编辑已有目标时另带 targetId。保存与测试共用 payload 转换,留空的已保存秘密不随请求重复提交,由服务端按资源及账号 ID 解析。只校验所选账号及 Sentinel 依赖账号,不因其他未完成账号阻止测试;空名称允许使用服务端测试名称。该操作不保存目标、配置历史或网关运行配置。 SSH 草稿的 draft_host_confirmation 返回指纹时,先显示服务器地址和完整指纹,用户确认才带 hostFingerprint 重试测试接口,不自动信任或保存。集群识别仍要求保存配置。网关草稿测试不再在指定账号不可用时悄悄换成其他账号;多项可测试账号需明确选择。 编辑页与详情页共享 Diagnostics:绿色成功、红色失败、阶段与脱敏轨迹;编辑页结果自动滚动并聚焦。本地缺少账号等前置条件失败显示具体原因。 兼容影响:恢复已有 API 的前端接入,未修改后端协议、数据库格式或迁移。新增浏览器 HTTP fixtures 覆盖未保存草稿、修改地址后的再次测试、SSH 指纹确认,真实隔离管理 API 的保存流程验证已有目标测试请求携带 targetId 且省略密码。既有 `TestTargetDraft*` Go API fixture 测试通过。完整本轮结果见 testing.md;没有进行真实上游服务器验收。 ## 会话阶段未知错误(2026-10-06) 目标测试包含代理及目标协议两个部分,代理握手成功不代表目标协议会话已建立。若观测到 protocol_session 失败但错误类型为 unknown/network/空,返回 target_session,界面显示“目标会话建立失败 · 无法确定”;不能仅凭会话阶段失败断言目标返回无效协议、TLS 错误或密码错误。仅明确 protocol 类型保持 target_protocol,明确认证/权限拒绝仍使用对应分类。已成功的前置阶段继续按实际轨迹显示。 本轮对用户提供的运行服务测试接口进行一次复现:SOCKS5 TCP、方法协商、认证、到目标 TCP 均成功,MySQL protocol_session 失败且 kind=unknown。当前接口没有具体驱动错误,实际 MySQL 失败根因尚未确定;没有改动目标、代理、TLS 或账号配置。分类修复使用隔离 fixture 验证,实际连接问题不能据此宣布修复。 ## 改动原因 草稿测试会让连接结果与后端实际保存的数据产生偏差,尤其是账号密码、出口代理和集群设置。现在目标必须先保存,连接测试只调用已保存目标的测试接口;保存成功后目标编辑页保持打开,便于立即测试和继续调整。 ## 使用方式与行为 在目标服务编辑窗口保存配置后,选择底部的测试账号并点击“测试连接”。只有一个账号时自动选中;多个账号时选择已保存账号。Redis 或 MongoDB 未配置任何账号时不显示测试账号选择器,直接按无上游认证测试。编辑器存在未保存修改、或目标尚未创建时,测试按钮不会发起网络请求,而是提示先保存。 - 使用后端保存的地址、端口、TLS/CA、认证库、集群节点、代理和所选账号。MongoDB 连接串等修改必须保存后才会参与测试。 - 账号密码、私钥或口令由服务端从已保存凭据解析;测试请求不携带草稿配置或明文凭据。 - 测试成功和失败都保留编辑页。保存成功后编辑器刷新为服务端返回的配置视图,并继续保持打开。 - 关闭连接测试结果页会清除编辑器中的本次成功/失败摘要和“实测连接阶段”,避免旧结果继续显示;再次测试会生成新结果。 - 测试不修改配置历史、不保存主机探测记录,也不修改正在使用的网关路由。测试会按现有协议实现连接并认证目标服务;外部服务可能记录连接或认证日志。 SSH/SFTP 仍核对主机身份。已有目标且地址、端口、代理未变时沿用已确认主机密钥;新目标或连接位置改变时先探测公开指纹,不提交认证凭据。用户核对并确认后,再用该指纹固定本次测试连接。此确认仅对本次测试有效,不代替保存后启动网关所需的持久指纹确认;取消可继续编辑。 目标被运行网关引用时仍可保存编辑。若 SSH/SFTP 的主机、端口或出口改变,保存接口会独立返回 `target_host_confirmation` 和候选 SHA256 指纹;用户确认后前端只重试一次,服务端再次探测一致才持久化。草稿测试阶段的 `draft_host_confirmation` 不会被当作保存确认。保存成功后只有新连接使用新目标配置,已有连接不迁移。 ## API 与兼容性 目标测试使用 `POST /api/v1/targets/{id}/test?accountId=...`,只读取后端已保存的目标和账号。接口沿用登录、令牌权限和 CSRF 防护;连接失败返回脱敏错误阶段。草稿测试接口 `POST /api/v1/targets/test` 不再由目标编辑器调用,保留后端兼容性以避免影响其他客户端。 保存接口返回完整资源视图后,前端刷新目标缓存并保留当前编辑页;无 API、数据库格式或迁移变更。测试与网关列表中的已保存目标测试共用服务端连接实现。 验证见 [测试记录](testing.md)。接口协议分派使用记录型 fixture,SSH 身份确认使用本地隔离 SSH 服务;浏览器测试模拟远端结果,不表示已验证所有生产数据库版本。 ## 网关草稿测试 网关新建和编辑弹窗的底部也提供“测试连接”。测试使用当前网关草稿、当前选中的网关账号及其目标映射;Redis 或 MongoDB 无客户端账号时不显示账号选择器,并使用空的上游账号选择。编辑已保存网关时,留空的密码按网关账号 ID 复用已保存凭据。测试不会保存草稿、创建网关、修改历史或启动网关。 新增 `POST /api/v1/proxies/test`,请求包含可选 `proxyId`、`gatewayAccountId` 和 `config`。服务端只在内存中合并草稿,解析目标和资产后复用已保存网关的协议测试流程;单次测试只提交所选网关账号的映射,避免未完成的其他账号阻塞当前测试。接口继续使用登录、令牌权限和 CSRF 防护,连接失败返回脱敏阶段诊断。网关列表上已有的 `POST /api/v1/proxies/{id}/test` 行为不变。