けいゆうのブログ

MENSA会員・TOEIC985・東大4落ちでうつ病人間

【Herokuの代替】DiscordボットはReplitにデプロイしよう【Python】

 

スポンサーリンク

はじめに

Discordボットのデプロイ先として大変便利に使っていたHerokuでしたが、この度ついに無料プランが廃止。

移行を余儀なくされました。

flyctl、Render、Denoと色々試してみたものの謎のエラーが出たりPythonが使えなかったりと結果は3敗。

そんな落ち武者を快く受け入れてくれたのがReplitです。

しかもHerokuから直接インポートできるとのこと。

replit.com

僕はインポートを使わず手作業で移行しましたがすごく簡単でした。

24時間稼働できるし素晴らしいです。

今回はそんなReplitをbotのデプロイ先として紹介したいと思います。

手順

まずはReplitのアカウントを作りましょう。

GitHubやGoogleアカウント経由でも大丈夫です。

ログインしたらサイドバーが現れると思うので+Createボタンから新しいプロジェクトを作りましょう。

するとこんな画面がポップアップします。

Templateで言語を選べるほか、GitHubからインポートすることもできます。

ここではPythonを選択しました。

ボットとして配置するのでPrivacyはPublicにしておきましょう。

ただこの場合、コードにそのままアクセストークンを書くと公開されてしまうので後述の対応が必要になります。

プロジェクトを作成したらmain.pyにコードを書いていきましょう。

左側のFilesタブから新規ファイル、フォルダの作成も簡単にできます。

【重要】トークンをSecretsにする

この作業は必須です!

やらないとボットに不正アクセスし放題になります!

 

みなさんコードに下記のような記述をしているかと思います。

client.run("ボットのトークン")

ただ先述したようにこのプロジェクトはパブリックなのでこれだとトークンが公開されてしまいます。

解決策としてトークンをシークレット環境変数に設定しましょう。

サイドバーのToolsタブからSecretsを選択してください。

こんな画面が出ます。

keyにはわかりやすい変数名、valueにはトークンを入力しましょう。

今回はkeyをDISCORD_TOKENとしました。

Add new secretを押したらmain.pyに戻ってimport osを記述します。

そうしたらclient.run()の部分をこう書き換えましょう。

my_secret = os.environ['DISCORD_TOKEN']
client.run(my_secret)

これでトークンを非公開にしたままボットにアクセスできます。

常時稼働にする方法

Filesタブからkeep_alive.pyを作成し、以下のコードを書いてください。

from flask import Flask
from waitress import serve
from threading import Thread

app = Flask('')

@app.route('/')
def home():
  return "I'm alive"

def run():
  # app.run(host='0.0.0.0', port=8080)
  serve(app, host='0.0.0.0', port=8080)

def keep_alive():
  t = Thread(target=run)
  t.start()

ほとんどHeroku公式からのコピペです。
Flaskのデフォルトサーバーでもいいのですが本番環境としても運用できるようにwaitressを導入しました。
これができたらmain.pyにkeep_aliveをインポートします。

from keep_alive import keep_alive

そしてclient.run()の前にkeep_alive()を記述すればOKです。

keep_alive()
my_secret = os.environ['DISCORD_TOKEN']
client.run(my_secret)

仕上げにプロジェクトの設定からAlways Onをオンにしましょう。

これで常時稼働するようになりました!

終わりに

英語ですがReplit公式もDiscordボットについて書いているのでご参照ください。

docs.replit.com

また実際にReplitにデプロイした自作ボットを以下の記事で紹介しています。
www.utsuboublog.com