1. 群晖 NAS 上 OpenClaw Docker 安装问题到底卡在哪OpenClaw 是一个可以自托管的 AI 助手网关能对接多种模型通道把对话、设备授权、控制面板统一在一个 Web 界面里管理。它适合想在本地 NAS 上跑一套私有 AI 入口的人尤其是手里已经有群晖、想复用 7×24 小时在线环境的用户。部署方式主流就是 Docker而群晖 DSM 7.x 的 Container Manager 对 docker-compose 支持已经比较完整所以用 compose 编排是最省心的路径。但真正动手时问题往往不在 OpenClaw 本身而在群晖这套环境的特殊性镜像拉取走不动、端口和 DSM 自带服务打架、挂载目录权限对不上容器内的 node 用户、反向代理后 WebSocket 连不上、设备配对一直 pending。这些报错单独看都不难凑在一起就容易让人卡半天。我这套环境是群晖 DS923DSM 7.2数据目录放在/volume1/docker/openclaw/。下面按「先能跑起来再能连上模型」的顺序把 compose 配置、权限修复、端口调整、TaoToken 接入和验证清单一次讲清楚。你照着替换占位符就能复现。核心检索词先明确OpenClaw Docker 安装问题、群晖 NAS docker-compose 部署、OpenClaw 接入 TaoToken。这三个词贯穿全文遇到报错时直接对号入座即可。2. TaoToken 前置准备与 OpenClaw 模型通道配置OpenClaw 本身不带模型它需要一个 OpenAI 兼容的 API endpoint。默认它可能指向某些公共通道但在群晖这种长期在线的环境里把 endpoint 统一到 TaoToken 会更稳一个 Key 管多个模型Base URL 固定不用在容器里塞一堆不同厂商的地址。TaoToken 的定位是统一模型调用通道兼容 OpenAI 风格的/v1/chat/completions接口。对 OpenClaw 来说你只需要三样东西Base URL、API Key、Model ID。这三件套在后面的 compose 环境变量和 OpenClaw 配置文件里都会用到。先拿 Key。打开 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker登录后创建一个新 Key复制出来形如sk-xxxxxxxx。这个 Key 只显示一次建议先贴到本地临时文件里。Base URL 用https://taotoken.net/api注意这里不加 UTM接口地址保持干净。Model ID 按你实际要用的填比如gpt-4o-mini、claude-3-5-sonnet这类具体以模型对话页面里列出的为准https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker如果你打算长期跑编码类 Agent 任务可以顺带看下 Coding Plan额度模型更适合高频调用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker接入文档在这里遇到字段对不上时翻一下https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker注意Key 不要写进会提交到 Git 的 compose 文件里。群晖上建议用.env文件存 Keycompose 里用${TAOTOKEN_API_KEY}引用.env权限设成 600。前置准备做完你手里应该有一个sk-开头的 Key、Base URLhttps://taotoken.net/api、一个确认可用的 Model ID。接下来进 compose。3. 可复制的 docker-compose.yml 与权限端口配置群晖上我用的目录结构是这样/volume1/docker/openclaw/ ├── docker-compose.yml ├── .env ├── data/ └── nginx/ ├── ssl/ └── conf.d/先建目录并处理权限。OpenClaw 容器内跑的是 node 用户UID 通常是 1000群晖宿主机上如果目录属主不对容器写配置就会报EACCES: permission denied。cd /volume1/docker/openclaw mkdir -p data nginx/ssl nginx/conf.d sudo chown -R 1000:1000 data sudo chmod -R 755 data.env文件内容TAOTOKEN_API_KEYsk-你的真实Key OPENCLAW_GATEWAY_TOKENb0e5ab你的固定令牌 NAS_IP192.168.1.100docker-compose.yml完整片段重点看环境变量和网络services: openclaw-gateway: image: openclaw:local container_name: openclaw-gateway restart: unless-stopped environment: - OPENCLAW_GATEWAY_TOKEN${OPENCLAW_GATEWAY_TOKEN} - OPENAI_API_KEY${TAOTOKEN_API_KEY} - OPENAI_BASE_URLhttps://taotoken.net/api - OPENAI_MODELgpt-4o-mini volumes: - ./data:/home/node/.openclaw ports: - 18789:18789 networks: - openclaw-network nginx: image: nginx:alpine container_name: openclaw-nginx restart: unless-stopped volumes: - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/ssl:/etc/nginx/ssl:ro ports: - 8443:443 depends_on: - openclaw-gateway networks: - openclaw-network networks: openclaw-network: driver: bridge几个关键点解释一下。端口这里宿主机用8443映射容器443是因为群晖 DSM 自己占了 443 和 5000/5001直接映射 443 会报port is already allocated。网关内部端口18789保持不变Nginx 通过服务名openclaw-gateway访问它所以两个服务必须在同一个自定义网络里否则会报host not found in upstream openclaw-gateway。Nginx 配置nginx/conf.d/openclaw.confserver { listen 443 ssl; server_name 192.168.1.100; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; location / { proxy_pass http://openclaw-gateway:18789; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 86400s; proxy_send_timeout 86400s; } }Upgrade和Connection这两行是 WebSocket 的关键控制面板加载不出来十有八九是这里漏了。自签证书生成cd /volume1/docker/openclaw openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout nginx/ssl/key.pem -out nginx/ssl/cert.pem \ -subj /CCN/STBeijing/LBeijing/OOpenClaw/OUHome/CN192.168.1.100把192.168.1.100换成你的群晖内网 IP。生成后启动docker compose up -d docker compose logs -f openclaw-gateway如果镜像openclaw:local拉不到说明你还没在本地构建。群晖上可以先在项目目录执行官方构建脚本或者把 image 换成你实际能拉到的镜像名。镜像拉取失败时先确认 Container Manager 的注册表能不能访问再检查镜像名拼写。4. 验证请求与成功结果从容器日志到模型对话容器起来不代表模型通了。分三层验证容器活着、网关能响应、模型能回话。第一层看容器状态docker compose ps两个服务都应该是Up。如果openclaw-gateway反复重启直接看日志docker compose logs --tail100 openclaw-gateway第二层验证网关 HTTP 响应。在群晖 SSH 里执行curl -k https://192.168.1.100:8443/-k是因为自签证书。返回 HTML 或 302 都算正常如果返回 502说明 Nginx 连不上网关回去检查网络和服务名。第三层验证 TaoToken 通道。这一步最关键直接测模型接口curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的真实Key \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 只回复两个字通了}] }返回 JSON 里choices[0].message.content是「通了」说明 Key、Base URL、Model ID 三件套都对。如果这里就报 401别急着怪 OpenClaw先解决 Key 问题。模型通道确认后回到浏览器打开https://192.168.1.100:8443/?tokenb0e5ab你的固定令牌第一次会显示pairing required。这是设备授权机制不是报错。立刻在 SSH 里执行docker compose exec openclaw-gateway node /app/dist/index.js devices list记下 Pending 里的 Request ID然后批准docker compose exec openclaw-gateway node /app/dist/index.js devices approve 你的request-id浏览器强制刷新CtrlShiftR就能进控制面板。进去后发一条消息如果模型正常回话整条链路就通了。实测下来最容易漏的就是「访问页面后要立刻执行 devices list」隔太久 pending 会过期得重新触发。5. 本篇常见报错排查对照表把踩过的坑按报错原文列出来方便你对号入座。报错信息原因解决EACCES: permission denied, open /home/node/.openclaw/...挂载目录属主不是 UID 1000sudo chown -R 1000:1000 dataunauthorized: device token mismatch环境变量令牌与配置文件不一致统一.env里的OPENCLAW_GATEWAY_TOKEN重启control ui requires device identity未用 HTTPS 或设备未授权走 8443 HTTPS执行 devices approveorigin not allowed反向代理来源未放行配置controlUi.allowedOrigins加https://192.168.1.100:8443host not found in upstream openclaw-gateway容器不在同一网络compose 里两个服务都挂openclaw-networkpairing required设备待批准devices list后devices approveport is already allocated443/5000 被 DSM 占用宿主机端口改 8443401 Unauthorized模型请求Key 错误或 Base URL 不对用第 4 节 curl 单独测 TaoTokenlocal proxy failed容器内访问不到外部 endpoint检查群晖 DNS确认容器能解析taotoken.netreading choices报错返回体不是标准 OpenAI 格式确认 Base URL 是https://taotoken.net/api不要多加/v1后缀重复allowedOrigins的配置在data/openclaw.json里结构是这样{ gateway: { controlUi: { allowedOrigins: [https://192.168.1.100:8443] } } }改完重启网关docker compose restart openclaw-gateway关于local proxy failed群晖上常见原因是容器 DNS 没配好。可以在 compose 的 gateway 服务里加dns: - 223.5.5.5 - 8.8.8.8然后docker compose up -d重建。这个报错本质是容器内发不出请求和 OpenClaw 逻辑无关。如果你用的是 Cline MCP 或 Codex 这类客户端去连 OpenClaw记住三件套必须写全Base URL 填https://taotoken.net/apiKey 填sk-开头那串Model ID 填你验证过的模型名。少任何一个都会在客户端侧报鉴权或模型不存在。6. 长期运行与 TaoToken 接入收尾跑通之后日常维护就几件事。备份data/目录和nginx/ssl/前者存配置和设备授权后者丢了浏览器又要重新信任。更新时先docker compose down改完 compose 再up -d别在运行中直接改挂载。日志排查固定用这两条docker compose logs --tail200 openclaw-gateway docker compose logs --tail200 nginx模型调用如果突然变慢或报错先单独 curl 一次 TaoToken 接口确认是通道问题还是 OpenClaw 问题。这个分离排查的习惯能省很多时间。想把 endpoint 从默认通道彻底切到 TaoToken核心就是 compose 里那三行环境变量OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_MODEL。改完docker compose up -d重建容器再进控制面板发一条消息验证。如果控制面板里还有单独的模型设置项把它也指向同一个 Base URL 和 Model ID避免两处配置打架。需要新建或轮换 Key 时回到 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker字段含义对不上就查接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentopenclaw_docker整套流程走下来群晖 NAS 上的 OpenClaw 就是一个常驻的私有 AI 入口模型通道统一走 TaoToken换模型只改一个 Model ID不用动容器网络和证书。最后留一个实用技巧把devices approve那两步写成一个 shell 脚本放项目目录下次加设备直接跑省得每次翻命令历史。