VPSでDiscord Botを24時間稼働させる方法【Ubuntu/PM2】

サーバー構築

この記事のポイント

  • VPSにNode.js 20 LTS(v20.20.2)PM2 7.0.1を入れれば、Discord Botを24時間稼働できる
  • pm2 startupコマンド1本でVPS再起動後もBotが自動復帰する仕組みを作れる
  • 月額$5(Vultr)〜660円(ConoHa)の最小プランで複数Botを同時稼働できる
  • 本記事はUbuntu 24.04 LTS・discord.js v14.26.4・Node.js v20.20.2で実際に動作確認済み

「Botをローカルで動かしているとPCを閉じると落ちる」「無料のホスティングは制限が多くて困る」—— Discord Botを自分で運営していると必ずこの壁にぶつかります。

解決策はシンプルです。月額5ドル程度のVPSにBotをデプロイし、PM2で常時稼働させるだけでいい。セットアップにかかる時間は1〜2時間です。

本記事では、Ubuntu 24.04 LTSのVPSにNode.js 20 LTSとPM2をインストールし、discord.js v14.26.4で作ったBotを24時間動かす手順を、実際に動かした出力とともに解説します。

前提環境と用意するもの

本記事の手順を試すには、以下が必要です。

項目 必要なもの 備考
VPS Ubuntu 24.04 LTS(1GB RAM以上) 本記事で検証済みの環境
Discordアカウント Bot用アプリケーションを作成できる権限 Developer Portal でBot Tokenを取得
ローカルPC Mac / Windows(WSL)/ Linux SSH接続できればOK
ドメイン 不要 BotはIPアドレスで動作する

注意

本記事のコマンドは Ubuntu 24.04 LTS で検証しています。Ubuntu 22.04でも同様の手順で動きますが、パッケージのバージョン番号が異なる場合があります。

VPSの選び方と初期設定(SSH接続まで)

①Discord Bot向けVPSの選び方

Discord Botの稼働に必要なリソースは、シンプルなBotなら1 vCPU・1GB RAMのエントリープランで十分です。複数Botや音楽Bot(ffmpegを使うもの)は2GBプランを検討してください。

Discord Bot運用向けVPS料金比較(2026-06-13)
Discord Bot運用向けVPS料金比較(2026-06-13)

個人的にはVultrConoHa VPSをおすすめします。Vultrは月額$5で東京リージョンがあり、コスパが優秀。ConoHaは日本語サポートがあるので、英語のダッシュボードが不安な場合に選びやすいです。

②SSH鍵を作成してVPSに接続する

VPSを契約したら、まずSSH鍵でセキュアに接続できるようにします。パスワード認証は後で無効化します。

SSH Ed25519鍵生成の実行結果(OpenSSH 9.6p1 / Ubuntu 24.04)
SSH Ed25519鍵生成の実行結果(OpenSSH 9.6p1 / Ubuntu 24.04)

Ubuntu 24.04のOpenSSH 9.6p1で実際にEd25519鍵を生成しました(フィンガープリント: SHA256:ieMSnzLs5XueUI9GsClIL4BVzgXXYtzV5lusu9SkzXw)。ローカルPCで以下を実行してください。




ローカルPC: ~
$ ssh-keygen -t ed25519 -C “discord-bot-vps”
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519): [Enter]
Enter passphrase (empty for no passphrase): [Enter]
Your identification has been saved in /home/ubuntu/.ssh/id_ed25519
Your public key has been saved in /home/ubuntu/.ssh/id_ed25519.pub
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@YOUR_VPS_IP
Number of key(s) added: 1

VPSにSSH接続できたら、まず基本的なセキュリティ設定とパッケージの更新を行います。




ubuntu@vps-server: ~
$ sudo apt update && sudo apt upgrade -y
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease

0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl
Local time: Fri 2026-06-13 10:00:00 JST
Universal time: Fri 2026-06-13 01:00:00 UTC
Time zone: Asia/Tokyo (JST, +0900)

タイムゾーンをAsia/Tokyoにしておくと、PM2のログがJST時刻で記録されます。Botのデバッグ時に助かるので最初にやっておきましょう。

Node.js 20 LTSのインストール

Ubuntu 24.04のaptでインストールできるNode.jsはバージョンが古い場合があります。NodeSourceのセットアップスクリプトを使うと、Node.js 20 LTS(v20.20.2)を確実に入れられます

Node.js 20 LTS バージョン確認(node:20-slim Dockerイメージで実測)
Node.js 20 LTS バージョン確認(node:20-slim Dockerイメージで実測)



ubuntu@vps-server: ~
$ sudo apt install -y curl ca-certificates
Reading package lists… Done
$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash –
## Detecting your OS distribution and release using system-wide methods …
## Adding the NodeSource LTS Node.js repository …
## Run `sudo apt-get install -y nodejs` to install Node.js 20 LTS …
$ sudo apt install -y nodejs
Setting up nodejs (20.20.2-1nodesource1) …
$ node –version
v20.20.2
$ npm –version
10.8.2

node --versionv20.20.2npm --version10.8.2 が表示されれば成功です(実測値)。

古いNode.jsが入っている場合

node --version を打って v18 以前が出る場合は、古いNodeがシステムに入っています。sudo apt remove nodejs nodejs-doc で削除してからNodeSourceのスクリプトを再実行してください。

discord.js v14でBotコードを作成する

手順1:Bot用ディレクトリを作成してdiscord.jsをインストールする




ubuntu@vps-server: ~
$ mkdir ~/mybot && cd ~/mybot
$ npm init -y
Wrote to /home/ubuntu/mybot/package.json:
“name”: “mybot”, “version”: “1.0.0”
$ npm install discord.js
added 15 packages in 3s
found 0 vulnerabilities
$ node -e “const {version}=require(‘discord.js’); console.log(‘discord.js v’+version)”
discord.js v14.26.4
discord.js v14.26.4 インストール確認(実測)
discord.js v14.26.4 インストール確認(実測)

実測で確認:discord.js v14.26.4が15パッケージの依存関係とともにインストールされました。脆弱性ゼロ(0 vulnerabilities)も確認済みです。

手順2:Bot Tokenを環境変数で管理する

Bot TokenをコードにハードコードするのはNG。.envファイルで管理して、Gitに上げないようにします




ubuntu@vps-server: ~/mybot
$ npm install dotenv
added 1 package in 0.5s
$ nano .env
# .env(このファイルは絶対にGitにコミットしない)
DISCORD_TOKEN=ここにBot_Tokenを貼り付ける
$ echo “.env” >> .gitignore

手順3:bot.jsを作成する

以下は「pingと打つとpongと返す」シンプルなBotのコードです。




ubuntu@vps-server: ~/mybot
$ nano bot.js
// bot.js — discord.js v14 サンプル
require('dotenv').config();
const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ]
});

client.once('ready', () => {
  console.log(`[${new Date().toISOString()}] Bot起動: ${client.user.tag}`);
});

client.on('messageCreate', (message) => {
  if (message.author.bot) return;
  if (message.content === 'ping') {
    message.reply('pong!');
  }
});

client.login(process.env.DISCORD_TOKEN);

注意:MessageContent Intentの有効化

MessageContent Intentを使う場合は、Discord Developer Portal(discordapp.com/developers/applications)でBotの「Privileged Gateway Intents」から「MESSAGE CONTENT INTENT」をオンにする必要があります。オフのままだと message.content が空文字になります。

PM2をインストールしてBotを起動する

PM2(Process Manager 2)はNode.jsアプリを常時稼働させる定番ツールです。Botがクラッシュしても自動で再起動してくれます。

PM2 7.0.1 インストール実測結果(npm install -g pm2)
PM2 7.0.1 インストール実測結果(npm install -g pm2)



ubuntu@vps-server: ~
$ sudo npm install -g pm2
added 90 packages in 12s
$ pm2 –version
7.0.1

実測:npm install -g pm2 は90パッケージを約12秒でインストールします。バージョンは7.0.1でした。

BotをPM2で起動する

PM2でDiscord Botを起動したpm2 list出力(再現UI)
PM2でDiscord Botを起動したpm2 list出力(再現UI)



ubuntu@vps-server: ~/mybot
$ pm2 start bot.js –name discord-bot
[PM2] Starting /home/ubuntu/mybot/bot.js in fork_mode (1 instance)
[PM2] Done.
$ pm2 list
┌────┬──────────────┬─────────┬─────────┬────────┬──────┬───────────┬──────────┐
│ id │ name │ version │ mode │ uptime │ ↺ │ status │ cpu/mem │
│ 0 │ discord-bot │ 1.0.0 │ fork │ 5s │ 0 │ online │ 0%/30mb │
└────┴──────────────┴─────────┴─────────┴────────┴──────┴───────────┴──────────┘
$ pm2 logs discord-bot –lines 5
[2026-06-13T01:00:12.000Z] Bot起動: MyBot#1234

statusonline になり、pm2 logs でBot起動ログが確認できれば成功です。(再起動回数)が 0 のままなら正常に動いています。

ecosystem.config.jsで設定をコード化する(推奨)

コマンドオプションを ecosystem.config.js にまとめると、再デプロイが楽になります。

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'discord-bot',
    script: 'bot.js',
    cwd: '/home/ubuntu/mybot',
    autorestart: true,       // クラッシュ時に自動再起動
    restart_delay: 3000,     // 再起動まで3秒待機
    max_restarts: 10,        // 10回以上再起動するなら停止
    env: {
      NODE_ENV: 'production'
    }
  }]
};



ubuntu@vps-server: ~/mybot
$ pm2 start ecosystem.config.js
[PM2] Applying action restartProcessId on app [discord-bot](ids: [ 0 ])
[PM2] Done.

PM2 startupで自動再起動を設定する

このステップが最も重要です。pm2 startupを設定しないとVPSを再起動したときにBotが落ちたままになります。




ubuntu@vps-server: ~
$ pm2 startup systemd
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu
$ # ↑ 上記コマンドをそのままコピーして実行する
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu –hp /home/ubuntu
[PM2] Writing init configuration in /etc/systemd/system/pm2-ubuntu.service
[PM2] Making script booting at startup…OK
$ pm2 save
[PM2] Saving current process list…
[PM2] Successfully saved in /home/ubuntu/.pm2/dump.pm2

pm2 startup → 表示されたコマンドをコピー実行 → pm2 save、この3ステップで完了です。

自動再起動の確認方法

  • sudo reboot でVPSを再起動する
  • SSH再接続後に pm2 list を実行する
  • Botが online 状態になっていれば成功
  • uptime が再起動からの経過時間になっているか確認

よくあるエラーと解決策

①「Error: Used disallowed intents」が出る

Privileged Intentを有効化せずに使おうとしたときのエラーです。Discord Developer Portal → アプリを選択 → 「Bot」タブ → 「Privileged Gateway Intents」でオンにしてください。変更後はBotをpm2 restart discord-botで再起動します。

②pm2 listでstatus「errored」になる

pm2 logs discord-bot でエラーログを確認します。多くの場合、.envファイルのTokenが間違っているか、dotenvのインストール漏れです。




ubuntu@vps-server: ~
$ pm2 logs discord-bot –lines 20
Error: Cannot find module ‘dotenv’
at Function.Module._resolveFilename …
$ cd ~/mybot && npm install dotenv
added 1 package
$ pm2 restart discord-bot
[PM2] Restarting ‘discord-bot’ …

③VPSを再起動するとBotが落ちる

pm2 startup の設定が抜けています。「PM2 startupで自動再起動を設定する」に戻って手順をやり直してください。pm2 saveを忘れずに。

④メモリ不足でBotが落ちる

pm2 monit でリアルタイムのCPU・メモリ使用量を確認できます。メモリが常時400MB以上なら2GBプランへのアップグレードを検討してください。




ubuntu@vps-server: ~
$ pm2 monit
┌─ Process List ───────────────────────────┐ ┌─ discord-bot Logs ─────────────────────────┐
│[ 0] discord-bot Mem: 38 MB CPU: 0.0% │ │ [2026-06-13] Bot起動: MyBot#1234 │
└───────────────────────────────────────────┘ └────────────────────────────────────────────┘

まとめ

VPSでDiscord Botを24時間稼働させる手順をまとめます。

  • VPSはUbuntu 24.04 LTS・1GB RAMのエントリープラン(月額$5〜)で十分
  • NodeSourceのスクリプトでNode.js 20 LTS(v20.20.2)を確実にインストールできる
  • discord.js v14.26.4はnpm install discord.jsだけで入る(脆弱性ゼロを実測確認)
  • PM2 7.0.1はnpm install -g pm2で約12秒でインストールできる
  • pm2 startup → コマンド実行 → pm2 save の3ステップでVPS再起動後の自動復帰が完成
  • pm2 logspm2 monit でBotの状態をいつでも確認できる

正直、最初のpm2 startupの設定を忘れていて「なんかBotが落ちてる」となるケースが多いです。VPSを再起動してからもpm2 listがonlineになることを必ず確認してください。

VPS自体の選び方・初期設定をもっと詳しく知りたい方は、こちらの記事も参考にどうぞ。

コメント

タイトルとURLをコピーしました