Replace active S3 sync with encrypted WebDAV synchronization and independent backups. Support explicit empty passwords and unauthenticated MongoDB, Redis, HTTP and HTTPS targets. Include migration, design and validation documentation. Validation: build and go vet passed; Playwright 113 passed with 4 existing failures. Full Go run reproduced the existing cluster discovery test failure. Preserve unrelated SSH fingerprint changes outside this commit.
47 KiB
测试与版本矩阵
2026-09-22 WebDAV 同步备份替代 S3
- 使用 Go 1.25.0 运行
go test ./... -count=1 -timeout=120s:本次变更涉及的 backup、syncjob、store、api、model、MongoDB/HTTP 协议包均通过;全量仅 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 失败,报cluster has no available primary or router,与本文件此前记录的既有间歇失败一致。本轮未修改该逻辑,不将全量 Go 标记通过。日志 artifacts/webdav-sync/go-test.log。 go vet ./...、npm.cmd --prefix web run build通过,前端只有现有大 chunk 警告。Vite 完成后恢复 web/dist/.gitkeep,再构建 artifacts/webdav-sync/serviceport.exe,未覆盖正式程序。- 设置 SERVICEPORT_E2E_BINARY 指向新程序,使用隔离 SQLite 与 19491/19492 端口:全量 Playwright 113 通过、4 失败(6.4 分钟)。四项仍为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,分别涉及资产草稿、目标字段显示及连接错误文本;与之前合并及空密码版本相同,不宣称全量浏览器通过。日志 artifacts/webdav-sync/full-web.log;最终退出状态见 results.json。
- 新 WebDAV 两项、目标认证七项均在完整浏览器运行中通过;此前 WebDAV/menu-search/target-auth 专项组合 11 项通过(26.3 秒,focused.log)。覆盖响应式布局、保存和秘密清空、冲突确认、独立备份以及实际隔离 API 到本机 WebDAV 上传的链路。
- Go HTTP fixture 覆盖目录和路径编码、Basic/匿名、强 ETag、条件创建/覆盖、拒绝重定向与错误正文泄漏、大小限制、两设备同步与冲突、租约、旧 S3 设置隔离。独立备份测试验证加密可解密、凭据可恢复、文件名唯一、共享文件不被访问且基线/冲突不变;API 测试覆盖跨地址/用户名不继承旧密码、显式清除及会话/CSRF/API Token 边界。
- 协议测试是 Go fixture,端到端 WebDAV 服务是 Node fixture,未连接外部真实 WebDAV 服务,不能据此保证任意服务商的条件写入兼容。智能体只读复核未发现阻断问题;同步和备份共用最近执行状态的边界已写入 docs/webdav-sync.md。
- 测试进程退出后隔离端口已释放;
git diff --check通过。没有部署、提交、修改真实数据库或目标数据。升级说明要求停服备份完整 data 后再运行新版;当前仍保留工作区原有 SSH 指纹改动。
2026-09-22 目标空密码与无认证连接
- Go 1.25.0
go test ./... -count=1 -timeout=120s和go vet ./...均通过,结果记录 artifacts/target-auth/go-result.json。新增模型/API 用例覆盖仅允许指定协议无认证、具名空密码、显式清除、草稿不落库及网关认证保留。 - MongoDB 和 HTTP 使用本机上游 fixture,验证无认证请求、网关错误密码拒绝及 Authorization 不泄漏;Redis 无凭据时跳过 AUTH 由现有 fixture 覆盖,没有连接实际生产服务器。
- 前端构建和新程序构建通过。使用隔离 SQLite/端口运行无认证版本全量 Playwright:112 通过、4 失败(6.4 分钟),日志 artifacts/target-auth/full-web.log。失败为 global-assets-proxy-project:98、kubeconfig-selection:23、target-outbound-selection:3、workspace:98,与此前合并验证相同,涉及资产草稿断言、目标字段显示和连接错误文本,不宣称全量通过。
- 随后与 WebDAV 专项一起运行 target-auth.spec.ts 全部 7 项通过(组合共 11 项,artifacts/webdav-sync/focused.log),包括新建空密码、无认证表单/草稿、旧账号默认模式、显式清除、协议限制及手机布局。浏览器部分远程结果使用模拟,不代表真实目标兼容验证。
- 未部署或修改实际目标数据,保留工作区已有 SSH 跳过指纹改动;本项无需数据库迁移。
2026-09-22 合并 origin/main 943ea75
- 前端
npm.cmd --prefix web run build通过(仅大 chunk 提示);Windows Go 1.25.0 新程序构建通过,恢复并保留 web/dist/.gitkeep。 go test ./... -count=1 -timeout=120s:除 internal/cluster 的 TestMySQLReplicationAndGroupDiscovery/mysql-group-replication 返回cluster has no available primary or router外全部包通过。该失败在合并前已有记录;本次未改集群发现代码。go vet ./...通过。- Linux/amd64、Darwin/amd64 的
go test -c ./internal/desktop通过;仅交叉编译,未在对应系统实际启动。 node scripts/verify-package.mjs artifacts/merge-verification-20260922/package、node scripts/verify-desktop.mjs artifacts/merge-verification-20260922/package/serviceport.exe均通过,覆盖单 EXE、内嵌资源、隔离登录、库内主密钥、自动 TLS、重启与目录迁移。桌面脚本首次在清理阶段重复等待已退出进程,修复后完整重跑通过。- 启动脚本隔离回归使用 Windows PowerShell 运行
scripts/start-dev.test.ps1通过。PowerShell 7 的 Add-Type 不支持测试 fixture 所需 ConsoleApplication;Windows PowerShell 首次又发现 fixture 未创建旧 desktop.lock,改为在隔离目录 OpenOrCreate 后通过。不修改真实数据库或服务。 - Playwright 使用 SERVICEPORT_E2E_BINARY 指定本次新编译程序、隔离 SQLite 和 18681/18682 端口:104 通过、4 失败(6.1 分钟)。失败位于 global-assets-proxy-project、kubeconfig-selection、target-outbound-selection、workspace 各一项,涉及资产草稿断言、目标字段显示及连接错误文本;不将全量浏览器回归标记为通过。TCP 映射、请求诊断元数据、范围维护、保存/标签页和响应式专项均在本轮通过。
- 日志、截图和测试程序位于忽略目录 artifacts/merge-verification-20260922;协议测试使用本机 fixture,并非真实 MongoDB/K8s 生产连接验证。没有部署、推送或真实数据迁移。
以下为历史分支验证记录,不替代本节合并结果。
2026-09-21 TCP 端口映射
- Go 1.25.0 全量命令
go test ./... -count=1 -timeout=120s已运行两次;除internal/cluster的TestMySQLReplicationAndGroupDiscovery外其他包通过。该未改动测试在 mysql-replication / mysql-group-replication 子用例间歇返回cluster has no available primary or router,单独-count=20也出现五次失败。本轮没有修改集群发现逻辑,不将全量 Go 测试标记为通过。日志:artifacts/tcp-go-test.log、artifacts/tcp-go-test-final.log。 - 本次相关 API、model、gateway、outbound、tcpproxy 包测试通过;最后补充断连必须非超时、认证计数不伪造以及出口包装半关闭测试后,model/gateway/outbound/tcpproxy 四包复跑通过。
go vet ./...通过。 - 新测试覆盖 TCP 无账号创建/保存/测试/断开、默认 0.0.0.0、拒绝只读及 TLS 终止、普通协议约束保留、直连/SOCKS5/SSH/K8s 配置、真实 loopback 字节透传与半关闭、取消清理、来源白名单与连接数限制、运行中切换保留旧连接、停服断连及无账号定时健康检查。上游和 SSH/K8s 测试均为本地 fixture,并非生产目标验证。
npm.cmd --prefix web run build通过(仅 chunk 大小警告),Vite 完成后生成 artifacts/serviceport-tcp-forwarding.exe;恢复 web/dist/.gitkeep。使用该新程序和隔离端口/SQLite,TCP、账号级连线、网关路径、断开重连、多对一六项回归通过(20.9s)。检查了 TCP 连线图截图。- 全量浏览器运行中,新增 TCP 用例受到其他测试遗留资源影响,长画布拖拽定位失败;为用例的目标和网关增加独立项目筛选后,与 gateway-management、target-accounts 连续复跑六项通过(17.1s),含本机二进制字节回显。产品源码未因此变化。完整 UI 结果记录见下方补充;不能用专项通过替代全量通过。
- 完整 Playwright:97 通过、10 失败(10.0m,日志 artifacts/tcp-playwright.log)。除上述随后修正并复跑通过的 TCP 测试外,其余九项为此前相同失败集合:account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项。修正测试隔离后未再次运行全量,只复跑上述相关组合;不将完整 suite 标记通过。
- 未替换 bin/serviceport.exe,未操作正式数据,也未提交本次改动。新程序需单独部署后功能才生效。
2026-09-21 MongoDB 网关非 admin 认证库
- Go 1.25.0:
go test ./... -count=1 -timeout=120s、go vet ./...通过。 TestGatewayAuthenticationDatabase覆盖 admin、ttx-xwms-test、speculative SCRAM;拒绝错误密码、未知用户名、空认证库和会话中切换认证库。TestOfficialDriver扩展为两种认证库与读写/只读的四组合,均通过。使用官方 Go 驱动和本地上游 fixture,未连接真实目标,未测试 Java 驱动。npm.cmd --prefix web run build通过(仅 chunk 大小警告);Vite 完成后构建artifacts/serviceport-mongo-authsource.exe,恢复 dist/.gitkeep。- 设置
SERVICEPORT_E2E_BINARY指向该新程序,隔离端口 18381/18382 和临时 SQLite;gateway-connection-path、account-targets、connection-diagnostics 六项 Playwright 通过(12.3s)。本次仅复跑相关浏览器用例,未重跑全量 UI;此前全量失败记录仍保留,不宣称全量 UI 通过。 - 未替换运行中的 bin/serviceport.exe,未修改实际数据库或目标数据。
2026-09-21 网关账号到目标账号的路径测试
-
最终目标多账号常驻展开版本:前端构建后生成 serviceport-multi-account.exe;gateway-connection-path、account-targets、many-to-one、disconnect 五项专项回归通过(18.3s)。account-targets 另行截图复跑一项通过(4.5s),已检查 desktop/mobile 截图;覆盖未选择源时账号可见、选择前后位置稳定、账号级连线及独立映射。
-
前一个 serviceport-account-path.exe 的完整 Playwright 结果为 97 通过、9 失败(9.9m)。失败为 account-editor 一项、global-assets-proxy-project 两项、kubeconfig-selection 一项、target-outbound-selection 一项、workspace-features 三项、workspace 一项,与此前记录的失败集合一致。该全量运行不包含最后的目标账号常驻展开改动,不能代替最终版本的全量验证;最终版本仅运行上述专项回归。两份程序均未部署覆盖正在运行的服务。
-
TestGatewayConnectionUsesAccountMapping与原有TestConnectionErrorsExposeStageWithoutDiagnostic通过,使用隔离 SQLite 和 recording handler;覆盖无默认目标的账号选路、目标凭据/地址/SOCKS5 出口、拒绝未知和禁用账号、测试不改映射。 -
go test ./... -count=1 -timeout=120s(Go 1.25.0)、go vet ./...、前端生产构建通过。构建仅有 chunk 大小警告。 -
account-targets、connection-diagnostics、gateway-connection-path 共六项 Playwright 通过。补充多账号显式选择后,gateway-connection-path 两项复跑通过,验证请求 query、实际目标账号、K8s 资源路径及不泄露凭据/原始错误;单账号拖拽不改其他映射。新增 fixture 最初漏填 TargetTLS=false 被正常拒绝,修正测试配置后通过;多账号选择测试改为点击 Element Plus select 容器后通过。
-
使用新嵌入式 serviceport-account-path.exe、隔离端口/SQLite;完整日志位于 artifacts/mongo-live-check-20260921-160801/account-path-playwright.log。本轮没有真实 MongoDB 连接测试或正式数据变更,不将模拟响应当作真实连接成功。
2026-09-21 资产统一居中弹框
npm.cmd --prefix web run build通过,仅有 chunk 大小警告;恢复.gitkeep后构建 serviceport-asset-dialog.exe。- Go 1.25.0 的
go test ./... -count=1 -timeout=120s与go vet ./...均通过。 - 新增 asset-editor-dialog.spec.ts 两项通过:文件/连接资产与目标弹框尺寸一致、居中、无抽屉、无空页签、底部按钮可见;覆盖 1440/390/320px;取消保留草稿、Escape 放弃、再次打开清空。截图禁用过渡动画后已检查。
- 既有 asset-remarks.spec.ts 一项、usability-assets.spec.ts 两项通过,覆盖上传保存、编辑/清空备注、内联创建回填与父草稿保护。
- 共享弹框复用后,responsive.spec.ts 原先假定全部 connection-editor 都有连接页签和“保存配置”按钮;更新为保留尺寸/滚动/固定操作区断言,仅对存在的页签验证键盘导航,并识别各表单保存按钮。单独重跑 responsive.spec.ts 两项通过,覆盖 320/390/768/1920px。一次组合回归命令被终端 60 秒时限截断并报 EPIPE,不作为通过记录。
- 测试使用 SERVICEPORT_E2E_BINARY 指向新嵌入式程序、隔离 SQLite 和端口。全量执行日志为 artifacts/mongo-live-check-20260921-160801/asset-dialog-playwright.log。未修改真实资产作测试,未停止/覆盖用户运行服务。
- 全量首跑结果为 94 通过、10 失败(9.6 分钟):包括上一轮已失败的 9 项,以及本次共享容器导致 responsive 用例旧假定失效的 1 项。后者更新断言后所在 responsive.spec.ts 两项已单独通过,其余 9 项未在本任务中修复。不将单独复跑结果合并成一次全量通过;git diff --check 通过。
2026-09-21 菜单与资源侧栏切换
npm.cmd --prefix web run build通过(只有既有 chunk 大小警告),构建后恢复.gitkeep并生成 serviceport-sidebar.exe。SERVICEPORT_E2E_BINARY指向该新程序,使用独立 SQLite 和 18181/18182 端口。sidebar-panels.spec.ts两项通过,覆盖桌面/手机、键盘及本地偏好;桌面菜单和资源截图已检查。- 更新既有 DBX 宽度期望,以及 workspace-features/global-assets 用例中的资源视图切换入口。未更改真实业务数据来运行 UI 测试。
- 最新全量 Playwright:93 项通过、9 项失败(9.6 分钟)。侧栏新增两项、DBX 三项、菜单搜索及响应式用例通过。失败为 account-editor、global-assets-proxy-project 两项、kubeconfig-selection、target-outbound-selection、workspace-features 三项和 workspace 的旧诊断断言;涉及小屏表单高度、重复未保存确认、超时和旧显示期望,本轮未扩大范围修复。全量执行日志位于 artifacts/mongo-live-check-20260921-160801/sidebar-playwright.log。不能声明全量浏览器回归通过。
- 嵌入新前端后的全量 Go 测试与 vet 再次通过,git diff --check 通过。新版程序已生成,但未停止或替换用户当前运行的 bin/serviceport.exe。
2026-09-21 MongoDB 兼容握手与真实连接
TestLegacyAndModernHandshake:初次 isMaster/helloOk 协商,连续两次刷新选择正确命令,使用本地 net.Pipe fixture。TestUpstreamSCRAMNegotiationAndEmptyFinish:认证库机制探测、SHA-256 优先、SHA-1 默认、额外空结束交换及异常结束载荷拒绝,使用本地 SCRAM fixture。TestMongoHelloUnsupported:只允许 CommandNotFound 回退,认证、权限和网络错误不能触发回退。- 最新
GOTOOLCHAIN=go1.25.0 go test ./... -count=1 -timeout=120s和go vet ./...均通过。中间一次 cluster MySQL fixture 间歇失败,最新全量通过;不代表间歇性根因已修复。 npm.cmd --prefix web run build已通过(有 chunk 大小警告),不再是此前的 esbuild EPERM 阻塞。构建后恢复 web/dist/.gitkeep,再构建嵌入新前端的隔离测试程序。- 实际使用已保存 Kubeconfig,经 K8s port-forward 对 wall-e-test/statefulset/mongo-shopee:27017 进行握手、SCRAM、buildInfo 查询。用户提供认证库/凭据后成功返回版本 4.1.13、standalone、TLS=false、zlib。保存配置并重新读取后再次成功。未执行业务数据写入。
- Playwright 首轮使用 SERVICEPORT_E2E_BINARY 指向 artifacts/mongo-live-check-20260921-160801/serviceport.exe,独立临时 SQLite 和端口,91 项通过、9 项失败;其中部分工作区用例执行期间又加入了后续侧栏变更,因此以后续 serviceport-sidebar.exe 全量运行结果为准,不将首轮当作干净的对照基线。
2026-09-21 连接路径与分阶段诊断
- 新增
TestMongoFailureStages:本地 net.Pipe fixture 区分 TCP、TLS、hello 拒绝/断连、SCRAM 认证拒绝/交换断连、buildInfo 权限拒绝/断连,不依赖真实服务器。 - 新增 gateway 和 API 白名单阶段测试:保留结构化阶段及内部 cause,未知阶段安全回退,管理响应与错误字符串不泄露凭据和服务器任意诊断文本。
- 新增
connection-diagnostics.spec.ts:阶段中文映射、网络/认证区别、K8s 资产名与资源路径、无敏感内容及未知阶段回退;浏览器用例使用模拟失败响应,不连接真实集群。 - 加入诊断后的全量 Go 测试:除既有 MySQL group-replication fixture 再次间歇失败外,API、gateway、Mongo、model、store 等包均通过;该 fixture 单独重跑通过。
go vet ./...通过。此前资产合并阶段的一轮全量通过,不能据此宣称间歇性测试已修复。 - Vue 类型检查、Node 中执行的阶段区别/安全回退/K8s 路径纯函数断言、
git diff --check通过。Playwright--list成功发现 100 项用例、43 个文件,仅验证用例可发现,不代表执行通过。 - 最后一次
npm.cmd --prefix web run build仍在 Vite/esbuild 启动时报spawn EPERM。没有新前端包、没有部署、没有浏览器 E2E 结果;不能把类型/纯函数检查当作浏览器验证已通过。
2026-09-21 资产合并与目标内联 Kubernetes(当前源码)
- Go 1.25.0:最后一轮
go test ./... -count=1 -timeout=120s和go vet ./...全部通过。期间既有 MySQL group-replication fixture 曾间歇失败;单独重跑和最终全量通过,未修改该集群实现。 - 新增 API/model 回归覆盖:目标不填写 IP 即可保存/草稿测试 StatefulSet、不生成中间代理、内联 Kubeconfig 解析、TLS/直连仍要求地址。存储 fixture 验证资产更新及版本恢复后使用最新内容、清除旧主机指纹、禁止删除被引用资产且不把 Kubeconfig 正文复制到目标记录。
- Vue 类型检查通过;Node 执行 TypeScript 转译后的纯函数断言通过,覆盖目标 payload、不泄漏资产内容、连接引用/直连切换及 K8s 单节点和保活校验。
npm.cmd --prefix web run build的类型检查阶段通过,但 Vite/esbuild 启动被当前环境以spawn EPERM阻止。没有新前端包,未构建/部署含新界面的运行程序,未执行浏览器端到端验证。下方旧版本的成功浏览器记录不代表此合并功能已通过 E2E。- 前端用例按新资产类别、连接字段、StatefulSet 目标直接配置、旧引用兼容和文件更新导航调整。使用隔离 API/模拟响应,不宣称真实 Kubernetes、MongoDB、SSH/SOCKS5 连通性;未操作真实
data或重启服务。
2026-09-21 新建目标选择代理验证
- 新增
target-outbound-selection.spec.ts,先对上一轮构建的程序执行首个用例,确认默认「连接信息」页没有可见的代理选择器;修改后新增 3 项用例通过。 npm.cmd --prefix web run build通过,包含 Vue 类型检查与 Vite 构建,仅有原有主包体积警告。待构建完成后使用 Go 1.25.0 生成artifacts/target-outbound-selection/serviceport.exe,保留web/dist/.gitkeep。- 使用上述新程序、独立数据及 19291/19292 端口执行
target-outbound-selection.spec.ts、kubeconfig-selection.spec.ts、kubernetes.spec.ts、project-scope.spec.ts、target-editor-test.spec.ts,21 项全部通过。覆盖首屏直连/SSH/SOCKS5/K8s 选择、服务类型和页签切换保留引用、Mongo 草稿测试参数、实际 API 保存与重新编辑回读、改回直连、跨项目选择、空列表、不可用引用及 390px 小屏。 - Go 1.25.0:
go test ./... -count=1 -timeout=120s和go vet ./...全部通过,先完成后端检查再执行全量浏览器测试,避免目录清理竞争。 - 全量 Playwright 使用新程序执行
npm.cmd --prefix web test -- --max-failures=3:82 通过、3 失败、8 未运行。失败仍是已记录的account-editor.spec.ts320×568 权限页多出 14px 滚动,以及workspace-features.spec.ts的 URL 参数和搜索/树导航两项超时。 - 对上述未运行的 8 项补跑:
workspace.spec.ts7 项全部通过,覆盖 SSH/SOCKS5 目标配置、共享代理引用、凭据保留与删除保护等;workspace-features.spec.ts的表格列设置用例在对隐藏 checkbox 执行uncheck时超时。再用本次修改前的artifacts/kubeconfig-selection/serviceport.exe单独复跑该列设置用例,同样失败,确认不是本次代理入口引入。两轮合计 89 项通过、4 项既有失败,未扩展修复这些无关功能。 - Mongo 草稿连接结果、跨范围列表和不可用引用场景使用浏览器模拟;三类代理创建、Kubeconfig 资产保存、Mongo 目标保存与切回直连通过隔离 API。未连接真实 MongoDB、SSH/SOCKS5 代理或 Kubernetes 集群;Go 协议测试使用本地 fixture。未替换现用程序或操作真实数据。
git diff --check通过,构建占位文件恢复原样;所有测试结束后确认隔离端口 19291/19292 不再监听。- 验证边界:本轮程序于 2026-09-21 13:21 构建,Go 检查于 13:25 完成。收尾发现
internal/store/audit_shards.go、commands.go、event_shards.go、store.go在 13:34 出现其他修改;本任务未触碰或回退它们,上述构建及测试结果不覆盖这些后续修改。
2026-09-21 Kubeconfig 资产选择验证
- 修改前,在新构建 EXE 上创建“数据库平台 · 正式”的 Kubeconfig,再以“默认项目 · 测试”新建代理,复现资产被范围过滤且无提示/展开入口;回归用例明确失败。
npm.cmd --prefix web run build通过,包含vue-tsc与 Vite 生产构建;仅有原有主包体积警告。构建后保留web/dist/.gitkeep,再使用 Go 1.25.0 构建artifacts/kubeconfig-selection/serviceport.exe,未并发替换嵌入资产。- 使用该新 EXE、独立数据及 19191/19192 端口,
kubeconfig-selection.spec.ts、kubernetes.spec.ts、usability-assets.spec.ts、project-scope.spec.ts共 7 项通过。新增 2 项覆盖跨范围 Kubeconfig 显式选择、排除普通文件、隐藏范围后保留引用、保存代理与 Mongo 目标并回读、空态类型提示、刷新失败重试和 390px 小屏。 - Kubernetes 命名空间/资源查询使用浏览器模拟响应;资产、代理和 Mongo 目标保存经过真实隔离 API。没有调用真实 Kubernetes API 或连接真实 MongoDB,不将 UI/引用验证表述为实时 port-forward 成功。
- Go 1.25.0:
go test ./... -count=1 -timeout=120s和go vet ./...串行复跑全部通过,包括internal/cluster。首次与 Playwright 并发运行时,Go 枚举目录遇到正在清理的web/test-results,报pattern ./...: open web\test-results: The system cannot find the file specified.;待浏览器结束后重跑消除该竞争。协议测试使用本地 fixture,未连接真实数据库或 SSH 服务。 - 全量 Playwright 使用同一新 EXE,执行
npm.cmd test -- --max-failures=3:79 通过、3 失败、8 未运行,达到失败上限后停止。失败与 2026-09-20 已记录情况一致:account-editor.spec.ts的 320×568 权限页多出 14px 滚动,以及workspace-features.spec.ts的 URL 参数、搜索/树导航两项超时;新增 2 项均通过,未修改上述无关功能。 - 未改动用户真实数据、未替换现用程序;测试结束后确认隔离端口 19191/19192 不再监听,
git diff --check通过。
2026-09-21 库内密钥、历史整合与工作区回归
- Go 1.25.0:
go test ./... -count=1 -timeout=120s和go vet ./...全部通过,包含新增库内密钥与离线整合测试。协议测试仍为隔离 fixture。 - 密钥验证覆盖首次入库、无外置密钥文件、重启、只复制主 SQLite 后仍能解密原密码/私钥、缺失/损坏记录不重建、显式环境密钥不匹配拒绝,以及外置文件不自动导入或覆盖。
- 离线工具 fixture 覆盖当前配置优先、独有资源合并、新增网关停止、旧管理员不覆盖、使用不同源密钥时正确重加密、完整备份、准备模式不改源库、应用模式替换主库、旧库与旧密钥保持。流程测试通过注入测试密钥执行,不依赖真实 DPAPI。真实密钥最初在代理环境解密失败,随后用户在原 Windows 会话执行整合成功,详见 历史数据说明。
- 真实整合结果复核:
consolidate-20260920T171719.754430900Z/report.json为applied:true;16 个备份文件及 10 个保留原文件哈希通过。ready/的主库复制件完整性、库内密钥和全部资源解密通过,8 个目标、4 个网关、1 个资产,2 个导入网关停止。实际安装主库在代理环境读取返回EPERM,未直接核对其内容或启动真实服务。 - 前端 vue-tsc/Vite 构建通过并保留
.gitkeep,存在已知 bundle 体积警告。账号编辑器 320×568 全页签以及 URL、搜索导航、列设置专项通过;测试未放宽滚动阈值,使用可见 checkbox 标签并保留状态断言。 node scripts/package.mjs --all完成六目标构建,发布目录artifacts/releases/2026-09-20T16-40-11-688Z-701d60e4/的六份 SHA256 均与清单一致。Windows x64 原生包与本地启动(无外置密钥、可选认证、TLS、重启与搬移)验收通过。Linux/macOS × amd64/arm64 的桌面测试二进制也编译通过,未实机执行;远程 CI 未执行。- 全量 Playwright 使用此次新程序
artifacts/db-key-verification/serviceport.exe,通过SERVICEPORT_E2E_BINARY指定,隔离数据库和端口 18485/24687。首轮 91 通过、4 失败:工作区 helper 仍匹配精简前的白名单说明文字,重试又遇到前次创建的重复 fixture。已同步文案断言并重建两套隔离测试库重跑;首轮目录为artifacts/db-key-verification/full,最终目录为artifacts/db-key-verification/full-final。 - 最终完整运行设置
--retries=0,95 项全部通过(7.0 分钟),包含此前失败的四项工作区/小屏用例及主题切换。测试结束后停止本轮两套隔离服务;未部署到真实数据目录。
2026-09-20 三平台与明文主密钥验证
- Go 1.25.0:
go test ./... -count=1 -timeout=120s、go vet ./...全部通过,包含 Windows 本地密钥、运行锁、缺失密钥保护,以及旧 DPAPI 文件不转换且保留的回归。协议测试使用本地 fixture,未连接真实上游服务器。 node scripts/build-web.mjs --force完成前端类型检查及 Vite 生产构建,保留web/dist/.gitkeep;仅有 bundle 体积警告。之后执行node scripts/package.mjs --all,生成 Windows/Linux/macOS × amd64/arm64 六个平台的独立程序,文件校验和均与清单一致。- Windows x64 使用此次实际程序通过单文件发布验收(版本信息、内嵌网页、隔离启动和登录)及
verify-desktop.mjs(免登录、可选管理员设置、自动 TLS、未加密密钥持久化、认证重启和搬移数据)。其他五个目标为编译验证。另对 Linux/macOS × amd64/arm64 的internal/desktop测试代码执行go test -c,全部编译成功,未在异系统执行。 - Node 脚本语法、三个 Unix shell 入口的 Git Bash
bash -n、CI YAML 解析及矩阵检查、git diff --check通过。Windows 启动脚本 fixture 回归在Get-CimInstance Win32_Process遇到当前环境权限拒绝,未完成源码启动和备份验收;不计为通过。远程三系统 CI 已配置但未执行。 - 产物:
artifacts/releases/2026-09-20T13-38-02-849Z-dc352132/;浏览器验证使用复制出的新程序artifacts/platform-verification/serviceport.exe,通过SERVICEPORT_E2E_BINARY指定,测试服务使用隔离数据及 8485/14687 端口。未部署到真实数据目录,未转换或删除实际master-key.dpapi。 - 全量 Playwright 95 项、不重试:90 通过、5 失败。最后的主题用例在
browser.newContext阶段因浏览器关闭失败,用新浏览器单独复跑后通过;剩余 4 项为此前已在旧程序复现的账号权限页 320×568 多出 14px 滚动,以及workspace-features.spec.ts的 URL 参数、搜索/树导航、表格列设置三项超时。整套结果不计为通过。本轮环境保存、请求报错信息、SQLite、RabbitMQ 版本、Sentinel 认证用例均通过。报告目录为artifacts/platform-verification/playwright和artifacts/platform-verification/theme。
2026-09-20 Windows 多路径启动验证
- Go 1.25.0:
go test ./internal/desktop ./cmd/serviceport -count=1 -timeout=120s通过,覆盖当前目录新库、AppData 已有库、双库优先级、相对/绝对显式路径、不依赖 AppData 环境、手动主密钥模式不遍历、目录占位错误、已有库缺密钥,以及data-path命令无初始化副作用与参数校验。 powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/start-dev.test.ps1通过:临时含空格项目、异目录调用、调用者目录恢复、构建锁、BuildOnly/FullCheck/RebuildWeb、构建/路径解析失败隔离;源码/发布入口不强制数据路径且保留显式设置;完整备份实际选中目录,并拒绝递归备份和被其他实例占用的数据。该脚本使用只记录环境变量的可执行 fixture,不启动真实服务。go vet ./...、npm.cmd --prefix web run build、git diff --check通过。Vite 报告主包体积警告,未作为失败处理;构建后保留web/dist/.gitkeep,待 Vite 完成后再构建嵌入前端的新 EXE。node scripts/verify-desktop.mjs artifacts/path-validation/serviceport.exe使用此次新构建程序及 Edge 无头浏览器,通过当前目录创建、首次账号设置、自动 TLS、DPAPI 密钥保持、认证重启,以及将测试库移至隔离 AppData 后复用旧账号且不另建本地库。原桌面脚本的管理员字段定位已更新为实际表单标签“登录账号/登录密码”。- 全量
go test ./... -count=1 -timeout=120s未全绿:未改动的internal/cluster中TestMySQLReplicationAndGroupDiscovery出现“无可用主节点”,单包复跑还出现拓扑不符;其余包通过。协议覆盖全部为本地 fixture,未连接真实 MySQL/MongoDB/SSH 服务。 - Playwright 使用新 EXE、独立数据和 19091/19092 端口,执行
npm.cmd test -- --max-failures=3:77 通过、3 失败、8 未运行,达到失败上限后停止。失败为account-editor.spec.ts的 320×568 权限页多出 14px 滚动,以及workspace-features.spec.ts的 URL 参数、搜索/树导航两项超时;未修改这些前端功能或把此轮报告为全套通过。 - 未运行实际项目的启动入口、未替换现用 EXE、未读写真实项目数据或用户 AppData 数据;路径变更无需数据库表结构迁移。
本地生成文件与 Git 忽略规则
.gitignore 排除本地 data、bin、artifacts、tmp、依赖目录和环境凭据;前端构建输出保留 web/dist/.gitkeep。Playwright 可从项目根目录或 web 运行,两处的 test-results、playwright-report、blob-report、缓存和隔离临时目录均不进入版本控制。
SQLite 的 .sqlite、.sqlite3 及其 journal/WAL/SHM 文件忽略;根目录临时 .db 及其侧文件也忽略。数据目录中的审计、DPAPI 主密钥与 TLS 文件保持本地,另外排除根目录可选的 tls 目录。规则不全局忽略所有 .db、证书、归档或配置文件,避免隐藏协议 fixture 和源码资产;.env.example、依赖锁文件、测试代码和文档应继续可提交。
修改规则后使用 git check-ignore --no-index 验证正反例,并检查 git ls-files 确认生成目录未被跟踪(dist 仅保留占位文件)。忽略规则不会删除文件,也不会让已经跟踪的文件自动退出版本控制。
2026-09-18 未保存目标连接测试
- 新接口覆盖全部 10 种协议的草稿分派、未完成的非选中账号、按账号 ID 保留或临时覆盖密码、配置与历史不变、网关引用不变、CSRF 与字段校验、错误脱敏、私钥和 Kubeconfig 资产解析。
- SSH 使用隔离的本机协议 fixture,验证未确认/错误指纹时不进行认证、确认后连接成功、后续测试不会继承临时信任。其他协议的新增接口测试使用记录型 handler;浏览器测试模拟远端结果。未连接生产服务或进行真实数据库版本验收。
go test ./... -count=1 -timeout=120s中 API、存储、模型及协议包通过;Windows 桌面TestLocalKeyPersistenceAndLock仍报The system cannot find the file specified.。网关TestShutdownClosesAfterGracePeriod首次报handler not started,随后单独重跑整个internal/gateway包通过,因此不宣称首次全量通过。go vet ./...、Vue 类型检查与 Vite 构建通过。Vite 保留大包体积提示;前端构建完成后用 Go 1.25.0 生成新的嵌入式测试程序,恢复web/dist/.gitkeep。- 默认 18081/18082 被另一轮测试占用,本轮设置
SERVICEPORT_E2E_PORT=19081、SERVICEPORT_E2E_AUTH_PORT=19082并通过SERVICEPORT_E2E_BINARY指定新程序;使用独立临时数据和结果目录,未停止其他服务、未部署实际数据目录。 target-editor-test.spec.ts的 13 项用例全部通过:修改后按指定账号测试且不保存、10 种协议新建草稿测试、390px 手机下 MongoDB URI 副本集草稿测试、SSH 临时指纹取消与确认。其他协议的远端连接结果由浏览器路由模拟,后端 SSH 认证由上面的本地 fixture 验证。- 整套浏览器运行先通过 35 项,随后并行工作新增的
rabbit-version.spec.ts在创建测试目标时失败:fixture 账号缺少保存接口必需的名称,尚未进入连接测试。未修改该并行文件,余下用例另起隔离服务继续运行;不能把这一轮称为首次全套通过。 - 余下 32 项先通过 31 项,最后的主题用例在创建浏览器上下文时遇到 Edge 退出;用新浏览器单独重跑通过。最终本轮范围内的 67 项浏览器用例分批通过,另有上述并行 RabbitMQ 用例失败记录。Windows 测试服务退出等待期间仅停止本轮指定路径的测试程序,未停止用户服务或另一轮测试程序。
改动原因和行为边界见 未保存配置的连接测试 与 变更原因与设计记录。
2026-09-18 账号路由与免滚动编辑验证
以下是本轮实际执行记录;下方早期版本的“全量通过”不代表本轮 Windows 环境所有测试通过。
- 前端:
npm.cmd --prefix web run build(Vue 类型检查及 Vite 生产构建)通过。使用 Go 1.25.0 在前端构建结束后生成新的嵌入式测试程序,并通过SERVICEPORT_E2E_BINARY运行 Playwright;恢复了受版本控制的web/dist/.gitkeep。 - 最终 55 项浏览器用例分批验证通过。全量运行先通过 48 项;旧工作区测试仍假设白名单位于登录表单,按新分组入口修正后,该文件的 6 项业务用例通过。最后的主题用例在创建浏览器上下文时遇到 Edge 退出,使用新浏览器单独重跑通过。因此不是一次完整运行零失败。
- 新增免滚动用例使用 12 个已有账号,检查 1440×900、375×812、320×568 的登录、目标、权限、更多分组内容高度;验证新增第 13 个账号立即聚焦、切换保留草稿、跨账号错误定位及保存后凭据保留。小屏溢出修正后该用例通过。
- 账号路由后端改动执行
go test ./... -count=1 -timeout=120s。相关模型、存储、API、网关及协议包通过;internal/desktop的TestLocalKeyPersistenceAndLock仍报The system cannot find the file specified.,因此完整命令返回失败。go vet ./...通过。 - 随后补充的双目标 SSH 账号切换/重连测试单独运行通过,覆盖同一监听端口按账号访问不同目标、只切换一个账号、新连接更新路由以及已有会话保持原目标。SSH、HTTP TLS、MongoDB 和 RabbitMQ 路由测试使用隔离 fixture,没有对实际生产服务做验收。
- 最新免滚动编辑调整只涉及前端及文档,重新执行前端构建和浏览器验证,未把此前后端结果表述为重新运行后的结果。测试使用独立数据库和端口,未部署或迁移实际使用的数据目录。
改动原因见 变更原因与设计记录,使用方式见 易用性 与 账号说明。
0.3.0 验证
-
共享代理出口:Go 全套测试与静态检查通过,覆盖旧出口原子迁移/幂等性、凭据不重复保存、目标引用解析、共享更新、运行中修改阻止、引用删除阻止和密码查看权限。八项浏览器流程验证代理独立菜单、目标下拉、多目标共享、解绑删除及既有服务功能;主题测试遇到 Edge 进程退出后独立重跑通过。桌面/390px 手机截图无页面溢出或抽屉裁切。
-
Go 全量测试和 go vet 通过;Vue 类型检查和生产构建通过。
-
内置 Kubernetes 测试使用模拟 API 与真实 SPDY 流,覆盖 TLS/Token、双向数据、建连取消、成功连接不受拨号 context 取消影响、关闭清理,以及 Service selector 和命名 targetPort。未连接真实 Kubernetes 集群。
-
七项浏览器流程覆盖既有功能、K8s 配置保存/编辑、缺失 kubeconfig 错误和版本信息;手机抽屉位置、宽度及截图验证通过。主题测试在整套运行时遇到 Edge 进程退出,独立重跑通过。
-
版本 CLI/API、无数据初始化的版本查询及 Windows 元数据注入构建通过。Linux/Docker 构建尚未运行。
本次验证记录
2026-09-09,Windows / Go 1.25.0 / Node.js 24 / Microsoft Edge:
go test ./...通过,真实服务测试在未提供环境变量时明确跳过。go vet ./...通过。- Vue 类型检查与生产构建通过,生成并嵌入 Go 可执行文件。
- Playwright 两条完整流程通过:MySQL 默认读写/可选只读/密码查看,MongoDB 与 SSH 的 SOCKS5 配置及编辑后凭据保留。
- 已检查桌面与移动端截图,移动端使用独立卡片布局且无页面横向溢出。
- PowerShell、Bash、MongoDB 初始化脚本语法检查及主密钥生成检查通过。
- MySQL AST 和 MongoDB wire/BSON 只读检查器完成短时模糊测试。
Docker 真实服务矩阵尚未在本机执行,不能据此宣称全部目标版本已完成兼容认证。
本地测试
统一使用 Go 1.25.0。Windows 已安装更高版本 Go 时设置 GOTOOLCHAIN=go1.25.0;首次使用需下载兼容工具链。
$env:GOTOOLCHAIN = 'go1.25.0'
go test ./...
go vet ./...
npm.cmd --prefix web run build
go build -o bin/serviceport.exe ./cmd/serviceport
npm.cmd --prefix web test
浏览器测试使用隔离的临时 SQLite、随机主密钥和仅供测试的登录密码,监听 127.0.0.1:18081,结束后清理。不连接用户的数据库。默认使用已安装的 Edge;其他平台可安装 Playwright Chromium 并设置 SERVICEPORT_BROWSER_CHANNEL=chromium。截图输出到忽略版本控制的 web/test-results。
已有自动化覆盖
| 模块 | 覆盖范围 |
|---|---|
| API | 登录、会话/CSRF、默认读写、CRUD 脱敏、密码保留和重新认证查看、限流、停止前禁止修改、主机指纹字段防绕过 |
| 存储 | AES-GCM 随机 nonce、篡改/用途/错误密钥拒绝、SQLite 加密持久化、登录密码重置及会话版本 |
| 运行管理 | CIDR、来源限制、并发上限、端口冲突、可选 TLS、启停和连接清理 |
| SOCKS5 | 无认证/密码认证、禁止降级、远端 DNS、IPv4/IPv6、失败不直连、超时和取消 |
| MySQL | TLS 网关、raw packet 转发、二进制预编译、重置、可选只读、LOCAL INFILE 拒绝、AST 模糊测试 |
| MongoDB | 官方 Go 驱动连接、双端 SCRAM、推测认证、上下游 TLS、BSON/OP_MSG、批量写入/游标、只读递归检查与模糊测试 |
| SSH | 进程内真实 SSH 协议、密码/公钥、带口令私钥、固定指纹、PTY/window、exec/退出码、SFTP channel、限制转发及取消 |
| 管理界面 | 登录、新建三类代理、默认读写、切换只读、SOCKS5 配置、凭据保留、密码查看、桌面及移动端布局 |
进程内协议测试使用可控服务端,不等同于真实数据库版本或 OpenSSH 的完整兼容认证。
Docker 真实版本测试
需要安装并运行 Docker Engine/Compose。所有服务为独立测试实例,端口只绑定到本机;脚本使用独立 Compose 项目,测试会创建并删除临时数据库,结束后删除该项目的测试卷。不要将这些测试指向生产服务。
.\scripts\test-matrix.ps1
bash scripts/test-matrix.sh
固定镜像和端口以 Compose 文件 为准:
| 服务 | 版本 | 本机端口 |
|---|---|---|
| MySQL | 5.7.44 / 8.0.43 / 8.4.6 | 13357 / 13380 / 13384 |
| MongoDB | 6.0.26 / 7.0.24 / 8.0.13 | 27060 / 27070 / 27080 |
| OpenSSH | 测试 Dockerfile 固定基础镜像 | 12222 |
| SOCKS5 | 仓库内测试实现,无认证 / 密码 | 11080 / 11081 |
生成的测试 CA 用于目标 TLS 验证。MongoDB 8.0 测试实例配置单节点副本集,脚本负责初始化以验证事务。脚本对全部数据库版本及 SSH/SFTP 分别执行直连、无认证 SOCKS5、密码 SOCKS5 三条路径;SOCKS5 路径使用仅 Docker 内可解析的服务名,检查远端 DNS。服务凭据仅供这些一次性测试实例使用,详见 Compose。
手动启动测试实例:
docker compose -f deploy/compose.test.yml up -d --build --wait
docker compose -f deploy/compose.test.yml run --rm --no-deps mongo80-init
独立连接已准备好的目标测试实例:
- MySQL:
SERVICEPORT_MYSQL_TEST_ADDR、SERVICEPORT_MYSQL_TEST_USER、SERVICEPORT_MYSQL_TEST_PASSWORD、可选SERVICEPORT_MYSQL_TEST_CA(CA 文件路径),执行go test ./internal/protocol/mysqlproxy -run TestRealMySQL -count=1 -v。 - MongoDB:
SERVICEPORT_MONGO_TEST_ADDR、SERVICEPORT_MONGO_TEST_USER、SERVICEPORT_MONGO_TEST_PASSWORD、可选SERVICEPORT_MONGO_TEST_CA(PEM 内容),执行go test ./internal/protocol/mongoproxy -run TestRealMongo -count=1 -v。 - SSH:
SERVICEPORT_SSH_TEST_ADDR、SERVICEPORT_SSH_TEST_USER、SERVICEPORT_SSH_TEST_PASSWORD,执行go test ./internal/protocol/sshproxy -run TestRealSSH -count=1 -v。验证远程输出和退出码、SFTP 上传下载及清理、禁止 TCP 转发。
三类测试可额外设置 SERVICEPORT_TEST_SOCKS_ADDR 和可选 SERVICEPORT_TEST_SOCKS_USER/PASSWORD,使用真实生产出站层经 SOCKS5 连接上述目标。测试中的首次 SSH 指纹探测仅适用于已明确指定的一次性测试服务,不替代生产环境的管理员独立核对流程。
测试账号须允许创建和删除独立测试库;未设置地址时真实版本测试明确跳过。省略上游 CA 时测试按明文上游运行,但网关客户端仍执行 TLS。
验证边界
当前开发机器没有 Docker、MySQL 或 MongoDB 服务,真实版本矩阵和 OpenSSH/mongosh 客户端组合尚未在此机器执行。Docker 镜像启动、数据库各版本 TLS/认证差异、真实副本集事务以及所有服务经 SOCKS5 的端到端组合,需要运行测试环境后再确认。
只读是严格请求白名单,不等同数据库权限保证;MongoDB 只读游标按客户端连接限制,多文档事务不在只读兼容范围。完整边界见 只读说明 和 开发计划。
Windows 双击启动验证
已通过 go test ./...、go vet ./...,以及 Edge 无头浏览器的桌面启动回归。验证包括无管理员/主密钥环境变量启动、从其他工作目录启动、首次页面创建管理员、自动本机 TLS、DPAPI 密钥持久化、重启后原账号登录。初始化单元测试覆盖错误 token、跨来源请求和重复初始化;Windows 测试覆盖独占锁和数据库存在时禁止替换丢失密钥。
对解压后的发行包运行:
node scripts/verify-package.mjs <单EXE交付目录或serviceport.exe路径>
node scripts/verify-desktop.mjs <解压后的目录>/serviceport.exe
脚本只在独立临时工作目录中测试:无已有库时创建 data 且不创建隔离的 AppData;随后将测试数据移至隔离的 AppData,验证旧库复用、原账号登录、密钥不变且不另建本地库。整个过程不读取实际用户配置。桌面脚本用 Edge 自动操作首次设置页面,禁用系统浏览器弹窗并使用随机本机端口;系统默认浏览器关联及资源管理器双击交互未由此脚本覆盖。
0.2.0 新增验证范围
- 独立目标 CRUD、多网关复用、目标修改/删除约束、旧版事务迁移、密码/SSH 身份/启用状态保留、网关存储不重复保存上游秘密。
- 本机免登录开发会话、Host/来源/CSRF 限制;认证启用时的既有登录与重新认证测试。
- MySQL 模拟服务压缩协商/回退、流量缩减、结果集和预编译;MongoDB 压缩协商/回退、压缩报文边界、凭据命令不压缩、只读网关转发。真实目标压缩仍需实际版本矩阵验证。
- SQL/MongoDB 放行与拦截审计、预编译模板、日志故障阻止转发;SSH exec/输入/SFTP 解析;日志内容加密、分页、筛选和 7 天保留。
- Edge 验证默认免登录、独立目标与网关表单、共享目标/只读策略、MongoDB/SSH/SOCKS5、压缩配置、三种主题及系统跟随/持久化、移动布局和命令审计入口。
2026-09-09 扩展验收
- Go 1.25.0 全量单元、协议、API、迁移测试与 go vet 通过;Vue 类型检查与生产构建通过。
- 隔离的真实 MySQL 5.7.44 实例通过 TLS + zlib、读写/只读、SHOW TABLE STATUS、SHOW FULL PROCESSLIST 和指定三语句批次测试;结果见
artifacts/mysql-verification/show-batches-mysql57.log。测试库自动清理,实例验证后关闭。 - Redis 使用可控 RESP 服务验证认证、HELLO、流水线、订阅、取消及审计;RabbitMQ 使用 amqp091-go 客户端连接模拟 broker;PostgreSQL 使用 pgconn 客户端连接模拟后端,验证简单/扩展查询、参数化、认证及审计。尚未对真实 Redis、RabbitMQ、PostgreSQL 部署做版本兼容验收。
- 审计测试覆盖跨三日 411 条记录分页、跨日关键词和完整导出、密文迁移、失败重试/冲突保护、7 天清理、取消和并发。连接事件覆盖旧记录迁移、跨日筛选/分页及 CSV 导出。未执行 Go race 检查(当前未配置所需 C 工具链)。
- Edge 六项流程通过,覆盖拖拽连接、审计筛选/导出、共享目标、可选只读、SSH/SOCKS5 出口、三种新增服务配置、主题及移动布局。最后一项首次因 Edge 进程退出失败,单独重跑通过。