以前にGlitchで環境を作った話はしたと思います。しかし、最近GlitchからDiscordのボットが使えなくなったので、その代替というかいい加減乗り換えるかということでVPSでDiscordボットを作った話になります。
とはいえ、そこまで凝ったことしなくても大丈夫なので超低スぺVPSでも問題はでないでしょう。実は一からjsのファイルをどうこうするのが初めてなので、ひとまず自分への備忘録として残しておこうと思います。
ちなみに私が使っているVPSは色々なところで書いていますが、WebARENA Indigoです。NTT系のサービスかつ国内サーバで最安のプランがあるのがここだからです。簡単なDiscordのbotに限った話なら一番下のメモリ768MBのIPv6限定プランでもいいと思いますし、1GBのIPv4/IPv6のプランですら450円以下です。ちなみに、このサイト自体もWebARENAIndigoを使っているので、割と下のプランでもいろんなことができます。

必要なパッケージ
コマンドラインで操作するにあたって必要なのは以下の二つ。
nodejs
npm
これらをインストールします。OSによっては標準のnodejsが古いことが多いので、ひとまずLTSの最新版を入れておくと長く使えそうです。
Ubuntuの場合、12系が標準で最新が20系だったりと非常に差があったりするので、以下のような形で最新のをaptでインストールしました。
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs
npmはinitに使ったりとそこまで最新機能を必要としないのもあって私は更新しないでプロジェクトを作成しました。
プロジェクトファイルの作成とセットアップ
プロジェクト用のフォルダを作成します。
mkdir project && cd project
npm init -y
ディスコードのbotを作るので、discord.jsをプロジェクトに追加します。
npm add discord.js
あとは、以前に書いた記事とほぼ同じコードを書けばいいですが、最初の起動時の処理だけ変更すればOKです。以前と使う関数の定義方法が変更になっています。
const { Client, GatewayIntentBits, Partials, ApplicationCommandType, ApplicationCommandOptionType } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.MessageContent,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildVoiceStates,
],
partials: [Partials.Channel]
})
これが新しいもので、以前の(V13系)は以下のような感じ。
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.GUILD_VOICE_STATES] });
インデントのつけ方がひどいので見にくいですが、使いたい情報の取り方が変わっているので、移行する際には逐一調べておく必要があります。
以前の私のコードだと.envいかに環境変数を定義していましたが、パッケージを追加すれば同じことができますし、少ないコードなら適当に先頭部分でconstで変数を定義して対応箇所を書き換えてしまってもいいでしょう。今回はパッケージを追加したくなかったので直接コードを触って対応しました。
packeage.jsonは好きなように編集しておきます。私の場合はこんな感じです。とてもシンプル。
{
"name": "discordbot",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"discord.js": "^14.18.0"
}
}
コードが書けて設定もできたら試しに動かしてみます。
node main.js
これで正しい動作をしてくれればOKです。
起動時に立ち上がるようにサービスに登録する
Botとして運用するので常時起動しておいてほしいですね。jsの場合は簡単に登録できるpm2があるのでそれに登録します。
まずはインストールです。
sudo npm install -g pm2
pm2の起動にも設定ファイルが必要なので、プロジェクトファイル内のecosystem.config.jsを編集します。
module.exports = {
apps: [
{
name: 'Discord Bot',
exec_mode: 'cluster',
instances: '1', // Or a number of instances
script: './main.js',
args: 'start'
}
]
こんな感じにしておきました。あとはpm2を操作して自動で起動できるように調整していきます。
pm2 start
pm2 save
pm2 startup
pm2 start upするとこのコマンドを実行しろというのがでるので、それを実行しましょう。
ここまで行って起動時に立ち上がるような設定ができました。
起動しているかは
pm2 status
で確認できます。起動できていればonlineになっているはずで、エラーがあるとerrorかstoppedの表示なるはずです。
意図的にサービスを一時的に止めたい場合は
pm2 stop モジュール名
とすれば止めることができるので、検証をやり直せます。
これで簡単なBotを作ることができたので、念のためシステムを再起動してみて正しく動くか確認してみましょう。
これで問題なく動けば簡単なボットの完成です。
WebARENA Indigoの一番安いプランでも余裕で動くようなレベルですし、月額500円以下で自由なbotが作れるので、不便を背負ってGlitchとかを使うよりも快適性が高いので結構おすすめです。

以上です。お読みいただきありがとうございました。