Dockerで動かすAIエージェントをオンプレMattermostに繋ぐまでに踏んだ地雷と、その解法をすべて記す。
構築環境
| 項目 | 内容 | 備考 |
|---|---|---|
| OS | Ubuntu 22.04 / 24.04 | Docker動作環境 |
| Docker | Docker Engine + Compose v2 | 2サービス構成(gateway / cli) |
| Node.js | v22 以上 | コンテナ内で自動解決 |
| LLMルーター | OpenRouter | モデル非依存で切替可能 |
| 使用モデル | openai/gpt-5-mini | Agentic Coding能力を重視して選定 |
| チャットツール | Mattermost(セルフホスト) | オンプレミス版 |
INTRO OpenClawとは何か
OpenClaw(旧称:Clawdbot / Moltbot)は、Peter Steinbergerが開発したオープンソースのローカルファースト自律型AIエージェントランタイムだ。WhatsApp・Telegram・Slack・Discord・Mattermostといった既存のチャットアプリをUIとして使いながら、裏側でLLMがシェルコマンドの実行、ブラウザ操作、ファイル読み書き、メール送信などを自律的にこなす。
ChatGPTやClaudeのようなWebチャットとの決定的な違いは「実際に手を動かせること」だ。構成は3層で理解すると整理しやすい。
- Gateway:各チャットプラットフォームとの通信を束ねるコントロールプレーン
- Brain:LLMによる意思決定エンジン(モデル非依存)
- Skills:エージェントが実行できる機能(ブラウザ制御・シェル実行など)
今回はこれをDockerで動かす。コンテナ構成は以下の通りだ。
openclaw-gateway ← AIエージェントの常駐デーモン(メイン)
├── ~/.openclaw/ # 設定・メモリ・APIキー(ホスト側マウント)
└── ~/openclaw/workspace/ # エージェントが読み書きするワークスペースopenclaw-cli ← 管理コマンド用コンテナ(都度 run –rm で起動)
└── pairing approve, dashboard, devices list など
⚠️ セキュリティ前提の共有
OpenClawはシェルアクセス・ブラウザ制御・メール送信権限を持つ。Dockerによるコンテナ分離が第一の防御線だが、設定ミスは依然として重大なリスクになる。本番環境への適用可否は必ず自身で判断すること。
STEP 0 🦞 OpenClaw本体の導入(Docker)
Mattermostとの接続設定に入る前に、OpenClaw本体を立ち上げる。公式が用意する docker-setup.sh を使うのが最短ルートだ。
前提条件の確認:
# Docker と Compose v2 が入っていることを確認
docker --version
docker compose version
# git が入っていることを確認
git --versionリポジトリのクローンとセットアップ:
# リポジトリをクローン
git clone https://github.com/openclaw/openclaw.git
cd openclaw
# 公式セットアップスクリプトを実行(初回ビルド+対話式ウィザード)
./docker-setup.shスクリプト実行後、対話式のオンボーディングウィザードが起動する。主な設定項目は以下の通りだ。
| 設問 | 推奨選択 |
|---|---|
| Gateway type | Local(ローカル動作) |
| AI Provider | OpenRouter(モデル横断で使いやすい) |
| API Key | OpenRouterのAPIキーを入力 |
| 追加ネットワーク機能 | 不明な場合はスキップ推奨 |
ウィザード完了後、以下のコマンドで起動する。
# イメージをビルド(初回のみ数分かかる)
docker build -t openclaw:local -f Dockerfile .
# オンボーディング(ウィザード未実施の場合のみ)
docker compose run --rm openclaw-cli onboard
# Gatewayをバックグラウンドで起動
docker compose up -d openclaw-gatewaydocker compose ps で openclaw-gateway が Up と表示されれば起動成功。Webダッシュボードへのアクセスが必要な場合は以下で確認する。
# ダッシュボードURL(tokenパラメータ付き)を取得
docker compose run --rm openclaw-cli dashboard --no-open
# → 出力されたURLをブラウザで開く(http://127.0.0.1:18789/?token=...)💡 躓きポイント:初回ビルドは時間がかかる
OpenClawはDockerHubからイメージをpullするのではなく、リポジトリのソースからローカルビルドする設計だ。初回は数分かかるが、2回目以降はDockerのレイヤーキャッシュが効くため高速になる。
💡 躓きポイント:ディレクトリ構造に注意
セットアップスクリプトはホスト側に2つのディレクトリを自動生成してコンテナにマウントする。
~/.openclaw/:設定・メモリ・APIキー(以降のステップで直接編集するファイルもここにある)~/openclaw/workspace/:エージェントが読み書きする作業領域
docker compose 系のコマンドは必ずクローンした ~/openclaw/ ディレクトリから実行すること。
STEP 1 🤖 Mattermost側のBot準備
OpenClawが憑依するための空のアカウントをMattermost上に用意する。システム管理者権限が必要だ。
- システム管理者でMattermostにログイン。
- 左上メニュー → 「統合機能(Integrations)」 → 「Botアカウント」 へ進む。
- 「Botアカウントを追加する」から任意のユーザー名(例:
openclaw-bot)を設定して保存。 - 生成されたアクセストークン(Bot Token) を必ずメモする(この画面を閉じると再表示されない)。
- 対象チームを開き、「メンバーを招待する」からBotアカウントをチームに所属させる。
💡 躓きポイント:Botは「チームの迷子」になる
Botを作成しただけでは、どのチームにも属していない状態だ。チームへの招待を忘れると、後でチャンネルに呼び出そうとした際に「このチームのメンバーではありません」と弾かれる。チャンネル招待の前にチーム招待が必要という順序を覚えておこう。
STEP 2 ⚙️ docker-compose.yml への環境変数追記
OpenClawのGatewayコンテナに、MattermostのURLと認証トークンを環境変数として渡す。Dockerの環境変数経由で渡すのが正解で、JSONに直書きしてはいけない(理由はSTEP 3で詳述)。
nano ~/openclaw/docker-compose.ymlopenclaw-gateway の environment: セクションに以下を追記する。
environment:
# (既存の設定はそのまま残す)
MATTERMOST_URL: https://mattermost.your-domain.example.com
MATTERMOST_BOT_TOKEN: <STEP 1で取得したアクセストークン>💡 躓きポイント:YAMLの2種類の記法トラップ
Dockerの environment 記法には2パターン存在する。
- ハイフン+イコール形式:
- KEY=VALUE - コロン形式:
KEY: VALUE
既存ファイルがどちらの形式かを先に確認し、統一すること。 混在させるとDockerが設定を無視する場合がある。
STEP 3 📄 openclaw.json でプラグイン有効化
続いて、OpenClaw本体の設定ファイルでMattermostプラグインのスイッチをONにする。
nano ~/.openclaw/openclaw.json"plugins" セクションを以下の通り編集する。config ブロックは絶対に書かないのがポイントだ。
{
"plugins": {
"entries": {
"mattermost": {
"enabled": true
}
}
}
}既存の "agent": { "model": "..." } 等の項目は削除せず残しておくこと。
💡 躓きポイント:2つの罠
- npm で外部インストールしてはいけない
OpenClawのDockerイメージにはMattermostを含む公式プラグインが最初から内蔵されている。npm installで外から追加すると競合してシステムが崩壊する。 - JSONに直接URLを書くと起動ループに陥る
configブロック等でURL・トークンをJSONに直書きすると、スキーマバリデーションがmust NOT have additional propertiesエラーを返し、Gatewayコンテナが無限再起動ループに入る。設定値は必ずSTEP 2の環境変数で渡すこと。
STEP 4 🚀 起動とペアリング承認
設定を反映させてGatewayコンテナを再起動し、ユーザーとBotを紐付ける。
コンテナを再構築して起動:
cd ~/openclaw
docker compose up -d接続ログの確認:
docker compose logs -f openclaw-gateway[mattermost] connected as @openclaw-bot と表示されたら接続成功。Ctrl + C で抜けてよい。チャンネルへのBot招待とペアリング:
- Mattermostで対象チャンネルを開き、
/invite @openclaw-botを実行してBotを招待する。 - Botに話しかける(例:
@openclaw-bot hello)。 - Botから 「Pairing code: XXXXXXXX」 というメッセージが返ってくる。
- ターミナルに戻り、表示されたコードで以下を実行する。
docker compose run --rm openclaw-cli pairing approve mattermost <8桁のペアリングコード>💡 躓きポイント:「Access not configured」は正常な動作
初回の応答がエラーに見えても慌てなくてよい。これはAPIの不正利用を防ぐためのセキュリティ機構だ。openclaw-cli コンテナから管理者が明示的に承認して初めてAIが言葉を返し始める設計になっている。
BONUS 🔄 モデル切り替え手順
用途に応じてLLMを差し替えたい場合は以下の3ステップで完結する。
~/.openclaw/openclaw.jsonを開く。"model"の値を使用したいモデル識別子に書き換えて保存する。docker compose restart openclaw-gatewayでコンテナに反映させる。
// OpenRouter経由でモデルを指定する場合の形式
"model": "openrouter/openai/gpt-5-mini"
"model": "openrouter/anthropic/claude-sonnet-4-5"
"model": "openrouter/google/gemini-2.0-flash"gpt-5-mini を選択した根拠はLiveBenchにおける「Agentic Coding」スコアだ。OpenClawのようにブラウザ画面を読み取って自律的にクリック・入力を判断するツールでは、単純な日本語生成能力よりエージェント的推論能力の数値が実用精度に直結する。廉価モデルを評価する際の重要な指標として今後も参考にしたい。まとめ
今回の構築で特に重要だったのは「設定値はDockerの環境変数で渡す」「プラグインは外からインストールしない」「コンテナ操作は必ずクローンディレクトリから実行する」という3点だ。この手順書通りに進めれば、別サーバーへの移設や同僚への環境展開も最短ルートで完了できるはずだ。
