このガイドでは、Discord Developer Portalでアプリケーションとボットを作成し、トークンを守り、コミュニティサーバーに招待し、LinuxのVPSで24時間運用する方法(systemd、pm2、Docker)を説明します。所要時間は30〜45分で、小規模なボットなら低価格のVPSで十分です。
手順ごとのインストール
Discordアカウントで2段階認証を有効にし、現行のNode.js(またはPython)のLTS版をインストールします。
discord.com/developers/applicationsでアプリケーションを作成します(New Application)。
Botタブでトークンを生成(Reset Token)し、パスワードマネージャーか.envファイルに一度だけコピーします。
実際に使うPrivileged Gateway Intents(Presence、Server Members、Message Content)だけを有効にします。
「ボット招待リンク」ツールで招待リンク(botとapplications.commandsスコープ、最小限の権限)を生成します。
リンクを開き、サーバー(「サーバー管理」権限が必要)を選んで認証します。
最小限のボット(discord.js)を書き、.envのトークンでローカルテストします。
LinuxのVPSを準備します:非rootユーザー、ファイアウォール、Node.js(「VPSの準備」ガイド参照)。
コードをデプロイし、トークンを.env(chmod 600)に置いて、systemd、pm2、Dockerでボットを起動します。
コミュニティサーバーを設定します:ロール、チャンネル、権限、Webhook、モデレーション。
前提条件
Discordアカウント(2段階認証あり)、所有または管理するサーバー、Node.js LTS(またはPython)が必要です。インストールするdiscord.jsのバージョンが要求する最低バージョンを確認してください。ホスティングにはLinux VPS(小規模ボットなら通常1 vCPU・512 MB〜1 GBのRAMで足ります。コードに応じて調整)。ボットトークンは絶対に共有しないでください。ボットの完全な制御権を与えます。
アプリケーションとボットの作成
- discord.com/developers/applications → New Application → 名前 → Create。
- General Information:Application ID(公開のclient_id)をコピー。
- Bot → Reset Token → トークンをコピー(表示は一度だけ)。
- トークンが漏れた場合(公開Gitリポジトリ、スクリーンショットなど)は直ちにReset Tokenを実行。
トークンの保護(.env)
トークンをコードに書かないでください。Gitから除外し、自分だけが読めるように.envファイルを使います。例(ダミー値):
echo 'DISCORD_TOKEN=ChangeMe!' > .env
chmod 600 .env
echo '.env' >> .gitignorePrivileged Intents
- Server Members Intent:メンバーの参加・退出イベントと全メンバー一覧。
- Message Content Intent:メッセージ本文の読み取り(スラッシュコマンドのみなら不要)。
- Presence Intent:メンバーのプレゼンス状態。
- 一定数のサーバー(執筆時点のDiscordポリシーでは100)を超えると、これらのインテントにはボットの認証が必要です。最新のポリシーを確認してください。
ボットを招待する
招待リンクは次の形式です(ダミーのclient_id、permissions = 3072:チャンネルの閲覧と書き込み)。権限計算機で整数を求め、専用ツールでリンクを組み立てます:
https://discord.com/oauth2/authorize?client_id=123456789012345678&scope=bot%20applications.commands&permissions=3072最小限のボット(discord.js)
インストール:npm init -y && npm install discord.js dotenv。index.js(最新APIはdiscordjs.guide参照):
require('dotenv').config();
const { Client, Events, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (c) => console.log(`Logged in as ${c.user.tag}`));
client.login(process.env.DISCORD_TOKEN);systemdで運用
/etc/systemd/system/discord-bot.service(Userとパスを調整、nodeのパスは「which node」で確認)。その後:sudo systemctl daemon-reload && sudo systemctl enable --now discord-bot、ログ:journalctl -u discord-bot -f。
[Unit]
Description=Discord bot
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=botuser
WorkingDirectory=/home/botuser/bot
EnvironmentFile=/home/botuser/bot/.env
ExecStart=/usr/bin/node index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetpm2で運用
pm2はクラッシュ時にプロセスを再起動します。「pm2 startup」が表示するsudoコマンドを実行すると、起動時にpm2が立ち上がります。
sudo npm install -g pm2
pm2 start index.js --name discord-bot
pm2 save
pm2 startup
pm2 logs discord-botDockerで運用
以下のDockerfile(Nodeのバージョンはdiscord.jsの要件に合わせてください)。トークンはenvファイルで渡してビルド・実行:docker build -t discord-bot . && docker run -d --restart unless-stopped --env-file .env --name discord-bot discord-bot
FROM node:lts-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
CMD ["node", "index.js"]コミュニティサーバーの設定
- ロール:役割別(管理者、モデレーター、メンバー)に最小限の権限で作成します。ボットのロールは管理対象ロールより上に置きます。
- チャンネル:カテゴリー(ようこそ、ルール、一般、サポート、ボイス)を作り、権限はチャンネルごとでなくカテゴリー単位で設定します。
- Webhook:ゲームサーバーの状態を投稿するには「Webhook埋め込みビルダー」で埋め込みを作ります。
- モデレーション:認証レベル、AutoMod、監査ログ。サーバー設定でモデレーターに2段階認証を必須にします。
- 告知:game-rank.com/jeuxにゲームサーバーを登録して見つけてもらいましょう。
トラブルシューティング
- 「TokenInvalid」/「An invalid token was provided」:トークンの誤り、余分なスペース、またはリセット済み。Reset Tokenで再取得してください。
- 「Used disallowed intents」:Botタブで該当する特権インテントを有効にするか、コードから外します。
- 「Missing Access」/「Missing Permissions」:ボットにそのチャンネルでの権限がないか、ロールの階層が低すぎます。
- スラッシュコマンドが表示されない:招待にapplications.commandsスコープがなかったか、コマンドが未登録(デプロイ)です。正しいリンクでボットを再招待してください。
- VPS上でボットが切断される:ログ(journalctl -u discord-bot -f)、空きメモリ、Restart=on-failureの設定を確認します。
よくある質問
- Discordボットは無料ですか?
- 開発者ポータルでのボット作成は無料です。VPSや常時稼働のPCなどのホスティングだけが月数ユーロかかる場合があります。
- トークンが漏れたらどうすればよいですか?
- BotタブですぐにReset Tokenを押し、.envを更新してボットを再起動し、サーバーの監査ログを確認します。
- systemd、pm2、Dockerのどれ?
- systemdは最も軽量でLinuxに統合済み、pm2は複数のNode.jsプロセスを扱うときに便利、Dockerは環境を分離して再現性のあるデプロイを実現します。いずれもクラッシュ後にボットを再起動します。
- ボットのホスティングに開放ポートは必要ですか?
- 不要です。ボット自身がDiscordへの外向き接続を開きます。管理用にSSHポートだけ到達可能であればよく、Webサーバーを公開する場合は別です。
