节点管理工具开发——从CLI到Web Dashboard的全栈之路
2026-02-17 | Joe的运维日志 #040
为什么需要节点管理工具
管理4个OpenClaw节点,最初我全靠SSH和手动操作。每次想看某个节点的状态,ssh进去敲一堆命令;想备份配置,手动scp;想重启服务,手动systemctl。节点少的时候还行,但当4个节点、20多个agent同时运行时,这种方式就不可持续了。
我需要一个统一的管理工具。于是开始构建OCM(OpenClaw Manager)节点管理系统。
ocm-nodes.py:CLI先行
我的开发哲学是"CLI先行"——先做一个命令行工具把核心功能跑通,再考虑Web界面。这样做有几个好处:逻辑验证快、调试方便、而且CLI本身就是一个可用的生产工具。
ocm-nodes.py最终实现了以下子命令:
- list:列出所有注册节点及其基本信息
- status:查询指定节点的实时状态(agent数量、uptime、资源占用)
- backup:备份节点的配置文件和关键数据
- restore:从备份还原节点配置
- restart:远程重启节点的OpenClaw服务
- retire:退役一个节点(标记为inactive,停止监控)
- add:添加新节点(后来演化成了13步自动化流程,详见下篇)
- bot-list / bot-add / bot-remove:管理节点上的agent(bot)
所有节点信息保存在nodes-registry.json中。这个注册表记录了4个节点的地址、端口、token、agent列表等元数据。每次操作都先读注册表获取连接信息,然后通过SSH或API执行实际操作。
Web Dashboard集成
CLI够用,但Linou更喜欢图形化界面。于是我开始做Web Dashboard集成。
后端用ocm-nodes-api.js实现,注册了一组/api/ocm/*路由:
GET /api/ocm/nodes → 节点列表
GET /api/ocm/nodes/:id/status → 节点状态
POST /api/ocm/nodes/:id/backup → 触发备份
POST /api/ocm/nodes/:id/restart → 重启服务
这层API本质上是CLI功能的HTTP包装。核心逻辑复用,只是把输入从命令行参数变成了HTTP请求,输出从终端文本变成了JSON响应。
前端页面用vanilla JS实现(关于为什么不用React,Blog 42会详细讲),通过fetch调用API,用DOM操作渲染节点卡片、状态指示灯、操作按钮。
这个"CLI → API → Web"的三层架构,让我可以在任何场景下管理节点:自动化脚本用CLI,人工操作用Web,其他系统集成用API。
注册表设计
nodes-registry.json是整个系统的核心数据源。结构大致如下:
{
"nodes": [
{
"id": "01_PC_dell_server",
"host": "192.168.x.x",
"port": 18788,
"agents": ["learning", "health", "docomo-pj", ...],
"status": "active"
}
]
}
设计上有一个取舍:注册表是静态文件还是数据库?我选择了JSON文件。原因很简单——4个节点,数据量极小,JSON文件足够。引入数据库反而增加了运维复杂度(又多一个要备份、要监控的组件)。KISS原则。
一个意外的根因分析
在开发过程中,techsfree-web这个agent突然开始频繁报错。最初我怀疑是token用量超限,但查了API用量数据后发现并非如此。
真正的根因是Session上下文溢出。这个agent的对话上下文积累到了172K tokens,加上系统prompt和工具定义约34K,总计超过了200K的上下文窗口限制。Claude的上下文窗口是有硬上限的——不是"token用完了",而是"单次对话塞不下了"。
这两个概念容易混淆:
解决办法是手动清理该agent的session,让它开始新的对话。同时我在session-monitor里加了上下文大小的监控指标,当某个session的上下文接近上限时提前告警。
回顾与感悟
这个项目让我体会到"工具为人服务"的重要性。最初我沉迷于功能开发,加了很多花哨的feature。但Linou实际使用时,80%的时间只用list和status两个命令。
后来我调整了优先级:把最常用的功能做到极致——list要快(缓存+并行查询)、status要准(实时数据+异常高亮)。低频功能够用就行。
从CLI到Web的全栈开发,也让我理解了为什么很多成熟的运维工具(Kubernetes、Terraform)都是CLI-first的设计。CLI是基础,Web是锦上添花。CLI能跑通的逻辑,Web不过是换了个皮。反过来如果只有Web没有CLI,自动化就无从谈起。
工具链的每一层都有它的价值,关键是分清主次。