pm2×Discord Bot、複数運用で実際にハマった3つの罠

「pm2×Discord Bot 複数運用で実際にハマった3つの罠」の文字と重なり合うロボットアイコンのイラスト

チャットシステムを使った個人開発を続けていると、Discord Botの数はいつの間にか増えていく。

通知用、応答用、そして今回新しく作ったサービス用と、気づけば同じVPS上で複数のBotが動くようになっていた。

複数運用に切り替えるタイミングで3つハマったので、同じ状況になりそうな人向けに整理しておく。

Tomoya

意外とハマりやすいポイントになるかもしれないので、
自分用にもここに記録しておく意味で書いていきます。

目次

2つの前提知識

Discord Botとは

Discordサーバーの中で、自動的にメッセージを送ったり、コマンドに反応したりするプログラムのことだ。

人間のユーザーと同じように「Bot専用のアカウント」としてサーバーに参加し、常にDiscordのサーバーと接続を保ちながら動いている。

pm2とは

Node.jsで作ったプログラムを、VPS上で「落ちても自動的に再起動する」形で動かし続けるためのツール

個人開発でVPSを使う場合、ほぼ必須の存在になる。

この記事のトラブルも、pm2でBotを常駐化させる過程で発生したものだ。


罠①:Botトークンの使い回しによる衝突

最初、新しいBotのために新しくDiscordアプリケーションを作らず、既存のBotトークンをそのまま使い回そうとした。

同じトークンで別々のプロセスがDiscord Gatewayに接続すると、セッションが競合し、片方の機能が正常に動かなくなることがある。

Tomoya

今回は、新しく追加したサービスの通知が、既存Botの処理に埋もれて機能しなかった。

サービスを追加するたびに、Discord Developer Portalで新しいアプリケーションを作り、専用のBotトークンを発行するのが安全だ。

サーバーやチャンネルは共用していい。競合するのはBotの「中身」の方だ。


罠②:pm2のexec_modeの設定漏れ

そもそもcluster modeとfork modeの違い

pm2には主に2つの起動モードがある
fork mode :

プログラムを1つだけ、そのまま起動する。シンプルな動作

cluster mode :

Node.jsの機能を使って、同じプログラムを複数同時に起動する。

主に、大量のアクセスを複数のCPUコアで分散処理したいWebサーバーなどで使われる

pm2でBotを常駐化する際、ecosystem.config.cjsexec_modeを明示していなかったところ、意図せずclusterモードで起動してしまっていた。

nano ecosystem.config.cjs // 編集エディタ
module.exports = {
  apps: [{
    name: "my-bot",
    script: "src/bot.js",
    exec_mode: "fork", // 明示しておく
    instances: 1,
    autorestart: true,
  }]
};

Discord Botのように「1本の接続を常に保つ」タイプのプロセスは、clusterモードには向いていない。

複数インスタンスが起動すると、同じトークンで複数のGateway接続が発生したり、定期処理が重複実行されたりするリスクがある。

exec_mode: "fork"は明示しておいた方がいい

設定を直した後は、pm2 deleteしてからpm2 startし直すと確実に反映される。

Tomoya

セーブした後に、再起動は忘れずに

pm2 listコマンドの実行結果一覧と、vps-noteプロセスがonline状態で動作している様子
プロセス管理ツールPM2の実行結果画面において、vps-noteプロセスが正常にfork modeで起動している状態を示しています。

罠③:DiscordのID種類の混同

DiscordのチャンネルURLとアプリIDの画面要素が雲型の吹き出しに描かれた、IDの選択迷いを表す図解
DiscordのチャンネルURLとアプリIDのどちらを設定すべきか混乱しやすいポイントを示したイメージです。
Tomoya

ここはホントに毎回悩みます。。。

Discordには似たような役割のIDがいくつも存在する。

ID用途取得方法
チャンネルID通知の送信先を指定チャンネルを右クリック→IDをコピー
Bot Application IDBotアプリ自体の識別子(開発者ポータル)Developer Portalのアプリ情報ページ
ユーザーID特定ユーザーへの権限制御などユーザーを右クリック→IDをコピー
サーバー(Guild)IDスラッシュコマンドの即時反映などサーバーアイコンを右クリック→IDをコピー

チャンネルIDとBot Application IDは、どちらも似たような桁数の数字なので混同しやすい。実際、自分もここで一度ハマった。

通知が届かない場合、まず疑うべきはこの取り違えだ!!

なお、これらのIDを表示するには、Discordの「ユーザー設定→詳細設定→開発者モード」を先にONにしておく必要がある。普段は一般ユーザーが使う機会がないため、初期設定では非表示になっている。


まとめ

「まとめ:一問一答表」としてBotトークンの衝突、pm2のexec_mode設定漏れ、DiscordのID種類混同の3つの罠と対策を掲載した表
pm2とDiscord Botの複数運用時に発生しやすい3つのトラブルと、その具体的な解決策をまとめた一問一答表です。

複数のBotを1台のVPSで運用する時のポイントは

「サーバー・チャンネルは共用していいが、Botアプリケーションはサービスごとに分ける」

これに尽きる。

IDの取り違えも含めて、最初の1回さえ乗り越えれば、次からは同じ手順の繰り返しになる。

Discord Botを活用した記事とそのシリーズ

①:テーマ選定

②:基盤構築(土台作り)

③:実装編(MVP)

④:VPSに反映(MVP)

⑤:VPS上である意味の為に機能追加(発展)


「pm2×Discord Bot 複数運用で実際にハマった3つの罠」の文字と重なり合うロボットアイコンのイラスト

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

始めまして。このブログを運営するTomoyaです。
未経験個人開発者。AI×個人開発(Vibe Cording)で学習して参入してくれる人が増えて広がっていくと良いなと思って始めました。

実際に作成→デプロイ(公開)→運営を行ってそれについての問題や疑問を記録していきます。
また行っていく上で内容(セキュリティ・制限など)にもこだわっていきたいなと思っています。

コメント

コメント一覧 (1件)

コメントする


目次