节点
把执行能力延伸到客户机器,无需开放 SSH、无需分发 SSH Key。节点主动拨向平台,浏览器终端、host exec、文件与节点 HTTP 代理都复用这条受控连接。
解决的核心问题传统远程执行需开放 SSH 端口、分发 SSH Key、维护 Key 轮换与撤销;节点可能在 NAT 或受控内网后,不便于中心平台主动拨入。平台让节点主动拨号、命令沿既有连接下发,日常使用链路不依赖 SSH。
特色:三种角色
| 角色 | 是否运行客户端 | 职责 |
|---|---|---|
execution | 是(独立 Go 二进制) | 执行 provider CLI 会话、任务、工作区、终端、文件与节点代理;只有它参与会话调度 |
management | 是(独立 Go 二进制) | 管理 execution 节点并在宿主机创建/删除它们;自身也支持 host terminal 与 exec |
passive_management | 否 | 纯分组与授权容器,创建后直接 approved,不连接、不执行、不提供终端 |
一台接进来的机器可同时是五类用途:浏览器 PTY 终端、跑 provider CLI 的编程子端、host exec 单条命令、工作区与文件读写、HTTP 代理出口。普通任务不独占节点,容量交给节点侧 max_sessions 控制。
特色:无需 SSH 的四步链路
1
节点主动拨号
节点使用自身 ID 与 TOTP 凭据连接控制服务;断线后指数退避重连。
2
平台批准与调度
只有 approved、在线、具备能力且满足容量的 execution 节点参与会话调度。
3
帧式命令通道
终端 open/input/resize、host exec、工作区配置与 HTTP 代理通过 NodeConnect 帧下发。
4
输出与状态回传
PTY 输出、命令结果、会话事件与隧道响应通过同一连接流式返回。
无需 SSH 的准确边界日常平台使用链路不依赖 SSH 端口与 SSH Key;客户仍需在目标机器安装节点、赋予合适的操作系统权限,并允许节点主动访问控制服务。
特色:终端、exec、文件与代理出口
- 浏览器 PTY 终端:浏览器 WebSocket → 数据服务 → 控制服务 → NodeConnect 帧 → 节点本机 PTY(Unix pty / Windows ConPTY);终端默认从节点用户 home 目录启动,连接断开时节点关闭残留 shell。
- host exec:在节点宿主机执行单条命令并结构化返回 stdout/stderr/exit_code,受超时(默认 2 分钟、上限 10 分钟)和输出上限(默认 1 MiB、上限 16 MiB)保护,需节点声明
host_exec=true。 - execution 节点跑 provider CLI:在工作区内运行 claude/codex/gemini/opencode 等 CLI 会话,输出/结果/事件流式回传,会话配置以带版本号的帧下发并确认。
- 工作区与文件:通过平台浏览、创建、编辑、移动和获取节点上的工作区文件,无需单独 SCP/SFTP。
- 节点 HTTP 代理:请求可通过节点自身网络出口发起(用节点 IP、NAT 后网络或内网资源),响应以隧道帧回传——即 代理方案里的
node模式。
特色:身份加密封存与审批
- 节点身份 AES-256-GCM 封存:onboard 时获得唯一 node_id 与 TOTP secret,服务端用 AES-256-GCM 封存 secret;认证使用服务端时钟并带重放缓存,同一验证码不能复用。
- 未知/撤销/错误/重放统一返回 permission_denied:避免身份枚举。
- 必须审批:未 approved 的节点即使连上也不参与调度,可随时撤销。
- 主密钥不可随意轮换:
node_server_master_key加密既有 TOTP 凭据,丢失/更换会让节点身份无法解密;必须备份并限制读取。迁移控制面时先停旧实例、同步数据库和主密钥,再启新实例,禁止双 Registry。
Go 客户端已迁入 nodes/
agent-compose 客户端 Go 代码已迁入 ai-lubricant/nodes,独立 go.mod;execution/management 拆成两个二进制(不再有 --role),common 共享 connect 层。进程内 NodeService 服务端已用 Python 重写进 monkeycode_compat/nodeserver(h2c 需 Hypercorn),由 node_server_enabled 开关控制。
/manager/nodes
截图加载失败
请检查静态资源路径
请检查静态资源路径
nodes/nodes-list.png