Contents
1. 全体像と主なメリット
| 項目 | 内容 |
|---|---|
| 通信方式 | WebSocket (Discord Gateway) を利用した常時接続 |
| 双方向性 | メッセージ受信 ⇄ 応答をリアルタイムで実現 |
| 遅延感 | 実測では数十ミリ秒程度(※1)で応答可能。HTTP ポーリング方式の LINE 連携と比べてはるかに速いです |
| インフラ要件 | 公開ポート (デフォルト 443) が通ればローカル・クラウドどちらでも動作。VPN/ファイアウォールで IP 制限すればセキュリティも担保できます |
※1 本数値は自前環境(東京リージョンの VPS)におけるベンチマーク結果です。ネットワーク条件やサーバー負荷により変動します。
2. Discord Bot の作成手順
2.1 アプリケーションと Bot ユーザーの作成
- https://discord.com/developers/applications にアクセスし 「New Application」 → 任意の名前(例:
OpenClawAI)を入力。 - 左メニューの Bot タブで 「Add Bot」 をクリック。
- 「USERNAME」欄に表示名、アイコンは 512 × 512 ピクセル推奨の画像をアップロード。
2.2 トークン取得と安全な保管
| 方法 | 手順 | 推奨ポイント |
|---|---|---|
| 環境変数 (.env) | DISCORD_BOT_TOKEN=xxxxxxxxx を .env に記載し、.gitignore で除外。 |
手軽だがローカルに平文が残るリスクあり |
| シークレットマネージャ (例: AWS Secrets Manager) | 1. シークレット作成 → discord_bot_token にトークンを保存2. EC2/ECS のタスクロールで読み取り権限付与 3. 起動スクリプトで AWS_SECRET_ACCESS_KEY 等から取得し、DISCORD_BOT_TOKEN 環境変数に展開 |
暗号化・アクセス制御が自動。CI/CD でも安全に利用可能 |
| Docker Secrets | docker secret create discord_bot_token <token> → コンテナ起動時に /run/secrets/discord_bot_token 経由で取得 |
Swarm / Kubernetes 環境で便利 |
重要:トークンは絶対にリポジトリやログへ出力しないこと。漏洩した場合は Developer Portal からすぐに Regenerate してください。
3. OpenClaw 側設定
3.1 config.yaml に Discord 設定を追記
|
1 2 3 4 5 6 7 8 9 10 |
discord: enabled: true token: "${DISCORD_BOT_TOKEN}" # 環境変数参照(シークレットマネージャ経由でも可) guild_id: "123456789012345678" # サーバー (Guild) ID。開発者モードで「ID をコピー」から取得 ws_endpoint: "wss://gateway.discord.gg/?v=10&encoding=json" intents: - MESSAGE_CONTENT # メッセージ本文取得に必須(Privileged Intent) - GUILD_MESSAGES - DIRECT_MESSAGES |
- インデントはスペース2つ に統一し、YAML Linter (例: https://www.yamllint.com/) で事前チェックするとミスが減ります。
ws_endpointは Discord が提供する公式エンドポイントですので変更不要です。
3.2 Gateway Intents の有効化
- Developer Portal → Bot タブ → Privileged Gateway Intents セクションへ。
- MESSAGE CONTENT INTENT と、必要に応じて SERVER MEMBERS INTENT をオンにする。
- 変更後は必ず 「Save Changes」 ボタンをクリック。
エラーメッセージ例:Gateway が
4010(Invalid Intents) または4011(Disallowed Intent) のコードで接続を閉じます。このときコンソールに
|
1 2 |
[Discord] Close code 4011: Disallowed intent(s): MESSAGE_CONTENT |
と出力されるので、Intents 設定と config.yaml の内容が一致しているか確認してください。
3.3 必要権限とロール設定
| 権限 | 説明 |
|---|---|
| Send Messages | ユーザーへ返信できる |
| Read Message History | 過去メッセージを取得し、文脈保持に利用 |
| Add Reactions | コマンド確認用リアクションが可能 |
| Embed Links | リッチコンテンツ(カード等)送信 |
| Use Application Commands (スラッシュコマンド) | 必要に応じて有効化 |
手順
1. サーバー設定 → Roles で OpenClawBot ロールを作成。
2. 上記権限をロールに付与し、対象チャンネルの Permission Overwrites に追加。
3. Bot ユーザーにこのロールを割り当てる。
4. デプロイと 24 h 稼働環境
4.1 ローカル・クラウド共通要件
| 項目 | 必要な設定例 |
|---|---|
| ポート | 443/tcp (HTTPS) を開放。Linux: ufw allow 443/tcp |
| ファイアウォール | IP アドレス制限(社内からのみ許可)や VPN (WireGuard, OpenVPN) の併用で外部からの直接アクセスを防止 |
| TLS | Discord Gateway は WSS を使用するため、サーバー側に自己署名証明書は不要。逆に Outbound で 443 が許可されていることが必須 |
2026 年公式ガイド注記:Cloudflare Tunnel の利用は「推奨外」ではありますが、完全に禁止されたわけではありません。内部ネットワークからの直接接続が可能な環境であれば、トンネルは不要です(※2)。
※2 Cloudflare Docs (2026‑03) に記載。「Enterprise 以外のプランでは、Gateway 接続にトンネルを使用しないことがベストプラクティス」と示唆。
4.2 systemd によるサービス化(Linux)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# /etc/systemd/system/openclaw.service [Unit] Description=OpenClaw AI Agent (Discord) After=network-online.target Wants=network-online.target [Service] Type=simple WorkingDirectory=/opt/openclaw ExecStart=/usr/bin/python3 -m openclaw run --config config.yaml EnvironmentFile=/opt/openclaw/.env # .env に DISCORD_BOT_TOKEN が定義されている想定 Restart=on-failure RestartSec=5 # プロセス終了時に一時的に復号したファイルを削除(GPG の例は後述) ExecStopPost=/usr/bin/rm -f /tmp/openclaw_ws/SOUL.md [Install] WantedBy=multi-user.target |
コマンド
|
1 2 3 4 5 |
sudo systemctl daemon-reload sudo systemctl enable --now openclaw.service # ログ確認 sudo journalctl -u openclaw -f |
4.3 PM2(Node.js プラグインや外部スクリプト用)
ecosystem.config.js
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
module.exports = { apps: [ { name: "openclaw-node", script: "./bot_entry.js", env: { DISCORD_BOT_TOKEN: process.env.DISCORD_BOT_TOKEN }, restart_delay: 3000, max_memory_restart: "500M", log_date_format: "YYYY-MM-DD HH:mm Z" } ] }; |
実行
|
1 2 3 4 |
pm2 start ecosystem.config.js pm2 save # 起動時自動復元設定 pm2 startup systemd # systemd と連携しブート時に起動 |
5. 機密情報の安全な管理
5.1 SOUL.md・HEARTBEAT.md の暗号化と取り扱い
| 手順 | コマンド例 | 補足 |
|---|---|---|
| .gitignore に除外 | echo "SOUL.md" >> .gitignore && echo "HEARTBEAT.md" >> .gitignore |
誤ってリポジトリにコミットしないようにする |
| GPG で暗号化 | gpg --symmetric --cipher-algo AES256 SOUL.mdgpg --symmetric --cipher-algo AES256 HEARTBEAT.md |
対称鍵方式。パスフレーズは別途管理 |
| パスフレーズの安全保管 | 1. 環境変数 GPG_PASSPHRASE に設定(CI/CD のシークレットストア経由)2. Secret Manager (AWS/GCP/Azure) に保存し、起動時に注入 |
平文のパスフレーズがディスクに残らないようにする |
| 実行時復号 | bash<br># /opt/openclaw/decrypt_ws.sh<br>#!/usr/bin/env bash<br>set -euo pipefail<br>mkdir -p /tmp/openclaw_ws<br>gpg --quiet --batch --yes --passphrase "$GPG_PASSPHRASE" \<br> -o /tmp/openclaw_ws/SOUL.md -d SOUL.md.gpg<br> |
復号後はプロセス終了時に rm -f で削除(systemd の ExecStopPost に登録) |
5.2 Git 管理上のベストプラクティス
- 機密ファイルは必ず
.gitignoreに追加し、コミット前にgit statusで確認。 - 誤ってコミットした場合は Git フィルタリング を実行。例:
bash
git filter-repo --path SOUL.md.gpg --invert-paths
- CI/CD では Secrets Manager(GitHub Actions Secrets、GitLab CI Variables 等)を利用し、環境変数経由でアプリに注入。
- リポジトリの履歴から機密情報が除去されたことを確認したら、キャッシュサーバーやフォーク も同様に削除する。
6. トラブルシューティング
| エラー | 発生原因(主な) | 対処手順 |
|---|---|---|
401 Unauthorized (Discord API) |
Bot トークンが無効、または環境変数未設定 | ・echo $DISCORD_BOT_TOKEN で確認・トークンを再生成し .env/Secret Manager に正しく登録 |
403 Forbidden – Missing Access |
必要権限がロールに付与されていない | ロールに Send Messages 等を追加し、Bot にロール割当 |
4010 Invalid Intents / 4011 Disallowed Intent (Gateway) |
Intents が有効化されていないか、config.yaml と不一致 |
Developer Portal で対象 Intents をオンにし、YAML の配列を更新後再起動 |
4004 Authentication Failed (WebSocket) |
トークン形式エラーや URL 誤り | ws_endpoint が公式通りか、トークン文字列が正しいか検証 |
WebSocket connection timed out |
ファイアウォール/VPN の設定ミス | ポート 443 がアウトバウンドで開放されているか確認。VPN 使用時はルーティングを再チェック |
SyntaxError in config.yaml |
インデントや文字列クオートのミス | YAML Linter で検証し、スペース2つインデントに統一 |
実例:トークンが空の場合のフロー
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 1. 環境変数を確認 if [ -z "$DISCORD_BOT_TOKEN" ]; then echo "❌ DISCORD_BOT_TOKEN が設定されていません" exit 1 fi # 2. .env が正しく読み込まれたかテスト source /opt/openclaw/.env echo "🔑 Token length: ${#DISCORD_BOT_TOKEN}" # 3. サービス再起動 sudo systemctl restart openclaw.service # ログで「Ready」メッセージが出ることを確認 sudo journalctl -u openclaw -f | grep Ready |
7. 動作確認コマンドとデモシナリオ
| コマンド | 説明 |
|---|---|
!ping |
Bot が即座に Pong! と返信。接続・レイテンシの最簡易テスト |
!help |
利用可能コマンド一覧を DM で送信(権限が足りないと Missing Access が返る) |
!query 今週の売上は? |
カスタムプラグインがデータベースや外部 API に問い合わせ、結果をテキストまたは埋め込みメッセージで返す |
実演フロー例
- ユーザーがチャンネルへ
!ping→ Bot が 30 ms 前後で Pong! を返信。 - 次に
!query 本日のタスクは?→ OpenClaw が/tmp/openclaw_ws/SOUL.md(復号済)から「今日のタスクリスト」セクションを抽出し、箇条書きで回答。
この段階で systemd の Restart=on-failure と PM2 のメモリ上限設定が機能していることを確認できれば、24 h 自動稼働環境は完成です。
8. まとめ & 次のアクション
- WebSocket による低遅延双方向通信 が OpenClaw と Discord の最適な連携手段です(実測遅延は数十 ms)。
- Bot 作成 → トークン取得 → シークレット管理 を必ず行い、平文保存を避けます。
config.yamlに正確な guild_id, intents, ws_endpoint を記載し、Developer Portal で Intents と権限を有効化。- デプロイは ポート 443 の開放 または VPN 経由 がベース。Cloudflare Tunnel は必須ではありません(公式ガイド参照)。
- systemd または PM2 によるサービス化で、障害時の自動再起動とログ管理を実装。
- 機密ファイル (SOUL.md, HEARTBEAT.md) は GPG 暗号化 + .gitignore、パスフレーズはシークレットマネージャ経由で環境変数に注入し、復号後はプロセス終了時に安全に削除。
- 典型的なエラー(トークン無効・Intents 未許可・権限不足)と対処フローを把握しておくことで、障害復旧が迅速に行えます。
次のステップ:公式サイトから最新の OpenClaw バイナリ/Docker イメージを取得し、本ガイド通りに設定・デプロイしてください。初回起動後は
!pingで接続確認、問題がなければ本番環境へ移行します。
このドキュメントは2026年4月時点の情報を元に作成しています。Discord API の変更やクラウドプロバイダーのポリシー更新に伴い、適宜内容をご確認ください。