feat: add provider ssh tcp data pool
This commit is contained in:
@@ -32,6 +32,16 @@ Provider Gateway 是计算节点侧容器。它只主动连出到主 server 暴
|
||||
|
||||
SSH 透传只作为维护桥,不作为普通计算任务和自动升级的执行通道。普通任务、Docker 状态采集和 `provider.upgrade` 仍必须走本地 Docker socket;SSH 透传用于节点诊断、人工修复和验证 WSL/宿主维护入口是否可达。
|
||||
|
||||
## SSH Data TCP Pool
|
||||
|
||||
Provider WebSocket 是注册、heartbeat、dispatch、`provider.upgrade` 和短控制消息的主管理通道,不再承载 `trans`/`tran`/`ssh` 的大块 stdin/stdout/stderr 数据面。Host SSH 透传的数据面必须走 provider 主动连到 main server 的 TCP warm pool;provider 仍然只主动连出,不要求计算节点暴露入站端口,也不改变公网 frontend/provider ingress 之外的业务入口。
|
||||
|
||||
标准能力名是 `host.ssh.tcp-pool`。支持该能力的 provider-gateway 会在连接 WebSocket 后按 `PROVIDER_DATA_HOST`、`PROVIDER_DATA_PORT` 和 `PROVIDER_DATA_POOL_SIZE` 建立常驻 TCP 通道池,默认 10 条通道;main server 默认公开 provider data port `18084`,backend-core 容器内监听 `8082`。每条 SSH 会话或文件传输占用一条 data channel,大文件传输不能阻塞其他已空闲通道上的 SSH、小文件或脚本请求;这里不再做应用层队列、fair scheduling 或把大文件分发到控制 WebSocket 的 fallback。池耗尽时必须返回结构化错误,例如 `provider-data-pool-exhausted`,调用方按短查询/重试语义处理,而不是让单个 `trans` 长挂。
|
||||
|
||||
旧 provider 没有声明 `host.ssh.tcp-pool` 时,backend-core 必须让 `/ws/ssh` 快速失败并返回 `provider-gateway-upgrade-required`,提示升级 provider-gateway;不得保留旧的 WebSocket 数据路径作为兼容分支。`provider.upgrade mode=schedule` 本身仍走 provider WebSocket 和 Docker socket,因为升级动作必须在旧 provider 上可达,用于把节点推进到支持 TCP pool 的版本。
|
||||
|
||||
可见性必须跟随通道池。provider-gateway labels 应上报 `providerGatewaySshDataTransport=tcp-pool`、目标 host/port、desired pool size、ready/claimed/connecting/total channel 数和最近错误;`debug health`、frontend raw JSON 和 issue 证据应优先用这些字段判断是 provider 未升级、data port 不通、池耗尽还是目标 host SSH 本身失败。只看到 provider 在线或 `host.ssh` 可用,不等于 TCP data pool 已经可用。
|
||||
|
||||
## WSL Compute Node Deployment
|
||||
|
||||
WSL 计算节点和普通外部计算节点使用同一套 provider ingress 协议:节点不暴露入站端口,只需要从 WSL 主动连出到 `ws://74.48.78.17:18082/ws/provider`。已验证的 WSL 节点命名口径是短设备编号,例如 `PROVIDER_ID=D601` 与 `PROVIDER_NAME=D601` 保持一致;新增 WSL 节点必须替换为唯一 ID,避免把旧节点状态覆盖到同一条 `unidesk_nodes.provider_id` 记录。
|
||||
@@ -166,6 +176,6 @@ WSL provider 需要调用 Windows-only 工具链时,优先在 WSL 用户的 `~
|
||||
|
||||
维护桥通过真实 WebSocket dispatch 暴露为 `host.ssh` 命令。默认 payload 使用 `mode: "probe"`,远端只执行一个短命令并返回 `UNIDESK_SSH_TEST user=... host=... bridge=host.ssh cwd=...`;需要人工诊断时可以显式使用 `mode: "exec"` 与 `command` 字段执行有界命令。所有 `host.ssh` 执行都必须有超时,stdout/stderr 在 task result 中截断展示;自动升级和普通任务仍必须使用 Docker socket 与 `provider.upgrade`,不得把 WSL SSH 维护桥当成调度通道。
|
||||
|
||||
面向人的终端入口是 `trans <PROVIDER_ID> [ssh-like args...]`。无后续参数时打开远端登录 shell,有后续参数时执行远端命令并返回远端 exit code;该入口走 backend-core 内网 `/ws/ssh` broker 和 provider 既有 WebSocket,不新增公网 core 端口。传统 ssh 传输参数由 provider-gateway 环境变量统一控制,CLI 只负责把 Provider ID 后的远端命令和终端 stdin/stdout/stderr 透传过去。非交互远端命令优先使用 argv 入口:`trans D601 argv true`,或需要 shell 特性时使用 `trans D601 argv bash -lc '<command>'`。WSL 节点需要同时看清 Linux/WSL 与 Windows 两套 skill 时,使用 `trans <PROVIDER_ID> skills`,该命令只通过已建立的维护桥读取 `SKILL.md` 元数据,不要求 provider-gateway 新增业务 API。
|
||||
面向人的终端入口是 `trans <PROVIDER_ID> [ssh-like args...]`。无后续参数时打开远端登录 shell,有后续参数时执行远端命令并返回远端 exit code;该入口的 client 侧仍连接 backend-core 内网 `/ws/ssh` broker,core 只用 provider WebSocket 下发 open/dispatch 控制消息,终端 stdin/stdout/stderr 数据面必须走 provider 主动连接 main server 的 `host.ssh.tcp-pool` TCP warm pool,不新增计算节点入站要求,也不保留旧 WebSocket 数据 fallback。传统 ssh 传输参数由 provider-gateway 环境变量统一控制,CLI 只负责把 Provider ID 后的远端命令和终端 stdin/stdout/stderr 透传过去。非交互远端命令优先使用 argv 入口:`trans D601 argv true`,或需要 shell 特性时使用 `trans D601 argv bash -lc '<command>'`。WSL 节点需要同时看清 Linux/WSL 与 Windows 两套 skill 时,使用 `trans <PROVIDER_ID> skills`,该命令只通过已建立的维护桥读取 `SKILL.md` 元数据,不要求 provider-gateway 新增业务 API。
|
||||
|
||||
验证 WSL SSH 桥时,先在目标 WSL 中启动 sshd 并确保维护公钥写入目标用户的 `authorized_keys`,再确认目标 provider 注册 labels 中 `unideskCapabilities` 包含 `host.ssh`。运行 `bun scripts/cli.ts debug dispatch <PROVIDER_ID> host.ssh --wait-ms 15000` 后,结果应在 `debug task latest` 或前端任务历史中显示 `status: succeeded`、`probeLine` 含 `UNIDESK_SSH_TEST`、`exitCode: 0`,并且目标节点 labels 中 `hostSshKeyPresent` 为 true;随后运行 `trans <PROVIDER_ID> argv true` 验证非交互 argv 维护命令,再运行 `trans <PROVIDER_ID> hostname` 验证近似原生 ssh 的远端命令体验。在计算节点本机自测时,使用 remote CLI 透传同一组命令:`bun scripts/cli.ts --main-server-ip 74.48.78.17 debug health`、`bun scripts/cli.ts --main-server-ip 74.48.78.17 debug dispatch <PROVIDER_ID> host.ssh --wait-ms 15000`、`bun scripts/cli.ts --main-server-ip 74.48.78.17 ssh <PROVIDER_ID> argv true` 和 `bun scripts/cli.ts --main-server-ip 74.48.78.17 ssh <PROVIDER_ID> hostname`;默认 remote CLI 走公网 frontend 登录态,不需要主 server SSH key。健康检查必须能看到该 Provider 在线、`hostSshConfigured=true`、`hostSshKeyPresent=true`、`hostSshTarget` 正确、`unideskCapabilities` 包含 `host.ssh`,probe 必须返回 `UNIDESK_SSH_TEST`,`ssh <PROVIDER_ID> argv true` 与 `ssh <PROVIDER_ID> hostname` 必须 exit code 为 0。如果 D518 这类 WSL 节点没有公网 SSH 入口,也必须通过这个 provider-gateway 自连维护桥完成验证,而不是要求主 server 直接连节点公网 22 端口;旧版 provider 未声明 `host.ssh` 时必须先升级 provider-gateway,否则 core 会拒绝 SSH 透传。
|
||||
|
||||
Reference in New Issue
Block a user