威联通 NAS 安装 OpenClaw 教程(Docker 部署 + 完整踩坑记录)

基于 威联通 TS-532X 与 QTS 5.2.8.3359 实测,完整记录了通过 Docker 部署 OpenClaw 的全过程。从镜像拉取、容器创建、代理环境配置,到模型接入(DeepSeek)、网关访问、Telegram 与微信渠道打通,均给出了可直接复现的操作步骤。同时针对常见问题(如 Web 控制台访问限制、代理导致的连接异常等)提供了具体解决方案。通过这套部署方案,可以将 NAS 从传统存储设备升级为常驻在线的 AI 网关,实现多模型统一管理与多平台接入,提升设备利用率与整体可玩性。

很多人把 威联通 NAS 当成一个“下载机 + 网盘”,但其实它本质上是一台 24 小时在线的低功耗服务器。如果只是用来存文件,硬件能力是被严重浪费的。

而 OpenClaw 这种 AI 网关类项目,刚好可以把 NAS 的价值发挥出来:

相比把这些服务跑在云服务器上,NAS 的优势是长期成本更低 + 完全掌控 + 可玩性更高。尤其是像 TS-532X 这种带万兆网络的设备,本身就具备不错的性能基础,用来跑这类服务其实非常合适。

🧰 设备环境

在 威联通 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

如果出现:

说明安全策略拦截了。

解决方法是停止容器,编辑配置文件:

/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 + 阿里云百炼),避免单一服务不稳定。

最后几个实用经验:

退出容器:

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

这套配置的效果非常明显:

修改完成后需要执行:

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
      }
    }
  }
}
使用 Discussions 讨论 Github 上编辑 分享到 X