云端 OpenClaw 部署 WebTop 方案实现真实桌面浏览器自动化
针对云端 OpenClaw 无头浏览器难以通过人机验证及无法人工接管的问题,基于 WebTop Docker 镜像配合 Tailscale 私有网络的解决方案。该方案提供完整桌面环境,支持 Cookie 持久化、验证码人工干预及自动重启监控。通过 socat 端口转发解决 Chromium 绑定限制,结合 Watchdog 确保服务稳定性。实测表明此架构能有效绕过反爬机制,适用于需要真实浏览器行为的自动化场景。

针对云端 OpenClaw 无头浏览器难以通过人机验证及无法人工接管的问题,基于 WebTop Docker 镜像配合 Tailscale 私有网络的解决方案。该方案提供完整桌面环境,支持 Cookie 持久化、验证码人工干预及自动重启监控。通过 socat 端口转发解决 Chromium 绑定限制,结合 Watchdog 确保服务稳定性。实测表明此架构能有效绕过反爬机制,适用于需要真实浏览器行为的自动化场景。

浏览器是网络世界的入口
对于云端部署的 OpenClaw,最大的痛点在于浏览器没有显示界面,这会对浏览器自动化操作产生很大影响。
刷知乎、小红书、推特或看 Reddit 时,传统的 Headless(无头)浏览器几乎过不了人机验证,也很容易卡在扫码登录界面。云服务器没有显示器,无法查看验证码,更别提接管操作了。
那么,有没有一种优雅的姿势,让云端的 OpenClaw 拥有一个'有血有肉'的真实桌面浏览器?既能保留 Cookie 环境,又能在遇到验证码时通过浏览器随时远程人工接管?
经多方验证,在云服务器上跑通 WebTop + Tailscale 方案,成功登录谷歌、知乎、小红书等平台。访问网页畅通无阻,甚至能自主搜索信息。
为了发挥 OpenClaw 最大潜力,需要一个'有血有肉'的真实桌面浏览器。核心诉求包括:
经过对比,最终选定 WebTop 方案。它本质是在 Xvfb 上的封装,提供完整的 Linux 桌面环境,内置浏览器。底层仍是 Xvfb,但做了完善封装,稳定性更高,配置更简单。
| 维度 | Xvfb + noVNC | WebTop ⭐ | Selenium Chrome | Playwright + xvfb |
|---|---|---|---|---|
| 内存占用 | ~250MB | ~600MB | ~450MB | ~200MB |
| CPU(空闲) | 低 | 中(桌面环境) | 低 - 中 | 低 |
| 网络(自动化) | CDP | CDP | CDP | CDP |
| 安装复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 维护复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 人工接管 | Web VNC | 完整桌面 | Web VNC | 需额外配置 |
| 接管体验 | ⭐⭐⭐ 一般 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐ 一般 | ⭐⭐ 差 |
| 反爬效果 | ⭐⭐⭐⭐ 好 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐ 差 | ⭐⭐⭐ 一般 |
| 稳定性 | ⭐⭐⭐ 中等 | ⭐⭐⭐⭐ 自动化稳定 | ⭐⭐⭐⭐ 好 | ⭐⭐⭐ 中等 |
说明:
navigator.webdriver 等自动化指纹,容易被识别。选定方案后,为稳定和安全加上了 Tailscale 私有网络、Watchdog 监控等配套组件。
┌──────────────┐ │ Local PC │ └──────┬───────┘ │ ┌──────▼───────┐ │ Tailscale │ (私有网络) └──────┬───────┘ │ (3000/3001) ▼ ┌─────────────────────────────────────────────┐ │ Oracle Cloud VPS │ │ │ │ ┌──────────────┐ │ │ │ OpenClaw │ │ │ └──────┬───────┘ │ │ │ CDP (127.0.0.1:9222) │ │ ▼ │ │ ┌────────────────────────┐ │ │ │ WebTop Container │◄─────────────────┘ │ │ (XFCE Desktop) │ │ │ │ │ │ │ │ ├─ socat :9222 │ │ │ │ │ └─> 127.0.0.1:9223│ │ │ │ └─ Chromium :9223 │ │ │ │ │ │ │ │ Watchdog Supervisor │ │ │ └────────────────────────┘ │ └─────────────────────────────────────────────┘
关键设计:
关键参数(4C 24GB 高配版本):
如果是 2C4G/2C8G 等轻量实例,可以把
mem_limit下调到 4GB、cpus限制到 1.5,并酌情调小disk-cache-size。唯一的前提是要保证shm_size≥ 2GB,否则 Chromium 很容易崩。
硬件建议:
| 档位 | CPU / RAM | 适用场景 | 备注 |
|---|---|---|---|
| 最低可用 | 2C / 4GB | 纯自动化 + 偶尔人工接管 | mem_limit≈4GB,cpus≤1.5,shm_size 保持 2GB |
| 建议标准 | 4C / 16GB+ | 稳定生产/推荐标准 | mem_limit≈6-8GB,cpus≈2-3,shm_size≈2-4GB |
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
复制终端输出的 https://login.tailscale.com/... 链接,在本地浏览器授权登录。
tailscale ip-4
记录输出的 IP(如 100.10.20.30),后续用 $TS_IP 表示。
在本地电脑安装 Tailscale 客户端,登录同一账号。
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
重新登录 SSH 使 docker 组生效。
mkdir -p /opt/openclaw-browser && cd /opt/openclaw-browser
cat > browser-launcher.sh <<'EOF'
#!/usr/bin/with-contenv bash
# WebTop 已设置 DISPLAY=:1,使用默认值或环境变量
export DISPLAY=${DISPLAY:-:1}
# 等待 X server 就绪
while ! xdpyinfo >/dev/null 2>&1; do sleep 1; done
echo "[$(date)] X server ready, using DISPLAY=$DISPLAY"
echo "[$(date)] Browser Supervisor 启动,监控 CDP 端口..."
# 启动 CDP 端口代理(9222 -> 9223)
start_cdp_proxy() {
pkill -f "socat.*TCP-LISTEN:9222" 2>/dev/null
socat TCP-LISTEN:9222,fork,reuseaddr TCP:127.0.0.1:9223 &
SOCAT_PID=$!
echo "[$(date)] CDP 代理已启动 (9222 -> 9223)"
}
# 主循环:浏览器崩溃或假死时自动重启
while true; do
echo "[$(date)] 清理锁文件..."
rm -f /browser-data/Singleton*
echo "[$(date)] 启动 Chromium (端口 9223)..."
chromium-browser \
--user-data-dir=/browser-data \
--remote-debugging-port=9223 \
--remote-debugging-address=127.0.0.1 \
--remote-allow-origins="*" \
--no-sandbox \
--disable-gpu \
--disable-software-rasterizer \
--disable-features=VizDisplayCompositor \
--disable-blink-features=AutomationControlled \
--disable-crash-reporter \
--disable-breakpad \
--hide-crash-restore-bubble \
--restore-last-session \
--disable-features=TranslateUI \
--no-first-run \
--disable-background-timer-throttling \
--disable-renderer-backgrounding \
--disable-backgrounding-occluded-windows \
--disable-ipc-flooding-protection \
--password-store=basic \
--disk-cache-size=536870912 \
--max-old-space-size=4096 &
BROWSER_PID=$!
start_cdp_proxy
-0 2>/dev/null;
15
! curl -sf http://localhost:9222/json/version >/dev/null 2>&1;
-TERM 2>/dev/null
2
-KILL 2>/dev/null
-9 2>/dev/null
2
3
EOF
+x browser-launcher.sh
cat > docker-compose.yml <<'EOF'
services:
webtop:
image: lscr.io/linuxserver/webtop:ubuntu-xfce
container_name: openclaw-browser
security_opt:
- seccomp:unconfined
environment:
- PUID=1001
- PGID=1001
- TZ=Asia/Shanghai
- CUSTOM_USER=oclaw
# - PASSWORD=${WEBTOP_PASSWORD:-ChangeMe123!} # 已禁用密码认证,通过 Tailscale 私有网络保护
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PACKAGES=socat
- SELKIES_ENABLE_HTTPS=false
volumes:
- ./config:/config
- ${HOME}/workspace/webtop-browser-data:/browser-data
- ./browser-launcher.sh:/config/scripts/browser-launcher.sh:ro
- ./config/custom-cont-init.d:/custom-cont-init.d:ro
ports:
- "${TAILSCALE_IP}:3000:3000"
- "${TAILSCALE_IP}:3001:3001"
- "127.0.0.1:9222:9222"
shm_size: "4gb"
mem_limit: "8gb"
[, ]
# 获取 Tailscale IP
TAILSCALE_IP=$(tailscale ip-4)
# 创建 .env 文件
cat > .env <<EOF
TAILSCALE_IP=${TAILSCALE_IP}
EOF
说明:
$HOME/workspace/webtop-browser-data(需提前创建)# 创建浏览器启动服务
mkdir -p config/custom-cont-init.d
cat > config/custom-cont-init.d/01-start-browser <<'EOF'
#!/bin/bash
(
# 等待 socat 安装完成
while ! command -v socat >/dev/null 2>&1; do sleep 2; done
# 以 abc 用户运行浏览器(解决 X11 认证问题)
exec s6-setuidgid abc /config/scripts/browser-launcher.sh
) &
EOF
chmod +x config/custom-cont-init.d/01-start-browser
mkdir -p $HOME/workspace/webtop-browser-data
cd /opt/openclaw-browser && docker compose up -d
docker compose logs -f
等待 30 秒,看到 'Browser Supervisor 启动' 日志即成功。
启动完成之后可快速检查 CDP 端口响应:
docker exec openclaw-browser curl -sf http://localhost:9222/json/version
在 OpenClaw 配置文件中浏览器配置里添加 webtop,并设为默认:
"browser":{
"defaultProfile":"webtop",
"profiles":{
"webtop":{
"cdpUrl":"http://127.0.0.1:9222",
"color":"#00AA00"
}
}
},
如果你还没有配置过浏览器,可以直接参考以下配置:
"browser":{
"enabled":true,
"headless":false,
"noSandbox":true,
"attachOnly":false,
"defaultProfile":"webtop",
"profiles":{
"openclaw":{
"cdpPort":18800,
"color":"#FF4500"
},
"webtop":{
"cdpUrl":"http://127.0.0.1:9222",
"color":"#00AA00"
}
}
},
| 参数 | 默认值 | 说明 | 可修改 |
|---|---|---|---|
TAILSCALE_IP | 可选设置 | Tailscale 私有网络 IP | tailscale 私有网络和密码保护至少选一项 |
WEBTOP_PASSWORD | 未设置 | 远程桌面登录密码(可选) | ✅ 如需密码保护可添加 |
| 参数 | 默认值 | 说明 | 可修改 |
|---|---|---|---|
CUSTOM_USER | claw | 远程桌面用户名 | ✅ 可自定义 |
TZ | Asia/Shanghai | 容器时区 | ✅ 可改为其他时区 |
PUID/PGID | 1001 | 容器内用户 ID | ⚠️ 需与宿主机匹配,终端输入 id 查询 |
shm_size | 4gb | 共享内存大小 | ✅ 可根据需求调整 |
ulimits.nofile | 65536 | 文件描述符限制 | ✅ 可根据需求调整 |
tmpfs | /tmp:size=1g | 临时文件系统 | ✅ 可根据需求调整 |
说明:
$HOME/workspace/webtop-browser-data 可自己修改登录凭据:
docker compose restart.env 文件中添加:WEBTOP_PASSWORD=your_secure_password_heredocker-compose.yml 中取消注释 PASSWORD 行这一步要在本地访问远程机器的浏览器,验证它是否稳定启动。
首先获取远程机的私有网络地址(也可以直接在 Tailscale 客户端里看到):
tailscale ip-4
然后在本地浏览器访问 https://<Tailscale_IP>:3001。
大概率会先看到'被安全拦截'的警告页。这是因为 WebTop 强制启用 HTTPS,但证书是自签名的,不被浏览器信任。点击 高级 → 继续访问 即可。
稍等片刻,就能看到远程浏览器已经打开。可以把它设为主页,在里面做搜索。也就是说无论你到哪里,只要能上网,随时可以查看云端浏览器的状态。
不用担心浏览器异常退出,监控脚本每 15 秒检测一次状态;一旦崩溃会立刻重启。可以手动关掉浏览器,等 15 秒左右就会自动恢复。
经过实测,OpenClaw 原生的 CDP 控制速度较慢,截图总是截长图。建议安装 Agent Browser 技能包。Agent Browser 是 Vercel 用 Rust 写的浏览器自动化工具,定位准、速度快,也更省 token。
Agent Browser 支持通过 --cdp 9222 连接 webtop 已有的 Chromium 进行工作。安装完技能,可以把相关文字发给 Agent 并让他写入 TOOLS.md。
这样 OpenClaw 就拥有了自己的桌面浏览器。你可以要求它截取文章中的关键数据表格,作为文章配图或者校验 AI 总结的数据准确性。
AI 热点监控的时候,比如 Midjourney V8 发布了,它不仅给你内容要点,还发几张参考图。
登录小红书小号:


温馨提示:登录账号可以先使用小号尝试,避免账号被封。
不过其实手动登录就行了,这里只是测试一下浏览器的能力。因为让它登个小红书花费了半个小时才登陆上,一方面中转站的 API 太慢了,另一方面浏览器自动化还需要打磨。
登录完可玩的空间就大了,大家可以自行尝试。
另外提一下 Google 发布的 Chrome DevTools MCP 工具,这对云端的 OpenClaw 并没有做任何改善,只是利好本地 OpenClaw。因为该工具只是提供操控浏览器的接口,并不改变浏览器本身的状态,该工具的运行还是建立在 CDP 接口的基础上。但是有了 WebTop 就不一样了,OpenClaw 天然拥有完全属于自己的桌面浏览器,并且与用户看到的是共享的。
也就是说在 Chrome DevTools MCP 工具发布之前,本地 OpenClaw 要与用户共享浏览器需要安装插件,而之后只需要开放开发者调试接口,不需要安装插件。而对于云端 OpenClaw,我们安装的 WebTop 解决了一切问题,浏览器天然属于共享状态。
在我写这篇文章的时候,Browser Use 刚巧上线了'直连 CDP'能力,可以通过 --cdp-url http://localhost:9222 指定 cdp 接口。官方也强调,这条路径就是为第三方云浏览器或自建实例准备的,只要你的浏览器通过 WebSocket 暴露了 CDP,就能被 Browser Use 驱动。
browser-use --cdp-url http://localhost:9222 open https://example.com
通过 CDP 端口直接控制浏览器会越来越成为主流。因为这样 Agent 不仅能控制本地电脑的真实浏览器,还能连接远程浏览器,也可以让云端 Agent 连接类似 WebTop 这一类的浏览器。
我在 OpenClaw 里面一开始配置 Agent Browser 也是因为它原生支持 CDP 模式。不过现在 Browse Use 也支持了,后面可以尝试一下。
遇到问题优先请教 AI 助手
Q: 想启用密码或公网访问?
A: 默认依赖 Tailscale 隐私网络,不开放公网端口。如果必须暴露公网,务必在 docker-compose 里启用 PASSWORD 并配置强口令,同时建议套上一层 Cloudflare Tunnel / Caddy 做额外认证。
Q: 远程桌面很卡怎么办?
A: 示例的 VPS 在新加坡,本人在国内,因此 SCP 只有 1.5~2 MB/s、延迟 400ms。人工接管时确实会感觉卡顿,但 OpenClaw 自动化走本地回环,速度不受影响。可以优先选择距离自己更近的节点(本地 NUC、同城云厂商等)。
Q: Tailscale IP 改了无法访问?
A: 重新执行 tailscale ip -4,把新 IP 写入 .env 或直接更新 docker-compose 的 TAILSCALE_IP 环境变量,然后 docker compose down && docker compose up -d 即可。
Q: 浏览器启动失败 / 无法打开新标签?
A: 99% 是共享内存不足,确认 shm_size 至少 2GB,低配机器也不要低于 2048m;若系统 RAM 只有 4GB,最好把其它容器停掉。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online