基于 OpenClaw 官方镜像,在其基础上加装 Xfce4 桌面环境与 xrdp 远程桌面服务,可通过 RDP 客户端连入独立容器,容器内还预装了 Chrome,可开箱即用地访问 OpenClaw Web UI。每个用户对应一个完全隔离的容器,数据互不干扰。
openclaw-rdp/
├── Dockerfile.rdp # 扩展官方镜像:加装 Xfce4 + xrdp + supervisord
├── supervisord.conf # 进程管理:同时守护 xrdp 和 openclaw-gateway
├── entrypoint.sh # 容器启动时初始化 openclaw 配置,设置 RDP 密码
├── launch.sh # 按用户名生成并执行 docker run 命令的辅助脚本
└── README.md
外部网络(Windows 客户端)
│ VSCode SSH 端口转发
▼
┌───────────────────────────────────────────────┐
│ 宿主机 │
│ 127.0.0.1 <rdp-port> → container:3389 │ ← 仅本机可达
│ 127.0.0.1 <gw-port> → container:18789 │ ← 仅本机可达
│ 127.0.0.1 <br-port> → container:18790 │ ← 仅本机可达
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ openclaw-net-<username> (独立网络) │ │
│ │ │ │
│ │ container: openclaw-<username> │ │
│ │ supervisord │ │
│ │ ├── xrdp-sesman :3389 │ │
│ │ ├── xrdp :3389 │ │
│ │ └── openclaw-gateway (node) :18789/90 │ │
│ │ │ │
│ │ volume: openclaw-data-<username> │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
进程管理:supervisord 在单容器内同时管理 xrdp 和 openclaw-gateway,无需 docker-compose 的双容器依赖。
数据隔离:每个用户的配置文件、会话历史、工作区文件均存储在独立的 Docker named volume(openclaw-data-<username>),容器删除后数据保留,重新部署可恢复。
网络隔离:每个容器运行在独立的 Docker bridge 网络(openclaw-net-<username>)中,用户之间无法互相访问。
端口暴露策略:所有端口(RDP、Gateway、Bridge)均绑定到宿主机 127.0.0.1,只能通过 VSCode SSH 端口转发从客户端访问,不对任何网络直接暴露。
免交互初始化:entrypoint.sh 在首次启动时以 --non-interactive --accept-risk 参数运行官方 onboard 命令,完成 identity 密钥生成、agent 配置等初始化,随后用 Python 精准 patch openclaw.json 中的 gateway token 与 MaaS provider 配置,其余字段(hooks、plugins、tools 等)均保持 onboard 写入的默认值。再次启动时检测到 identity 目录已存在则跳过 onboard,只执行 patch 步骤。
patch 会注册三个 provider:MaaS-openai(OpenAI 兼容格式)、MaaS-anthrpc(Anthropic Messages 格式,默认模型 Claude Sonnet 4.6)、MaaS-google(Google Generative AI 格式,Gemini 系列),均指向同一 MaaS 服务根地址。
cd openclaw-rdp
docker build --build-arg OPENCLAW_IMAGE=ghcr.io/openclaw/openclaw:latest -f Dockerfile.rdp -t openclaw-rdp:latest .构建完成后可通过 docker images openclaw-rdp 确认。
若需固定到某个 OpenClaw 版本,将 latest 替换为具体 tag,例如 ghcr.io/openclaw/openclaw:2026.3.23。
chmod +x launch.sh
./launch.sh <username> \
--rdp-port 13389 \
--gateway-port 18789 \
--bridge-port 18790 \
--maas-api-key <你的MaaS API Key> \
--rdp-password Alice@2026每个用户需要三个不重复的端口。建议按以下方式递增分配:
| 用户 | RDP 端口 | Gateway 端口 | Bridge 端口 |
|---|---|---|---|
| alice | 13389 | 18789 | 18790 |
| bob | 13390 | 18889 | 18890 |
| carol | 13391 | 18989 | 18990 |
| dave | 13392 | 19089 | 19090 |
启动示例:
KEY=<MaaS API Key>
./launch.sh alice --rdp-port 13389 --gateway-port 18789 --bridge-port 18790 --maas-api-key $KEY --rdp-password Alice@2026
./launch.sh bob --rdp-port 13390 --gateway-port 18889 --bridge-port 18890 --maas-api-key $KEY --rdp-password Bob@2026
./launch.sh carol --rdp-port 13391 --gateway-port 18989 --bridge-port 18990 --maas-api-key $KEY --rdp-password Carol@2026首先在 VSCode PORTS 标签页转发 RDP 端口(例如转发服务器的 13389 到本地 13389),然后:
| 系统 | 操作 |
|---|---|
| Windows | 打开「远程桌面连接」,输入 localhost:<RDP端口>,用户名 node,密码为部署时设置的 --rdp-password |
| macOS | 安装 Microsoft Remote Desktop,添加 PC,地址填 localhost:<RDP端口> |
| Linux | xfreerdp /v:localhost:<RDP端口> /u:node /p:<密码> |
进入远程桌面后,打开浏览器访问:
http://localhost:18789
输入 Gateway Token(部署时由 launch.sh 打印,或 --gateway-token 指定)即可登录。
容器内已安装 Google Chrome。由于容器以非特权模式运行,启动时需加 --no-sandbox --disable-dev-shm-usage:
google-chrome-stable --no-sandbox --disable-dev-shm-usage --remote-debugging-port=9222 --user-data-dir="/home/node/chrome-user-data"并访问 chrome://inspect#remote-debugging 开启调试
若需要让openclaw操控浏览器,还需要在web UI的左侧边栏找到"Agents"-"Tools",在"Quick Presets"中将"Coding"改为"Full"并点击Save保存配置
之后与 OpenClaw 对话让它自己配置即可,如“帮你自己配置好通过 Chrome DevTools Protocol 控制我的浏览器进行操作,你可以看看你的browser工具的说明,我已经在9222端口开放了chrome”,OpenClaw 会自动识别并连接这个调试端口,后续就可以自然语言与它对话让它控制浏览器
所有端口均绑定到宿主机 127.0.0.1,只能通过 VSCode SSH 端口转发访问,不对任何网络直接暴露:
| 端口 | 绑定方式 | 访问方式 |
|---|---|---|
| RDP(如 13389) | 127.0.0.1 |
VSCode 端口转发后,本地 RDP 客户端连接 localhost:<端口> |
| Gateway(如 18789) | 127.0.0.1 |
VSCode 端口转发,或在 RDP 桌面内用 localhost 访问 |
| Bridge(如 18790) | 127.0.0.1 |
同上 |
每个用户容器使用独立的 Docker bridge 网络(openclaw-net-<username>),默认 Docker 的 docker0 网桥会让所有容器互相可见,独立网络消除了这个风险。
| 风险 | 说明 |
|---|---|
| API Key 共享 | 所有容器使用同一个 MAAS_API_KEY,以环境变量形式存在,docker inspect 可见。条件允许时建议为每个用户申请独立 Key |
| 容器内 root 进程 | xrdp、supervisord 以 root 运行,openclaw-gateway 以 node 运行。容器内 root 不等于宿主机 root,风险有限 |
| 变量名 | 说明 | 默认值 |
|---|---|---|
MAAS_API_KEY |
MaaS 平台的 API Key | 无(必填) |
MAAS_BASE_URL |
MaaS 服务根地址 | https://chat.noc.pku.edu.cn |
OPENCLAW_GATEWAY_TOKEN |
Gateway 鉴权 Token | 自动随机生成(32字节 hex) |
OPENCLAW_RDP_PASSWORD |
容器内 node 用户的 RDP 密码 |
openclaw(不安全,务必覆盖) |
# 查看某用户容器的实时日志
docker logs -f openclaw-alice
# 单独查看 openclaw gateway 日志
docker exec openclaw-alice tail -f /var/log/supervisor/openclaw-gateway.log
# 进入容器调试
docker exec -it openclaw-alice bash
# 检查 gateway 健康状态
docker exec openclaw-alice node /app/dist/index.js health --token <gateway_token>
# 重启容器(保留数据)
docker restart openclaw-alice
# 彻底删除容器(数据 volume 和独立网络保留)
docker rm -f openclaw-alice
# 删除容器 + 网络(完整清理)
docker rm -f openclaw-alice
docker network rm openclaw-net-alice
# 删除用户数据(不可恢复)
docker volume rm openclaw-data-alice
# 列出所有用户容器
docker ps --filter "name=openclaw-"
# 列出所有用户数据卷
docker volume ls --filter "name=openclaw-data-"
# 列出所有用户网络
docker network ls --filter "name=openclaw-net-"镜像升级不影响用户数据(数据存储在 volume 中):
# 1. 拉取新版官方镜像并重新构建
docker pull ghcr.io/openclaw/openclaw:latest
docker build --build-arg OPENCLAW_IMAGE=ghcr.io/openclaw/openclaw:latest -f Dockerfile.rdp -t openclaw-rdp:latest .
# 2. 逐个重建用户容器(数据自动恢复)
docker rm -f openclaw-alice
./launch.sh alice --rdp-port 13389 --gateway-port 18789 --bridge-port 18790 \
--maas-api-key <key> --rdp-password Alice@2026 --gateway-token <原token>--gateway-token 建议复用原来的 token,避免用户重新登录 Web UI。原 token 查看方式:
docker exec openclaw-alice cat /home/node/.openclaw/openclaw.json | python3 -m json.tool | grep token- 在 VSCode PORTS 标签确认已转发 RDP 端口,并且连接地址是
localhost:<端口>而非服务器 IP - 检查容器是否正常运行:
docker ps --filter "name=openclaw-alice"
- 查看 xrdp 日志:
docker exec openclaw-alice cat /var/log/xrdp.log - 查看 xrdp-sesman 日志:
docker exec openclaw-alice cat /var/log/xrdp-sesman.log
- Gateway 端口绑定在
127.0.0.1,必须在 RDP 桌面内用localhost:18789访问,不能从外部直接访问 - 确认 gateway 进程正常:
docker exec openclaw-alice supervisorctl status - 查看 gateway 日志:
docker exec openclaw-alice tail -30 /var/log/supervisor/openclaw-gateway.log
- 确认 API Key 已传入:
docker exec openclaw-alice env | grep MAAS - 检查配置文件:
docker exec openclaw-alice cat /home/node/.openclaw/openclaw.json - 测试 MaaS 可达性:
docker exec openclaw-alice curl -sf https://chat.noc.pku.edu.cn && echo OK
删除 openclaw.json,重启后 Python patch 会从空配置重建,等效于恢复到 onboard 后的默认状态再应用 env 参数:
docker exec openclaw-alice rm /home/node/.openclaw/openclaw.json
docker restart openclaw-alice如需强制重新执行完整 onboard(重新生成 identity 密钥),还需同时清空 identity 目录:
docker exec openclaw-alice sh -c "rm /home/node/.openclaw/openclaw.json && rm -rf /home/node/.openclaw/identity/*"
docker restart openclaw-alice