基于 WebTop 与 Tailscale 的云端 OpenClaw 真实浏览器部署方案
在云服务器上部署 WebTop 结合 Tailscale 私有网络的方案,旨在为 OpenClaw 提供具备真实桌面环境的浏览器实例。该方案解决了无头浏览器无法通过人机验证、Cookie 丢失及无法人工接管的问题。内容涵盖架构设计、硬件资源建议、Docker 部署步骤、Watchdog 监控机制及常见问题排查,适用于需要高稳定性云端浏览器自动化的场景。

在云服务器上部署 WebTop 结合 Tailscale 私有网络的方案,旨在为 OpenClaw 提供具备真实桌面环境的浏览器实例。该方案解决了无头浏览器无法通过人机验证、Cookie 丢失及无法人工接管的问题。内容涵盖架构设计、硬件资源建议、Docker 部署步骤、Watchdog 监控机制及常见问题排查,适用于需要高稳定性云端浏览器自动化的场景。

对于云端部署的 OpenClaw,最大的痛点在于浏览器没有显示界面,这会对浏览器自动化操作产生很大影响。刷知乎、小红书、推特或 Reddit 时,传统的 Headless(无头)浏览器几乎过不了人机验证,也很容易卡在扫码登录界面。
云服务器没有显示器,无法看到验证码内容,更别提接管操作了。因此,需要一种方案让云端的 OpenClaw 拥有一个'有血有肉'的真实桌面浏览器,既能保留 Cookie 环境,又能在遇到验证码时通过远程桌面进行人工接管。
经过验证,WebTop + Tailscale 是在云服务器上跑通该方案的推荐组合,成功支持谷歌、知乎、小红书等平台的访问。
为了发挥 OpenClaw 的最大潜力,需要一个真实的桌面浏览器环境,满足以下诉求:
本质上都是在 Xvfb 上做了不同程度的封装:
| 维度 | Xvfb + noVNC | WebTop ⭐ | Selenium Chrome | Playwright + xvfb |
|---|---|---|---|---|
| 内存占用 | ~250MB | ~600MB | ~450MB | ~200MB |
| CPU(空闲) | 低 | 中(桌面环境) | 低 - 中 | 低 |
| 安装复杂度 | 复杂 | 简单 | 较简单 | 中等 |
| 维护复杂度 | 复杂 | 简单 | 较简单 | 中等 |
| 人工接管 | Web VNC | 完整桌面 | Web VNC | 需额外配置 |
| 接管体验 | 一般 | 优秀 | 一般 | 差 |
| 反爬效果 | 好 | 优秀 | 差 | 一般 |
| 稳定性 | 中等 | 自动化稳定 | 好 | 中等 |
选择理由:
选定方案后,增加了 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 高配版本):
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 |
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
复制终端输出的链接,在本地浏览器授权登录。
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
- 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:
[, ]
# 获取 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 行:- PASSWORD=${WEBTOP_PASSWORD:-ChangeMe123!}获取远程机的私有网络地址:
tailscale ip -4
然后在本地浏览器访问 https://<Tailscale_IP>:3001。
大概率会先看到'被安全拦截'的警告页,这是因为 WebTop 强制启用 HTTPS,但证书是自签名的。点击 高级 → 继续访问 即可。
稍等片刻,就能看到远程浏览器已经打开。可以随时查看云端浏览器的状态,不用担心浏览器异常退出,监控脚本每 15 秒检测一次状态;一旦崩溃会立刻重启。
OpenClaw 原生的 CDP 控制速度较慢,截图功能可能存在默认截取全图的情况。建议安装 Agent Browser 技能包,它是 Rust 编写的浏览器自动化工具,定位准、速度快。
Agent Browser 支持通过 --cdp 9222 连接 WebTop 已有的 Chromium 进行工作。安装完技能,将相关配置写入 TOOLS.md。
这样 OpenClaw 就拥有了自己的桌面浏览器,可以执行总结博客内容、AI 热点监控、登录社交平台等操作。
--cdp-url http://localhost:9222 指定 CDP 接口。官方强调这条路径是为第三方云浏览器或自建实例准备的。Q: 想启用密码或公网访问?
A: 默认依赖 Tailscale 隐私网络,不开放公网端口。如果必须暴露公网,务必在 docker-compose 里启用 PASSWORD 并配置强口令,同时建议套上一层 Cloudflare Tunnel / Caddy 做额外认证。
Q: 远程桌面很卡怎么办? A: 示例 VPS 在新加坡,国内访问延迟较高。人工接管时确实会感觉卡顿,但 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