网关支持多台桌面 Agent 同时在线(个人多设备到上百台规模),浏览器可分别 控制任意一台。本文是部署与凭证运维手册;协议细节见 protocols.md。
-
每个桌面端首次初始化设置时都会生成全局唯一且稳定的
agent-UUIDv4,可在 “设置 → Remote → Agent ID”中查看和复制。该标识由客户端管理,用户不能修改; 不同客户端独立生成,不依赖 hostname。 -
网关默认自动创建每 Agent 凭证存储。凭证存于内嵌 SQLite 数据库 (纯 Go 驱动,无需额外安装任何东西);需要固定位置时可指定数据库路径:
liveagent-gateway \ -token "<网关 Token,浏览器与 REST 使用>" \ -agent-db /var/lib/liveagent/agents.db等价环境变量:
LIVEAGENT_GATEWAY_AGENT_DB。容器部署必须在/var/lib/liveagent挂载持久卷,否则重启丢凭证。不指定
-agent-db时,数据库默认创建在LIVEAGENT_GATEWAY_DATA_DIR/gateway.db,或用户配置目录下的liveagent/gateway.db。Agent 链路同时接受网关 Token 和按agent_id签发的 独立凭证;无论使用哪种凭证,Agent 都必须携带稳定的agent_id。 -
桌面端可直接将网关 Token 填入“访问令牌”并连接。若改用独立凭证,先复制 桌面端自动生成的 Agent ID,在 WebUI“设置 → 多客户端管理”中粘贴该 ID, 可选填写客户端名称并签发,再把响应中的
agt_...填回该桌面端的“访问令牌”。 -
WebUI 首次连接会从
agent_list自动选择一个在线 Agent;多 Agent 场景可在 顶栏选择器切换,后续所有目标型请求都会携带明确agent_id。
三条 v2 链路的并发连接上限可配置(超限的连接在升级前收到 503):
| flag | 环境变量 | 默认 |
|---|---|---|
-max-agent-connections |
LIVEAGENT_GATEWAY_MAX_AGENT_CONNECTIONS |
256 |
-max-browser-connections |
LIVEAGENT_GATEWAY_MAX_BROWSER_CONNECTIONS |
128 |
-max-terminal-connections |
LIVEAGENT_GATEWAY_MAX_TERMINAL_CONNECTIONS |
512 |
有两种方式管理 Agent 凭证:管理界面(推荐)或 curl。
登录 WebUI 后进入“设置 → 多客户端管理”即可分页浏览所有已登记 Agent,使用
网关 Token 或独立凭证成功连接都会自动登记。页面支持按全部、在线或离线筛选,
以及签发/轮换独立凭证、编辑或清空可选名称、删除客户端。轮换会立即断开当前客户端,
旧凭证不能重连;独立 Token 可持续用于
该客户端连接,但明文只在签发/轮换响应中展示一次;删除会移除整条记录、凭证并
断开当前连接。使用共享网关 Token 的客户端之后再次连接时会按其 Agent ID 重新登记。
页面直接复用当前登录的网关 Token;
/admin/devices 仅作为可直接访问的备用入口。
管理 API 使用网关 Token 鉴权;$GW 为网关地址,$TOKEN 为网关 Token。
# Agent 目录分页(默认每页 50,上限 200)
curl -sS -H "Authorization: Bearer $TOKEN" "$GW/api/agents?page=1&page_size=50"
# 仅查看在线 Agent;status 还可取 all 或 offline
curl -sS -H "Authorization: Bearer $TOKEN" \
"$GW/api/agents?status=online&page=1&page_size=50"
# 签发/轮换:name 可省略或为空;轮换会立即断开当前会话,明文只在本次响应展示
# 新 Token 可持续用于客户端连接
curl -sS -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"家里的台式机"}' \
"$GW/api/agents/agent-550e8400-e29b-41d4-a716-446655440000/token"
# 修改名称;传空字符串可清空名称
curl -sS -X PATCH -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"办公室电脑"}' \
"$GW/api/agents/agent-550e8400-e29b-41d4-a716-446655440000"
# 删除整条客户端记录、凭证,并立即断开活跃会话
curl -sS -X DELETE -H "Authorization: Bearer $TOKEN" \
"$GW/api/agents/agent-550e8400-e29b-41d4-a716-446655440000"数据库仅含凭证的 SHA-256 哈希(文件 0600 权限),明文不落盘;网关重启后 凭证与客户端名称均保持。
数据库首版只使用 agents 单表保存 Agent ID、可选名称、创建时间和独立凭证哈希。
凭证校验、名称修改和删除使用 agent_id 主键索引;目录分页的
ORDER BY created_at, agent_id 使用 (created_at, agent_id) 组合索引。
目录 API GET /api/agents 在数据库内完成状态筛选、计数和分页(每页默认 50、
上限 200);Go 层只传入在线 ID 快照并合并当前页实时状态,不读取全量目录分页。
| 凭证 | 浏览器链路 /ws/v2 | Agent 链路 /ws/v2/agent | 管理 REST /api/* |
|---|---|---|---|
| 网关 Token | ✅ | ✅ | ✅ |
| Agent 凭证(agt_*) | ❌ | 仅限签发时绑定的 agent_id ✅ | ❌ |
- 单个 Agent 凭证泄露的最大损害 = 冒充/顶替该一台 Agent;无法控制其他 Agent、无法冒充浏览器(控制端)、无法调用管理 API。
- 未知 agent_id 与错误凭证统一报 "unauthorized"(常量时间比较,防枚举)。
- 跨 Agent 隔离由网关按已认证会话身份强制:事件打标、快照分仓、隧道帧 stream_id 归属校验,Agent 无法伪造他人身份的数据。