💡

【Koyeb】Discord Botを無料で24時間運用

2024/04/08に公開

はじめに

Discord Bot無料ホスティングの有力候補として挙げられていた Heroku, Railway (Replit) の相次ぐ有料化によって低規模Botの無料運用が難しくなっている今日この頃。
新たな運用先として発見した Koyeb というサービスを使用して無料で24時間運用をしていこう!という記事です。
https://www.koyeb.com

Koyebとは

Koyebはクラウドホスティングサービスの1つであり、PaaS(Platform as a Service)に分類されます。基本的な機能や操作感はRailwayにとても似ている印象です。利用にクレジットカードの登録は必要ないですが機能が多少制限されます。(低規模Botなら十分)
ビルドはBuildpackまたはDockerで行います。今回はDockerFileからのビルドの方法について記載します。

導入

環境

  • Python 3.11
  • Discord.py 2.3.2
  • FastAPI 0.110.1 / uvicorn 0.29.0

0. Githubの準備

今回はGithubとKoyebを連携して作業をしていきます。
適当な名前でリポジトリを作成しておいてください。

1. コード

以下のようなただメッセージに反応するBotを作成しました。

ディレクトリ構成

$ tree
.
├── app
│   ├── main.py
│   └── server.py
├── Dockerfile
└── requirements.txt

main.py

main.py
import discord
import dotenv

from server import server_thread

dotenv.load_dotenv()

TOKEN = os.environ.get("TOKEN")
intents = discord.Intents.default()
intents.message_content = True
intents.voice_states = True
client = discord.Client(intents=intents)

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

# Koyeb用 サーバー立ち上げ
server_thread()
client.run(TOKEN)

server.py

Koyebの仕様上サーバーを建てる必要があるためFastAPIを使用し、8080ポートに簡単なサーバーを建てています。
Flaskでも同様に動作すると思います。(未検証)

server.py
from threading import Thread

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
async def root():
	return {"message": "Server is Online."}

def start():
	uvicorn.run(app, host="0.0.0.0", port=8080)

def server_thread():
	t = Thread(target=start)
	t.start()

requirements.txt

Botの動作に必要なPythonライブラリです。以下のコマンドで出力してください。

$ pip freeze
requirements.txt
discord.py==2.3.2
python-dotenv==1.0.1
uvicorn==0.29.0
fastapi==0.110.1

DockerFile

あくまで一例となります。環境に合わせて書き換えて実行してください。

DockerFile
FROM python:3.11
WORKDIR /bot

# 更新・日本語化
RUN apt-get update && apt-get -y install locales && apt-get -y upgrade && \
	localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo
ENV TERM xterm

# pip install
COPY requirements.txt /bot/
RUN pip install -r requirements.txt
COPY . /bot

# ポート開放 (uvicornで指定したポート)
EXPOSE 8080

# 実行
CMD python app/main.py

コードが完成したらGithubにPushしておいてください。

2. Koyebアカウントの作成

Koyebにアクセスし右上の「SIGN UP」からアカウントを作成してください。
https://www.koyeb.com

メールアドレス認証が完了したら以下のような画面になると思います。

組織名ということなので適当に決めちゃってください。そしたら「あなたについて教えてくれ」と出てくるのでササっと回答しましょう。以上でアカウントが作成できると思います。

3. デプロイ

まず、「Create Web Service」をクリック

「Github」をクリックし、

Githubと連携させます。

連携させると以下のような画面になるので作成したリポジトリを選択して

サービスの設定をしていきます。

  • Service type
    • 変更せずに「Web Service」
  • Source
    • 先程選択したリポジトリになっているか確認
    • ブランチを選択
    • Autodeployはオンにすると指定したブランチにPushがあった際に自動的にデプロイしてくれます。
  • Builder
    • 「DockerFile」を選択
    • Dockerfile locationのOverrideをオンにし、「DockerFile」と入力
    • その他、Docker関連で変更がある場合は設定してください。
  • Environment variables
    • 環境変数の設定です。TOKENなどの機密事項は必ずTypeをSecretにして追加してください。
  • Regions
    • 無料アカウントでは Frankfurt か Washington, D.C しか選べません。お好きな方を選択してください。
  • Instance
    • Instance typeは Eco - Free を選択してください。
  • Scaling
    • デフォルトのまま
  • Exposed ports
    • server.pyで指定したポートを入力してください。
    • 外部に公開しない場合はPublicをオンに
  • Health checks
    • デフォルトのまま
  • App and Service names
    • お好きな名前を指定してください。

全て設定し終わったらDeployをクリック。しばらく待つとデプロイが完了しサービスが起動します。

最後に

低規模Botのホスティング先としてKoyebを紹介させていただきました。デプロイも簡単で早いのがメリットです。デメリットとしましては、ログが72時間しか残らないことぐらいですかね。(Log保存して送信させれば解決しますが)
様々なサービスが有料化されている今、低規模なDiscord Botを無料で運用する上ではとてもいい選択肢になると思いました。

公式ドキュメント
Koyeb Docs

参考

記事を作成する上で以下の記事を参考にさせていただきました。ありがとうございました!
https://zenn.dev/maguro_alterna/articles/65906deef48e2b

Discussion