この記事のポイント
- 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プランを検討してください。

個人的にはVultrかConoHa VPSをおすすめします。Vultrは月額$5で東京リージョンがあり、コスパが優秀。ConoHaは日本語サポートがあるので、英語のダッシュボードが不安な場合に選びやすいです。
②SSH鍵を作成してVPSに接続する
VPSを契約したら、まずSSH鍵でセキュアに接続できるようにします。パスワード認証は後で無効化します。

Ubuntu 24.04のOpenSSH 9.6p1で実際にEd25519鍵を生成しました(フィンガープリント: SHA256:ieMSnzLs5XueUI9GsClIL4BVzgXXYtzV5lusu9SkzXw)。ローカルPCで以下を実行してください。
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接続できたら、まず基本的なセキュリティ設定とパッケージの更新を行います。
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)を確実に入れられます。

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 --version で v20.20.2、npm --version で 10.8.2 が表示されれば成功です(実測値)。
古いNode.jsが入っている場合
node --version を打って v18 以前が出る場合は、古いNodeがシステムに入っています。sudo apt remove nodejs nodejs-doc で削除してからNodeSourceのスクリプトを再実行してください。
discord.js v14でBotコードを作成する
手順1:Bot用ディレクトリを作成してdiscord.jsをインストールする
$ 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が15パッケージの依存関係とともにインストールされました。脆弱性ゼロ(0 vulnerabilities)も確認済みです。
手順2:Bot Tokenを環境変数で管理する
Bot TokenをコードにハードコードするのはNG。.envファイルで管理して、Gitに上げないようにします。
added 1 package in 0.5s
$ nano .env
# .env(このファイルは絶対にGitにコミットしない)
DISCORD_TOKEN=ここにBot_Tokenを貼り付ける
$ echo “.env” >> .gitignore
手順3:bot.jsを作成する
以下は「pingと打つとpongと返す」シンプルなBotのコードです。
// 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がクラッシュしても自動で再起動してくれます。

added 90 packages in 12s
$ pm2 –version
7.0.1
実測:npm install -g pm2 は90パッケージを約12秒でインストールします。バージョンは7.0.1でした。
BotをPM2で起動する

[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
status が online になり、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'
}
}]
};
[PM2] Applying action restartProcessId on app [discord-bot](ids: [ 0 ])
[PM2] Done.
PM2 startupで自動再起動を設定する
このステップが最も重要です。pm2 startupを設定しないとVPSを再起動したときにBotが落ちたままになります。
[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のインストール漏れです。
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プランへのアップグレードを検討してください。
┌─ 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 logs・pm2 monitでBotの状態をいつでも確認できる
正直、最初のpm2 startupの設定を忘れていて「なんかBotが落ちてる」となるケースが多いです。VPSを再起動してからもpm2 listがonlineになることを必ず確認してください。
VPS自体の選び方・初期設定をもっと詳しく知りたい方は、こちらの記事も参考にどうぞ。


コメント