Skip to content
VDS · アプリとボット

Discordボット:起動と監視

VPS上でsystemdを使ってDiscordボットを実行し、メモリを制限し、ログを読み、レート制限に対処し、ダウンタイムなしで更新する方法を説明します。

更新日 2026年8月23日

DiscordボットはDiscordゲートウェイへの永続的なWebSocket接続を維持するため、常時稼働するマシンが必要です。必要なリソースは控えめですが、Telegramボットとは異なり再起動への耐性が低く、再起動のたびにゲートウェイへの接続をやり直す必要があります。

インストール

useradd -r -m -d /srv/dbot -s /usr/sbin/nologin dbot
cd /srv/dbot && sudo -u dbot git clone https://github.com/you/bot.git .
sudo -u dbot npm ci --omit=dev
install -o dbot -g dbot -m 600 /dev/null /srv/dbot/.env

トークンとIDは.envに記述します。Discord Developer Portalで発行したトークンはボットへの完全なアクセス権を持つため、パスワードと同様に扱ってください。

Pythonライブラリの場合も手順は同じで、仮想環境を使用します。詳しくはPythonアプリをご覧ください。

サービス

/etc/systemd/system/dbot.service:

[Unit]
Description=Discord bot
After=network-online.target
Wants=network-online.target

[Service]
User=dbot
WorkingDirectory=/srv/dbot
EnvironmentFile=/srv/dbot/.env
ExecStart=/usr/bin/node index.js
Restart=always
RestartSec=15
MemoryMax=512M
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now dbot

RestartSec=15は標準の5秒ではなく15秒に設定しています。ゲートウェイへの接続が切断された際、頻繁な再起動はDiscord側からの接続の一時的なブロックを招くためです。

MemoryMaxは、メモリリークを抱えたボットがマシン全体を巻き込んでダウンさせるのを防ぎます。特に2 GBのVDS-1では重要です。

監視

systemctl status dbot
journalctl -u dbot -f
journalctl -u dbot --since today -p err
systemctl show dbot -p NRestarts

NRestartsが最も有用な指標です。このカウンターが毎時間増加している場合、ボットはクラッシュしており、Restart=alwaysがそれを隠蔽しています。

特定のサービスのメモリ使用量:

systemctl status dbot | grep Memory

マシン全体の状況については、/hosting/vds/m/<id>のパネルの「概要」にあるCPU、メモリ、トラフィックのグラフをご確認ください。

レート制限

DiscordはAPI呼び出しにレート制限をかけています。兆候はログ内の429エラーと、「固まる」コマンドです。有効な対策:

  • 間隔を空けずにループでメッセージを送信しない;
  • 新しいメッセージを送信するのではなく、1つのメッセージを編集する;
  • 毎回のイベントで要求するのではなく、参照データをキャッシュする;
  • 一括配信にはRedisのキューを使用する。

更新

cd /srv/dbot
sudo -u dbot git pull
sudo -u dbot npm ci --omit=dev
systemctl restart dbot
journalctl -u dbot -n 50

最後の行は必須です。ボットが新しい依存関係でクラッシュせず、ゲートウェイに接続したことを確認してください。

よくあるエラー

症状原因
ボットはオンラインだがコマンドに応答しないDeveloper Portalで必要なインテントが有効になっていない
絶え間ない再接続RestartSecが短すぎる、またはイベントハンドラーでのクラッシュ
Invalid tokenトークンが再生成され、.envが更新されていない
コマンドが重複するボットが2つ実行されている — ps aux | grep nodeで確認
マシンがスワップを開始するMemoryMaxがない、コードにリークがある

ボットをscreenやtmuxで実行しないでください。セッションはSSHの切断には耐えられますが、マシンの再起動には耐えられません。そして1か月後には、どこで実行されているのかさえ忘れてしまうでしょう。