@cookiezmq

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

使っていない Android 端末を OpenClaw サーバーにする 完全 SOP 手順書

使っていない Android 端末を OpenClaw サーバーにする 完全 SOP 手順書

本手順書では OnePlus 9 を例に説明します。Root は不要、Mac Mini も不要です。
Android スマホと Termux、SSH だけで OpenClaw を動かせます。


目次

  1. 事前準備
  2. Termux 一式をインストールする
  3. Termux の基本環境を初期化する
  4. SSH を設定して Mac/PC に作業を移す
  5. Ubuntu 仮想環境をインストールする
  6. Node.js と OpenClaw をインストールする
  7. OpenClaw の初期設定を行う
  8. Android proot の互換性問題を修正する
  9. Gateway を起動してスモークテストする
  10. Feishu チャンネルを設定する
  11. 本番運用向けの安定化設定
  12. セキュリティを強化する
  13. スマホ側に戻って行うシステム設定
  14. よく使うコマンド早見表
  15. よくあるトラブルと対処

0-openclaw-deploy-on-android.jpg


全体の流れ


実行時アーキテクチャ


「実行場所」ラベルの見方

この手順書では、各ステップの冒頭に「どこで実行するか」を示すラベルを付けています。

ラベル 意味 プロンプト例
📱 スマホ · Termux スマホで Termux アプリを開き、そのままコマンドを入力する ~ $
🐧 スマホ · Ubuntu Termux 内で proot-distro login ubuntu を実行して入った後の環境 root@localhost:~#
💻 Mac / PC · ターミナル PC 側のターミナルを開いて操作する 人によって異なる
🌐 ブラウザ スマホまたは PC のブラウザでページを開く

⚠️ いちばん混同しやすいポイント: openclaw コマンドは 🐧 Ubuntu 環境でしか実行できません。📱 Termux でそのまま openclaw を打つと command not found になりますが、インストール失敗ではなく環境を間違えているだけです。


1. 事前準備

1.1 ハードウェア要件

要件 OnePlus 9 の例 補足
Android 10 以上 初期状態は Android 11、Android 14 まで更新可能
メモリ 4 GB 以上 8 GB / 12 GB LPDDR5 ✅ 余裕あり
空き容量 2 GB 以上 128 GB / 256 GB UFS 3.1
安定した Wi-Fi パッケージ総量は約 200~400 MB。モバイル回線でも可能だが通信量は増える

1.2 先に用意しておくもの

1. AI API キー(必須)

OpenClaw を動かすには、AI モデルにアクセスするための API キーが必要です。利用するネットワーク環境に合わせてプロバイダを選んでください。

ここでは MiniMax を例にします。中国本土からでも使いやすく、登録直後から無料枠があり、API は OpenAI 互換です。

  1. ブラウザで platform.minimaxi.com を開く
  2. アカウントを登録してログインする
  3. 账号信息(アカウント情報)→ API 密钥(API キー)→ 创建新的 API Key(新しい API キーを作成)と進み、生成されたキーをコピーする
  4. このキーは後で Section 7 で使うので控えておく。onboard ウィザードでプロバイダを選ぶ場面では、MiniMax は OpenAI 互換なので OpenAI を選ぶ

そのほか、DeepSeek(platform.deepseek.com)、通義千問(dashscope.aliyun.com)、Kimi(platform.moonshot.cn)、智譜 GLM(open.bigmodel.cn)などでも構いません。いずれも OpenAI 互換 API を提供しており、流れはほぼ同じです。

2. Feishu 開発者アカウント(Feishu チャンネルを使う場合)

Feishu アカウントが 1 つ必要です。Feishu Open Platform で自前アプリを作成します。詳しい手順は Section 10 で扱うので、この段階ではまだ操作不要です。

1.3 2 つのコマンドライン環境を混同しない

このセットアップでは、途中で 2 つのシェル環境を使い分けます。ここを取り違えると、ほぼ確実に詰まります。

環境 A: Termux ネイティブ環境

  • スマホで Termux を開いた直後に見えるシェル
  • プロンプト: ~ $
  • Android 側の基本セットアップやシステム寄りの操作はここで行う

環境 B: Ubuntu(proot 仮想環境)

  • Termux で proot-distro login ubuntu を実行すると入れる
  • プロンプト: root@localhost:~#
  • OpenClaw はここにインストールされるため、openclaw 系コマンドはすべてここで実行する
  • Termux に戻るときは exit

2. Termux 一式をインストールする

2.1 F-Droid をインストールする

📍 実行場所: 🌐 スマホのブラウザ

Google Play 版の Termux は使わないでください。 Play 版は 2 年以上メンテナンスが止まっており、この後の手順がうまく進みません。必ず F-Droid 版を使います。

F-Droid とは: オープンソースの Android アプリを配布するアプリストアです。無料で、広告もありません。

  1. スマホのブラウザで 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-locktermux-notification など、Android 側の機能を呼び出せるようにする
Termux:Boot ✅ 必須 端末再起動後に Termux を自動起動させ、24 時間運用を可能にする
Termux:Styling 任意 フォントや配色の変更用。動作には不要

⚠️ Termux:Boot はインストール後に一度だけ手動で開く必要があります。 アプリ一覧から Termux:Boot を見つけて 1 回タップしてください。空白画面が出たりすぐ閉じたりしても正常です。このひと手間を省くと、起動時自動実行の権限が有効になりません。


3. Termux の基本環境を初期化する

📍 実行場所: 📱 スマホ · Termux

Termux の開き方: ホーム画面またはアプリ一覧から Termux を開きます。初回起動時は黒いターミナル画面が表示され、プロンプトは ~ $ です。ターミナル部分をタップしてキーボードを表示し、次のコマンドを 1 つずつ入力して Enter で実行してください。

# パッケージを更新(2~5 分ほど。途中で [Y/n] が出たら Y を入力して Enter)
pkg update && pkg upgrade -y
# 必要なツールをまとめてインストール
# proot-distro  - Ubuntu 仮想環境の導入と起動
# openssh       - Mac/PC から SSH 接続できるようにする
# tmux          - プロセスをバックグラウンドで持続させる
# curl wget git - ダウンロードやソース取得に使う基本ツール
# termux-api    - Termux:API アプリ経由で Android の機能を呼び出す
pkg install proot-distro openssh tmux curl wget git termux-api -y

完了すると ~ $ に戻ります。出力に Error が出ていなければ成功です。


4. SSH を設定して Mac/PC に作業を移す

ここがこの手順書の最大の切り替えポイントです。この節が終われば、スマホを脇に置いて、残りの設定はすべて Mac/PC のターミナルから SSH 経由で進められます。

4.1 スマホ側: SSH サービスを起動する

📍 実行場所: 📱 スマホ · Termux(プロンプトは ~ $

# SSH ログイン用パスワードを設定
# 実行すると "New password:" と出るので入力する(文字が表示されなくても正常)
# 続いて "Retype new password:" が出るので、同じものをもう一度入力する
# このパスワードは Mac から最初に接続するときに使うので控えておく
passwd
# 現在の Wi-Fi 上でスマホに割り当てられている IP アドレスを確認する
# ifconfig をそのまま実行すると、インターフェース一覧がまとめて表示される
ifconfig

ℹ️ Warning: cannot open /proc/net/dev (Permission denied). Limited output. という警告が出ることがありますが、Termux ではよくある挙動なので無視して構いません。

出力の中から wlan0 のブロックを探してください。ここが Wi-Fi インターフェースで、inet の後ろに出ている値がスマホの 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 を見れば十分です。

# 現在の Termux ユーザー名を確認する
# u0_a353 のような形で、端末ごとに異なる
whoami
# SSH サービスを起動する
# 何も出ずにプロンプトへ戻れば、バックグラウンドで sshd が動き始めている
sshd

⚠️ 重要: Termux の SSH は標準の 22 番ではなく 8022 番ポートを使います。接続時は必ず -p 8022 を付けてください。

4.2 Mac / PC 側: スマホに接続する

📍 実行場所: 💻 Mac / PC · ターミナル

Mac でターミナルを開く方法: Command + Space で Spotlight を開き、Terminal と入力して Enter。
Windows の場合: PowerShell か Git Bash を使います。

# すでに SSH 鍵があるか確認する
# パスが表示されれば OK。次の手順は飛ばしてよい
ls ~/.ssh/id_ed25519

No such file or directory と出た場合は、先に鍵を作成します。

# SSH 鍵を作成する
# 基本的には Enter を押して進めればよい。パスフレーズも不要
ssh-keygen -t ed25519 -C "my_mac"
# 公開鍵をスマホへコピーし、以降はパスワードなしでログインできるようにする
# 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 と表示されます。

# 接続テスト
# ここが通れば、次回以降はパスワード不要で入れるはず
ssh u0_a353@192.168.1.108 -p 8022

確認ポイント: プロンプトが ~ $ に変われば、Mac/PC からスマホの Termux に SSH ログインできています。

4.3 よく使う接続をエイリアス化する(推奨)

📍 実行場所: 💻 Mac · ターミナル

# 以下を ~/.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 で進める

Section 5 以降の作業は、すべて Mac/PC のターミナルから SSH 経由で行います。

もう一度スマホを手に取るのは、基本的に次の 2 回だけです。

  • Section 13: システム設定の変更(手でタップする必要がある)
  • 再起動後の確認: 自動起動が動くまで待って動作を見る

5. Ubuntu 仮想環境をインストールする

📍 実行場所: 💻 Mac · ターミナル(スマホの Termux に SSH 済み、プロンプト ~ $

まだ接続していない場合は、先に phone もしくは ssh u0_a353@192.168.1.108 -p 8022 を実行します。

💡 なぜ Ubuntu が必要なのか
OpenClaw は動作中に /tmp 配下へ一時ファイルを書き込みます。素の Android では、Root がないとこのあたりに制限がかかります。proot-distro で Ubuntu を動かすことで、この制約を回避できます。

# Ubuntu をダウンロードしてインストールする
# サイズはおおむね 100~200 MB、回線によって 3~10 分ほどかかる
proot-distro install ubuntu

完了すると Ubuntu installed successfully のような表示が出て、~ $ に戻ります。

# Ubuntu 環境へ入る
proot-distro login ubuntu

確認ポイント: プロンプトが ~ $ から root@localhost:~# に変われば、Ubuntu 仮想環境に入れています。


6. Node.js と OpenClaw をインストールする

📍 実行場所: 💻 Mac · ターミナル(SSH → Ubuntu、プロンプト root@localhost:~#

ターミナルを閉じた場合や SSH が切れた場合は、再接続後にもう一度 proot-distro login ubuntu を実行してください。

# Ubuntu のパッケージを更新し、基本的なビルドツールを入れる
# 2~5 分ほど見ておけばよい
apt update && apt upgrade -y
apt install -y curl git build-essential
# Node.js 22 の公式リポジトリを追加する
# OpenClaw は Node.js v22 以上が必要で、Ubuntu 標準リポジトリでは古すぎる
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -

実行すると長い出力が流れます。最後に Run apt-get install -y nodejs が見えれば成功です。

# Node.js をインストールする
apt install -y nodejs
# バージョンを確認する
# v22.x.x 以上であること
node --version

v22.13.1 のように表示されれば OK です。v18 以下が出る場合は、NodeSource の追加が正しく反映されていないので前の手順をやり直します。

# OpenClaw をインストールする
# WARN は出ても問題ないことが多い。避けたいのは ERR
npm install -g openclaw@latest
# インストール確認
openclaw --version

確認ポイント: OpenClaw 2026.3.13 (61d171a) のようなバージョン文字列が出れば成功です。command not found の場合は、Ubuntu(root@localhost:~#)ではなく Termux(~ $)にいる可能性が高いです。


7. OpenClaw の初期設定を行う

📍 実行場所: 💻 Mac · ターミナル(SSH → Ubuntu、プロンプト root@localhost:~#

openclaw onboard

対話型のセットアップウィザードが始まります。矢印キーと Enter で進めてください。

質問 1: Continue? (personal mode)

  • 初期カーソルは No にあります。左矢印キー Yes に切り替えてから Enter を押します
  • ⚠️ そのまま Enter するとウィザードが終了してしまうので、もう一度やり直しになります

質問 2: AI プロバイダを選ぶ

  • 上下キーで、自分の API キーに対応するプロバイダ(Gemini / OpenAI / Claude など)を選んで Enter

質問 3: API キーを入力する

  • API キーを貼り付ける
  • 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 が出た場合は、次でやり直します。

openclaw onboard --no-daemon

確認ポイント: 最後に Doctor complete と表示され、設定が ~/.openclaw/openclaw.json に保存されます。


8. Android proot の互換性問題を修正する

📍 実行場所: 💻 Mac · ターミナル(SSH → Ubuntu、プロンプト root@localhost:~#

Android の proot 環境では、OpenClaw が 2 箇所でシステムコールに引っかかります。ここは手動でパッチを当てる必要があります。

8.1 メインプログラム側の networkInterfaces 問題を修正する

原因: OpenClaw は os.networkInterfaces() を呼んでネットワーク情報を取得しますが、Android カーネル + proot 環境ではここが例外になり、そのままクラッシュすることがあります。try/catch で包み、失敗時はフォールバック値を返すようにします。

# パッチ用スクリプトを一時ファイルに書き出す
# 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('✅ networkInterfaces 呼び出しを ' + count + ' 箇所置き換えました');
PATCHEOF
# パッチスクリプトを実行する
node /tmp/patch_networkInterfaces.js

確認ポイント: 対象ファイル: /usr/lib/node_modules/...✅ networkInterfaces 呼び出しを 2 箇所置き換えました のような出力が出れば成功です。対象ファイルはスクリプトが自動で探します。

8.2 Bonjour / mDNS コンポーネントを修正する

原因: OpenClaw に同梱されている Bonjour コンポーネントも os.networkInterfaces() を使っているため、別途パッチが必要です。

FILE=/usr/lib/node_modules/openclaw/node_modules/@homebridge/ciao/lib/NetworkManager.js

# 対象ファイルが存在するか確認する
# パスが表示されれば OK。No such file の場合は OpenClaw の導入状態を見直す
ls $FILE

# 退避を取っておく
# 必要なら cp ${FILE}.bak $FILE で戻せる
cp $FILE ${FILE}.bak
# 手順 1: 安全な補助関数を一時ファイルに書き出す
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
# 手順 2: NetworkManager.js の先頭に補助関数を注入する
{ cat /tmp/nm_patch.js; cat $FILE; } > /tmp/nm_temp.js && mv /tmp/nm_temp.js $FILE
# 手順 3: 既存の networkInterfaces 呼び出しを安全版に置き換える
sed -i 's/os_1\.default\.networkInterfaces()/_safeNetIf()/g' $FILE
# 3 手順とも正しく終わったか確認する
echo "=== ファイル先頭(補助関数が見えるはず)==="
head -3 $FILE
echo "=== _safeNetIf() の呼び出し回数(通常は 5)==="
grep -c '_safeNetIf()' $FILE

確認ポイント: head -3 の先頭行が // Android proot patch になっており、grep -c の結果が 5 であれば問題ありません。

⚠️ 3 手順とも必要です。 手順 2 で関数を注入し、手順 3 で呼び出し側を書き換えています。どちらか片方だけだと、実行時に _safeNetIf is not defined のようなエラーになります。

8.3 起動時の警告を避けるため Bonjour を無効化する

openclaw config set bonjour.enabled false 2>/dev/null || true

💡 フィールドが存在しないと怒られても、そのまま進めて構いません。Bonjour 周りの警告は致命的ではなく、Gateway 自体は動きます。


9. Gateway を起動してスモークテストする

📍 実行場所: 💻 Mac · ターミナル(SSH → Ubuntu、プロンプト root@localhost:~#

📌 この節はスモークテストです。 Gateway が正常起動するかだけを確認します。動作確認ができたら Ctrl+C で停止してください。常駐運用は Section 11 の tmuxwatchdog に任せます。

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 し、次を実行してください。

proot-distro login ubuntu -- cat ~/.openclaw/openclaw.json | grep token

表示された token の値を管理画面に貼り付けて Connect を押します。


10. Feishu チャンネルを設定する

10.1 Feishu Open Platform で自前アプリを作成する

📍 実行場所: 🌐 PC またはスマホのブラウザ

手順 1: アプリを作成する

  1. open.feishu.cn を開き、Feishu アカウントでログインする
  2. 开发者后台(開発者コンソール)→ 创建自建应用(自前アプリを作成)をクリックする
  3. アプリ名(例: OpenClaw Bot)と説明を入力し、作成を確定する

手順 2: Bot 機能を追加する(⚠️ 見落としやすいが必須)

  1. 作成したアプリを開き、左メニューの 添加应用能力(アプリ機能を追加)を開く
  2. 一覧から 机器人(Bot)を見つけて追加する

⚠️ ここを入れ忘れるケースが非常に多いです。Bot 機能がないと、Feishu 上ではアプリがあってもチャットボットとしてメッセージを受け取ったり返したりできません。

手順 3: 権限を設定する

  1. 权限管理(権限管理)に移動し、次の権限を順に検索して有効化します。
権限 内容 用途
im:message DM / グループメッセージの送受信 Bot の返信
im:message.receive_v1 メッセージイベントを受信 Bot の入力受付
im:chat グループ情報の取得・更新 グループ会話で使う
contact:user.id:readonly ユーザーの user_id を取得 安全な許可リスト設定に必要

手順 4: メッセージイベントを購読する

  1. 事件与回调 → 事件配置(イベントとコールバック → イベント設定)を開く
  2. 使用长连接接收事件(長接続でイベントを受信)を選ぶ。OpenClaw は WebSocket 長接続を使うため、コールバック URL は不要
  3. 添加事件(イベント追加)を押し、im.message.receive_v1 を検索して追加する

手順 5: 認証情報を控える

  1. 凭证与基础信息(認証情報と基本情報)で次の 2 つを控えておく
    • App IDcli_xxxxxxxxxxxxxxxx のような形式)
    • App Secret查看 / View を押して表示し、コピーする)

手順 6: アプリを公開する

  1. 应用发布 → 版本管理与发布(アプリ公開 → バージョン管理と公開)へ進み、创建版本(バージョン作成)を押してバージョン番号を入力し、公開申請する

💡 個人 Feishu アカウントの場合: 個人アプリとして作成できる場合はそちらで構いません。流れは同じで、多くの場合は管理者承認なしですぐ使えるようになります。

10.2 onboard ウィザードで Feishu を紐付け、アカウントをペアリングする

📍 実行場所: 💻 Mac · ターミナル(SSH → Ubuntu、プロンプト root@localhost:~#

📌 流れの全体像: Feishu 連携は 2 段階です。
まず onboard ウィザードで App ID / App Secret を登録し、OpenClaw がどの Feishu アプリを使うかを教えます。
次に Gateway を起動した状態で Feishu 側からペアリングを発生させ、どの Feishu アカウントを所有者として許可するかを登録します。
この 2 つが揃って初めて動きます。

段階 1: Feishu アプリの認証情報を登録する

openclaw onboard

ウィザードで Feishu チャンネルを選び、先ほど控えた App IDApp Secret を入力します。完了したらプロンプトへ戻ります。

段階 2: Gateway を起動してペアリング待ちにする

ペアリングは Gateway が起動している間しか受け付けません。同じ Ubuntu ターミナルで一時的にバックグラウンド起動します。

# Gateway をバックグラウンドで起動し、ログを一時ファイルへ出す
openclaw gateway > /tmp/openclaw/openclaw.log 2>&1 &

# 起動完了を少し待つ
sleep 3

# 正常に立ち上がっているか確認する
tail -5 /tmp/openclaw/openclaw.log

listening on ws://127.0.0.1:18789 が見えれば準備完了です。

段階 3: Feishu 側でペアリングメッセージを発生させる

📍 スマホまたは PC の Feishu アプリへ切り替える

  1. Feishu を開き、Bot 名(例: OpenClaw Bot)で検索する
  2. Bot との1 対 1 チャットを開き、こんにちは など適当なメッセージを送る
  3. Bot が自動返信し、次のような内容が届く
access not configured.
Your Feishu user id: ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Pairing code: 12345678

⚠️ 返信が来ない場合は、まず次を見直してください。
アプリを公開済みか、Bot 機能を追加済みか、tail -5 /tmp/openclaw/openclaw.log で Gateway が実際に動いているか。

段階 4: ペアリングを承認する

📍 Mac のターミナルに戻る(SSH → Ubuntu、プロンプト root@localhost:~#

Bot の返信に含まれる Pairing code を使い、12345678 を置き換えて実行します。

# 12345678 は実際の Pairing code に置き換える
openclaw pairing approve feishu 12345678

ℹ️ このコマンドは、その Pairing code に対応する Feishu アカウントを OpenClaw の許可対象として登録します。成功時は特別な表示が出ず、そのままプロンプトへ戻ることが多いです。

段階 5: ペアリングできたか確認する

# 先ほどの一時起動 Gateway を止める
pkill -x openclaw-gateway

Feishu に戻ってもう一度 Bot にメッセージを送ってください。今度は access not configured が出ず、普通に返答が来ればペアリング完了です。

⚠️ グループチャットでは @メンション しないと Bot は反応しません。DM ならそのまま送れば大丈夫です。

💡 いま動いている Gateway はあくまで一時起動です。常駐起動やクラッシュ時の再起動は、この次の Section 11 で watchdogtmux に任せます。


11. 本番運用向けの安定化設定

ここからは、手動で起動するテスト用サービスを、常時運用できる 24 時間サービスに整えていきます。

📍 実行場所: 💻 Mac · ターミナル(SSH → スマホ Termux、プロンプト ~ $

いま Ubuntu(root@localhost:~#)にいる場合は、先に exit を打って Termux(~ $)へ戻ってください。

📌 この節のコマンドの考え方: 以降は proot-distro login ubuntu -- コマンド という形を多用します。これは Termux にいながら、Ubuntu 内部へ直接ファイルを書いたりコマンドを実行したりするための書き方です。先に Ubuntu に入っておく必要はありません。

11.1 watchdog スクリプトを作る(落ちたら自動再起動)

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 というプロセス名を前提に監視します。もし使っている OpenClaw のビルドでプロセス名が違うと、無限再起動ループになります。Ubuntu 内で ps aux | grep openclaw を実行して実際の名前を確認し、必要ならスクリプトを修正してください。

11.2 monitor スクリプトを作る

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

⚠️ ポート監視は nc ではなく Bash 組み込みの /dev/tcp を使っています。proot 内ではその方が安定しやすいためです。

11.3 ログローテーションを設定する

# 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:00 に実行するよう登録
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 で常駐サービスを立ち上げる

# openclaw という tmux セッションを作り、watchdog を起動する
# Gateway 自体の起動と監視は watchdog に任せる
tmux new-session -d -s openclaw
tmux send-keys -t openclaw "proot-distro login ubuntu -- bash /root/watchdog.sh" Enter
# monitor 用の 2 枚目のウィンドウを作る
tmux new-window -t openclaw -n monitor
tmux send-keys -t openclaw:monitor "proot-distro login ubuntu -- bash /root/monitor.sh" Enter
# 2 つのウィンドウが立ち上がっているか確認する
tmux ls
tmux list-windows -t openclaw

出力例:

openclaw: 2 windows (created ...)
0: bash* (1 panes)
1: monitor- (1 panes)

💡 リアルタイムで様子を見たいときは tmux attach -t openclaw を実行します。Ctrl+BD でデタッチすれば、プロセスを止めずに抜けられます。

⚠️ proot 環境で長時間動かすプロセスを nohup ... & に頼るのは避けてください。セッションが終わると一緒に消えることがあります。常駐管理は tmux を使うのが無難です。

11.5 起動時の自動実行を設定する

# 起動スクリプトの置き場を作る
mkdir -p ~/.termux/boot

# スクリプト 1: 端末起動時に 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
# スクリプト 2: OpenClaw 一式を起動時に自動で立ち上げる
cat > ~/.termux/boot/start-openclaw.sh << 'EOF'
#!/data/data/com.termux/files/usr/bin/bash

# Android に Termux を落とされにくくする
termux-wake-lock &

# 端末起動直後は少し待つ
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

# 1 枚目が安定するまで少し待つ
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 稼働中" \
  --content "Gateway + watchdog + monitor が動作中" \
  --ongoing
EOF
chmod +x ~/.termux/boot/start-openclaw.sh
# 2 つのスクリプトができているか確認する
ls -la ~/.termux/boot/

start-ssh.shstart-openclaw.sh が見えれば OK です。


12. セキュリティを強化する

📍 実行場所: 💻 Mac · ターミナル(SSH → スマホ Termux、プロンプト ~ $

Feishu User ID は、Section 10 で Bot が最初に返したメッセージの中に出ています。形式は ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx です。

# Feishu の許可リストを設定し、自分のメッセージだけを処理する
# ou_your_feishu_user_id は実際の User ID に置き換える
proot-distro login ubuntu -- openclaw config set channels.feishu.allowFrom '["ou_your_feishu_user_id"]'
proot-distro login ubuntu -- openclaw config set channels.feishu.groupAllowFrom '["ou_your_feishu_user_id"]'
# 誤操作リスクの高いドキュメント作成権限を無効化する
proot-distro login ubuntu -- openclaw config set channels.feishu.tools.doc false
# Feishu プラグインを許可する
# 起動時の関連警告を消せる
proot-distro login ubuntu -- openclaw config set plugins.allow '["feishu"]'
# セキュリティ監査を実行する
# 目標は CRITICAL = 0
proot-distro login ubuntu -- openclaw security audit
# 設定反映のため 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 が出ていれば、再起動は正常です。


13. スマホ側に戻って行うシステム設定

📍 実行場所: 📱 スマホ · システム設定(この手順書でスマホを手に取る 2 回目の場面です)

⚠️ ここを飛ばすと、再起動後やロック放置後に OpenClaw が応答しなくなったり、SSH までつながらなくなったりしやすくなります。

OnePlus / OxygenOS

  1. 設定 → バッテリー → アプリのバッテリー使用量 → Termux → 制限なし
  2. 設定 → アプリ → アプリ管理 → Termux → バッテリー → 制限なし
  3. 設定 → セキュリティ → 自動起動管理 → Termux → 有効
  4. 最近使ったアプリ画面を開き、Termux のカードを長押しして ロックアイコン(🔒)を付ける

💡 他メーカー端末の場合: 設定画面で 自動起動バッテリー最適化バックグラウンド制限 などで検索し、Termux を対象外にしてください。よくある設定場所の例:

  • Xiaomi / MIUI: 設定 → アプリ → 権限管理 → 自動起動 → Termux を有効化、設定 → バッテリーとパフォーマンス → バッテリー最適化 → Termux → 制限なし
  • Samsung / One UI: 設定 → バッテリー → バックグラウンド使用制限 → スリープしないアプリ → Termux を追加
  • Huawei / HarmonyOS: 設定 → アプリ → アプリ起動管理 → Termux → 手動管理ですべて有効化

14. よく使うコマンド早見表

📍 実行場所: 💻 Mac · ターミナル(SSH → スマホ Termux、プロンプト ~ $

# 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

# monitor ログを直近 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

15. よくあるトラブルと対処

症状 主な原因 対処方法
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 を使い、Section 8 のパッチを最後まで適用する
ssh-copy-idNo identities found Mac 側に SSH 鍵がまだない ssh-keygen -t ed25519 を実行してから再試行する
SSH が Connection refused になる スマホ側で sshd が動いていない スマホで Termux を開いて sshd を実行する
再起動後に SSH へ入れない start-ssh.sh が動いていない ~/.termux/boot/ にファイルがあるか、Termux:Boot を一度開いたか確認する
Gateway が起動直後に落ちる Bonjour / mDNS コンポーネントが失敗している Section 8.2 の NetworkManager.js パッチを適用する
watchdog が Gateway を無限再起動する 監視対象のプロセス名が実際と合っていない Ubuntu で `ps aux
Feishu Bot が反応しない 許可リストが空、または設定反映前 Section 12 の allowFrom を設定し、Gateway を再起動する
管理画面で token missing と表示される Gateway Token を入力していない `cat ~/.openclaw/openclaw.json
画面ロック後に Gateway が止まる Android のバッテリー最適化で Termux が落とされている Section 13 の設定を行い、Termux のタスクカードもロックする
nohup ... & で動かしたプロセスが消える proot セッション終了時にバックグラウンドジョブも一緒に落ちる Section 11.4 のように tmux で管理する
IP 変化で SSH が切れる Wi-Fi 切り替えやルーター再起動で IP が変わった Tailscale を使って固定の仮想 IP を持たせる

📌 最終確認: すべて設定し終えたら、スマホを再起動して 1 分ほど待ち、Feishu から Bot へメッセージを送ってください。普通に返答が返ってくれば、自動運用まで含めて一通り完成です。

再起動後に反応しない場合は:

  • 通知欄に OpenClaw 稼働中 の常駐通知があるかを見る。あるなら watchdog ログを確認する
  • 通知がないなら、Section 13 のシステム設定をもう一度見直す
1 likes

Your answer might help someone💌