☰
在群晖NAS上配置OpenClaw:一次踩坑后的保姆级教程(TaoToken修订版)
2026/10/7 7:00:21 网站建设 项目流程

1. 群晖NAS上跑OpenClaw,我踩过的第一个坑

OpenClaw 是一个开源的 AI 编码助手网关,能把你常用的模型能力统一封装成 OpenAI 兼容接口,适合自托管用户把编码助手、Agent 工作流接到自己的硬件上。群晖 NAS 常年开机、功耗低、Docker 支持成熟,是跑 OpenClaw 的理想载体。但如果你第一次在 DSM 里直接点“容器管理器”新建容器,大概率会在端口映射和权限上卡住——我试过用默认 bridge 网络跑,结果 Web UI 一直转圈,日志里反复报permission denied和address already in use。

这篇教程面向已经有一台群晖 NAS、但第一次接触 OpenClaw 的运维和自托管用户。我会交付一份可直接复制的 Docker Compose 配置、完整的环境变量清单、端口映射表,以及三步验证动作:容器日志检查、Web UI 连通性测试、API Key 调用回显。整个过程不需要你懂太多 Docker 底层,只要会 SSH 登录 DSM 就行。

先说清楚 OpenClaw 在群晖上的定位:它本身不训练模型,而是一个请求转发与协议适配层。你给它一个上游模型的 Base URL 和 Key,它对外暴露标准的/v1/chat/completions接口。群晖的 CPU 型号(比如 Intel Celeron J4125 或 AMD Ryzen R1600)跑这个网关绰绰有余,真正吃资源的是你调用的上游模型。所以别担心 NAS 性能不够,瓶颈在网络和配置。

我用的环境是 DSM 7.2、Container Manager 24.x、OpenClaw 镜像ghcr.io/openclaw/openclaw:latest。下面所有命令和配置都基于这个组合实测通过。如果你用的是 DSM 6.2,Docker 版本较老,Compose 语法需要把version字段保留为"3.8",其余基本一致。

2. TaoToken 前置准备:拿到 Base URL 和 API Key

OpenClaw 要能工作,必须有一个上游模型服务。这里我用 TaoToken 作为上游,因为它提供 OpenAI 兼容接口,接入 OpenClaw 只需要改 Base URL 和 Key 两个值。你需要在 TaoToken 控制台创建一个 API Key,并确认你的账户有可用额度。

第一步,打开 TaoToken 官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,注册或登录后进入控制台。控制台地址是https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite。在控制台左侧找到“API Keys”,点击创建新 Key。建议给这个 Key 起名openclaw-nas,方便后续在群晖里识别。创建后立刻复制,页面刷新后就看不到完整 Key 了。

第二步,确认 Base URL。TaoToken 的 API 入口是https://taotoken.net/api,注意这个地址不带任何查询参数。OpenClaw 配置里填的 Base URL 就是它,后面 OpenClaw 会自动拼接/v1/chat/completions。如果你填成https://taotoken.net/api/v1,会变成/api/v1/v1/chat/completions,直接 404。这个坑我在第一次配置时踩过,日志里报404 page not found,排查了半小时才发现是路径重复。

第三步,确认你要用的 Model ID。TaoToken 支持多种模型,具体可用列表在文档里查:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。常见的有claude-sonnet-4-20250514、gpt-4o等。OpenClaw 的环境变量里需要指定默认模型,填错会导致请求返回model not found。

这里给一个对照表,把三个核心参数列清楚:

参数名填写值说明
Base URLhttps://taotoken.net/api不带末尾斜杠,不带 /v1
API Keysk-开头的一串字符控制台创建后立即复制
Model ID如claude-sonnet-4-20250514以文档最新列表为准

如果你后续要做长期编码或 Agent 工作流,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。它适合高频调用场景,这里先不展开,先把基础接入跑通。

拿到这三个值后,先别急着关控制台。你可以顺手在“模型对话”页面发一条测试消息,确认 Key 本身可用:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite。如果那边能正常回显,说明 Key 和额度没问题,接下来群晖里的问题就纯粹是容器配置了。

3. 可复制配置:Docker Compose 与环境变量清单

群晖 DSM 7.2 的 Container Manager 支持直接粘贴 Compose 文件创建项目。我建议用 SSH 登录 NAS 后操作,因为需要提前建目录和改权限。假设你的 DSM 管理员账号是admin,NAS IP 是192.168.1.100。

先通过 SSH 登录:

ssh admin@192.168.1.100

然后创建 OpenClaw 的数据目录。群晖的 Docker 数据默认在/volume1/docker,我们在这里建一个openclaw文件夹:

sudo mkdir -p /volume1/docker/openclaw/data sudo chown -R 1026:100 /volume1/docker/openclaw

这里的1026:100是群晖 Docker 容器内常用的用户和组 ID,避免容器写入时权限不足。如果你不确定,可以先设成1000:1000,后面根据日志调整。

接下来创建 Compose 文件。在/volume1/docker/openclaw下新建docker-compose.yml:

version: "3.8" services: openclaw: image: ghcr.io/openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "18789:18789" environment: - OPENCLAW_HOST=0.0.0.0 - OPENCLAW_PORT=18789 - OPENCLAW_API_KEY=sk-你的TaoToken密钥 - OPENCLAW_BASE_URL=https://taotoken.net/api - OPENCLAW_DEFAULT_MODEL=claude-sonnet-4-20250514 - OPENCLAW_LOG_LEVEL=info - OPENCLAW_DATA_DIR=/app/data volumes: - /volume1/docker/openclaw/data:/app/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:18789/health"] interval: 30s timeout: 10s retries: 3

端口映射表如下,方便你对照检查:

容器端口宿主机端口协议用途
1878918789TCPWeb UI 与 API 入口

环境变量清单再单独列一遍,方便你复制到别处:

变量名必填示例值说明
OPENCLAW_HOST是0.0.0.0监听所有网卡
OPENCLAW_PORT是18789服务端口
OPENCLAW_API_KEY是sk-xxxTaoToken 密钥
OPENCLAW_BASE_URL是https://taotoken.net/api上游地址
OPENCLAW_DEFAULT_MODEL是claude-sonnet-4-20250514默认模型
OPENCLAW_LOG_LEVEL否info日志级别
OPENCLAW_DATA_DIR否/app/data数据持久化目录

把sk-你的TaoToken密钥替换成真实 Key 后保存。然后在同目录下执行:

sudo docker-compose up -d

如果你用的是 Container Manager 图形界面,进入“项目”->“新增”,选择“创建 docker-compose.yml”,把上面内容粘贴进去,路径选/volume1/docker/openclaw,点击完成即可。图形界面和命令行效果一样,但命令行更容易看到实时输出。

启动后别急着访问 Web UI,先看日志。这一步很关键,因为很多配置错误在启动阶段就会暴露。

4. 三步验证:日志、Web UI、API 回显

4.1 容器日志检查

执行:

sudo docker logs -f openclaw

正常启动的日志会依次出现:

level=info msg="starting openclaw gateway" level=info msg="listening on 0.0.0.0:18789" level=info msg="upstream base url: https://taotoken.net/api" level=info msg="default model: claude-sonnet-4-20250514" level=info msg="health endpoint ready"

如果你看到permission denied写/app/data,说明目录权限不对,回到第 3 节改chown。如果看到address already in use,说明 18789 端口被占用,执行sudo netstat -tlnp | grep 18789找到占用进程,或者把宿主机端口改成18790:18789。

4.2 Web UI 连通性测试

在浏览器打开http://192.168.1.100:18789。如果页面能加载出 OpenClaw 的界面,说明容器网络和端口映射都正常。如果转圈或拒绝连接,先在 NAS 本机执行:

curl -v http://localhost:18789/health

返回{"status":"ok"}说明服务本身没问题,问题在群晖防火墙。DSM 的“控制面板”->“安全性”->“防火墙”里,需要放行 18789 端口。另外如果你开了 QuickConnect 或反向代理,注意不要和这个端口冲突。

4.3 API Key 调用回显

最后一步,用 curl 模拟一次真实请求,确认 OpenClaw 能把请求转发到 TaoToken 并拿回结果:

curl -X POST http://192.168.1.100:18789/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoToken密钥" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复两个字:通了"}], "max_tokens": 20 }'

如果返回类似:

{ "id": "chatcmpl-xxx", "object": "chat.completion", "choices": [{"message": {"role": "assistant", "content": "通了"}}] }

说明整条链路打通:群晖容器 -> OpenClaw -> TaoToken -> 模型 -> 回显。如果返回 401,检查 Authorization 头里的 Key 是否和控制台一致;如果返回 404,检查 Base URL 是否多写了/v1;如果返回model not found,检查 Model ID 拼写。

这三步做完,你的 OpenClaw 就已经在群晖上稳定运行了。后续你可以把它接到 Cline、Continue 等编码工具里,Base URL 填http://192.168.1.100:18789/v1,Key 填你在 TaoToken 创建的那个。

5. 本篇常见错排查:401、local proxy failed、reading choices

这一节把我遇到的和社区反馈最多的报错集中列出来,对照日志定位。

401 Unauthorized:最常见。日志里会显示upstream returned 401。原因通常是三个:Key 复制时多了空格、Key 已被删除、或者你在 OpenClaw 环境变量里填的 Key 和请求头里的 Key 不一致。注意 OpenClaw 本身不校验 Key,它只是透传,所以 401 一定来自上游。解决方法是重新在控制台创建一个 Key,直接粘贴,不要手动输入。

local proxy failed:日志里出现local proxy failed: dial tcp 127.0.0.1:7890: connect: connection refused。这是 OpenClaw 尝试走本地代理但代理没开。检查你的环境变量里有没有HTTP_PROXY或HTTPS_PROXY,如果有就删掉。群晖容器默认不走代理,除非你手动加了。另外检查 Compose 文件里有没有多余的network_mode: host,这会导致端口冲突和代理继承。

reading choices:日志里报error reading choices: unexpected end of JSON input。这通常发生在流式响应被截断时。OpenClaw 默认开启流式转发,如果你的上游返回了非标准 SSE 格式,就会解析失败。解决方法是在环境变量里加OPENCLAW_STREAM=false,强制非流式。或者检查 Model ID 是否支持流式,有些模型需要显式传stream: true。

OAuth 相关报错:如果你看到oauth token expired或invalid_grant,说明你误用了 OAuth 类型的 Key。TaoToken 的 API Key 是静态的sk-开头,不需要 OAuth 刷新流程。检查控制台里创建的是“API Key”而不是“OAuth 应用”。

容器反复重启:docker ps看到状态是Restarting。执行sudo docker logs --tail 50 openclaw看最后几行。多数是环境变量缺失导致启动失败,比如没填OPENCLAW_API_KEY。OpenClaw 在启动时会校验必填项,缺失就直接退出。

如果你用的是 CC Switch 或 Cline MCP 来管理多个模型端点,记住三件套必须写全:Base URL 填https://taotoken.net/api,Key 填sk-开头那串,Model ID 填文档里的准确名称。少任何一个都会在切换时失败。Codex 的auth.json里也是同样三个字段,格式是:

{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的密钥", "model": "claude-sonnet-4-20250514" }

Claude Code 如果要接入,在 settings 里配置ANTHROPIC_BASE_URL为https://taotoken.net/api,ANTHROPIC_API_KEY填你的 Key。注意 Claude Code 走的是 Anthropic 协议,OpenClaw 已经做了协议转换,所以直接填就行。具体接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite。

6. 跑通之后:把 OpenClaw 接进你的编码工作流

容器跑起来只是第一步。真正提升效率的是把它接到你每天用的工具里。我现在的用法是:群晖上的 OpenClaw 作为统一入口,家里几台电脑的 Cline、Continue、甚至手机上的快捷指令都指向http://192.168.1.100:18789/v1。这样我只需要在 TaoToken 控制台管理一个 Key,换模型时改 OpenClaw 的环境变量重启即可,不用每台设备都改配置。

如果你要长期跑编码任务或 Agent 工作流,建议看一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。它针对高频调用做了额度优化,比按量计费更适合每天跑几十次补全的场景。创建和管理 Key 仍然在 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite。

最后分享一个实用技巧:群晖的 Container Manager 支持“自动启动”,在容器设置里勾选“启用自动重新启动”,这样 NAS 断电恢复后 OpenClaw 会自己起来。另外把/volume1/docker/openclaw/data加入 Hyper Backup 的备份列表,里面存的是会话日志和配置,换 NAS 时直接恢复就行。端口方面,如果你不想记 18789,可以在 DSM 的反向代理里绑一个域名,比如openclaw.yourdomain.com指向localhost:18789,然后申请 Let's Encrypt 证书,这样外网访问也是 HTTPS。不过反向代理的配置涉及群晖的 Web Station,步骤较多,这里先不展开,等你把基础链路跑稳了再折腾。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询