跳到主要内容Shell / BashAI
云端 OpenClaw 部署 WebTop 方案实现真实桌面浏览器自动化
针对云端 OpenClaw 无头浏览器难以通过人机验证及无法人工接管的问题,基于 WebTop Docker 镜像配合 Tailscale 私有网络的解决方案。该方案提供完整桌面环境,支持 Cookie 持久化、验证码人工干预及自动重启监控。通过 socat 端口转发解决 Chromium 绑定限制,结合 Watchdog 确保服务稳定性。实测表明此架构能有效绕过反爬机制,适用于需要真实浏览器行为的自动化场景。
锁机制31 浏览
浏览器是网络世界的入口
对于云端部署的 OpenClaw,最大的痛点在于浏览器没有显示界面,这会对浏览器自动化操作产生很大影响。
刷知乎、小红书、推特或看 Reddit 时,传统的 Headless(无头)浏览器几乎过不了人机验证,也很容易卡在扫码登录界面。云服务器没有显示器,无法查看验证码,更别提接管操作了。
那么,有没有一种优雅的姿势,让云端的 OpenClaw 拥有一个'有血有肉'的真实桌面浏览器?既能保留 Cookie 环境,又能在遇到验证码时通过浏览器随时远程人工接管?
经多方验证,在云服务器上跑通 WebTop + Tailscale 方案,成功登录谷歌、知乎、小红书等平台。访问网页畅通无阻,甚至能自主搜索信息。
测试环境
- Oracle Cloud(新加坡区 Free Tier)4C CPU / 24GB 内存。SCP 速度约 1.5~2 MB/s,Ping 延迟 400ms,远程桌面人工接管时会感觉偏卡。好在 OpenClaw 通过 CDP 调用浏览器是本机通讯,不吃公网带宽,不会拖慢自动化性能。
- 若将 WebTop 跑在离自己更近的 VPS(或本地超微机),延迟和带宽体验会更好。以下参数基于高配机器调试,资源紧张(如 2C4G 或 2C8G)时需对照可调项做减法。
OpenClaw 需要的浏览器环境
为了发挥 OpenClaw 最大潜力,需要一个'有血有肉'的真实桌面浏览器。核心诉求包括:
- 抗反爬:避免网站风控秒封
- 浏览状态持久化:记住登录状态、浏览历史、Cookie
- 遇到登录/验证码可人工接管
经过对比,最终选定 WebTop 方案。它本质是在 Xvfb 上的封装,提供完整的 Linux 桌面环境,内置浏览器。底层仍是 Xvfb,但做了完善封装,稳定性更高,配置更简单。
方案对比
| 维度 | Xvfb + noVNC | WebTop ⭐ | Selenium Chrome | Playwright + xvfb |
|---|
| 内存占用 | ~250MB | ~600MB | ~450MB | ~200MB |
| CPU(空闲) | 低 | 中(桌面环境) | 低 - 中 | 低 |
| 网络(自动化) | CDP | CDP | CDP | CDP |
| 安装复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 维护复杂度 | ⭐⭐⭐⭐ 复杂 | ⭐ 简单 | ⭐⭐ 较简单 | ⭐⭐⭐ 中等 |
| 人工接管 | Web VNC | 完整桌面 | Web VNC | 需额外配置 |
| 接管体验 | ⭐⭐⭐ 一般 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐ 一般 | ⭐⭐ 差 |
| 反爬效果 | ⭐⭐⭐⭐ 好 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐ 差 | ⭐⭐⭐ 一般 |
| 稳定性 | ⭐⭐⭐ 中等 |
- 内存占用:Selenium 包含 fluxbox + Xvfb + noVNC + supervisord,实际占用约 450MB。
- 反爬效果:WebTop 提供真实桌面环境,反爬效果最佳;Selenium 包含
navigator.webdriver 等自动化指纹,容易被识别。
最终架构
选定方案后,为稳定和安全加上了 Tailscale 私有网络、Watchdog 监控等配套组件。
- WebTop (Chromium) - 持久化浏览器,Cookie/Session 永久保留
- socat 端口转发 - 解决 Chromium 133+ 强制绑定 127.0.0.1 的问题
- Tailscale - 私有网络,无需公网端口
- Watchdog - 监控 CDP 端口,浏览器 freeze 时自动重启(<3 秒恢复)
- Docker Healthcheck - 容器健康监控
┌──────────────┐ │ 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 │ │ │ └────────────────────────┘ │ └─────────────────────────────────────────────┘
- socat 监听 0.0.0.0:9222,转发到 Chromium 的 127.0.0.1:9223
- Watchdog 只重启浏览器进程,不重启整个容器
- 桌面环境保持运行,Cookie/Session 不丢失
- 解决浏览器 freeze(进程存在但 CDP 无响应)问题
- ✅ shm_size: 4GB(共享内存)
- ✅ mem_limit: 8GB(内存限制)
- ✅ cpus: 2.5(CPU 限制)
- ✅ disk-cache-size: 512MB(磁盘缓存)
- ✅ max-old-space-size: 4GB(V8 堆内存)
如果是 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 |
如何配置
Step 1: Tailscale 私有网络
1. VPS 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
复制终端输出的 https://login.tailscale.com/... 链接,在本地浏览器授权登录。
2. 获取 Tailscale IP
记录输出的 IP(如 100.10.20.30),后续用 $TS_IP 表示。
3. 本地安装 Tailscale
在本地电脑安装 Tailscale 客户端,登录同一账号。
Step 2: 部署 Docker 环境
1. 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
2. 创建项目目录
mkdir -p /opt/openclaw-browser && cd /opt/openclaw-browser
3. 创建浏览器启动脚本(带 Watchdog + socat 端口转发)
cat > browser-launcher.sh <<'EOF'
export DISPLAY=${DISPLAY:-:1}
while ! xdpyinfo >/dev/null 2>&1; do sleep 1; done
echo "[$(date)] X server ready, using DISPLAY=$DISPLAY"
echo "[$(date)] Browser Supervisor 启动,监控 CDP 端口..."
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
while kill -0 $BROWSER_PID 2>/dev/null; do
sleep 15
if ! curl -sf http://localhost:9222/json/version >/dev/null 2>&1; then
echo "[$(date)] 浏览器无响应,正在重启..."
kill -TERM $BROWSER_PID 2>/dev/null
sleep 2
kill -KILL $BROWSER_PID 2>/dev/null
kill -9 $SOCAT_PID 2>/dev/null
sleep 2
break
fi
done
echo "[$(date)] 浏览器已停止,3 秒后重启..."
sleep 3
done
EOF
chmod +x browser-launcher.sh
4. 创建 Docker Compose 配置
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
- 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"
cpus: "2.5"
ulimits:
nofile:
soft: 65536
hard: 65536
tmpfs:
- /tmp:size=1g
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:9222/json/version >/dev/null"]
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
EOF
5. 创建环境变量文件
TAILSCALE_IP=$(tailscale ip-4)
cat > .env <<EOF
TAILSCALE_IP=${TAILSCALE_IP}
EOF
- VNC 端口(3000/3001)绑定到 Tailscale IP,只能通过 Tailscale 网络访问
- 已禁用密码认证,通过 Tailscale 私有网络保护访问安全
- CDP 端口(9222)绑定到 127.0.0.1,本地 OpenClaw 直接访问
- 浏览器数据目录:
$HOME/workspace/webtop-browser-data(需提前创建)
6. 配置浏览器自启动
- ✅ 使用 custom-cont-init.d:容器初始化时后台启动,避免 s6 服务管理问题
- ✅ s6-setuidgid abc:以 abc 用户运行浏览器,解决 X11 认证问题
- ✅ 后台启动 (&):避免阻塞容器启动流程
mkdir -p config/custom-cont-init.d
cat > config/custom-cont-init.d/01-start-browser <<'EOF'
(
while ! command -v socat >/dev/null 2>&1; do sleep 2; done
exec s6-setuidgid abc /config/scripts/browser-launcher.sh
) &
EOF
chmod +x config/custom-cont-init.d/01-start-browser
7. 创建浏览器数据目录
mkdir -p $HOME/workspace/webtop-browser-data
8. 启动容器
cd /opt/openclaw-browser && docker compose up -d
docker compose logs -f
等待 30 秒,看到 'Browser Supervisor 启动' 日志即成功。
docker exec openclaw-browser curl -sf http://localhost:9222/json/version
Step 3:OpenClaw 配置
在 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"
}
}
},
配置参数说明
环境变量 (.env)
| 参数 | 默认值 | 说明 | 可修改 |
|---|
TAILSCALE_IP | 可选设置 | Tailscale 私有网络 IP | tailscale 私有网络和密码保护至少选一项 |
WEBTOP_PASSWORD | 未设置 | 远程桌面登录密码(可选) | ✅ 如需密码保护可添加 |
Docker Compose 配置
| 参数 | 默认值 | 说明 | 可修改 |
|---|
CUSTOM_USER | claw | 远程桌面用户名 | ✅ 可自定义 |
TZ | Asia/Shanghai | 容器时区 | ✅ 可改为其他时区 |
PUID/PGID | 1001 | 容器内用户 ID | ⚠️ 需与宿主机匹配,终端输入 id 查询 |
shm_size | 4gb | 共享内存大小 | ✅ 可根据需求调整 |
ulimits.nofile | 65536 | 文件描述符限制 | ✅ 可根据需求调整 |
tmpfs | /tmp:size=1g | 临时文件系统 | ✅ 可根据需求调整 |
- VNC 端口(3000/3001)绑定到 Tailscale IP,只能通过 Tailscale 网络访问
- 默认无密码认证,通过 Tailscale 私有网络保护
- CDP 端口(9222)绑定到 127.0.0.1,供本地 OpenClaw 连接,不建议修改
- 浏览器数据目录:
$HOME/workspace/webtop-browser-data 可自己修改
- 当前配置:无需密码,直接访问即可(通过 Tailscale 私有网络保护)
- 如需启用密码保护:
- 重启容器:
docker compose restart
- 在
.env 文件中添加:WEBTOP_PASSWORD=your_secure_password_here
- 在
docker-compose.yml 中取消注释 PASSWORD 行
本地如何连接远程浏览器验证
这一步要在本地访问远程机器的浏览器,验证它是否稳定启动。
首先获取远程机的私有网络地址(也可以直接在 Tailscale 客户端里看到):
然后在本地浏览器访问 https://<Tailscale_IP>:3001。
大概率会先看到'被安全拦截'的警告页。这是因为 WebTop 强制启用 HTTPS,但证书是自签名的,不被浏览器信任。点击 高级 → 继续访问 即可。
稍等片刻,就能看到远程浏览器已经打开。可以把它设为主页,在里面做搜索。也就是说无论你到哪里,只要能上网,随时可以查看云端浏览器的状态。
不用担心浏览器异常退出,监控脚本每 15 秒检测一次状态;一旦崩溃会立刻重启。可以手动关掉浏览器,等 15 秒左右就会自动恢复。
OpenClaw 实操
经过实测,OpenClaw 原生的 CDP 控制速度较慢,截图总是截长图。建议安装 Agent Browser 技能包。Agent Browser 是 Vercel 用 Rust 写的浏览器自动化工具,定位准、速度快,也更省 token。
Agent Browser 支持通过 --cdp 9222 连接 webtop 已有的 Chromium 进行工作。安装完技能,可以把相关文字发给 Agent 并让他写入 TOOLS.md。
这样 OpenClaw 就拥有了自己的桌面浏览器。你可以要求它截取文章中的关键数据表格,作为文章配图或者校验 AI 总结的数据准确性。
AI 热点监控的时候,比如 Midjourney V8 发布了,它不仅给你内容要点,还发几张参考图。
温馨提示:登录账号可以先使用小号尝试,避免账号被封。
不过其实手动登录就行了,这里只是测试一下浏览器的能力。因为让它登个小红书花费了半个小时才登陆上,一方面中转站的 API 太慢了,另一方面浏览器自动化还需要打磨。
Chrome DevTools MCP
另外提一下 Google 发布的 Chrome DevTools MCP 工具,这对云端的 OpenClaw 并没有做任何改善,只是利好本地 OpenClaw。因为该工具只是提供操控浏览器的接口,并不改变浏览器本身的状态,该工具的运行还是建立在 CDP 接口的基础上。但是有了 WebTop 就不一样了,OpenClaw 天然拥有完全属于自己的桌面浏览器,并且与用户看到的是共享的。
也就是说在 Chrome DevTools MCP 工具发布之前,本地 OpenClaw 要与用户共享浏览器需要安装插件,而之后只需要开放开发者调试接口,不需要安装插件。而对于云端 OpenClaw,我们安装的 WebTop 解决了一切问题,浏览器天然属于共享状态。
Browse Use
在我写这篇文章的时候,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 也支持了,后面可以尝试一下。
FAQ
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,最好把其它容器停掉。
参考链接
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online