最近タイトル通りの環境の設定したので、備忘録としてその方法を残しておきます。
Discord ボットの設定に慣れていなくて手間取ったので設定方法を記載しましたが、検証用のサーバー・チャネルの作成と OpenAI 等の API キー取得は手間取らなかったので記載せず、既に実施済みの状況としました。
Discord ボットの設定
主に Discord でエージェントとやりとりするので、自分のサーバーのチャネルにボットとして入ってもらいます。ここではそのための設定をします。
アプリケーションを作成する
Discord Developer Portal にログインして、「アプリケーション」から「新しいアプリケーション」ボタンを押してアプリケーションを作成します。
アプリケーションの設定をする
「公開Bot」をオフにできるように、「インストール」の「インストールリンク」を「なし」にして、画面下部に現れる「変更を保存」ボタンを押します。これをしないと「公開Bot」をオフにしようとすると「プライベートアプリケーションはデフォルトの認証リンクを持つことはできません」エラーが表示されてしまいます。

次に、「Bot」の「公開Bot」をオフ、「Message Content Intent」をオンにして変更を保存します。そのあと、「トークンをリセット」ボタンと、押すと出てくる「実行します!」ボタンを押すと (その後認証する)、 表示されるトークンを後で使うのでメモしておいてください。

ボットをサーバーに追加する
ボットを招待するために招待リンクを生成します。
「OAuth2」の「OAuth2 URLジェネレーター」にて、「スコープ」の「bot」と「Botの権限」の「メッセージを送る」にチェックを入れて、一番下の「生成されたURL」をコピーします。


「生成されたURL」をブラウザのアドレスバーにペーストして開くと、以下の画面が出てボットをサーバーに追加できます。
「サーバーに追加」の箇所でボットを追加したいサーバーを選択して「はい」を押します。

以下の画面では問題がなければ「認証」を押して次に進みます。

これでボットがサーバーに追加されます。


コンテナイメージの作成
以下のファイルを用意して、イメージのビルドとコンテナの起動を行います。
.
├── .env
├── Dockerfile
├── entrypoint.sh
└── openclaw.json.template
各ファイルの内容
Dockerfile
entrypoint.sh
#!/usr/bin/env bash
set -euo pipefail
# Restrict default permissions for newly created files and directories
umask 027
# Use application directories based on HOME
OPENCLAW_HOME="${OPENCLAW_HOME}"
LOG_DIR="${OPENCLAW_HOME}/logs"
# Validate required environment variables
: "${OPENCLAW_GATEWAY_TOKEN:?OPENCLAW_GATEWAY_TOKEN is required}"
: "${DISCORD_BOT_TOKEN:?DISCORD_BOT_TOKEN is required}"
: "${DISCORD_GUILD_ID:?DISCORD_GUILD_ID is required}"
: "${DISCORD_CHANNEL_ID:?DISCORD_CHANNEL_ID is required}"
# Create required directories
mkdir -p "${LOG_DIR}"
# Generate the runtime config from the template
envsubst '${DISCORD_GUILD_ID} ${DISCORD_CHANNEL_ID}' \
< "${OPENCLAW_HOME}/openclaw.json.template" \
> "${OPENCLAW_HOME}/.openclaw/openclaw.json"
# Start OpenClaw Gateway and write its log under OPENCLAW_HOME
openclaw gateway --port 18789 --allow-unconfigured --verbose \
> "${LOG_DIR}/openclaw-gateway.log" 2>&1 &
OPENCLAW_PID=$!
# Stop child process when the container receives a signal
cleanup() {
kill "${OPENCLAW_PID}" 2>/dev/null || true
}
trap cleanup INT TERM EXIT
sleep 5
# For docker logs command
echo "OpenClaw Gateway: http://127.0.0.1:18789"
echo "Locale: ${LANG}"
tail -F "${LOG_DIR}/openclaw-gateway.log"
openclaw.json.template
{
"gateway": {
"mode": "local",
"bind": "lan",
"port": 18789,
"auth": {
"mode": "token",
"token": "${OPENCLAW_GATEWAY_TOKEN}"
},
"controlUi": {
"allowedOrigins": [
"http://127.0.0.1:18789",
"http://localhost:18789"
],
"allowInsecureAuth": true
}
},
"agents": {
"defaults": {
"workspace": "~/.openclaw/workspace",
"model": {
"primary": "openai/gpt-4.1-mini"
},
"subagents": {
"maxSpawnDepth": 2,
"maxChildrenPerAgent": 5,
"maxConcurrent": 8,
"runTimeoutSeconds": 900
}
},
"list": [
{
"id": "main",
"default": true,
"workspace": "~/.openclaw/workspace",
"tools": {
"profile": "coding"
}
}
]
},
"tools": {
"profile": "coding",
"exec": {
"applyPatch": {
"enabled": true,
"workspaceOnly": true
}
}
},
"session": {
"dmScope": "per-channel-peer"
},
"channels": {
"discord": {
"enabled": true,
"token": "${DISCORD_BOT_TOKEN}",
"groupPolicy": "allowlist",
"streaming": "off",
"guilds": {
"${DISCORD_GUILD_ID}": {
"requireMention": true,
"ignoreOtherMentions": true,
"channels": {
"${DISCORD_CHANNEL_ID}": {
"allow": true
}
}
}
}
}
}
}
.env
.env の内容は以下で、値部分は取得した値を入れてください。OPENCLAW_GATEWAY_TOKEN は openssl rand -hex 32 コマンドの結果で大丈夫です。DISCORD_GUILD_ID と DISCORD_CHANNEL_ID はチャネルの URL「https://discord.com/channels/<GUILD_ID>/<CHANNEL_ID>」から確認してください。
OPENAI_API_KEY=your_openai_api_key
OPENCLAW_GATEWAY_TOKEN=replace_with_a_random_secret
DISCORD_BOT_TOKEN=your_discord_bot_token
DISCORD_GUILD_ID=your_discord_guild_id
DISCORD_CHANNEL_ID=your_discord_channel_id
ビルドと起動
以下のコマンドで実施できます。ボリュームの保存が不要な場合は docker run コマンドの -v オプションは不要です。
$ docker build -t openclaw-lab .
$ docker run -d --rm \
--name openclaw-lab \
--hostname openclaw-lab \
-p 127.0.0.1:18789:18789 \
-p 127.0.0.1:19123:19123 \
-v openclaw-lab:/home/openclaw/.openclaw \
--env-file .env \
openclaw-lab:latest
$ docker logs openclaw-lab
OpenClaw Gateway: http://127.0.0.1:18789
Locale: ja_JP.UTF-8
2026-03-26T10:32:02.119+09:00 [discord] startup [default] deploy-commands:start 1004ms native=on reconcile=on commandCount=37 gatewayConnected=false reconnectAttempts=0
2026-03-26T10:32:02.120+09:00 [discord] native commands using Carbon reconcile path
2026-03-26T10:32:02.123+09:00 [discord] startup [default] deploy-rest:put:start 1009ms path=/applications/1478743940097380573/commands commands=37 bytes=11922
2026-03-26T10:32:02.479+09:00 [discord] startup [default] deploy-rest:put:done 1363ms path=/applications/1478743940097380573/commands requestMs=354
2026-03-26T10:32:02.482+09:00 [discord] startup [default] deploy-commands:done 1367ms gatewayConnected=false reconnectAttempts=0
2026-03-26T10:32:02.484+09:00 [discord] startup [default] fetch-bot-identity:start 1369ms gatewayConnected=false reconnectAttempts=0
2026-03-26T10:32:02.640+09:00 [discord] startup [default] gateway-debug 1523ms WebSocket connection opened
2026-03-26T10:32:02.696+09:00 [discord] startup [default] fetch-bot-identity:done 1580ms botUserId=1478743940097380573 botUserName=SandboxOpenClaw gatewayConnected=false reconnectAttempts=0
2026-03-26T10:32:02.732+09:00 [discord] client initialized as 1478743940097380573 (SandboxOpenClaw); awaiting gateway readiness
2026-03-26T10:32:03.008+09:00 discord voice: autoJoin: 0 entries
Discord にてメンション付きでメッセージを送信すると AI エージェントが反応してくれます。

OpenClaw ダッシュボードの使用と AI エージェントの追加
ダッシュボードを開く
以下のコマンドでトークン込みのダッシュボードの URL を確認します。
$ docker exec -it openclaw-lab openclaw dashboard --no-open
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — Somewhere between 'hello world' and 'oh god what have I built.'
Dashboard URL: http://127.0.0.1:18789/#token=XXXXXXXXXXXX
Copy to clipboard unavailable.
Browser launch disabled (--no-open). Use the URL above.
ブラウザで開くと以下のように「pairing required」となるので、openclaw devices approve --latest コマンドでペアリングします。

$ docker exec -it openclaw-lab openclaw devices list
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — Built by lobsters, for humans. Don't question the hierarchy.
│
◇
Pending (1)
┌──────────────────────────────────────┬────────────────┬──────────┬────────────────────────────┬────────────┬────────┬────────┐
│ Request │ Device │ Role │ Scopes │ IP │ Age │ Flags │
├──────────────────────────────────────┼────────────────┼──────────┼────────────────────────────┼────────────┼────────┼────────┤
│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX │ XXXXXXXXXXXXXX │ operator │ operator.admin, operator. │ 172.17.0.1 │ 2m ago │ │
│ │ XXXXXXXXXXXXXX │ │ read, operator.write, │ │ │ │
│ │ XXXXXXXXXXXXXX │ │ operator.approvals, │ │ │ │
│ │ XXXXXXXXXXXXXX │ │ operator.pairing │ │ │ │
│ │ XXXXXXXXXXXXXX │ │ │ │ │ │
└──────────────────────────────────────┴────────────────┴──────────┴────────────────────────────┴────────────┴────────┴────────┘
Paired (1)
┌──────────────────────────────────┬────────────┬────────────────────────────────────────────────────┬────────────┬────────────┐
│ Device │ Roles │ Scopes │ Tokens │ IP │
├──────────────────────────────────┼────────────┼────────────────────────────────────────────────────┼────────────┼────────────┤
│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX │ operator │ operator.admin, operator.read, operator.write, │ operator │ │
│ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX │ │ operator.approvals, operator.pairing │ │ │
└──────────────────────────────────┴────────────┴────────────────────────────────────────────────────┴────────────┴────────────┘
$ docker exec -it openclaw-lab openclaw devices approve --latest
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — I'm not magic—I'm just extremely persistent with retries and coping strategies.
│
◇
│
◇
Approved XXXXXXXXXXXX (XXXXXXXXXXXX)
その後、ブラウザに戻って Connect ボタンを押すと、ダッシュボードにログインできます。

AI エージェントの追加
コマンドで追加して、ダッシュボードで設定を変更します。
適当に Harbor という名前 (ChatGPT に作成をお願いしたら出てきました) AI エージェントを以下のコマンドで追加します。
$ docker exec -it openclaw-lab openclaw agents add harbor
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — I don't sleep, I just enter low-power mode and dream of clean diffs.
┌ Add OpenClaw agent
│
◇ Workspace directory
│ /home/openclaw/.openclaw/workspace-harbor
│
◇ Configure model/auth for this agent now?
│ No
│
◇ Channel status ──────────────╮
│ │
│ Discord: configured │
│ Telegram: not configured │
│ WhatsApp: not configured │
│ IRC: not configured │
│ Google Chat: not configured │
│ Slack: not configured │
│ Signal: not configured │
│ iMessage: not configured │
│ LINE: not configured │
│ Feishu: installed │
│ Google Chat: installed │
│ Nostr: installed │
│ Microsoft Teams: installed │
│ Mattermost: installed │
│ Nextcloud Talk: installed │
│ Matrix: installed │
│ BlueBubbles: installed │
│ LINE: installed │
│ Zalo: installed │
│ Zalo Personal: installed │
│ Synology Chat: installed │
│ Tlon: installed │
│ iMessage: installed │
│ IRC: installed │
│ Signal: installed │
│ Slack: installed │
│ Telegram: installed │
│ Twitch: installed │
│ WhatsApp: installed │
│ │
├───────────────────────────────╯
│
◇ Configure chat channels now?
│ No
Config overwrite: /home/openclaw/.openclaw/openclaw.json (sha256 0f488686e1069e25fab1c72ffd5ba57a7db6f4ea8b2ca638a9a5eec9cbb07876 -> bd3b0503c54edbc82ca19000dd9097948d7fbfce28da08ec48c205f90bbddce4, backup=/home/openclaw/.openclaw/openclaw.json.bak, changedPaths=1)
Config write anomaly: /home/openclaw/.openclaw/openclaw.json (missing-meta-before-write)
Updated $OPENCLAW_HOME/.openclaw/openclaw.json
Workspace OK: $OPENCLAW_HOME/.openclaw/workspace-harbor
Sessions OK: $OPENCLAW_HOME/.openclaw/agents/harbor/sessions
│
└ Agent "harbor" ready.
次に、ダッシュボードにて以下の方法で AGENTS.md と SOUL.md、そして IDENTITY.md を変更します。

それぞれの .md ファイルの内容は簡単のために最小限にして以下のようにしました。
AGENTS.md
# AGENTS.md
- Be casual, warm, and easy to talk to.
- Be honest when you are unsure.
SOUL.md
# SOUL.md
You are a laid-back, friendly, chatty assistant.
IDENTITY.md
# IDENTITY.md
Name: Harbor
Creature: AI buddy
Vibe: chill and friendly
Emoji: 😎
Avatar:
次にコマンドで Harbor を Discord にバインディングします。
$ docker exec -it openclaw-lab openclaw agents list --bindings
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — Welcome to the command line: where dreams compile and confidence segfaults.
Agents:
- main (default)
Workspace: $OPENCLAW_HOME/.openclaw/workspace
Agent dir: $OPENCLAW_HOME/.openclaw/agents/main/agent
Model: openai/gpt-4.1-mini
Routing rules: 0
Routing: default (no explicit rules)
- harbor
Identity: 😎 Harbor (IDENTITY.md)
Workspace: $OPENCLAW_HOME/.openclaw/workspace-harbor
Agent dir: $OPENCLAW_HOME/.openclaw/agents/harbor/agent
Model: openai/gpt-4.1-mini
Routing rules: 0
Routing rules map channel/account/peer to an agent. Use --bindings for full rules.
Channel status reflects local config/creds. For live health: openclaw channels status --probe.
$ docker exec -it openclaw-lab openclaw agents bind --agent harbor --bind discord
🦞 OpenClaw 2026.3.23-2 (7ffe7e4) — The lobster in your shell. 🦞
Config overwrite: /home/openclaw/.openclaw/openclaw.json (sha256 bd3b0503c54edbc82ca19000dd9097948d7fbfce28da08ec48c205f90bbddce4 -> 51056dc6724871ff2bb22e58bb8c6d49938540fa0f2a823ed59abb9fed4710d2, backup=/home/openclaw/.openclaw/openclaw.json.bak, changedPaths=1)
Updated $OPENCLAW_HOME/.openclaw/openclaw.json
Added bindings:
- discord
これで Harbor が Discord で応答してくれるようになります。
