吃灰安卓机变身 OpenClaw 服务器 — 完整手册

吃灰安卓变身 OpenClaw 服务器 --- 完整 SOP 手册

本手册以 OnePlus 9 为例 · 无需 Root · 无需买 Mac Mini ,

只用安卓手机 + Termux + SSH,即可玩转 OpenClaw。


目录

  1. 准备工作
  2. [安装 Termux 套件](#安装 Termux 套件)
  3. [初始化 Termux 基础环境](#初始化 Termux 基础环境)
  4. [配置 SSH --- 切换到 Mac/PC 操作](#配置 SSH — 切换到 Mac/PC 操作)
  5. [安装 Ubuntu 虚拟环境](#安装 Ubuntu 虚拟环境)
  6. [安装 Node.js 和 OpenClaw](#安装 Node.js 和 OpenClaw)
  7. [初始化 OpenClaw 配置](#初始化 OpenClaw 配置)
  8. [修复 Android proot 兼容性问题](#修复 Android proot 兼容性问题)
  9. [启动 Gateway(冒烟测试)](#启动 Gateway(冒烟测试))
  10. 配置飞书渠道
  11. 生产级稳定性配置
  12. 安全加固
  13. 回到手机:系统设置
  14. 常用命令速查
  15. 常见问题排查


整体部署流程

flowchart TD START(🚀 开始) --> PHONE1 subgraph PHONE1 "📱 手机操作" A1安装 F-Droid 应用商店 --> A2 A2安装 Termux 套件\Termux、Termux:API、Termux:Boot --> A3 A3初始化 Termux\更新软件包 · 安装基础工具 --> A4 A4配置 SSH\安装 openssh · 设密码 · 查 IP · 启动 sshd end A4 --> SWITCH SWITCH{{"🔁 切换点<br>手机放下,拿起 Mac/PC<br>后续全部通过 SSH 远程完成"}} SWITCH --> MAC subgraph MAC "💻 Mac/PC 通过 SSH 远程操作" B1SSH 连接手机 --> B2 B2安装 Ubuntu 虚拟环境 --> B3 B3安装 Node.js + OpenClaw --> B4 B4初始化 OpenClaw 配置 --> B5 B5修复 Android 兼容性 Patch --> B6 B6冒烟测试 Gateway --> B7 B7配置飞书渠道 --> B8 B8生产级稳定性配置\watchdog · monitor · tmux · 开机自启 --> B9 B9安全加固 end MAC --> PHONE2 subgraph PHONE2 "📱 回到手机" C1系统设置\关闭电池优化 · 开启自启动 --> C2 C2重启手机验证 end C2 --> DONE(✅ 部署完成!\发飞书消息验证)


运行时架构

graph TB MAC"💻 Mac/PC 终端" -->|"SSH · 端口 8022"| SSH_SVC subgraph PHONE "安卓手机" subgraph TERMUX "Termux 原生环境(\~ $)" SSH_SVC"sshd\供 Mac/PC 远程登录" WAKELOCK"termux-wake-lock\阻止系统杀进程" NOTIF"termux-notification\常驻状态通知栏" subgraph TMUX "tmux 会话 openclaw" WD"window 0 · watchdog\每 60 秒巡检,崩溃自动重启 Gateway" MON"window 1 · monitor\每 5 分钟巡检,异常推送通知" end end subgraph UBUNTU "proot Ubuntu 虚拟环境(root@localhost:\~#)" GW"OpenClaw Gateway\ws://127.0.0.1:18789" CRON"cron\每天凌晨 3 点日志轮转" end end FEISHU"飞书 App" -->|"WebSocket 长连接\n自动重连"| GW WD -->|"进程守护 / 崩溃重启"| GW MON -->|"端口 + 进程双重巡检"| GW MON -->|"异常时推送"| NOTIF CRON -.->|"定时清理日志"| GW


关于"执行位置"标记

本手册每个操作步骤开头都会标注执行位置:

标记 含义 提示符样式
📱 手机 · Termux 在手机上打开 Termux 应用,直接输入命令 ~ $
🐧 手机 · Ubuntu 在 Termux 中输入 proot-distro login ubuntu 进入后 root@localhost:~#
💻 Mac / PC · 终端 在电脑上打开终端(Mac 用"终端"或 iTerm2) 因人而异
🌐 浏览器 在手机或电脑浏览器中打开网页 ---

⚠️ 最容易搞错的地方 :openclaw 命令只能在 🐧 Ubuntu 环境 中运行。在 📱 Termux 里直接输入 openclaw 会报 command not found,这不是安装有问题,是环境不对。


一、准备工作

1.1 硬件要求

要求 (例)OnePlus 9配置 说明
Android 10+ 出厂 Android 11,可升至 Android 14 ✅
内存 ≥ 4GB 8GB / 12GB LPDDR5 ✅ 非常充裕
存储剩余 ≥ 2GB 128GB / 256GB UFS 3.1 ✅
稳定 Wi-Fi --- 安装包约 200~400MB,移动网络也可但耗流量

1.2 提前准备好以下内容

① AI API 密钥(必须)

OpenClaw 需要调用 AI 模型才能工作。根据你所在的网络环境选择对应的服务商:

以 MiniMax 为例,国内直连、注册即有免费额度、API 兼容 OpenAI 格式:

  1. 用浏览器打开 https://platform.minimaxi.com
  2. 注册并登录账号
  3. 点击左侧「账号信息」→「API 密钥」→「创建新的 API Key」,复制生成的密钥
  4. 把这串密钥保存好,第七节会用到;在 onboard 向导中选择服务商时选「OpenAI」(MiniMax 兼容 OpenAI 接口格式)

也可以使用其他国内的服务商:DeepSeek(https://platform.deepseek.com)、通义千问(https://dashscope.aliyun.com)、月之暗面 Kimi(https://platform.moonshot.cn)、智谱 GLM(https://open.bigmodel.cn),均支持 OpenAI 兼容接口,步骤类似。

② 飞书开发者账号(如果要用飞书渠道)

需要一个飞书账号,在飞书开放平台创建自建应用。具体步骤见第十节,现在不用操作。

1.3 搞清楚两个命令行环境

全程涉及两个独立的命令行环境,这是最容易混淆的地方:

环境 A:Termux 原生

  • 打开手机上 Termux 应用后直接看到的界面
  • 提示符:~ $
  • Android 上的 Linux 终端,系统管理命令在这里执行

环境 B:Ubuntu(proot 虚拟系统)

  • 在 Termux 里输入 proot-distro login ubuntu 后进入
  • 提示符:root@localhost:~#
  • OpenClaw 安装在这里,所有 openclaw 命令必须在这里执行
  • 退出回 Termux:输入 exit 回车

二、安装 Termux 套件

2.1 安装 F-Droid

📍 执行位置:🌐 手机浏览器

❌ 绝对不要从 Google Play 安装 Termux! Play 版本已停止维护超过两年,后续所有步骤都会失败。必须通过 F-Droid 安装。

F-Droid 是什么:专门收录开源 Android 应用的应用商店,免费无广告。

  1. 打开手机浏览器,访问 https://f-droid.org
  2. 点击「Download F-Droid」,等待 .apk 下载完成
  3. 点击下载的文件安装。若弹出「不允许安装未知来源应用」:
    • 进入 系统设置 → 安全 → 安装未知应用
    • 找到你的浏览器,开启安装权限
    • 返回,重新点击安装
  4. 安装完毕后打开 F-Droid,等待软件包列表刷新完成(约 1~2 分钟)

2.2 在 F-Droid 中安装 Termux 套件

📍 执行位置:🌐 手机 · F-Droid 应用

在 F-Droid 搜索框中逐个搜索安装:

应用名称 是否必装 说明
Termux ✅ 必装 核心终端环境,后续所有命令行操作在这里
Termux:API ✅ 必装 提供 termux-wake-lock、termux-notification 等系统调用能力
Termux:Boot ✅ 必装 让 Termux 在开机后自动启动,实现 7×24 运行
Termux:Styling 可选 美化终端字体和颜色,与功能无关

⚠️ Termux:Boot 安装后必须手动打开一次:在应用列表找到 Termux:Boot,点击图标打开一次(会显示空白界面或立即关闭,正常)。不做这步,开机自启动权限不会激活。


三、初始化 Termux 基础环境

📍 执行位置:📱 手机 · Termux 终端

如何打开 Termux :在手机桌面或应用抽屉找到 Termux 图标,点击打开。首次打开会看到黑色背景终端,提示符为 ~ $。点击终端区域唤出键盘,逐条输入以下命令,每条命令输入完毕按回车执行。

sh 复制代码
# 更新软件包(需要 2~5 分钟,遇到 [Y/n] 输入 Y 回车)
pkg update && pkg upgrade -y
sh 复制代码
# 一次性安装所有必要工具:
# proot-distro  - 用来安装和运行 Ubuntu 虚拟环境
# openssh       - SSH 服务,让 Mac/PC 可以远程连进来
# tmux          - 终端复用器,让进程在后台持续运行
# curl wget git - 下载和代码工具
# termux-api    - 配合 Termux:API 应用,调用手机系统功能
pkg install proot-distro openssh tmux curl wget git termux-api -y

安装完成后回到 ~ $ 提示符,没有 Error 字样即为成功。


四、配置 SSH --- 切换到 Mac/PC 操作

这是整个部署流程的关键切换点。完成本节后,你可以把手机放到一边,后续所有配置都在 Mac/PC 终端里通过 SSH 远程完成,彻底告别手机小键盘。

4.1 手机端:启动 SSH 服务

📍 执行位置:📱 手机 · Termux 终端 (提示符为 ~ $)

sh 复制代码
# 设置 SSH 登录密码
# 执行后提示 "New password:",输入密码(不显示字符,正常)
# 再次提示 "Retype new password:",再输一遍确认
# 记住这个密码,Mac 第一次连接时要用
passwd
sh 复制代码
# 查看手机在当前 Wi-Fi 下的 IP 地址
# 直接执行 ifconfig,会显示完整网络接口信息
ifconfig

ℹ️ 执行后可能出现 Warning: cannot open /proc/net/dev (Permission denied). Limited output. 警告,这在 Termux 里是正常现象,忽略即可,不影响输出结果。

在输出中找到 wlan0 这一段(Wi-Fi 无线网卡),其下方 inet 后面的地址就是你的手机 Wi-Fi IP:

复制代码
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.19.30.69  netmask 255.255.255.0  broadcast 10.19.30.255

👆 上例中 10.19.30.69 就是要记下的手机 IP。后面 SSH 连接、设置别名都要用到这个地址。

⚠️ 输出里可能还有 lo(回环)、rmnet_data2(移动数据)、tun0(VPN)等接口,认准 wlan0 即可。

sh 复制代码
# 查看当前 Termux 的用户名(形如 u0_a353,每台手机不同)
whoami
sh 复制代码
# 启动 SSH 服务(执行后无输出直接回到提示符,说明已在后台运行)
sshd

⚠️ 重要 :Termux 的 SSH 端口是 8022 ,不是默认的 22。连接时必须加 -p 8022。

4.2 Mac / PC 端:连接手机

📍 执行位置:💻 Mac / PC · 终端

如何打开 Mac 终端 :按 Command + 空格 打开 Spotlight,输入「终端」,回车。
Windows 用户:打开 PowerShell,或安装 Git Bash。

sh 复制代码
# 检查是否已有 SSH 密钥(如果输出文件路径,说明有,跳过下一步)
ls ~/.ssh/id_ed25519

如果提示 No such file or directory,先生成密钥:

sh 复制代码
# 生成 SSH 密钥(一路回车即可,不需要设密码短语)
ssh-keygen -t ed25519 -C "my_mac"
sh 复制代码
# 将公钥复制到手机,实现免密登录
# 把 u0_a353 替换成你 whoami 得到的用户名
# 把 192.168.1.108 替换成你手机的实际 IP
ssh-copy-id -p 8022 u0_a353@192.168.1.108

提示输入密码时,输入你刚才在手机 passwd 设置的密码。成功后显示 Number of key(s) added: 1。

sh 复制代码
# 测试连接(成功后就不再需要密码了)
ssh u0_a353@192.168.1.108 -p 8022

✅ 验证成功 :终端提示符变为 ~ $,说明你已通过 SSH 登录到手机的 Termux 环境。

4.3 设置快捷别名(推荐)

📍 执行位置:💻 Mac · 终端

sh 复制代码
# 将以下两行添加到 ~/.zshrc(替换用户名和 IP)
echo 'alias phone="ssh u0_a353@192.168.1.108 -p 8022"' >> ~/.zshrc
echo 'alias claw="ssh -t u0_a353@192.168.1.108 -p 8022 \"proot-distro login ubuntu\""' >> ~/.zshrc

# 立即生效
source ~/.zshrc

之后:

  • 输入 phone → 进入手机 Termux 环境
  • 输入 claw → 直接进入手机的 Ubuntu 环境

💡 IP 变动问题 :切换 Wi-Fi 后手机 IP 会变,SSH 失效。解决方法:安装 Tailscale(免费),获得永久固定虚拟 IP,一次配置永久有效。


══════════════════════════════════════

🔁 切换点:手机放下,拿起 Mac/PC

从第五节开始,所有操作都在 Mac/PC 的终端里通过 SSH 完成。

需要回到手机亲自操作的场景只剩两个:

  • 第十三节:手机系统设置(需要手动点击,无法远程)
  • 重启验证:重启手机后等待自启动

══════════════════════════════════════


五、安装 Ubuntu 虚拟环境

📍 执行位置:💻 Mac · 终端(已 SSH 进入手机 Termux,提示符为 ~ $)

如果还没连接,先执行 phone(或 ssh u0_a353@192.168.1.108 -p 8022)登录手机。

💡 为什么需要 Ubuntu?

OpenClaw 运行时需要向 /tmp 目录写入临时文件,原生 Android 系统禁止此操作(除非 Root)。通过 proot-distro 运行 Ubuntu 可绕过此限制,完全无需 Root。

sh 复制代码
# 下载并安装 Ubuntu(约 100~200MB,视网速需要 3~10 分钟)
# 过程中会显示进度条,耐心等待
proot-distro install ubuntu

安装完成后显示类似 Ubuntu installed successfully,回到 ~ $ 提示符。

sh 复制代码
# 进入 Ubuntu 环境
proot-distro login ubuntu

✅ 验证成功 :提示符从 ~ $ 变为 root@localhost:~#,说明已进入 Ubuntu 虚拟环境。


六、安装 Node.js 和 OpenClaw

📍 执行位置:💻 Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

如果关闭了终端或断开了 SSH,重新连接后先执行 proot-distro login ubuntu 进入 Ubuntu。

sh 复制代码
# 更新 Ubuntu 软件包并安装基础编译工具(需要 2~5 分钟)
apt update && apt upgrade -y
apt install -y curl git build-essential
sh 复制代码
# 添加 Node.js 22 官方安装源
# OpenClaw 要求 Node.js ≥ v22,Ubuntu 默认源里的版本太旧
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -

执行后会看到一大段输出,最后提示 Run apt-get install -y nodejs 即为成功。

sh 复制代码
# 安装 Node.js
apt install -y nodejs
sh 复制代码
# 验证版本(必须是 v22.x.x 或更高)
node --version

看到类似 v22.13.1 的输出。如果显示 v18 或更低,说明上一步添加官方源没有成功,需重新执行。

sh 复制代码
# 安装 OpenClaw(需要几分钟,有 WARN 警告是正常的,只要没有 ERR 就没问题)
npm install -g openclaw@latest
sh 复制代码
# 验证安装成功(输出版本号即为成功)
openclaw --version

✅ 验证成功 :输出版本号,如 OpenClaw 2026.3.13 (61d171a)。若提示 command not found,确认你在 Ubuntu 环境(root@localhost:~#)而非 Termux(~ $)。


七、初始化 OpenClaw 配置

📍 执行位置:💻 Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

sh 复制代码
openclaw onboard

这条命令会启动交互式配置向导,用方向键和回车操作:

问题 1:Continue? (personal mode)

  • 默认光标在「No」,按 左方向键 ← 切换到「Yes」,再按回车
  • ⚠️ 直接回车会选「No」退出向导,需重新执行

问题 2:选择 AI 服务商

  • 用上下方向键选择你的 API Key 对应的服务商(Gemini / OpenAI / Claude 等),回车确认

问题 3:输入 API Key

  • 将 API Key 粘贴进去(Mac 上 Command+V 粘贴)
  • ⚠️ 输入时屏幕不显示字符,这是正常的安全设计

问题 4:Gateway Bind 地址(⚠️ 关键!)

  • 必须选 Loopback (127.0.0.1)
  • ❌ 绝对不能选 0.0.0.0,会导致 Gateway 启动后立刻崩溃

问题 5:Install daemon

  • 选 --no-daemon 或跳过,proot 环境不支持 daemon 模式

⚠️ 如果报错 ERR_SYSTEM_ERROR Unknown system error 13,改用:

sh 复制代码
openclaw onboard --no-daemon

✅ 验证成功 :向导最后显示 Doctor complete,配置已写入 ~/.openclaw/openclaw.json。


八、修复 Android proot 兼容性问题

📍 执行位置:💻 Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

OpenClaw 在 Android proot 环境下有两处系统调用会失败,必须手动修复。

8.1 修复主程序的 networkInterfaces 问题

原因 :OpenClaw 调用 os.networkInterfaces() 获取网络接口信息,Android 内核对此调用有限制,会抛出异常导致崩溃。需加 try-catch 保护,失败时返回模拟数据。

sh 复制代码
# 将 patch 脚本写入临时文件
# 以下是一整段命令,从 cat 开始到 PATCHEOF 结束,全部复制后一次性粘贴并回车
cat > /tmp/patch_networkInterfaces.js << 'PATCHEOF'
const fs = require('fs');
const { execSync } = require('child_process');

const result = execSync(
  'grep -rl "pickPrimaryLanIPv4" /usr/lib/node_modules/openclaw/dist/'
).toString().trim();
const file = result.split('\n')[0];
if (!file) { console.error('❌ 未找到目标文件,请确认 openclaw 已正确安装'); process.exit(1); }

console.log('目标文件:' + file);
const content = fs.readFileSync(file, 'utf8');
fs.writeFileSync(file + '.bak', content);

const FALLBACK = '{ lo: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "00:00:00:00:00:00", internal: true, cidr: "127.0.0.1/8" }], eth0: [{ address: "192.168.1.100", netmask: "255.255.255.0", family: "IPv4", mac: "00:00:00:00:00:01", internal: false, cidr: "192.168.1.100/24" }] }';

let count = 0;
const patched = content.replace(
  /\b(const|let|var)\s+(\w+)\s*=\s*os\.networkInterfaces\(\)/g,
  (match, decl, varname) => {
    count++;
    return `${decl} ${varname}; try { ${varname} = os.networkInterfaces(); } catch(e) { ${varname} = ${FALLBACK}; }`;
  }
);

fs.writeFileSync(file, patched);
console.log('✅ 已替换 ' + count + ' 处 networkInterfaces 调用');
PATCHEOF
sh 复制代码
# 执行 patch 脚本
node /tmp/patch_networkInterfaces.js

✅ 验证成功 :输出 目标文件:/usr/lib/node_modules/... 和 ✅ 已替换 2 处 networkInterfaces 调用。脚本自动定位文件,无需手动指定文件名或行号。

8.2 修复 Bonjour/mDNS 组件问题

原因 :OpenClaw 内嵌的 Bonjour 组件同样调用了 os.networkInterfaces(),需单独修复。

sh 复制代码
FILE=/usr/lib/node_modules/openclaw/node_modules/@homebridge/ciao/lib/NetworkManager.js

# 确认文件存在(输出文件路径正常;若报 No such file 说明 OpenClaw 安装有问题)
ls $FILE

# 备份(出错可用 cp ${FILE}.bak $FILE 还原)
cp $FILE ${FILE}.bak
sh 复制代码
# 第一步:将安全函数定义写入临时文件
cat > /tmp/nm_patch.js << 'EOF'
// Android proot patch --- injected by SOP setup script
const _origNetIf = require("os").networkInterfaces.bind(require("os"));
const _safeNetIf = () => { try { return _origNetIf(); } catch(e) { return { lo: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "00:00:00:00:00:00", internal: true, cidr: "127.0.0.1/8" }], eth0: [{ address: "192.168.1.100", netmask: "255.255.255.0", family: "IPv4", mac: "00:00:00:00:00:01", internal: false, cidr: "192.168.1.100/24" }] }; } };

EOF
sh 复制代码
# 第二步:将函数定义注入到 NetworkManager.js 文件开头
{ cat /tmp/nm_patch.js; cat $FILE; } > /tmp/nm_temp.js && mv /tmp/nm_temp.js $FILE
sh 复制代码
# 第三步:将所有函数调用替换为安全版本
sed -i 's/os_1\.default\.networkInterfaces()/_safeNetIf()/g' $FILE
sh 复制代码
# 验证三步均正确完成
echo "=== 文件开头(应看到注入的函数定义)==="
head -3 $FILE
echo "=== _safeNetIf 调用次数(正常应为 5)==="
grep -c '_safeNetIf()' $FILE

✅ 验证成功 :head -3 第一行是 // Android proot patch,grep -c 输出 5。

⚠️ 三步缺一不可 :第二步是把函数注入文件,第三步是替换调用,少任何一步运行时会报 _safeNetIf is not defined。

8.3 禁用 Bonjour 避免启动警告

sh 复制代码
openclaw config set bonjour.enabled false 2>/dev/null || true

💡 如果报错说字段不存在,忽略并继续。Bonjour 报错是非致命的,Gateway 仍正常工作。


九、启动 Gateway(冒烟测试)

📍 执行位置:💻 Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

📌 本节是冒烟测试 :验证 Gateway 能否正常启动。确认成功后按 Ctrl+C 停止即可,持久化运行由第十一节的 tmux + watchdog 接管。

sh 复制代码
openclaw gateway --verbose

✅ 验证成功:看到以下输出说明 Gateway 正常:

复制代码
[gateway] listening on ws://127.0.0.1:18789, ws://[::1]:18789

确认后按 Ctrl+C 停止,继续下一节。

获取 Gateway Token(如果需要)

Gateway 运行时,可用手机浏览器访问 http://localhost:18789 看控制面板。若提示 token missing,另开终端窗口,SSH 进入手机后执行:

sh 复制代码
proot-distro login ubuntu -- cat ~/.openclaw/openclaw.json | grep token

复制 token 值粘贴到控制面板输入框,点击「连接」。


十、配置飞书渠道

10.1 在飞书开放平台创建自建应用

📍 执行位置:🌐 电脑或手机浏览器

第一步:创建应用

  1. 打开 https://open.feishu.cn,登录飞书账号
  2. 点击「开发者后台」→「创建自建应用」
  3. 填写应用名称(如 OpenClaw Bot)和描述,点击「确认创建」

第二步:添加机器人能力(⚠️ 关键步骤,漏掉则无法收发消息)

  1. 进入刚创建的应用,左侧找到「添加应用能力」
  2. 在能力列表中找到「机器人」,点击「添加」并确认

⚠️ 这一步非常容易漏掉。没有添加机器人能力时,应用在飞书中只是普通应用,无法作为聊天机器人接收和回复消息。

第三步:配置权限

  1. 左侧点击「权限管理」,在搜索框逐一搜索以下权限并开通:
权限标识 权限说明 用途
im:message 获取与发送单聊、群组消息 机器人发消息
im:message.receive_v1 接收消息事件 机器人收消息
im:chat 获取与更新群组信息 群聊场景
contact:user.id:readonly 获取用户 user_id 配置安全白名单时需要

第四步:订阅消息事件

  1. 左侧点击「事件与回调 → 事件配置」
  2. 选择「使用长连接接收事件」(无需填写回调 URL,OpenClaw 用 WebSocket 长连接)
  3. 点击「添加事件」,搜索 im.message.receive_v1,点击确认添加

第五步:记录凭证

  1. 左侧点击「凭证与基础信息 」,记下:
    • App ID (形如 cli_xxxxxxxxxxxxxxxx)
    • App Secret(点击「查看」后复制)

第六步:发布应用

  1. 左侧点击「应用发布 → 版本管理与发布」,点击「创建版本」,填写版本号后「申请发布」

💡 个人飞书账号:选「创建个人应用」,发布流程相同但无需等管理员审核,立即生效。企业账号如需管理员审核,联系管理员在后台通过即可。

10.2 通过 onboard 向导绑定飞书,并完成账号配对

📍 执行位置:💻 Mac · 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

📌 整体流程说明:绑定飞书分为两个阶段------①通过 onboard 向导填入 App 凭证(让 OpenClaw 知道用哪个飞书应用);②启动 Gateway 后在飞书中触发配对(让 OpenClaw 知道哪个飞书用户是允许的主人)。两个阶段缺一不可。

阶段一:填入飞书 App 凭证

sh 复制代码
openclaw onboard

向导启动后,选择「飞书(Feishu)」渠道,然后依次输入上一步记下的 App ID 和 App Secret,按回车确认,向导完成后回到命令提示符。

阶段二:启动 Gateway,触发飞书配对

配对需要 Gateway 在运行中才能接收飞书发来的消息。在同一个 Ubuntu 终端里,把 Gateway 临时放到后台运行:

sh 复制代码
# 将 Gateway 放到后台启动,日志写入临时文件
openclaw gateway > /tmp/openclaw/openclaw.log 2>&1 &

# 等待 3 秒让 Gateway 完全启动
sleep 3

# 确认 Gateway 已在运行(有输出内容表示正常)
tail -5 /tmp/openclaw/openclaw.log

✅ 看到 listening on ws://127.0.0.1:18789 说明 Gateway 已就绪。

阶段三:在飞书中触发配对消息

📍 切换到手机或电脑的飞书 App

  1. 打开飞书,在搜索框搜索你的机器人名称(如 OpenClaw Bot)

  2. 点击进入私聊,发送任意一条消息(如「你好」)

  3. 机器人会自动回复一条包含配对信息的消息,格式如下:

    access not configured.
    Your Feishu user id: ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Pairing code: 12345678

⚠️ 如果机器人没有回复:检查飞书应用是否已发布(10.1 第六步)、是否添加了机器人能力(10.1 第二步)、Gateway 是否在运行(用 tail -5 /tmp/openclaw/openclaw.log 确认)。

阶段四:执行配对命令

📍 切换回 Mac 终端(SSH → Ubuntu,提示符为 root@localhost:~#)

把飞书机器人回复消息中的 Pairing code (上例中的 12345678)替换进以下命令执行:

sh 复制代码
# 将 12345678 替换为飞书机器人回复的实际 Pairing code
openclaw pairing approve feishu 12345678

ℹ️ 这条命令的作用:把这个 Pairing code 对应的飞书账号加入 OpenClaw 的授权列表,之后该账号发来的消息才会被正常处理。执行成功后无特别提示,直接回到命令行即可。

阶段五:验证配对成功

sh 复制代码
# 停止之前的临时 Gateway
pkill -x openclaw-gateway

回到飞书,再次向机器人发送一条消息。如果机器人正常回复(不再出现 access not configured),说明配对完成。

⚠️ 群聊中需要 @机器人 才会响应;私聊直接发消息即可。

💡 Gateway 目前是临时运行的。真正的持久化运行(开机自启、崩溃重启等)由下一节的 watchdog + tmux 接管,现在不用担心。


十一、生产级稳定性配置

以下配置让 OpenClaw 从"手动启动的测试服务"变成真正稳定的 7×24 服务。

📍 执行位置:💻 Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)

如果当前在 Ubuntu(root@localhost:~#),先输入 exit 回到 Termux(~ $)。

📌 本节命令说明 :以下使用 proot-distro login ubuntu -- 命令 的方式,在 Termux 里直接向 Ubuntu 内部写文件或执行命令,不需要先进入 Ubuntu。

11.1 创建 watchdog 脚本(崩溃自动重启)

sh 复制代码
proot-distro login ubuntu -- tee /root/watchdog.sh << 'SCRIPT'
#!/bin/bash

LOG=/tmp/openclaw/watchdog.log
mkdir -p /tmp/openclaw

echo "=== Watchdog started at $(date) ===" >> $LOG

while true; do
  if ! pgrep -x "openclaw-gateway" > /dev/null 2>&1; then
    echo "[$(date)] Gateway not running, restarting..." >> $LOG
    openclaw gateway >> /tmp/openclaw/openclaw.log 2>&1 &
    disown $!
    echo "[$(date)] Gateway restarted PID=$!" >> $LOG
    sleep 30
  else
    echo "[$(date)] Gateway OK PID=$(pgrep -x openclaw-gateway)" >> $LOG
  fi
  sleep 60
done
SCRIPT

proot-distro login ubuntu -- chmod +x /root/watchdog.sh

⚠️ watchdog 用 openclaw-gateway 检测进程。如果你的版本进程名不同,watchdog 会陷入无限重启循环。可在 Ubuntu 中执行 ps aux | grep openclaw 确认实际进程名,按需修改脚本。

11.2 创建监控脚本

sh 复制代码
proot-distro login ubuntu -- tee /root/monitor.sh << 'SCRIPT'
#!/bin/bash

LOG=/tmp/openclaw/monitor.log
mkdir -p /tmp/openclaw

check_gateway() {
  if pgrep -x "openclaw-gateway" > /dev/null 2>&1; then echo "ok"; else echo "down"; fi
}

check_port() {
  if bash -c 'echo > /dev/tcp/127.0.0.1/18789' 2>/dev/null; then echo "ok"; else echo "down"; fi
}

check_log_size() {
  local size=$(du -sm /tmp/openclaw/ 2>/dev/null | cut -f1)
  echo "${size:-0}"
}

notify() {
  termux-notification --id 2 --title "OpenClaw 告警" --content "$1" --priority high 2>/dev/null || true
  echo "[$(date)] ALERT: $1" >> $LOG
}

echo "[$(date)] Monitor started" >> $LOG

while true; do
  GATEWAY=$(check_gateway)
  PORT=$(check_port)
  LOG_SIZE=$(check_log_size)

  [ "$GATEWAY" = "down" ] && notify "Gateway 进程已停止,watchdog 正在重启..."
  [ "$PORT" = "down" ] && notify "Gateway 端口 18789 无响应"
  [ "$LOG_SIZE" -gt 500 ] && notify "日志目录已占用 ${LOG_SIZE}MB,请清理"

  echo "[$(date)] gateway=$GATEWAY port=$PORT log=${LOG_SIZE}MB" >> $LOG
  sleep 300
done
SCRIPT

proot-distro login ubuntu -- chmod +x /root/monitor.sh

⚠️ 端口检测用 bash 内置的 /dev/tcp 方式,比 nc 命令更可靠(proot 里不一定有 nc)。

11.3 配置日志轮转

sh 复制代码
# 安装 cron
proot-distro login ubuntu -- apt install -y cron

# 创建日志轮转脚本
proot-distro login ubuntu -- tee /root/logrotate.sh << 'SCRIPT'
#!/bin/bash
LOG_DIR=/tmp/openclaw
MAX_SIZE_MB=200
size=$(du -sm $LOG_DIR 2>/dev/null | cut -f1)
if [ "${size:-0}" -gt $MAX_SIZE_MB ]; then
  echo "[$(date)] Rotating logs (${size}MB)..." >> $LOG_DIR/rotate.log
  find $LOG_DIR -name "openclaw-*.log" -mtime +3 -delete
  echo "[$(date)] Done. New size: $(du -sm $LOG_DIR | cut -f1)MB" >> $LOG_DIR/rotate.log
fi
SCRIPT

proot-distro login ubuntu -- chmod +x /root/logrotate.sh

# 设置每天凌晨 3 点自动执行
proot-distro login ubuntu -- bash -c '(crontab -l 2>/dev/null; echo "0 3 * * * bash /root/logrotate.sh") | crontab -'

# 启动 cron(直接调用,兼容无 init 系统的 proot 环境)
proot-distro login ubuntu -- cron

11.4 用 tmux 启动持久服务

sh 复制代码
# 创建 openclaw tmux 会话并启动 watchdog
# watchdog 启动后会自动负责启动和守护 Gateway
tmux new-session -d -s openclaw
tmux send-keys -t openclaw "proot-distro login ubuntu -- bash /root/watchdog.sh" Enter
sh 复制代码
# 新建第二个窗口运行监控脚本
tmux new-window -t openclaw -n monitor
tmux send-keys -t openclaw:monitor "proot-distro login ubuntu -- bash /root/monitor.sh" Enter
sh 复制代码
# 确认两个窗口都在运行
tmux ls
tmux list-windows -t openclaw

输出示例:

复制代码
openclaw: 2 windows (created ...)
0: bash* (1 panes)
1: monitor- (1 panes)

💡 想查看实时日志:执行 tmux attach -t openclaw,按 Ctrl+B 再按 D 可退出而不关闭进程。

⚠️ 不要用 nohup ... & 在 proot 环境后台运行长期进程,proot session 退出后进程随即终止。必须用 tmux 保持持久会话。

11.5 配置开机自启动

sh 复制代码
# 确保启动脚本目录存在
mkdir -p ~/.termux/boot

# 脚本一:开机自动启动 SSH
cat > ~/.termux/boot/start-ssh.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash
sshd
EOF
chmod +x ~/.termux/boot/start-ssh.sh
sh 复制代码
# 脚本二:开机自动启动 OpenClaw 全套服务
cat > ~/.termux/boot/start-openclaw.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash

# 防止系统杀死 Termux 进程
termux-wake-lock &

# 等待 Android 系统完全启动(15 秒)
sleep 15

# 启动 cron(日志轮转)
proot-distro login ubuntu -- cron

# 启动 watchdog(守护 Gateway)
tmux new-session -d -s openclaw
tmux send-keys -t openclaw "proot-distro login ubuntu -- bash /root/watchdog.sh" Enter

# 等待第一个窗口就绪
sleep 3
tmux new-window -t openclaw -n monitor
tmux send-keys -t openclaw:monitor "proot-distro login ubuntu -- bash /root/monitor.sh" Enter

# 常驻通知,方便确认服务在运行
sleep 5
termux-notification \
  --id 1 \
  --title "OpenClaw Running" \
  --content "Gateway + watchdog + monitor active" \
  --ongoing
EOF
chmod +x ~/.termux/boot/start-openclaw.sh
sh 复制代码
# 确认两个脚本都已创建
ls -la ~/.termux/boot/

输出应包含 start-ssh.sh 和 start-openclaw.sh。


十二、安全加固

📍 执行位置:💻 Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)

你的飞书 User ID 在第十节机器人第一次回复中已经告知,格式为 ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。

sh 复制代码
# 配置飞书白名单:只处理你自己发来的消息
# 将 ou_你的飞书user_id 替换为实际 User ID
proot-distro login ubuntu -- openclaw config set channels.feishu.allowFrom '["ou_你的飞书user_id"]'
proot-distro login ubuntu -- openclaw config set channels.feishu.groupAllowFrom '["ou_你的飞书user_id"]'
sh 复制代码
# 关闭高风险的文档创建权限(防止 AI 误操作)
proot-distro login ubuntu -- openclaw config set channels.feishu.tools.doc false
sh 复制代码
# 允许飞书插件(消除启动警告)
proot-distro login ubuntu -- openclaw config set plugins.allow '["feishu"]'
sh 复制代码
# 查看安全审计(目标:CRITICAL = 0)
proot-distro login ubuntu -- openclaw security audit
sh 复制代码
# 重启 Gateway 使配置生效(watchdog 约 60 秒后自动重启)
proot-distro login ubuntu -- pkill -x openclaw-gateway
sleep 70
proot-distro login ubuntu -- tail -5 /tmp/openclaw/watchdog.log

日志末尾应有 Gateway restarted PID=XXXX,说明重启成功。


十三、回到手机:系统设置

📍 执行位置:📱 手机 · 系统设置(这是本教程第二次需要拿起手机)

⚠️ 这步很多人会漏掉,漏掉后的症状:手机重启或锁屏一段时间后,OpenClaw 停止响应,SSH 无法连接。

OnePlus / OxygenOS:

  1. 设置 → 电池 → 应用电池用量 → Termux → 不限制
  2. 设置 → 应用 → 应用管理 → Termux → 电池 → 无限制
  3. 设置 → 安全 → 自启动管理 → Termux → 开启
  4. 打开「最近任务」,长按 Termux 卡片,点击锁定图标(🔒)

💡 其他品牌:在系统设置搜索「自启动」或「电池优化」,找到 Termux 关闭后台限制并开启自启动。各品牌参考路径:

  • 小米 / MIUI:设置 → 应用设置 → 授权管理 → 自启动 → Termux 开启;设置 → 电量与性能 → 省电优化 → Termux → 无限制
  • 三星 / One UI:设置 → 电池 → 后台使用限制 → 从不休眠的应用 → 添加 Termux
  • 华为 / HarmonyOS:设置 → 应用 → 应用启动管理 → Termux → 手动管理,三项全开

十四、常用命令速查

📍 执行位置:💻 Mac · 终端(SSH → 手机 Termux,提示符为 ~ $)

sh 复制代码
# 进入 Ubuntu 环境(需要多步 Ubuntu 操作时)
proot-distro login ubuntu

# 查看 OpenClaw 状态
proot-distro login ubuntu -- openclaw status

# 查看 watchdog 日志(最近 20 条)
proot-distro login ubuntu -- tail -20 /tmp/openclaw/watchdog.log

# 查看监控日志(最近 20 条)
proot-distro login ubuntu -- tail -20 /tmp/openclaw/monitor.log

# 查看 Gateway 运行日志(最近 50 条)
proot-distro login ubuntu -- tail -50 /tmp/openclaw/openclaw.log

# 手动重启 Gateway(watchdog 60 秒内自动恢复)
proot-distro login ubuntu -- pkill -x openclaw-gateway

# 查看 tmux 会话和窗口
tmux ls
tmux list-windows -t openclaw

# 进入 tmux 查看实时日志(Ctrl+B 再按 D 退出,不关闭进程)
tmux attach -t openclaw

# 查看手机当前 IP
ifconfig | grep 'inet '

# 手动启动 SSH(自启动配置前,重启手机后需要先到手机上执行此命令)
sshd

十五、常见问题排查

问题现象 原因 解决方法
openclaw: command not found 在 Termux 原生环境执行了 openclaw 命令 先执行 proot-distro login ubuntu 进入 Ubuntu
ERR_SYSTEM_ERROR Unknown system error 13 Android 内核禁止 uv_interface_addresses 调用 改用 openclaw onboard --no-daemon,并完成第八节的 patch
ssh-copy-id 报 No identities found Mac 本地没有 SSH 密钥 先执行 ssh-keygen -t ed25519 生成,再重新执行
SSH 连接被拒绝 Connection refused 手机 sshd 没有运行 到手机 Termux 中执行 sshd
开机后 SSH 无法连接 start-ssh.sh 没有生效 确认 ls ~/.termux/boot/ 文件存在,且 Termux:Boot 已打开过一次
Gateway 启动后立刻崩溃 Bonjour/mDNS 组件调用失败 执行第八节 8.2 的 NetworkManager.js patch
watchdog 无限重启 Gateway 进程名检测有误 在 Ubuntu 执行 `ps aux
飞书机器人无响应 白名单为空或配置未生效 执行第十二节配置 allowFrom,并重启 Gateway
控制面板提示 Token 缺失 未填入 Gateway Token 执行 `cat ~/.openclaw/openclaw.json
锁屏后 Gateway 停止响应 系统电池优化杀死了 Termux 按第十三节关闭电池优化并锁定 Termux 任务卡片
nohup ... & 后台进程消失 proot 环境下后台进程随 session 退出 改用 tmux 管理持久会话(见 11.4)
IP 变化导致 SSH 断连 切换 Wi-Fi 或重启路由器后 IP 改变 安装 Tailscale 获得永久固定虚拟 IP

📌 最终验证:完成所有配置后,重启手机,等待约 1 分钟,通过飞书发消息给机器人。收到正常回复,说明整个系统已完全自动化运行 🎉

如果重启后不响应:

  • 查手机通知栏是否有「OpenClaw Running」常驻通知 → 有则查 watchdog 日志定位问题
  • 没有通知 → 检查第十三节系统设置是否完成
相关推荐
老唐7772 分钟前
Transformer原理大白话讲解
人工智能·python·深度学习·神经网络·计算机视觉·ai·transformer
林伽一6 分钟前
端侧模型与运行框架双轮驱动,智能体工程化进入深水区|2026年10月16日
人工智能·科技·安全·ai·开源
云半S一15 分钟前
Agent学习总结二
经验分享·笔记·学习·agent
PPIO派欧云17 分钟前
Grok、Cursor 纳入同一订阅后,AI Agent 任务成本怎么算?
人工智能·ai
xiezhr17 分钟前
WorkBuddy白送500积分,大家快来领
ai·deepseek·deepseek大模型·workbuddy
是枚小菜鸡儿吖28 分钟前
听歌截图太普通?我把MusicCard部署到极空间,把歌曲做成随时可开的音乐海报页
服务器·人工智能·后端·ai·大模型
tianbin91131 分钟前
AI 应用开发避坑,API 中转站如何解决多模型接口适配难题
ai
安然讲ai37 分钟前
企业AI经营系统如何搭建?
ai
voipmaker1 小时前
融合通信调度录音的困局:基于 MediaX 网关实现对讲语音 AI 事件萃取
人工智能·ai·音视频·语音识别·实时音视频·信息与通信·iot