前回のあらすじ
discord.pyを用いてbot本体のコードを作成した。
この記事でやること
実際に作成したプログラムをサーバーにデプロイする。
Koyebサーバーにアップロードする
今回はKoyebのサーバーにプログラムをアップロードして運用します。
Dockerの作成
サーバーにどんなライブラリでどのファイルを実行するかを教えてあげる必要があります。そこで、プロジェクトをDockerコンテナとして作成し、dockerfileにいろいろ書いて教えてあげましょう。
dockerfile
FROM python:3.13.2
# Set the working directory
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
requireents.txtにはpythonのライブラリのバージョン情報を書き込みます。
以下のコマンドを実行して生成してください。
pip freeze > requirements.txt
ディレクトリ構造
appフォルダにmain.pyを配置し、その他はroot
これでできたはずだが…?
現段階でもKoyebにアップロードを済ませれば動くと思うのですが、botの感知するdiscordサーバーにしばらく動きがなくなってしまったときにsleepしてしまいます。
health checkをする
定期的にbotに対して刺激を与えることで寝ないように起こしてあげます。
health_check_server.py
from flask import Flask
from rich import console
app = Flask(__name__)
@app.route("/")
def health_check():
return "OK", 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
ここで問題が
Koyebの無料枠で実行できるのは一つのファイルのみ。
しかし、本体とヘルスチェックを同時に動かさなければ。
run_all.sh
# 両方をバックグラウンドで起動しつつ監視
python healthcheck_server.py &
python app/main.py
# discord_bot.py を終了させたらコンテナも終了
両方を実行するシェルスクリプトをKoyebの実行対象のファイルにしたら解決しました。
書き忘れ
Koyebの設定について書き忘れていました。
- 環境変数の登録(discord bot, github access)
- ポート番号をhealth checkのプログラムと一致させる
これでできるはずです。
完成!!
おまけ
本記事の内容に加えて、チャットで設定を変更する機能を追加しました。
通話通知を出さないように非通知チャンネルを設定してみました。
やってみてね