用 Unraid 搭一套 24/7 本地 Agent:Ollama + OpenClaw 一键复刻
【省 Token + 数据不出网】

适用人群:有显卡、有 NAS/服务器、长期在线、不想把数据交给外网、还想把 Agent 玩明白的人。
目标:在 内网 跑起一个“能执行任务”的本地 Agent:
推理走本地 GPU(Ollama)
执行与编排走本地网关(OpenClaw)
让你从此不再被“云端 token 账单”和“外泄风险”牵着走
1)背景:为什么 OpenClaw 这么香,也这么容易翻车?
先说一句大实话:OpenClaw 的魅力不在“它会聊天”,而在于——它能动手做事。
你可以把它理解成“一个有手有脚的 AI”:
能读写工作区文件(workspace)
能跑命令行(shell)
能控浏览器做自动化
能挂定时任务(cron)
能把能力接到各种聊天入口(可选)
但问题也来自这里:一旦它动起来,就很容易出现两类争议:
争议 A:烧 Token(甚至免费额度也能被跑光)
Agent 不是“一问一答”,而是“计划→执行→校验→修正”的多轮循环;再叠加浏览器、工具调用、定时任务,很容易把云端推理消耗推高。
争议 B:数据外泄(更多是“误配置”导致)
真正危险的往往不是软件本身,而是:
网关暴露到公网(或弱 token / 错误绑定)
目录挂载过大(把整个 NAS 根目录丢给 Agent)
技能/脚本来源不明(供应链风险)
网页/文档里的提示注入(诱导 Agent 执行危险动作)
结论:想享受 Agent 的效率,最好把它“圈”在内网里,把推理也尽量本地化。
2)本地化方案:让推理回到你的 GPU,让 Agent 只活在内网
这篇的方案很简单、很工程化:
Ollama:负责本地推理(走你 Unraid 的 NVIDIA GPU)
OpenClaw:负责执行与编排(网关 + 控制台,只在局域网访问)
架构一句话:
浏览器(内网) → OpenClaw(18789) → 调用 Ollama(11434/v1) → GPU 本地推理
你得到的结果是:
日常推理成本“可控”(不再依赖云端 token)
数据默认不出内网(除非你自己开放)
你的 Agent 变成“自有基础设施”(能长期跑、能审计、能备份)
3)一键部署:把模板丢进 U 盘目录,Unraid 下拉就能装
我把我自己跑通的 Unraid 模板整理出来了(已脱敏):
你只要把两个模板文件放到 Unraid 的 Flash 里:
路径:
/boot/config/plugins/dockerMan/templates-user/
(也可以在 Unraid WebUI 里进入 Flash 对应目录上传)
然后:
Docker → Add Container → Template 下拉选择 → Apply
就能一键创建容器。
国内常见 ghcr.io 拉不动:你可以把镜像域名替换成可用镜像源(我这里已经在模板里替换好了)。
4)部署顺序:先 Ollama,后 OpenClaw(别反)
Step 1:先装 Ollama
装好后进容器 Console(或 SSH 到 Unraid)执行:
ollama list
ollama pull qwen3:8b
# 或者:拉取并立即对话验证
ollama run qwen3:8b
能正常对话 = 本地推理层 OK。
小提示:如果你要确认 GPU UUID,可在 Unraid 执行:
nvidia-smi -L
Step 2:再装 OpenClaw(并生成你的网关 token)
OpenClaw 的访问一般是这样的(局域网):
http://:18789/?token=
token 建议用随机 32 字节(64 hex):
openssl rand -hex 32
5)验证:5 分钟确认你真的“全本地跑起来了”
按这个清单打勾:
ollama run qwen3:8b能对话浏览器能打开
http://:18789/?token=...OpenClaw 控制台里对话不再提示缺某云厂商 API Key(说明走本地模型)
Unraid Docker 页面端口映射正常:11434 / 18789
6)FAQ:最常见的三个坑
Q1:为什么很多教程要起两个容器:gateway 和 cli?
简单说:
gateway 容器:一直跑着的服务(你打开网页、对话、执行任务,全靠它)
cli 容器:只用来跑管理命令(例如 status / setup / update),跑完就退出
用 docker-compose 的人常这么分,是为了“管理命令更干净”。
但在 Unraid 单容器玩法里,你通常直接:
docker exec -it <你的_openclaw_容器名> openclaw status
就够了。
Q2:页面提示 disconnected (1008): device identity required 怎么办?
这通常是因为 Control UI 需要“安全上下文”生成 device identity(常见是 HTTPS/localhost 才算安全上下文),而你在内网用纯 HTTP 打开时触发了要求。
你有三种思路(从更安全到更省事):
用 HTTPS(反向代理 / VPN / 仅内网证书)
本机打开(localhost / 127.0.0.1)
允许不安全认证:在内网可信环境下,启用
allowInsecureAuth让它回退到 token-only(这属于安全降级,只建议内网)
Q3:日志出现 EACCES: permission denied(mkdir /home/node/.openclaw/...)
本质是:容器内用户(常见是 node 用户)和宿主机目录权限/UID 不匹配。
解决方式一般就两类:
把映射目录修改为容器用户可写
或调整容器运行用户
7)安全硬化:别让“高权限 Agent”变成内网炸弹
一句话原则:高权限 Agent 不上公网;能最小权限就最小权限。
18789 不要暴露公网:只内网;远程访问走 VPN/反代 + HTTPS
token 够长 + 定期轮换:别写进公开文章、别截图打码不全
目录最小挂载:不要把整个 NAS 根目录挂给容器
技能/脚本谨慎启用:来源不明的脚本不要直接执行
日志与更新:定期更新镜像;出问题先看日志、再看配置、再看挂载目录权限
8)复制区块——零理解成本一键复刻
你只需要替换占位符:
:你的 Unraid 内网 IP
:你自己生成的 token
、:你的 GPU UUID(或直接改成 all)
8.1 复制区块:my-ollama.xml(Unraid 模板)
用途:一键创建 Ollama 容器(含 GPU runtime 与持久化目录)。
放置路径:/boot/config/plugins/dockerMan/templates-user/my-ollama.xml
<?xml version="1.0"?>
ollamadocker.1ms.run/ollama/ollama:latesthttps://hub.docker.com/r/ollama/ollama/bridgebashfalsehttps://hub.docker.com/r/ollama/ollama/The easiest way to get up and running with large language models locally.AI: Other:http://[IP]:[PORT:11434]/https://raw.githubusercontent.com/Joly0/docker-templates/master/templates/ollama.xmlhttps://ollama.ai/public/ollama.png--runtime=nvidia --restart=always1770261903**Nvidia Driver plugin** (nVidia Support)/mnt/user/appdata/ollama11434*<GPU_UUID_1>,<GPU_UUID_2>2256h
8.2 复制区块:my-openclaw.xml(Unraid 模板)
用途:一键创建 OpenClaw 容器(含国内可用镜像、workspace/config 持久化、token 访问)。
放置路径:/boot/config/plugins/dockerMan/templates-user/my-openclaw.xml
<?xml version="1.0"?>
OpenClawghcr.nju.edu.cn/openclaw/openclaw:latesthttps://github.com/openclaw/openclaw/pkgs/container/openclawbridgeshfalsehttps://forums.unraid.net/topic/196865-support-openclaw-ai-personal-assistanthttps://github.com/openclaw/openclawProductivity: Tools: AIhttp://[IP]:[PORT:18789]/--user root --hostname OpenClawsh -c "mkdir -p /root/.openclaw /home/linuxbrew; [ -s /root/.openclaw/openclaw.json ] || echo '{"gateway":{"mode":"local","bind":"lan","controlUi":{"allowInsecureAuth":true},"auth":{"mode":"token"}}}' > /root/.openclaw/openclaw.json; exec node dist/index.js gateway --bind lan"18789/mnt/user/appdata/openclaw/config/mnt/user/appdata/openclaw/workspace<OPENCLAW_GATEWAY_TOKEN>
8.3 复制区块:openclaw.json(把默认模型指到本地 Ollama)
用途:让 OpenClaw 默认模型走本地 Ollama,避免云端 token。
你可以在 OpenClaw 控制台 Config 中直接粘贴保存(或编辑映射目录里的文件)。
{
"meta": {
"lastTouchedVersion": "2026.2.6",
"lastTouchedAt": "2026-02-10T03:47:35.508Z"
},
"models": {
"providers": {
"ollama": {
"baseUrl": "http://:11434/v1",
"apiKey": "__OPENCLAW_REDACTED__",
"models": [
{
"id": "500a1f067a9f",
"name": "qwen3:8b",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 8192
}
]
}
},
"bedrockDiscovery": {
"providerFilter": []
}
},
"agents": {
"defaults": {
"model": {
"primary": "ollama/qwen3:8b"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
},
"messages": {
"ackReactionScope": "group-mentions"
},
"commands": {
"native": "auto",
"nativeSkills": "auto"
},
"gateway": {
"mode": "local",
"bind": "lan",
"controlUi": {
"allowInsecureAuth": true
},
"auth": {
"mode": "token"
}
}
}
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

杖藜行歌
校验提示文案
杖藜行歌
校验提示文案