威联通 NAS 安装 OpenClaw 教程(Docker 部署 + 完整踩坑记录)
基于 威联通 TS-532X 与 QTS 5.2.8.3359 实测,完整记录了通过 Docker 部署 OpenClaw 的全过程。从镜像拉取、容器创建、代理环境配置,到模型接入(DeepSeek)、网关访问、Telegram 与微信渠道打通,均给出了可直接复现的操作步骤。同时针对常见问题(如 Web 控制台访问限制、代理导致的连接异常等)提供了具体解决方案。通过这套部署方案,可以将 NAS 从传统存储设备升级为常驻在线的 AI 网关,实现多模型统一管理与多平台接入,提升设备利用率与整体可玩性。
很多人把 威联通 NAS 当成一个“下载机 + 网盘”,但其实它本质上是一台 24 小时在线的低功耗服务器。如果只是用来存文件,硬件能力是被严重浪费的。
而 OpenClaw 这种 AI 网关类项目,刚好可以把 NAS 的价值发挥出来:
- 常驻在线:不需要电脑开机,随时可用
- 统一入口:把多个 AI 模型(DeepSeek / 阿里云 / 其他)整合到一起
- 多渠道接入:Telegram、微信等都可以直接接入
- 本地化控制:数据和配置都在自己设备上,更可控
相比把这些服务跑在云服务器上,NAS 的优势是长期成本更低 + 完全掌控 + 可玩性更高。尤其是像 TS-532X 这种带万兆网络的设备,本身就具备不错的性能基础,用来跑这类服务其实非常合适。
🧰 设备环境
- NAS:威联通 TS-532X,5 盘位设计
- 系统:QTS 5.2.8.3359
- CPU:AnnapurnaLabs AL-324(4 核 ARM)
- 内存:8GB(支持扩展)
- 网络:2 × 10GbE SFP+ + 2 × 1GbE
- 环境:已安装 Container Station,支持 Docker 容器
- 用途:部署 OpenClaw
在 威联通 TS-532X(系统:QTS 5.2.8.3359)上部署 OpenClaw,本质就是用 Docker 跑一个长期在线的 AI 网关服务。下面记录完整安装流程和踩坑点,按步骤走基本不会出问题。
首先在 Container Station 里拉取镜像:
alpine/openclaw
本文使用的是 2026.3.31 版本。
镜像下载完成后直接创建容器,名称填 openclaw,启动命令如下(默认即可),镜像地址 https://hub.docker.com/r/alpine/openclaw :
node openclaw.mjs gateway --allow-unconfigured
网络模式建议直接选 Host,可以避免后面端口访问和 WebSocket 的各种限制问题。
接下来是比较关键的环境变量,如果你需要走代理(例如 V2Ray),建议一开始就配置好,如果你的 Docker 本来就可以访问外网就不用:
TZ=Asia/Shanghai
HTTP_PROXY=http://192.168.2.20:7890
HTTPS_PROXY=http://192.168.2.20:7890
NO_PROXY=localhost,127.0.0.1,192.168.2.0/24
这里有个细节:NO_PROXY 一定要包含你的局域网段,否则后面访问 NAS 本机会出现各种奇怪问题(尤其是回环访问失败)。
存储路径建议挂载出来,方便后续改配置。
需要先创建一个文件夹这样方便管理:
/Container/OpenClaw -> /home/node/.openclaw
运行模式开启「特权模式」,然后启动容器,等初始化完成。
接下来进入容器进行配置。可以用 SSH:
进入 NAS 操作
ssh admin@192.168.2.20
进入 具体容器 操作
sudo docker exec -it openclaw bash
但实测 SSH 容易断,更推荐直接用威联通自带的容器控制台进入。
进入后先看状态:
openclaw status
没问题的话执行:
openclaw config
这里主要是配置模型。Google API 虽然免费,但稳定性一般,而且配置麻烦,实际使用更推荐直接换成 DeepSeek。可以用下面命令快速切换默认模型(不用改配置文件,也不用重启):
openclaw models set deepseek/deepseek-chat
顺便可以确认一下当前状态:
openclaw models list
openclaw config get agents.defaults.model.primary
配置过程中,每改一个关键参数,服务一般会自动重启,这是正常现象。
然后是网关访问。系统会生成一个登录 Token,例如:
c52c623c0c2ced1a5f0162254c021f89315b66
如果需要手动重启网关:
openclaw gateway restart
接下来可以配置聊天渠道。先做 Telegram,配置好 Bot 后,随便发一条消息会返回配对码,然后执行:
openclaw pairing approve telegram H8K2LH4M
Bot Token 类似这样:
81607095:AAEW9PlmBBxuYYBI_ithVD0A
微信这块稍微坑一点,直接在容器里执行官方提供的安装:
npx -y @tencent-weixin/openclaw-weixin-cli@latest install
如果失败,多执行几次,一般能成功。成功后扫码登录。如果首次登录异常没有来得及扫二维码,可以手动触发:
openclaw channels login --channel openclaw-weixin
再说 Web 控制台访问,这是很多人会卡住的地方。默认访问:
ws://192.168.2.20:18789
如果出现:
origin not allowedcontrol ui requires device identity
说明安全策略拦截了。
解决方法是停止容器,编辑配置文件:
/Container/OpenClaw/openclaw.json
找到 controlUi,改成这样:
"controlUi": {
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"http://192.168.2.20:18789"
],
"dangerouslyDisableDeviceAuth": true
}
保存后重启容器,再用浏览器访问:
http://192.168.2.20:18789
输入 Token 就能进后台。
如果需要增强能力,可以加搜索 API,比如 Exa:
1db7a4-e35f-4368-8d8c-5165480edd
另外建议配置多个模型服务商(例如 DeepSeek + 阿里云百炼),避免单一服务不稳定。
最后几个实用经验:
- SSH 容器操作不稳定,优先用 NAS 控制台
- 网络问题基本都和代理 / NO_PROXY 有关
- Host 网络模式可以避免 80% 坑
- 改配置后服务自动重启是正常行为
退出容器:
exit
或直接 Ctrl + D
需要注意的问题
在实际使用 OpenClaw 的过程中,我遇到一个比较离谱的问题:单次请求 Token 使用量直接飙到 3 万+。排查后发现,并不是历史对话累积,而是配置策略导致的。
核心原因主要有三个:
首先,默认使用的模型(如 qwen、MiniMax、Kimi)都支持超大上下文窗口(最高 100 万 tokens),这会让系统倾向于保留更多上下文,从而导致 Token 消耗失控。
其次,compaction.mode 设置为 safeguard,属于偏保守策略,不会主动压缩历史内容。
最后,没有限制上下文大小(如 contextTokens),导致单次请求可以无限扩展。
针对这些问题,我对配置做了一轮优化,核心思路就是:限制上下文 + 强制压缩 + 控制启动加载量。
关键配置如下:
"contextTokens": 800,
"compaction": {
"mode": "default",
"reserveTokens": 200,
"keepRecentTokens": 200,
"recentTurnsPreserve": 3
},
"bootstrapMaxChars": 500,
"bootstrapTotalMaxChars": 1500
这套配置的效果非常明显:
- 单次请求 Token 从约 37K → 8K(下降约 78%)
- 上下文不会无限增长
- 启动加载内容减少约 90%
修改完成后需要执行:
openclaw gateway restart
使配置生效。
如果你也遇到 Token 消耗异常的问题,这一套优化基本可以直接解决。
性能 vs Token 成本优化对比表
| 配置状态 | 单次请求 Token | 上下文保留策略 | Bootstrap 加载量 | 系统性能表现 |
|---|---|---|---|---|
| 默认配置 | ~37,000 | 完全保留(safeguard) | 15,000 字符 | 高内存占用,响应慢 |
| 优化后 | ~8,000 | 压缩 + 保留最近 3 轮对话 | 1,500 字符 | 内存占用降低,响应速度快,稳定性高 |
配置文件
{
"messages": {
"ackReactionScope": "group-mentions"
},
"agents": {
"defaults": {
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
},
"compaction": {
"mode": "safeguard"
},
"models": {
"modelstudio/qwen3.5-plus": {
"alias": "Qwen"
},
"modelstudio/qwen3-max-2026-01-23": {},
"modelstudio/qwen3-coder-next": {},
"modelstudio/qwen3-coder-plus": {},
"modelstudio/MiniMax-M2.5": {},
"modelstudio/glm-5": {},
"modelstudio/glm-4.7": {},
"modelstudio/kimi-k2.5": {}
},
"model": {
"primary": "modelstudio/qwen3.5-plus",
"fallbacks": [
"modelstudio/qwen3-max-2026-01-23",
"modelstudio/qwen3-coder-next",
"modelstudio/qwen3-coder-plus",
"modelstudio/MiniMax-M2.5",
"modelstudio/glm-5",
"modelstudio/glm-4.7",
"modelstudio/kimi-k2.5"
]
}
}
},
"gateway": {
"auth": {
"mode": "token",
"token": "c52c623c0c2ced19454c021f89315b66"
},
"mode": "local",
"port": 18789,
"bind": "lan",
"controlUi": {
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"http://192.168.2.20:18789"
],
"dangerouslyDisableDeviceAuth": true
},
"tailscale": {
"mode": "off",
"resetOnExit": false
}
},
"meta": {
"lastTouchedVersion": "2026.3.31",
"lastTouchedAt": "2026-04-01T17:26:25.768Z"
},
"wizard": {
"lastRunAt": "2026-04-01T17:26:25.571Z",
"lastRunVersion": "2026.3.31",
"lastRunCommand": "configure",
"lastRunMode": "local"
},
"models": {
"mode": "merge",
"providers": {
"deepseek": {
"baseUrl": "https://api.deepseek.com",
"api": "openai-completions",
"models": [
{
"id": "deepseek-chat",
"name": "DeepSeek Chat",
"reasoning": false,
"input": [
"text"
],
"contextWindow": 131072,
"maxTokens": 8192,
"cost": {
"input": 0.28,
"output": 0.42,
"cacheRead": 0.028,
"cacheWrite": 0
},
"compat": {
"supportsUsageInStreaming": true
},
"api": "openai-completions"
},
{
"id": "deepseek-reasoner",
"name": "DeepSeek Reasoner",
"reasoning": true,
"input": [
"text"
],
"contextWindow": 131072,
"maxTokens": 65536,
"cost": {
"input": 0.28,
"output": 0.42,
"cacheRead": 0.028,
"cacheWrite": 0
},
"compat": {
"supportsUsageInStreaming": true
},
"api": "openai-completions"
}
]
},
"modelstudio": {
"baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"api": "openai-completions",
"models": [
{
"id": "qwen3.5-plus",
"name": "qwen3.5-plus",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 1000000,
"maxTokens": 65536
},
{
"id": "qwen3-max-2026-01-23",
"name": "qwen3-max-2026-01-23",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 65536
},
{
"id": "qwen3-coder-next",
"name": "qwen3-coder-next",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 65536
},
{
"id": "qwen3-coder-plus",
"name": "qwen3-coder-plus",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 1000000,
"maxTokens": 65536
},
{
"id": "MiniMax-M2.5",
"name": "MiniMax-M2.5",
"reasoning": true,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 1000000,
"maxTokens": 65536
},
{
"id": "glm-5",
"name": "glm-5",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 202752,
"maxTokens": 16384
},
{
"id": "glm-4.7",
"name": "glm-4.7",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 202752,
"maxTokens": 16384
},
{
"id": "kimi-k2.5",
"name": "kimi-k2.5",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 262144,
"maxTokens": 32768
}
]
}
}
},
"auth": {
"profiles": {
"deepseek:default": {
"provider": "deepseek",
"mode": "api_key"
},
"google:default": {
"provider": "google",
"mode": "api_key"
},
"modelstudio:default": {
"provider": "modelstudio",
"mode": "api_key"
}
}
},
"channels": {
"telegram": {
"enabled": true,
"groups": {
"*": {
"requireMention": true
}
},
"botToken": "8416095:AAEW9PpzYxuYYBI_ithVD0A"
},
"openclaw-weixin": {
"channelConfigUpdatedAt": "2026-04-01T16:11:23.925Z"
}
},
"plugins": {
"entries": {
"openclaw-weixin": {
"enabled": true
},
"exa": {
"enabled": true,
"config": {
"webSearch": {
"apiKey": "1db7aed4-e35f-4368-8d8c-510065480edd"
}
}
}
},
"installs": {
"openclaw-weixin": {
"source": "npm",
"spec": "@tencent-weixin/openclaw-weixin@latest",
"installPath": "/home/node/.openclaw/extensions/openclaw-weixin",
"version": "2.1.2",
"resolvedName": "@tencent-weixin/openclaw-weixin",
"resolvedVersion": "2.1.2",
"resolvedSpec": "@tencent-weixin/openclaw-weixin@2.1.2",
"integrity": "sha512-eUvuBeJrJdI7T7tXNksTpE2Dm+YEMMBU8AzN5cVnPSIf0TMx2D+jFsW2pZzCAYy9fWQ6S1+VqFw==",
"shasum": "a3ddab0a1947b0e08f53495fa61077bda7",
"resolvedAt": "2026-04-01T15:43:19.608Z",
"installedAt": "2026-04-01T15:47:09.742Z"
}
}
},
"tools": {
"web": {
"search": {
"provider": "exa",
"enabled": true,
"openaiCodex": {}
},
"fetch": {
"enabled": true
}
}
}
}