💭 引言:为什么选择系统级部署而非Docker
在做好上述安全隔离的前提下,我们在飞牛 NAS 上采用 npm i -g openclaw 系统级安装,不要使用 sudo安装,在用户级别下安装就行,原因如下:
| 对比项 |
系统级部署 ✅ |
Docker ❌ |
| 调试友好性 |
直接编辑配置文件,无需进容器 |
需挂载卷、处理权限映射 |
| 网络连通性 |
直连主机网络,Telegram API 通信稳定 |
容器 NAT 可能导致 Webhook 失败 |
| 权限控制 |
明确指定运行用户,配合 allowlist 更安全 |
用户/组映射复杂,易出错 |
| 长期运维 |
原生 systemd 托管,日志清晰 |
依赖 Docker Compose,多一层抽象 |
⚠️ 重要提醒:OpenClaw 具备读取文件和执行系统命令的能力,不建议在主力 NAS 或存有重要数据的设备上直接部署。如果你的飞牛 NAS 主要用于家庭影音、文档存储等日常用途,请务必:
- 启用
allowlist 限制可访问目录
- 避免将敏感文件放在 Agent 可见路径
- 优先在测试环境或次要设备上试用
🔒 核心原则:
不是“必须用专用设备”,而是“在现有设备上做好最小权限隔离”。
系统级部署 + 配置防护 = 轻量、可控、可维护。 ⚠️ Docker常见坑:代理配置繁琐、时区漂移、依赖版本锁死、日志收集困难
📖 前言:什么是OpenClaw?
OpenClaw是一个强大的AI助手框架,可以:
- ✅ 部署在NAS等Linux设备上
- ✅ 通过Telegram、WhatsApp等聊天平台与AI对话
- ✅ 执行文件操作、自动化任务
- ✅ 集成各种AI模型(如DeepSeek、GPT等)
- ✅ 支持自定义技能和插件
- ✅ 提供Web Dashboard管理界面
一、📦 OpenClaw系统级安装
1.1 检查系统信息
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -a
# 查看CPU架构(很重要!)
uname -m
预期输出示例:
uname -m 输出说明:
- x86_64 → 64位Intel/AMD处理器(大多数飞牛NAS)
- aarch64 → ARM64处理器(部分NAS型号)
- armv7l → ARM 32位处理器
1.2 检查是否已安装Node.js
# 检查Node.js版本
node -v
# 检查npm版本
npm -v

我这边之前提前安装了,如果没有安装或版本过低,继续下面的步骤。
1.3 安装必要的工具
# 更新软件包列表(如果是Debian/Ubuntu系统)
apt update
# 安装curl和wget(如果还没有)
apt install -y curl wget git
# 安装构建工具(某些npm包需要)
apt install -y build-essential python3
📦1.4 安装Node.js
OpenClaw 至少需要 Node.js 22 或更高版本。
用NodeSource官方源(推荐)
# 下载NodeSource安装脚本
# 根据你的系统选择:
# - Debian 11/12 使用 setup_22.x
# - Ubuntu 20.04/22.04/24.04 使用 setup_22.x
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
# 安装Node.js
apt install -y nodejs
# 验证安装
node -v # 应显示类似 v22.x.x
npm -v # 应显示类似 10.x.x
二、📦 OpenClaw安装
# 安装
npm i -g openclaw

- 这里一直在转圈圈耐心等待,可以通过监测网络传输数据。

你现在用的是普通用户 Jaben(普通用户), 但 npm i -g 默认要往 /usr/local/lib 写, 👉 权限被系统正确地拦下来了(EACCES)。
① 给 npm 配一个「用户级全局目录」
mkdir -p ~/.local/npm-global
npm config set prefix '~/.local/npm-global'
② 把它加入 PATH(只对你生效)
echo 'export PATH="$HOME/.local/npm-global/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

又报错误了: ✅ Node 是用 nvm 管的(v24.13.0)
❌ npm 的 prefix 被你手动改成了 ~/.local/npm-global
⚠️ nvm 不喜欢这样,会导致:
切 Node 版本后全局包“消失”
PATH 混乱
将来排错非常痛苦
👉 所以我们要“回到 nvm 推荐姿势”
✅ 正确解决方案(推荐,也最干净)
✔ 第一步:让 nvm 接管一切(照它说的来)
nvm use --delete-prefix v24.13.0 --silent
✔ 第二步:确认 prefix 已经没了
npm config get prefix
期望结果:说明状态完美 ✅
/home/Jaben/.nvm/versions/node/v24.13.0

重新用「nvm 风格」重新装 openclaw(继续等待转圈圈/(ㄒoㄒ)/~~)
npm i -g openclaw

出现这个信息🎉恭喜,这一步已经成功了,而且是“姿势完全正确”的那种成功。那些警告信息是openclaw的部分依赖比较老,但不影响使用,可以👉 可以完全忽略。
🧪 现在做 3 个“黄金确认”(很重要)
请依次执行:
1️⃣ 看 openclaw 在哪
which openclaw
2️⃣ 看版本(确认能跑)
openclaw --version
3️⃣ 确认用户身份
whoami
# Jaben

🎉🎉🎉恭喜,做到这一步,openclaw已经完美安装;
🚀 下一步开始准备启用openclaw。
三、🚀 初始化配置
openclaw onboard #初始化配置

到这个页面就开始初次运行配置了,下面就简单介绍下配置过程:
2.1 ⚠️ Security安全提示

| 风险项 |
防护建议 |
| 文件系统访问 |
启用 allowlist限制可访问目录 |
| 命令执行权限 |
配置沙箱环境 |
| 敏感信息泄露 |
密钥单独存放于 secrets.json |
选 YES,回车选择 QuickStart

2.2 🤖 模型配置(以Z.AI为例)
选择Z.AI(GLM 4.7) → 输入API_KEY → 选择第一个默认模型

2.3 💬 即时通讯Bot核心配置 ⭐(以TG为例)
选择TG → 输入TG token
获取Token步骤:
- 搜索官方机器人创建平台(如@BotFather)
- 发送
/newbot 创建新机器人
- 命名机器人 → 获取
HTTP API格式的Token

2.4 跳过skill配置,截图保存红框配置文件路径,后续都可以打开文件进行配置。

终端会自动跳转“到要不要给 openclaw 打开 Bash 命令自动补全?” ✅ 选 Yes(推荐) openclaw 会:在你的 用户级 bash 配置 里加一小段补全脚本,只影响你这个用户 ,以后用起来更爽,没任何副作用。
2.5 本地电脑打开OpenClaw Dashboard UI界面
下面就是打开UI地址:(复制保存)
🎉 Dashboard URL:
http://127.0.0.1:18789/#token=xxxx

输入 openclaw gateway run启动OpenClaw
安全起见,先将终端环境启用代理:
export http_proxy=http://192.168.31.197:7890 && export https_proxy=http://192.168.31.197:7890 && export all_proxy=socks5://192.168.31.197

2.6 💬 即时通讯Bot核心配置跟OpenClaw配对 ⭐(最后一步了)

从运行状态可以看出OpenClaw在等待BOT配对中
- 回到你的TG机器人聊天输入
/start,机器人会弹出你的配对码

/home/Jaben/.local/npm-global/bin/openclaw pairing approve telegram 你的配对码

这样你的BOT就跟OpenClaw配对成功了。
2.7 💬 Bot控制OpenClaw演示效果

任务演示



任务演示2




三、♻️ 长期运行(systemd守护)(可选)
终端一关,OpenClaw就关掉了,想要保持OpenClaw长期后台运行可以按照下面操作
3.1 创建服务
sudo vi /etc/systemd/system/openclaw.service
[Unit]
Description=OpenClaw Gateway 🤖
After=network.target
[Service]
Type=simple
User=root
Environment="TELEGRAM_BOT_TOKEN=你的Token"
ExecStart=/usr/local/bin/openclaw gateway run
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
3.2 启动并自启
sudo systemctl daemon-reload
sudo systemctl enable --now openclaw
sudo systemctl status openclaw # 查看状态 ✅
四、📋 完整命令速查表
# ===== 安装阶段 =====
npm i -g openclaw
export PATH=/usr/local/bin:$PATH && source ~/.bashrc
# ===== 配置阶段 =====
openclaw onboard # 交互式初始化
export TELEGRAM_BOT_TOKEN="xxx" # Bot 配置(示例)
# ===== 配对阶段 ⭐关键 =====
openclaw gateway run & # 后台启动网关
# 在 IM 应用给 Bot 发送消息,获取回复的配对码后:
openclaw pairing list # 查看待批准请求
openclaw pairing approve telegram <code> # 批准配对 ✅
# ===== 运行阶段 =====
openclaw dashboard # 启动面板
sudo systemctl start openclaw # 后台服务(如已配置)
# ===== 维护命令 =====
openclaw pairing revoke telegram <user_id> # 撤销配对权限
sudo journalctl -u openclaw -f # 实时查看日志
nano ~/.openclaw/config.json # 修改配置文件
五、🏗️ 架构示意图
**─────────────────** **─────────────** **─────────────────**
** 👤 用户终端 **────→** 消息平台 **←────** Bot API服务 **
** (手机/电脑) ** ** (IM应用) ** ** (下发配对码) **
**─────────────────** **──────**──────** **─────────────────**
**
↓ 发送配对码
**─────────────────**
** 🖥️ 飞牛NAS **
** **─────────────** **
** **OpenClaw ** **◄── 接收配对请求
** **Gateway ** **
** **:18789 ** **◄── systemd托管
** **(127.0.0.1) ** **
** **──────**──────** **
** ↑ **
** [执行approve] **
** SSH隧道入口 **
** (22端口) **
**────────**─────────**
**
═════════╧═════════ 局域网/互联网
**
**────**────**
** 💻 电脑 **
** localhost**
** :18789 **◄── 浏览器访问Dashboard
**─────────**
配对流程图示:


六、🔒 SSH Key登录与安全加固
6.1 🔑 生成SSH密钥对
ssh-keygen -t ed25519 -C "openclaw-nas" -f ~/.ssh/openclaw_nas
6.2 📤 上传公钥到NAS
ssh-copy-id -i ~/.ssh/openclaw_nas.pub Jaben@192.168.31.197
效果: 免密码登录 + 防暴力破解 ✅
6.3 🛡️ OpenClaw应用层安全配置(关键!)
💡 核心原则:最小权限 + 目录隔离
(1) 启用 allowlist 限制文件访问范围
编辑配置文件:
nano ~/.openclaw/config.json
添加或修改以下字段(注意:标准JSON,无注释):
{
"fileSystem": {
"allowlist": [
"/home/Jaben/openclaw_workspace",
"/mnt/user/AI_Tools"
]
}
}
✅ 最佳实践:
- 创建专用工作目录(如
~/openclaw_workspace)
- 所有Agent操作文件放在此目录内
- 不要将
allowlist 设为 / 或 /home
(2) 避免敏感文件暴露
- 不要在
allowlist 目录中存放: * SSH私钥(~/.ssh/id_*)
- 建议:在飞牛NAS的共享文件夹中新建
AI_Workspace 专用目录,并仅对此目录授权
(3) 运行用户降权(可选但推荐)
如果不需要系统级操作,可在 systemd 服务中指定普通用户:
[Service]
User=Jaben # 而非 root
Group=users
6.4 🌐 网络与系统层加固
| 层级 |
措施 |
操作 |
| SSH层 |
禁root登录 |
PermitRootLogin no |
| 网络层 |
Fail2Ban |
apt install fail2ban |
| 应用层 |
Token保护 |
存 secrets.json,设600权限 |
| 传输层 |
防火墙限制 |
ufw allow from 192.168.31.0/24 |
| 物理层 |
VPN访问 |
公网场景强制WireGuard/OpenVPN |
七、✅ 总结
| 阶段 |
关键成果 |
| 1️⃣ 安装 |
系统级npm部署,选择更轻量的方案 |
| 2️⃣ 配置 |
模型+消息平台双通道就绪 |
| 2.5 🔗 配对 |
Bot下发配对码 → NAS执行approve |
| 3️⃣ 访问 |
本地端口映射安全穿透内网 |
| 4️⃣ 运维 |
systemd保活,日志可追踪 |
| 5️⃣ 安全 |
allowlist目录隔离 + 分层加固 |

如有修改将更新在文章底部留言,觉得有用可以点赞+转发+推荐,点点关注,你的支持是我更新的最大动力❤。