OpenClaw 合集 | 为 OpenClaw 部署专属浏览器

本文是 OpenClaw 使用合集的其中一篇,记录如何在 1Panel 环境下,为 OpenClaw 部署一个可远程控制的 Chromium 浏览器容器。


为什么需要单独部署浏览器?

在实际使用 OpenClaw 的过程中,”让 AI Agent 上网”这件事远比想象中麻烦。常见的几种思路都存在明显缺陷:

方案一:服务器安装桌面环境 + Chrome
资源消耗高,且一个桌面通常只能稳定运行一个 Chrome 实例,难以同时支撑多个 Agent。

方案二:容器内运行无头 Chrome(Headless)
每次重建容器都需要重新安装浏览器,数据无法持久化,无法登录账号,也无法处理人机验证(CAPTCHA)。

方案三:使用 browserless
初期体验尚可,但很容易被人机验证拦截,连 Google 搜索都可能触发验证,需要手动干预,操作成本较高。

经过一番对比,最终选定 lscr.io/linuxserver/chromium 作为解决方案。它将 Chromium 浏览器封装在容器中,通过 Web UI 可以直接在浏览器里操作浏览器,支持持久化配置、账号登录与 Cookie 保留,同时可通过 CDP(Chrome DevTools Protocol)对外提供远程控制接口。


技术背景:为什么需要 socat?

Chromium 的 CDP 接口默认只监听本地回环地址 127.0.0.1,容器外部无法直接访问。因此需要借助 alpine/socat 容器将端口转发出来,使 OpenClaw 能够通过局域网 IP 连接到浏览器。

此外需要特别注意:如果 openclaw.json 中的 cdpUrl 填写的是回环地址(如 localhost127.0.0.1),OpenClaw 会误判为需要在本地启动浏览器,而不是连接外部实例。因此 cdpUrl 必须填写服务器的局域网 IP 地址。


部署步骤

第一步:启动 Chromium 容器

以下两条命令分别启动 Chromium 容器和 socat 转发容器。在 1Panel 中,容器需要加入 1panel-network 网络,以便与 OpenClaw 容器互通。

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -d \
--name chromium_openclaw \
--restart unless-stopped \
--network 1panel-network \
-p 3011:3001 \
-p 9224:9223 \
-v ./data:/config \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Hong_Kong \
-e "CHROME_CLI=chrome://version --remote-debugging-port=9222 --remote-debugging-address=0.0.0.0 --remote-allow-origins=*" \
--shm-size="2gb" \
lscr.io/linuxserver/chromium:latest
1
2
3
4
5
6
docker run -d \
--name chromium_socat_openclaw \
--restart unless-stopped \
--network container:chromium_openclaw \
alpine/socat \
tcp-listen:9223,fork,reuseaddr tcp:127.0.0.1:9222

几点说明:

  • 3011:3001 将 Web UI 映射到宿主机的 3011 端口,可按需修改以避免端口冲突。
  • 9224:9223 用于暴露经 socat 转发后的 CDP 接口。
  • socat 容器使用 --network container:chromium_openclaw,与 Chromium 容器共享同一网络命名空间,这是 CDP 转发能够工作的关键。
  • ./data:/config 用于持久化浏览器配置与用户数据,重建容器后数据不丢失。

第二步:在浏览器中完成初始配置

容器启动后,通过浏览器访问:

1
http://服务器IP:3011

此时可以直接在 Web UI 中操作 Chromium,建议在此阶段完成以下准备工作:

  • 登录需要用到的网站账号
  • 处理首次访问时可能出现的人机验证
  • 确认浏览器运行正常

第三步:配置 OpenClaw

编辑 OpenClaw 的配置文件 openclaw.json,添加以下 browser 配置段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"browser": {
"enabled": true,
"remoteCdpTimeoutMs": 5000,
"remoteCdpHandshakeTimeoutMs": 10000,
"defaultProfile": "openclaw",
"ssrfPolicy": {
"dangerouslyAllowPrivateNetwork": true
},
"profiles": {
"openclaw": {
"cdpUrl": "http://chromium_openclaw容器分配的IP:9224",
"color": "#FF6B35"
}
}
}
}

cdpUrl 中的 服务器IP 替换为实际的chromium_openclaw容器分配 IP 地址(例如 172.18.0.45)。再次强调,这里不能使用 localhost127.0.0.1


验证是否成功

配置完成并重启 OpenClaw 后,可以让 Agent 执行一个简单的网页访问任务,观察它是否能正确使用已部署的 Chromium 实例。如果浏览器 Web UI 中能看到 Agent 的操作行为,说明配置已经生效。


小结

整个方案的核心逻辑是:用 linuxserver/chromium 提供一个可持久化、可交互的浏览器环境,用 socat 解决 CDP 端口的网络可达性问题,最后通过局域网 IP 将浏览器实例挂载到 OpenClaw。这套组合在 1Panel 环境下运行稳定,也便于后续扩展为多浏览器实例、服务多个 Agent 的场景。