【2026年版】ゲーマー向けDiscordボット(BGM再生・戦績通知)をVPSで24時間稼働
筆者の結論(読む前に確認してほしい)
やりたいと思ったなら、やってみればいい。これが最終回答じゃないから。
ただ、先に一つだけ言わせてほしい。「自宅PCで動かせばタダじゃん」という考えは今すぐ捨てたほうがいい。
PCを立ち上げっぱなしにするのは精神的に気になる。何かあったらリモートデスクトップで入らなきゃいけないから、全然手放しにならない。「月1,000円くらいなら払うよ」という人は、迷わずVPSに投げていい。1日あたり33円で「ボットのことを気にしなくていい」が買える。安い買い物だと思う。
GPUが必要かどうかについても最初に言っておく。DiscordボットにGPUは不要。BGM再生も戦績通知もAPI経由でやるだけなので、CPUとメモリで十分。GPUプランを推してくる記事はアフィリエイト報酬が高いプランに誘導したいだけのことが多いので、そのまま信じなくていい。
サービス選びは記事末尾の判断テーブルで確認してほしい。
なぜDiscordボットにVPSが必要なのか
正直に言うと、「自宅PCで動かす」と「VPSで動かす」の差は思っている以上に大きい。
| 運用場所 | 稼働時間 | 通信速度 | 月額費用目安 |
|---|---|---|---|
| 自宅PC | PC起動中のみ | 家庭回線依存 | 電気代のみ |
| Heroku(無料) | 30分無操作でスリープ | 安定しない | 無料枠廃止済み |
| VPS | 24時間365日 | データセンター回線 | 500〜2,000円/月 |
Herokuの無料枠はもうない。自宅PCは電気代だけで動くが「PCを落とせない」という精神的コストが地味にきつい。これを「タダ」とは呼べない。
月1,000円のVPSなら1日あたり約33円。この33円で「ボットのことを気にしなくていい」が買えると思えば、高くもなんともない。自分はこれに気づいてからVPSを迷わず選ぶようになった。
必要スペックの目安
はっきり書いておく。DiscordボットにGPUは不要。
BGM再生も戦績通知も、YouTubeのストリームURLを取得してFFmpegで流すだけ。GPUが活躍する場面が一切ない。CPUとメモリで十分動く。
GPUプランを推してくる記事を見かけたら「なんでGPUが必要なんだろう?」と一回立ち止まってほしい。大抵の場合、アフィリエイト報酬が高い上位プランに誘導したい理由がある。
| ボット用途 | 推奨メモリ | 推奨CPU | 月額目安 |
|---|---|---|---|
| テキスト通知のみ | 512MB〜1GB | 1コア | 500円〜 |
| BGM再生(〜3サーバー) | 2GB | 2コア | 1,000円〜 |
| BGM+戦績+複数サーバー | 4GB | 4コア | 2,000円〜 |
自分の場合、友人3〜4人のDiscordサーバーでBGM+戦績通知を動かすなら2GB/2コアで余裕だった。最小構成から始めて、重くなったらプランを上げればいい。最初から大きいプランを取る必要はない。
discord.py 音楽ボットの基本構成
インストール
# Python 3.11 以上を確認
python3 --version
# discord.py と音声依存ライブラリをインストール
pip install "discord.py[voice]" yt-dlp
# FFmpeg(音声変換に必須)
sudo apt install ffmpeg -y
yt-dlpとFFmpegの組み合わせが現状一番安定している。以前はyoutube-dlが主流だったが、更新頻度の関係でyt-dlpに移行したほうが無難。これは今から始めるなら最初からyt-dlpで迷わなくていい。
BGM再生ボットのコアコード
import discord
from discord.ext import commands
import yt_dlp
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
YTDL_OPTIONS = {
"format": "bestaudio/best",
"noplaylist": True,
"quiet": True,
}
FFMPEG_OPTIONS = {
"before_options": "-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5",
"options": "-vn",
}
@bot.command()
async def play(ctx, *, query: str):
if not ctx.author.voice:
return await ctx.send("ボイスチャンネルに参加してください。")
vc = ctx.voice_client or await ctx.author.voice.channel.connect()
with yt_dlp.YoutubeDL(YTDL_OPTIONS) as ydl:
info = ydl.extract_info(f"ytsearch:{query}", download=False)["entries"][0]
source = discord.FFmpegPCMAudio(info["url"], **FFMPEG_OPTIONS)
vc.play(source)
await ctx.send(f"再生中: **{info['title']}**")
@bot.command()
async def stop(ctx):
if ctx.voice_client:
await ctx.voice_client.disconnect()
await ctx.send("停止しました。")
bot.run("YOUR_BOT_TOKEN")
-reconnect 1 のFFMPEGオプションはほぼ必須。これがないとストリームが途切れたとき無音のまま止まる。最初にここでハマる人が多い。先に入れておくと後で余計な時間を使わなくて済む。
戦績通知の実装(Valorant APIの例)
import aiohttp
@bot.command()
async def stats(ctx, username: str, tag: str):
url = f"https://api.henrikdev.xyz/valorant/v1/account/{username}/{tag}"
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
data = await resp.json()
rank = data["data"].get("currenttierpatched", "不明")
await ctx.send(f"**{username}#{tag}** 現在のランク: `{rank}`")
HenrikDev APIは非公式だが、Valorantの戦績取得では事実上これ一択になっている。無料枠でも個人利用なら十分。レート制限に引っかかったときのエラーハンドリングは後から足せばいい。まず動くものを作るのが先。完璧に作ってから動かそうとすると永遠に動かない。
systemd で24時間稼働させる
ここが本題と言っても過言ではない。VPSに乗せる意味の大半はここにある。systemdで管理するかどうかで「VPSに入れた甲斐があったかどうか」がほぼ決まる。
サービスファイルの作成
sudo nano /etc/systemd/system/discord-bot.service
[Unit]
Description=Discord Game Bot
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/discord-bot
ExecStart=/usr/bin/python3 /home/ubuntu/discord-bot/bot.py
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
# 有効化して起動
sudo systemctl daemon-reload
sudo systemctl enable discord-bot
sudo systemctl start discord-bot
# 状態確認
sudo systemctl status discord-bot
Restart=always と RestartSec=10 の組み合わせが重要。クラッシュしても10秒後に自動で復活するので、夜中に落ちても朝起きたら動いてる状態になる。自宅PCでは絶対に実現できない安心感がある。これを設定してから「ボットが落ちてた」という報告をサーバーで受けることがなくなった。
ログの確認
# リアルタイムログ
journalctl -u discord-bot -f
# 直近50行
journalctl -u discord-bot -n 50 --no-pager
最初のうちはリアルタイムログを流しながら動作確認するのがいちばん早い。エラーメッセージをそのままコピーして調べれば大抵解決する。「なんか動かない」で止まる人の多くは、ここのログを見ていないだけだったりする。
VPS選びのポイント(ゲーム用途)
使ってみた感想としては、Discordボット単体ならどのVPSでも動く。差が出るのはゲームサーバーと同居させるときだけ。
自分の判断をここは断言する。
- ボット単体: 正直どこでもいい。一番安いプランで始めればOK
- ゲームサーバーと同居: ゲーム特化プランのあるサービスを選ぶ。帯域とレイテンシで差が出る
| サービス | 最小プラン | ゲーム特化 | 特徴 |
|---|---|---|---|
| XServer VPS for Game | 2GB/月1,000円〜 | ○ | ゲームテンプレート多数 |
| ConoHa for GAME | 2GB/月1,000円〜 | ○ | 時間課金・即時停止可 |
両方とも月1,000円前後のスタートラインは同じ。ここは用途と性格で分けていい。
ConoHaは時間課金なので「週末だけ使う」「試しに動かしてみたい」人向け。使った時間だけ払えばいい。XServerは固定料金なので「毎月いくらか計算したくない、とにかく決めたい」人向け。毎月同じ金額が引き落とされる安心感は、地味にストレスを減らしてくれる。
どちらが正解かではなく、「計算するのが面倒な人はXServer、まず試してみたい人はConoHa」と考えると選びやすい。
まとめ:あなたの使い方で選ぶ
| 使い方 | 判断 | 選ぶプラン |
|---|---|---|
| 友人4〜5人のサーバーでBGMだけ流したい | まず最小構成で試す | 1GB〜2GB、月500〜1,000円 |
| 戦績通知も入れて複数サーバーで使いたい | 2GBあれば余裕 | 2GB/2コア、月1,000円前後 |
| ゲームサーバーと同居させたい | ゲーム特化VPS一択 | XServer/ConoHa for GAME |
| とにかく固定料金で管理したい | XServer VPS for Game | 月額固定プラン |
| 試用期間中に動作確認したい | ConoHaの時間課金が柔軟 | 使った分だけ課金 |
| 自宅PCで動かそうとしてる | やめとけ | VPSに移行を |
技術的にまとめると:
- discord.py + yt-dlp + FFmpeg でBGM再生ボットは動く
- 戦績APIを組み合わせればゲームチームの実用ツールになる
- systemd の
Restart=alwaysで夜中に落ちても自動復旧する - GPUは不要。推してくる記事は疑っていい
- ゲームサーバーと同居させるなら2GB以上を確保する
やってみたいと思ったなら一度やってみればいい。最初からうまくいかなくても、プランを変えることも、サービスを乗り換えることも、全部後からできる。今の選択が一生続くわけじゃない。悩んでいる暇があったら、手を動かしたほうが早い。
