远程控制 OpenClaw:从群晖 Docker 到本地浏览器的完整隧道指南

## 背景

OpenClaw 是一个强大的浏览器自动化框架,其核心服务通常运行在服务器端(如群晖 NAS),而控制端则是本地的 Chrome 浏览器插件 **OpenClaw Browser Relay**。插件默认只连接本地的 `127.0.0.1:18792`,无法直接与远程服务通信。因此,我们需要建立一条安全的隧道,将远程服务的端口映射到本地,让插件“以为”服务就在本地。

本文记录了在群晖 NAS(通过 Docker 运行 OpenClaw)与 Windows 本地电脑之间实现这一目标的全过程,包括踩坑与解决方案。所有敏感信息均已脱敏。

---

## 环境

- **远程服务器**:群晖 DS220+,IP `192.168.1.100`(示例)
- **OpenClaw 部署方式**:Docker Compose(容器名 `openclaw-openclaw-gateway-1`)
- **本地电脑**:Windows 11,PowerShell
- **目标**:通过 SSH 隧道,将群晖上的 OpenClaw 服务端口映射到本地的 `18792`,使浏览器插件能远程控制浏览器。

---

## 第一步:SSH 隧道基础尝试

最初的想法很简单:在本地执行 SSH 端口转发命令,将远程端口映射到本地。

```bash
ssh -L 18792:127.0.0.1:18792 [email protected] -N
```

### 遇到的错误

**错误 1**:`ssh: command not found`(Windows 未安装 OpenSSH 客户端)  
**解决**:在 Windows 设置中安装“OpenSSH 客户端”可选功能,或通过 PowerShell 安装。

**错误 2**:`channel 2: open failed: administratively prohibited: open failed`  
**原因**:群晖的 SSH 服务默认禁用了 TCP 端口转发。  
**解决**:以 root 登录群晖,编辑 `/etc/ssh/sshd_config`,确保以下两行存在且未被注释:

```
AllowTcpForwarding yes
PermitOpen any
```

然后重启 SSH 服务:

```bash
synoservicectl --restart sshd
```

**错误 3**:`Permission denied, please try again.`(密码错误或认证失败)  
**排查**:直接用 `ssh [email protected]` 测试登录,确认密码无误。最终通过 `ssh -v` 调试发现是密码输入问题,重试后成功。

---

## 第二步:隧道终于建立,但本地访问被拒绝

再次执行 SSH 隧道命令:

```bash
ssh -L 18792:127.0.0.1:18792 [email protected] -N
```

输入密码后,窗口停留在光标闪烁状态(正常)。但浏览器访问 `http://127.0.0.1:18792` 时,SSH 窗口出现错误:

```
channel 2: open failed: connect failed: Connection refused
```

这说明本地 `18792` 端口已经监听,但转发到远程的 `127.0.0.1:18792` 时,远程没有服务在监听。显然,OpenClaw 并没有监听这个端口。

---

## 第三步:查找 OpenClaw 的真实端口

通过 SSH 登录群晖,查看 Docker 容器端口映射:

```bash
docker ps | grep openclaw
```

输出:

```
dcd1b6c4a45c   nginx:alpine     ...   0.0.0.0:8443->443/tcp   openclaw-nginx
5f05be4dd7a2   openclaw:local   ...   0.0.0.0:18789-18790->18789-18790/tcp   openclaw-openclaw-gateway-1
```

可以看到,OpenClaw 网关容器将宿主机的 `18789-18790` 端口映射到了容器内。为了确定具体是哪个端口用于插件通信,在群晖上直接 curl 测试:

```bash
curl http://127.0.0.1:18789   # 返回了 OpenClaw 控制界面的 HTML
curl http://127.0.0.1:18790   # Connection refused
```

因此,真实端口是 **18789**。

---

## 第四步:调整 SSH 隧道命令

终止原来的 SSH 隧道,重新执行:

```bash
ssh -L 18792:127.0.0.1:18789 [email protected] -N
```

再次访问 `http://127.0.0.1:18792`,这次 SSH 窗口没有报错,但浏览器显示:

```
unauthorized: gateway token missing
```

这说明隧道已通,但 OpenClaw 要求认证。

---

## 第五步:获取并设置网关令牌

OpenClaw 默认使用 **token 认证模式**,需要在浏览器中设置令牌。

### 在群晖上查看/生成令牌

进入 OpenClaw 的 docker-compose 目录(例如 `/volume1/docker/openclaw`),执行:

```bash
docker compose exec openclaw-gateway node dist/index.js config get gateway.auth.token
```

如果返回空,则生成新令牌:

```bash
docker compose exec openclaw-gateway node dist/index.js doctor --generate-gateway-token
```

得到类似 `ocw_xxxxxx...` 的令牌字符串,完整复制。

### 在浏览器中设置令牌

访问 `http://127.0.0.1:18792`,页面显示 `unauthorized`,同时有一个输入框要求粘贴 **Gateway Token**。将令牌粘贴并保存,刷新页面,控制界面正常加载。

此时,OpenClaw Browser Relay 插件图标也应变为橙色 **ON**,表示已成功连接。

---

## 第六步:处理设备批准(如果仍无法连接)

某些情况下,即使设置了令牌,仍需要批准设备。在浏览器访问后,OpenClaw 会生成一个 pending 设备请求。查看待处理设备:

```bash
docker compose exec openclaw-gateway node dist/index.js devices list
```

输出可能包含多行,状态为 `pending` 的即为待批准。例如:

```
Request ID                              Device ...    Status
a7590340-2fc2-42bb-841b-83553e5032f1    ...           pending
```

批准该请求:

```bash
docker compose exec openclaw-gateway node dist/index.js devices approve a7590340-2fc2-42bb-841b-83553e5032f1
```

刷新浏览器,一切正常。

---

## 总结

整个过程中,关键点如下:

1. **SSH 隧道**:必须确保远程 SSH 服务允许 TCP 转发(修改 `sshd_config`)。
2. **端口确认**:Docker 映射的端口可能不是默认的 `18792`,需要实际探测。
3. **认证**:OpenClaw 需要网关令牌,必须正确配置。
4. **设备批准**:如果启用设备配对,还需批准浏览器的连接请求。

最终,通过 `ssh -L 18792:127.0.0.1:18789 user@remote-ip -N` 隧道,我们成功将群晖上的 OpenClaw 服务映射到本地,实现了通过浏览器插件远程控制。

---

## 附录:常用命令速查

- 建立隧道(保持窗口打开):  
  `ssh -L 18792:127.0.0.1:18789 [email protected] -N`

- 查看 Docker 端口映射:  
  `docker ps | grep openclaw`

- 在容器内执行命令:  
  `docker compose exec openclaw-gateway node dist/index.js [command]`

- 查看网关令牌:  
  `docker compose exec openclaw-gateway node dist/index.js config get gateway.auth.token`

- 批准设备:  
  `docker compose exec openclaw-gateway node dist/index.js devices approve <request-id>`

- 查看待处理设备:  
  `docker compose exec openclaw-gateway node dist/index.js devices list`

希望这篇记录能帮助遇到类似问题的朋友们。如有疑问,欢迎交流!

Read more

Flutter for OpenHarmony: Flutter 三方库 pedantic_mono 引入最严格的代码静态审计规范(鸿蒙项目代码质量卫士)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 项目开发,尤其是多人协作的大型工程时,“代码风格不统一”和“潜在逻辑风险”是性能和维护的双重杀手。虽然 Dart 官方提供了 lints 包,但其约束力往往较弱。 pedantic_mono 是一套极度严格、由社区资深开发者维护的统计审计(Lint)规则集。它不仅包含了基础的排版规范,更深入到了异步安全(Async Safely)、集合操作性能以及代码健壮性等多个维度。引入它,就像是为你的鸿蒙项目请来了一位 24 小时待命的“代码审计专家”。 一、核心审计范围图 pedantic_mono 覆盖了从变量命名到高阶逻辑的每个角落。 pedantic_mono 规则库 基础规范 (命名/排序) 异步安全 (忘记 await/

By Ne0inhk
Flutter 三方库 lazy_evaluation 的鸿蒙化适配指南 - 深度调优计算性能、实现“按需而动”的极致资源管理方案

Flutter 三方库 lazy_evaluation 的鸿蒙化适配指南 - 深度调优计算性能、实现“按需而动”的极致资源管理方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 lazy_evaluation 的鸿蒙化适配指南 - 深度调优计算性能、实现“按需而动”的极致资源管理方案 前言 在高性能应用的开发中,我们常说“最好的优化就是不做无用功”。然而,在复杂的逻辑链中,我们往往会预先计算一堆可能根本不会被用到的变量或模型,这在资源受限的移动设备(尤其是需要极速响应的鸿蒙设备)上是对电池和 CPU 的极大浪费。 惰性求值(Lazy Evaluation)是一种优雅的策略:它确保一个昂贵的计算过程只在程序真正需要其结果时才执行,且结果会被缓存以备后用。 lazy_evaluation 为 Dart 提供了一种极简的封装,完美补齐了编译器层面某些惰性特性的缺失。在 OpenHarmony 系统的适配实操中,我们将看到它如何帮助我们实现更精细的初始化策略,以及如何在确保“鸿蒙式流畅”的同时,极限压榨硬件能效。 一、原理解析 / 概念介绍

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 intersperse 优雅在鸿蒙列表项间插入间隔或装饰(UI 细节处理助手)

Flutter for OpenHarmony: Flutter 三方库 intersperse 优雅在鸿蒙列表项间插入间隔或装饰(UI 细节处理助手)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 OpenHarmony 应用的 UI 设计中,我们经常需要在列表(List)或一排组件(Column/Row)之间插入特定的元素,例如: 1. 在一排按钮中间插入分隔线。 2. 在列表数据项之间插入间隙(Spacing)。 3. 为每个组件之间添加逗号或其他符号。 常见的做法是手写 for 循环并通过索引判断。但这种方式不仅代码丑陋,且在处理动态列表时极其容易出错(例如忘记最后一个元素不加分隔符)。 intersperse 是一个极简的扩展库。它通过为 Iterable 增加一个极其直观的方法,彻底解决了“元素间插入”这一烦人的小问题。 一、核心操作图解 intersperse 提供了一种“无感插入”的流式处理方式。 [A, B, C] (原始数据) intersperse(

By Ne0inhk
Windows装Docker至D盘/其他盘(最新,最准确,直接装)

Windows装Docker至D盘/其他盘(最新,最准确,直接装)

前言 Docker的默认安装路径为 C:\你的用户名\AppData\Local\Docker\wsl 这样安装常常会导致C盘爆满。目前现有博客的安装方法往往不能把docker的container和image也装在非C盘。本博客旨在用最简单的方式,把Docker Deskstop的images和container装在D盘中。 安装前,请提前打开WSL2, 步骤 1. 上官网下载Docker Desktop Installer.exe 2. 以管理员身份打开Windows终端,并转到你下载文件的位置。 输入:cd + 你Docker Desktop Installer.exe下载到的地址。比如,我本机的命令为: cd C:\Users\ASUS\Downloads 3. 在命令提示符内运行下面代码,并根据你的安装需求做出修改: start /w “” “Docker Desktop Installer.exe” install -accept-license --installation-dir=“D:

By Ne0inhk