CloudCLI 公网 Web 工作台
更新:2026-09-12
📌 结论摘要
CloudCLI 已通过 MM 公网入口提供。 入口 https://ai.yohan.fun 经 MM BaoTa Nginx 回源 101 的 100.64.0.2:3001,不经过 RR;GET /health 返回正常,未登录 API 与 WebSocket 均被 CloudCLI 拒绝。依据是 2026-09-02 的公网、证书、认证和 WebSocket 现场验证。影响是移动设备无需安装 Tailscale 即可使用工作台,但 Provider 密钥和 101 工作区仍必须留在本机受保护边界内。
🧩 已部署链路
手机或电脑浏览器
-> https://ai.yohan.fun
-> MM BaoTa Nginx
-> 100.64.0.2:3001(101 CloudCLI UI)
-> 101 本机 Linux Codex 与其他已配置 Provider
MM、101 与其他节点位于同一 Tailnet,因此本入口不经过 RR。ai.yohan.fun 的 DNS 指向 MM 公网地址,MM 站点直接回源 100.64.0.2:3001。101 上的 CloudCLI 由 cloudcli.service 管理,监听 0.0.0.0:3001;公网访问只能通过 MM 的 TLS 站点,不能直接使用 Tailnet 地址或内部端口。
🛡️ 协议与安全边界
- CloudCLI 版本为
1.37.3,GET /health返回正常状态。 - CloudCLI 的
/wsWebSocket 和/api/agentSSE 流式接口需要保留 HTTP/1.1、Upgrade、长连接和 600 秒超时;MM 站点已配置这些参数。 - 未登录的
/api/providers、/api/user和 WebSocket 握手均由 CloudCLI 返回未授权;MM 不代替 CloudCLI 认证。 - Console 只增加跳转入口,目标为
https://ai.yohan.fun/,不嵌入或复制 CloudCLI 的会话、Provider、文件、项目或数据库状态。 - 手机无需安装节点,使用浏览器访问即可;语音输入由手机浏览器/系统键盘转换为文字后提交给 CloudCLI。
🧪 运维与验收
每次变更按以下顺序验收:
- 在 MM 上确认
http://100.64.0.2:3001/与/health可达。 - 在公网确认
https://ai.yohan.fun/、证书 SAN、静态资源和/health。 - 确认未登录 API 与 WebSocket 被 CloudCLI 拒绝,再使用浏览器登录后测试 Codex、其他 Provider、流式回复和长请求。
- 确认 101 的
cloudcli.service、/root/project工作区和/root/.codex系统配置保持独立;不得把 Provider 密钥写入 AgentMeshOS 仓库或 Console。
🧷 工作区根目录升级保持
CloudCLI 以 root systemd 服务运行时,WORKSPACES_ROOT 固定为 /root/project。上游版本会把 /root/project 误判为 /root 系统目录,因此 /usr/local/sbin/agentmeshos-cloudcli-workspace-patch 在每次服务启动前幂等修补已安装包的路径校验:只豁免配置根目录及其子目录,/root、/etc 等其他系统路径仍被拒绝。每次 npm 升级后必须确认服务重启,并验证认证请求到 /api/file-tree/browse-filesystem?path=~ 返回 /root/project;不得只检查 /health 的磁盘版本。
2026-09-02 现场证据:MM 主机 mm(Tailnet 100.64.0.6)访问 101 返回 HTTP 200;公网证书主题和 SAN 为 ai.yohan.fun;公网 /health 返回 HTTP 200;未登录 API 返回 HTTP 401;WebSocket /ws 无令牌返回 HTTP 401。当前 AgentMeshOS 仓库的 AGENTMESHOS_RUNNER_LABEL=agentmeshos-ci 已由 GitHub 探针验证运行在 101 自托管 Runner pcdell-101-agentmeshos。
⚠️ 未决项 / 需要决策
| 事项 | 当前事实 | 下一步 |
|---|---|---|
| CloudCLI 升级后路径校验 | 上游曾把 /root/project 误判为系统目录 |
每次升级后重启服务并验证认证文件树接口;失败时保留上一可用包并回退 |
| Provider 与工作区边界 | 入口公开,但 Provider 密钥和本机目录不在公网页面内 | 继续禁止把密钥、会话或工作区状态写入仓库、Console 或普通日志 |