乐于分享
好东西不私藏

威联通安装OpenClaw

威联通安装OpenClaw

最近想倒腾一下 openclaw,没有 Macmini,试试看用 Nas 能不能安装。

威联通用 Docker 安装 OpenClaw 有两种方法,一种是用 Docker Compose 安装,另一种是用容器(Container Station)方式安装。

1 用 Docker Compose 安装

Docker Compose 安装需要定义两个文件,docker-compose.yaml 和 Dockerfile

1.1 docker-compose.yaml 和 Dockerfile

1.1.1 docker-compose.yaml

services:openclaw:# service的名字,自己定义;在同一个Docker Compose中必须唯一#可选,如果要用Dockerfile的话就用build指向Dockerfile所在的目录,Dockerfile的文件名不能改,所以不需要精确到文件,只需要到目录build:.container_name:openclaw#容器名image:openclaw-xxxxxx#镜像名,如果有build就是build里的镜像名,如果没有build就是要拉取的镜像名restart:unless-stoppednetwork_mode:bridge#网络模式,决定容器“用谁的网络栈”,bridge是默认设置,通过端口映射访问# 环境变量environment:-http_proxy=http://xxx.xxx.xx.xx:xxx-https_proxy=http://xxx.xxx.xx.xx:xxx-all_proxy=socks5://xxx.xxx.xx.xx:xxx-no_proxy=localhost,127.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8#用代理的话no_proxy不能少#端口映射ports:-18789:18789#存储映射volumes:-/xx/xxxx/xxxx:/home/node/.openclaw

1.1.2 Dockerfile

#拉取 镜像:版本,如果是经常需要更新的容器,版本建议用版本号,不要统一写latest,方便版本回滚。FROM alpine/openclaw:latest #切换到root用户USER root #执行命令更新apt、安装python3RUN apt -o Acquire::http::Proxy="http://xxx.xxx.xx.xx:xxx" \        -o Acquire::https::Proxy="http://xxx.xxx.xx.xx:xxx" \         update && \    apt -o Acquire::http::Proxy="http://xxx.xxx.xx.xx:xxx" \        -o Acquire::https::Proxy="http://xxx.xxx.xx.xx:xxx" \         install -y python3 #切换回node用户,docoker里就是node用户USER node

1.2 构建环境

准备好了 docker-compose.yaml 和 Dockerfile 两个文件之后首先要构建环境。构建环境就是执行刚才编写的 Dockerfile 文件,因为威联通的 Container Station 下载镜像无法走代理,所以手动通过命令行进行构建。

建议每次下载的镜像用日期和时间命名,方便回滚

#先切换到Dockerfile所在的目录下cd /xxx/xxxx/xx#执行docker build# DOCKER_BUILDKIT=0   因为要用代理,所以要关闭BUILDKIT# --pull 强制从远程仓库拉取镜像,防止从本地仓库拉取之前的缓存# --no-cache 禁用缓存,强制重新构建所有层# -t 就是给镜像命名,后面跟的就是本次要生成的镜像的名称# 最后一个参数就是Dockerfile所在的目录,因为之前已经切换到了Dockerfile所在的目录,所以用 . (表示当前目录)就可以了# 可能需要给到root权限,需要的话就在最前面加上sudoDOCKER_BUILDKIT=0 docker build --pull --no-cache -t {要生成的镜像的名称} {Dockerfile的目录}

1.3 创建应用程序

在 Container Station 中选择 应用程序 然后点击 创建应用程序的名字可以随便取,yaml 代码就是 docker-compose.yaml 里的代码,可以上传。创建前可以通过验证按钮来验证一下脚本是否可用。创建应用程序的时候 Container Station 就会自动创建容器,容器会根据 docker-compose.yaml 里的服务数量和服务名称创建(yaml 里包含几个服务就会创建几个容器)。

应用程序创建完成之后观察一下日志,没有报错就是 openclaw 安装完成了。

2 用Container Station安装

因为之前一直都是用容器方式安装,所以一开始我安装 openclaw 的时候也是用容器方式安装的。后来考虑到 openclaw 的更新频率比较高,每次更新都要重新安装一遍其他的依赖项(比如接入企业微信的话就要安装 python3 ,每次更新 openclaw 的版本都要重新安装一次)比较麻烦,所以 openclaw 就用 Docker Compose 方式安装了。

2.1 下载镜像

先使用浏览功能看一下 DockerHub 中有哪些 openclaw 相关的镜像文件。找到星星最多的镜像 alpine/openclaw,网上查一下觉得没问题于是就选中了这个镜像。直接用提取功能下载这个镜像的最新版,可能镜像比较大所以下载花了几分钟。

2.2 Docker 安装 Openclaw

安装下载好的镜像,整个过程根据界面提示一步步走就可以了。在创建容器的第二步(即配置容器)中有两个地方需要单独配置:网络和存储。

2.2.1 网络配置

进入高级设置,选择网络,然后选择发布新端口。容器的端口是 18789,主机的端口如果没有冲突的话也选择 18789 就可以了,如果冲了就换成其他随便什么端口。

2.2.2 存储配置

在高级设置里,选择存储,然后点击添加卷,选择绑定装载主机路劲。容器的路径是 /home/node/.openclaw,主机的路径需要单独创建一个新的文件夹。这个文件夹就是用来存放 Openclaw 的工作文件的,以后可以直接在主机的这个文件夹里看到 Openclaw 的配置文件和工作空间等文件。

2.2.3 环境配置(可选)

环境配置是配置环境变量的,一般不需要单独配置。如果想要为 Openclaw 的容器配置代理什么的可以在这里配置。环境变量的 key 是

  • http_proxy
  • https_proxy
  • all_proxy all_proxy 可以配置 sock5。
  • no_proxy 不走代理的请求,因为有些请求走代理会有问题,比如 docker 环境下有些容器会请求自己的端口,而这些端口可能不对外暴露所以没有做映射,走到了代理就访问不到这个端口了。部分应用有自己的规则,类似 localhost、127.0.0.1 等请求不会走到代理网络,但是这也只是部分,为了方便起见还是应该加上这个配置。常用的值是 localhost,127.0.0.0/8,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8

3 Openclaw 配置

3.1 登录配置

3.1.1 打开登录界面

Openclaw 的登录地址是你的服务器 ip+你的映射端口:http://服务器ip:映射端口。如果没有特意修改映射端口的话,Openclaw 的默认端口是 18789。如果安装时的网络配置里填写的映射端口不是 18789,那就按填写的端口访问。访问成功后的界面如下

3.1.2 获取令牌

登录的第一步就是要获取 token,token 可以在配置文件里获取 ~/.openclaw/openclaw.json(Docker 配置的时候已经把文件映射到了物理机的磁盘上,根据配置直接去文件夹里找就可以了)。

{"gateway": {"auth": {"mode""token","token""xxxxxxxxxxxxxxxx"//这就是令牌    }//略......  }}

3.1.3 添加信任来源

得到临牌后依然登录不上,页面上会报错: origin not allowed (open the Control UI from the gateway host or allow it in gateway.controlUi.allowedOrigins)

这是因为我们不是本机访问 openclaw,openclaw 默认的配置是不允许的。我们需要在 openclaw 的配置里把我们的访问 openclaw 的 url 加入到被允许的来源里。

{//略......"gateway": {"controlUi": {"allowedOrigins": ["http://localhost:18789","http://127.0.0.1:18789","http://NasIp:18789"//加入你请求openclaw的url      ]    }  }//略......}

3.1.4 在浏览器中信任源

完成上面两步之后登录还是会继续报错: control ui requires device identity (use HTTPS or localhost secure context)

这是一个浏览器安全机制导致的限制。由于 OpenClaw 的 Web UI 需要调用一些敏感的浏览器 API(如加密、剪贴板或身份验证),这些功能被限制在 安全上下文(Secure Context) 中才能运行。我用的是 Chrome 浏览器,在新标签页的地址栏里输入 chrome://flags/#unsafely-treat-insecure-origin-as-secure,然后找到 Insecure origins treated as secure 的配置。把 openclaw 的访问地址填写进去,在启动这个配置就可以了。但是这样配置之后每次打开浏览器都会看到上面有一条提示,虽然可以关但是每次都出现有点难受。

3.1.5 添加信任设备

登录继续报错:device is not approved yet(requestId:xxxxxxxxxxxxxx) 。这个报错是因为当前的设备没有被添加到 openclaw 的信任设备列表里。openclaw 默认是要求所有访问这个 webui 的设备都要添加都信任设备列表中的,如果内网用并且不想搞得这么复杂可以在配置文件(openclaw.json)里修改。

{"gateway": {"auth": {"mode""token","token""xxxxxxxxxxxxxxxx""auto_approve_devices"true//增加这个配置项    }//略......  }}

如果觉得这样设置有风险,那么可以通过 ssh 登录 openclaw 所在的服务器,用 docker 命令登录 openclaw 的容器。

#用于获取docker信息,主要是获取openclaw容器的名字docker ps  #用于登录openclaw的容器,这里面的{openclaw}用实际的容器名替换#我的容器名是openclaw-1,所以我用的命令就是docker exce -it openclaw-1 /bin/bashdocker exce -it {openclaw} /bin/bash

用这两个命令之后应该就已经登录了 openclaw 所在的容器了,接下来就是把当前设备的 Id 加入到 openclaw 的信任设备列表中。

#这是把设备Id添加到openclaw信任设备列表的命令,{deviceId}就是页面上错误提示中的requestId,把它替换过来执行就可以了openclaw devices approve {deviceId} 

完成这些配置之后基本上就可以登录成功了。

3.2 AI 和 Agent 配置

完成了登录之后肯定先要配置一下 AI,毕竟这是 Openclaw 的核心能力。感觉 openclaw 的配置界面有点卡,我选择直接修改配置文件,配置文件的路径是 /home/node/.openclaw/openclaw.json (因为做了存储映射,所以可以直接在宿主机上改)。

"models": {//这是定义大模型"providers": {"大模型提供方(可以自己定义)": {"baseUrl""大模型的baseurl,必须从模型官方获取","apiKey""大模型的appkey,必须从模型官方获取","auth""api-key","models": [          {"id""大模型id,必须从模型官方获取","name""大模型名字","reasoning"false,"input": ["text"            ],"cost": {"input"0,"output"0,"cacheRead"0,"cacheWrite"0            },"contextWindow"200000,"maxTokens"8192          }        ]      }    }  },"agents": {"list": [      {"id""main","tools": {"elevated": {"enabled"true,"allowFrom": {"webchat": ["openclaw-control-ui"              ]            }          }        }      }    ],"defaults": {"models": {//这是定义默认大模型"大模型的id,和models中保持一致": {"alias""大模型的名字,和models中保持一致"        }      }    }  }

4 踩坑记录

4.1 Config write rejected

一开始用的是模型供应商提供的试用额度(量很少,但是模型很多),所以配置了很多试用已经结束的模型。想直接把这些已经耗尽 token 的试用模型清理掉,结果报错了:GatewayRequestError: Error: Config write rejected: /home/node/.openclaw/openclaw.json (size-drop:4753->1735). Rejected payload saved to

根据 AI 的提示发现这个错误的原因是:系统发现你这次修改配置后,配置文件的大小从 4753 字节 骤减到了 1735 字节。为了防止因为误操作、程序 Bug 或磁盘写入异常导致你的配置(比如模型 Key、通道设置、自定义 Skill)大面积丢失,OpenClaw 拒绝了这次写入。那就只能减少修改量,一点点删除。

4.2 docker build 卡住不动

最开始执行 docker build 的时候直接卡住不动了,没有日志,过了很久也不知道为什么卡住。问了 AI 才知道需要给 docker build 加上 --progress=plain 参数,--progress=plain 会显示详细步骤。

4.3 拉取镜像超时

使用 Dockerfile 拉取镜像超时。用 Container Station 拉取镜像不超时,因为给 nas 加了代理。但是 Docker 好像并没有走我给 nas 配置的全局代理。一开始我只以为 Docker 有什么特别的逻辑,所以不受 nas 全局代理的影响,但是找了很多方法给 Docker 加配置都不行。处理这个问题的时候遇到了下面几个坑。

4.3.1 Dockerfile 里的 FROM 不受 build-arg 影响

有 Dockerfile 的情况下,拉取哪个镜像看的是 Dockerfile 里的 FROM 这个配置项。一开始我的理解是既然 FROM 在 Dockerfile 里,那么我使用 docker build 命令的时候增加一个代理的参数就可以了。大概得命令如下

docker build \  --build-arg HTTP_PROXY=http://xx.xx.xx.xx:xxx \  --build-arg HTTPS_PROXY=http://xx.xx.xx.xx:xxx \  --build-arg ALL_PROXY=socks5://xx.xx.xx.xx:xxx \  -t my-openclaw .

试了以后发现不行,问了 AI 才知道 FROM 不受 build-arg (build 命令的参数)的影响。

4.3.2 build 和 buildkit 不走同一套代理

既然给 build 加参数走不通,那还是得让 build 走全局代理。查了一圈资料依然没有头绪,于是决定尝试一下手动拉取镜像,结果没想到使用 docker pull 命令手动拉取竟然可以成功拉下来。如果 docker build 没法走代理拉取镜像,那么 docker 所有的命令应该都是一样的,为什么 docker pull 可以走代理拉取。再次求助 AI,得到的结果是 BuildKit 和 build 没有走一样的代理,同时 AI 表示其实关闭 BuildKit 也可以完成构建,果断选择关闭(因为已经浪费了大量时间在这个问题上)。关闭 BuildKit 的方法就是在 docker 命令前就加上 BUILDKIT=0,即 DOCKER_BUILDKIT=0 docker build -t my-openclaw . 。

4.4 添加信任设备失败

在更新了 openclaw 版本之后想用另一台电脑访问管理后台,在添加信任设备的时候突然报错:Failed to start CLI: GatewayClientRequestError: missing scope: operator.admin。根据错误的提示排查了配置文件发现每个用户都有 operator.admin 这个权限,用 openclaw 自己也解决不了这个问题。反复排查无果,怀疑是版本更新问题(毕竟更新之前增加信任设备都是可用的)。回退版本重新部署 docker 容器之后果然问题消失了。得出一个经验:对于版本更新过快的应用,不要一直更新。Openclaw 基本上几天就会发一个版本,更新太快可能会带来一些额外的 bug。如果使用的版本还算稳定,新版本也没有特别吸引的内容,可以选择以后再更新。

5 参考资料

https://github.com/KimYx0207/Claude-Code-x-OpenClaw-Guide-Zh/blob/main/docs/openclaw/09-Docker%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97.md