パソコンで動かすと、なぜ止まるのか
Discord Bot は、書き終えたら終わりではありません。誰かがコマンドを打つ瞬間に、プログラムが動いている必要があります。つまり、24時間ずっと起動したままでなければいけません。
手元のパソコンで動かしていると、次のようなことで止まります。
- パソコンを閉じた、スリープに入った、シャットダウンした
- Windows の更新で、夜のあいだに勝手に再起動した
- 回線が切れた、ルーターが再起動した
- エラーで落ちたが、寝ていて気づかなかった
どれも「気をつければ防げる」ものではありません。パソコンは人が使うための機械で、動かし続けるための機械ではないからです。電気代も無視できません。ノートパソコンを1台つけっぱなしにすると、月に数百円から千円ほどかかります。月30円のサーバーのほうが安く済む、という逆転が起きます。
「無料のクラウドで動かせないか」と考える方も多いと思います。無料の枠は、一定時間アクセスが無いと停止する、毎月の稼働時間に上限がある、といった制限が付いているのが普通です。常駐が前提の Discord Bot とは相性がよくありません。
Bot に必要なスペックの目安
Discord Bot は、思っているより軽いプログラムです。判断の基準になるのはメモリで、CPU はよほど重い処理をしなければ問題になりません。
| Botの規模 | メモリの目安 | 向いている構成 |
|---|---|---|
| コマンドに応答するだけ | 〜128MB | ミニ(256MB) |
| 数サーバーで常用・簡単なDBあり | 128〜300MB | ベーシック(512MB) |
| 数十サーバー・音楽再生・画像生成 | 300MB〜1GB | プラス(1GB)以上 |
| 大量のデータを抱えたまま処理する | 1GB〜 | 大容量メモリプラン |
迷ったら、まず小さい構成で始めてください。足りなくなってから上げれば済みます。最初から大きい構成を借りても、使い切れなければ無駄になるだけです。
音楽Botだけは少し注意
音声を流すBotは、ほかの用途よりCPUとメモリを使います。音声の変換(エンコード)が常に走るためです。1〜2サーバーで使うならプラス、人数が増えるならプロ以上を見ておくと安心です。
料金の目安
ASHIKA Network の料金は定額です。使った分だけの後払いはないので、チャージした残高を超える請求は起きません。
| プラン | メモリ | CPU | 容量 | 月額 |
|---|---|---|---|---|
| ミニ | 256MB | 20% | 512MB | 30円 |
| ベーシック | 512MB | 50% | 2048MB | 50円 |
| プラス | 1024MB | 100% | 5120MB | 110円 |
| プロ | 2048MB | 150% | 10240MB | 230円 |
3ヶ月分をまとめて払うと、1ヶ月あたりはもう少し安くなります。すべての構成は料金のページで見比べられます。
置き場所を用意して、動かすまで
難しい設定は挟みません。順番はこうです。
- 残高を入れる。クレジットカード・PayPay・銀行振込・Apple Pay・Google Pay が使えます。100円から入れられます。
- 構成と期間を選んで購入する。買った時点で接続先が出るので、待ち時間はありません。
- ファイルを置く。ブラウザからアップロードするか、その場で編集できます。SSH を繋ぐ必要はありません。
- 起動する。ログはブラウザの画面にそのまま流れます。
ここまでで、早ければ数分です。用意するのは Bot のトークンとソースコードだけで、手元の端末に何かを入れる必要はありません。
discord.py(Python)の場合
Python で書いた Bot は、そのまま置けます。requirements.txt を一緒に置いておくと、必要なライブラリがまとめて入ります。
discord.py
python-dotenv
トークンはコードに直接書かず、環境変数から読んでください。ソースを誰かに見せたときに、うっかり漏らさずに済みます。
import os
import discord
client = discord.Client(intents=discord.Intents.default())
@client.event
async def on_ready():
print(f"{client.user} で接続しました")
client.run(os.environ["DISCORD_TOKEN"])
Intents について。メッセージの本文を読む Bot や、参加・退出を知りたい Bot は、Discord の開発者ページで「特権インテント」を有効にしないと動きません。手元では動いていたのにサーバーに置いたら動かない、という場合、ここが原因のことがあります。
discord.js(Node.js)の場合
Node.js も同じです。package.json を置いておけば、必要なパッケージが入ります。
const { Client, GatewayIntentBits } = require("discord.js");
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once("ready", () => {
console.log(`${client.user.tag} で接続しました`);
});
client.login(process.env.DISCORD_TOKEN);
起動するコマンドは、パネルから指定できます。node index.js のように、いつも手元で打っているものをそのまま入れてください。
落ちても、勝手に立ち上がります
どれだけ気をつけて書いても、プログラムは落ちるときがあります。Discord 側の一時的な不具合や、想定していなかった入力、メモリ不足などが原因です。
ASHIKA Network では、異常終了を検知すると自動で立ち上げ直します。夜中に落ちても、翌朝には動いています。自分で見張る必要はありません。
ただし、落ちる理由そのものは残ります。ログはブラウザから追えるので、同じ落ち方を繰り返しているときは中身を見て直してください。
よくあるつまずき
手元では動くのに、置いたら動かない
ほとんどは次の3つです。
- ライブラリが入っていない …
requirements.txtやpackage.jsonを一緒に置いてください。 - 環境変数が入っていない … トークンなどはパネルから設定します。
- 特権インテントが無効 … Discord の開発者ページで有効にしてください。
しばらく動いて、そのうち落ちる
メモリ不足を疑ってください。使っていないデータを抱えたままにしていると、少しずつ増えて上限に当たります。構成を1つ上げるか、コードを見直すかのどちらかです。
トークンが無効になった
トークンをうっかり公開してしまうと、Discord が自動で無効にします。GitHub に上げたコードの中に残っていた、というのがよくある例です。発行し直して、環境変数から読む形に変えてください。
無料で動かす方法はあるのか
あります。ただし、どれも何かを引き換えにしています。無料の枠は「一定時間で停止する」「月あたりの稼働時間に上限がある」「予告なく終了する」ことが多く、動かし続けることが目的の Bot とは噛み合いません。
止まるたびに手を入れる時間を考えると、月30円のほうが結果的に安いことがほとんどです。缶ジュース1本より安い金額で、見張らなくてよくなります。
