跳到主要内容云端 OpenClaw 真实浏览器部署:WebTop + Tailscale 实战方案 | 极客日志Shell / BashAI大前端
云端 OpenClaw 真实浏览器部署:WebTop + Tailscale 实战方案
综述由AI生成针对云端 OpenClaw 无头浏览器易被反爬且无法人工接管的问题,基于 WebTop 容器化桌面环境与 Tailscale 私有网络的解决方案。通过部署 Ubuntu XFCE 桌面镜像,配合 socat 端口转发及 Watchdog 监控脚本,实现了 Chromium 浏览器的持久化运行与 CDP 调试接口暴露。方案支持 Cookie 留存、验证码人工辅助及自动化流程无缝切换,有效规避了网站风控检测。文中详细提供了 Docker Compose 配置参数、环境变量设置及本地连接验证步骤,适用于 4C24G 及以上云服务器环境,确保 AI 代理具备类人浏览体验。
竹影清风17 浏览 云端 OpenClaw 真实浏览器部署:WebTop + Tailscale 实战方案
浏览器是网络世界的入口
对于云端部署的 OpenClaw,最大的痛点在于浏览器没有显示界面。这会对浏览器自动化操作产生很大影响,传统的 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),记得在部署前对照文中的可调项做减法,确保 CPU、内存、带宽匹配自己的上限。
OpenClaw 需要什么样的浏览器环境
为了发挥 OpenClaw 的最大潜力,它需要一个真实的桌面浏览器环境。这个诉求可以拆解为:
- 抗反爬: 避免网站风控秒封
- 浏览状态持久化: 记住登录状态、浏览历史、Cookie
- 人工接管: 遇到登录/验证码可人工介入
市面上主要有四种候选方案,本质上都是在 Xvfb 上做了不同程度的封装:
| 维度 | Xvfb + noVNC | WebTop ⭐ | Selenium Chrome | Playwright + xvfb |
|---|
| 内存占用 | ~250MB | ~600MB | ~450MB | ~200MB |
| CPU(空闲) | 低 | 中 | 低 - 中 | 低 |
| 安装复杂度 | 复杂 | 简单 | 较简单 | 中等 |
| 维护复杂度 | 复杂 | 简单 | 较简单 | 中等 |
| 人工接管 |
虽然 WebTop 内存占用稍高,但稳定性、反爬效果、接管体验、配置流程都优秀得多。特别是我的机器内存充足(建议不少于 4G),且维护成本最低(Docker Compose 一键管理),所以最终选择了 WebTop。
最终架构设计
选定方案后,为了稳定和安全,我加上了 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 │
│ ┌─────────────────────────────────────────┐ │
│ │ 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 无响应)问题
- Healthcheck 仅用于容器状态监控,实际恢复由 Watchdog 完成
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 |
既然要用 OpenClaw,就别把它当做一个'聊天机器人'糊弄过去。太低配的云主机只能让你卡着干着急——与其在 2C2G 上耗时间,不如直接上够用的规格,把 OpenClaw 当成真正的提效助手。
部署步骤
这份教程是在 Oracle Cloud 4C24G 机器上调试沉淀下来的生产级实践。每个参数都有出处,要么是官方最佳实践,要么是我真实环境量出来的稳定值。你可以把这份步骤交给 AI 去执行,但务必要结合你机器的 CPU/内存/带宽,把 cpus、mem_limit、shm_size、PASSWORD 等可调项提前改好。
第一步:搭建 Tailscale 私有网络
1. VPS 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
2. 获取 Tailscale IP
记录输出的 IP(如 100.10.20.30),后续用 $TS_IP 表示。
3. 本地安装 Tailscale
在本地电脑安装 Tailscale 客户端,登录同一账号。
第二步:部署 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
第三步: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"
}
}
}
}
本地连接验证
这一步我们要在本地访问远程机器的浏览器,验证它是否稳定启动。
然后在本地浏览器访问 https://<Tailscale_IP>:3001。
大概率你会先看到'被安全拦截'的警告页。没关系,这是因为 WebTop 强制启用 HTTPS,但证书是自签名的,不被浏览器信任。点击 高级 → 继续访问 即可。
稍等片刻,就能看到远程浏览器已经打开。也就是说无论你到哪里,只要能上网,随时可以查看云端浏览器的状态。
不用担心浏览器异常退出,我写了监控脚本,每 15 秒检测一次状态;一旦崩溃会立刻重启。可以手动关掉浏览器,等 15 秒左右就会自动恢复。
OpenClaw 实操与扩展
经过实测,OpenClaw 原生的 CDP 控制速度较慢,截图有时会出现问题。建议安装 Agent Browser 技能包。它是 Rust 写的浏览器自动化工具,定位准、速度快,也更省 token。
Agent Browser 支持通过 --cdp 9222 连接 WebTop 已有的 Chromium 进行工作。安装完技能,可以把相关命令写入 TOOLS.md。
这样 OpenClaw 就拥有了自己的桌面浏览器,可以做一些有趣的事,比如总结博客内容时直接要求它截取文章中的关键数据表格,或者在 AI 热点监控时获取参考图。
登录完可玩的空间就大了,大家可以自行尝试。不过其实我们手动登录就行了,这里只是测试一下浏览器的能力。因为让它登个小红书其实花费了半个小时才登陆上,一方面中转站的 API 太慢了,另一方面浏览器自动化还需要和虾一起打磨打磨。
另外提一下 Google 发布的 Chrome DevTools MCP 工具,这对云端的 OpenClaw 并没有做任何改善,只是利好本地 OpenClaw。因为该工具只是提供操控浏览器的接口,并不改变浏览器本身的状态。但是有了 WebTop 就不一样了,OpenClaw 天然拥有完全属于自己的桌面浏览器,并且与用户看到的是共享的。
Browser Use 刚巧上线了'直连 CDP'能力,可以通过 --cdp-url http://localhost:9222 指定 CDP 接口。官方强调,这条路径就是为第三方云浏览器或自建实例准备的,只要你的浏览器通过 WebSocket 暴露了 CDP,就能被 Browser Use 驱动。
其实通过最近 Chrome DevTools MCP 工具的发布,Browser Use 新增对 CDP 直连的支持,我们可以发现通过 CDP 端口直接控制浏览器会越来越成为主流。因为这样 Agent 不仅能控制本地电脑的真实浏览器,还能连接远程浏览器,也可以让云端 Agent 连接类似 WebTop 这一类的浏览器。
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