Agent 节点
单个 muvee-agent 二进制文件同时支持构建节点和部署节点两种角色,具体角色由 NODE_ROLE 环境变量决定。
安全性:Agent 密钥
所有 Agent ↔ 控制平面的通信均通过共享密钥(AGENT_SECRET)保护。Agent 在每个请求中通过 X-Agent-Secret HTTP 头传递此值。服务器会拒绝头部缺失或不正确的请求,返回 401 Unauthorized。
在控制平面和所有 Agent 节点上设置相同的 AGENT_SECRET 值。使用以下命令生成强密钥:
openssl rand -hex 32
若未设置 AGENT_SECRET,服务器会记录警告并接受所有 Agent 请求(仅适用于本地开发环境)。
通信协议
Agent 采用长轮询拉取模型——控制平面无需向 Agent 发起入站连接。
Agent → POST /api/agent/register (启动时)
header: X-Agent-Secret: <secret>
body: { hostname, role, host_ip, max_storage }
← Node(含分配的节点 ID)
Agent → GET /api/agent/config (启动时,register 之后)
header: X-Agent-Secret: <secret>
← { registry_addr, registry_user, registry_password, base_domain }
Agent → GET /api/agent/tasks?node_id={id} (每 5 秒)
header: X-Agent-Secret: <secret>
← []Task(此节点的待处理任务)
Agent → POST /api/agent/tasks/{id}/complete
header: X-Agent-Secret: <secret>
body: { status, result, image_tag? } # 构建任务
body: { status, host_port } # 部署任务
Agent 只需要能够访问 CONTROL_PLANE_URL 的出站连接——可以位于 NAT 或防火墙后面。
CONTROL_PLANE_URL 必须使用内网地址
将 CONTROL_PLANE_URL 设置为控制平面的内网地址(如 http://10.0.0.1:8080),而非公开域名。
原因如下:
- Agent 通过观察连接控制平面所使用的网络接口来自动检测
HOST_IP。使用内网地址能确保选择正确的接口(及 IP),从而让 Traefik 能够正确路由流量到容器。 - 没有必要走公网——Agent 端点不受 OAuth 保护。