【Render.com】Pythonで作成したDiscord用のボットをGitHubリポジトリからデプロイするやり方(Dockerも利用)

1655 語
8 分
【Render.com】Pythonで作成したDiscord用のボットをGitHubリポジトリからデプロイするやり方(Dockerも利用)

はじまり#

リサちゃん avatar
リサちゃん
ちっくしょおーー!! HerokuからGitHubリポジトリのソースをデプロイ出来ないなんて、何てことだあああ!!
135ml avatar
135ml
まあ、2022/4/16のOAuth漏れた騒動があったからねー・・・
リサちゃん avatar
リサちゃん
ぐぬぬ・・・、同じ感じでGitHubからデプロイ出来るサービスはないのだろうか・・・
135ml avatar
135ml
じゃあ、Renderを使ってみますかあ?
リサちゃん avatar
リサちゃん
なんだそれは!?

Renderとは#

最近、色々なアプリをデプロイ出来て、Herokuよりも安価にそれが出来るとして、注目を集めているサービスです。

僕は、今回起きたGitHubとHeroku間のOAuth事故が起きたときに知りました。

HerokuとRenderを色々と比較してくれている記事が以下にありましたので、もう少し違いを詳しく見たい方はご参照ください。

実際にRenderを使ってデプロイしてみよう#

この機会なので、HerokuではなくRenderを使ってみたいと思います。

RenderをGitHubに連携する#

まず、デプロイしたいサービス形態を選択します。今回は、「Private Services」を選択します。

初めて利用するのであれば、クレジットカードを登録します。

GitHubのリポジトリを選択する画面になります。(画面はCron Jobで試したものです。Private Servicesでも同じような画面になると思います。)

public repositoryを選べ的な感じで書いてありますが、private repositoryを選んでも大丈夫です。

Private repositoryを選ぶと、そのGitHubのプライベートリポジトリにRenderをインストールしろと言われますので、インストールします。

インストールするリポジトリは、デプロイするリポジトリだけでいいので、そのリポジトリを選択します。

Installをクリックしてインストールします。

先程の画面に戻るので、プライベートリポジトリを再度選択します。

インストールに関しては、ここに記事があったので詳細はこちらをご参照ください。

デプロイの設定をする。#

デプロイの設定に入ります。Python 3を選択して、mainブランチからデプロイします。

「Build Command」および「Start Command」は、このコマンド群でデプロイしてみます。

Build Command:

Terminal window
apt update; apt install -y python3 python3-pip; /opt/render/project/src/.venv/bin/python -m pip install --upgrade pip; pip install -r requirements.txt

Start Command:

Terminal window
python3 app.py

料金プランは最弱の「Starter」を選びました。

「Create Private Service」をクリックして、デプロイが始まります。どきどき・・・。

Pythonでデプロイ出来ない・・・#

これでデプロイしてみると、こんなエラーメッセージが表示されてデプロイ出来ません。(僕のDiscord botアプリは、py-cord 2.0.0じゃないと動きません・・・。困った・・・。)

Pythonのバージョンが古いのが問題・・・?

Dockerでデプロイしてみよう#

Pythonのバージョンを上げたいのですが、Python 3でデプロイすると、Python 3.7からバージョンアップできないようです。

RenderでPythonのバージョンについて調べてみると、3.7がデフォルトらしくそれ以上のバージョンでデプロイしたければDockerでデプロイしてみろとのことです。

Dockerfileの設定#

なので、Dockerでデプロイしてみます。Dockerfileを以下のように設定します。Ubuntuでコンテナを作ります。

先程デプロイしようとしたメインディレクトリに、以下の感じのDockerfileを配置します。

デプロイに必要ないファイルは.dockerignoreで排除してデプロイ時間を短縮します。

Dockerfile

FROM ubuntu:latest
ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv
# setup timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# update apt
RUN apt update
# install python and pip
RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip
# save docker layer cache
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
# use git
RUN apt install git -y
# pip install
RUN pip install --no-cache-dir -r requirements.txt
# install landmasterlibrary
RUN pip install git+https://github.com/landmaster135/landmasterlibrary.git@main
# copy files
COPY ./ /usr/src/app
# execute Python code
RUN python3 app.py

デプロイ設定#

再度、デプロイ設定に入ります。「Environment」を今回はDockerにします。Commandを入れる必要はなくなったので以下の設定で基本的にOKです。

デプロイ完了・・・?#

「Create Private Service」をクリックして、デプロイが始まります。どきどき・・・。

していると、デプロイが終わりました。その結果を見てみると、405: Method Not Allowedのメッセージが出ていますね・・・

うーん、少し気になりますが、Discordの画面を見てみるとボットは起動しているようです・・・。問題なく使えています。

うーん・・・、今回は詮索するのは保留にします・・・。pycordの中で起きている例外なので、分かるには時間が掛かりそう・・・。

ところがどっこい#

デプロイがエラーコード137で失敗する#

ところがどっこい、先程の状態を放置して2時間ほど経過した後、Renderを見てみると・・・

「Deploy failed」となっていますね・・・。Error codeが137となっています。どうやら、このコード自体はメモリ不足が原因のようです。

プランを引き上げて再デプロイしてみる#

試しにサーバを「Starter Plus」にして、再度デプロイして放置してみます・・・。

しかし、またもや、失敗と出ます・・・。同じエラーコードです。

アプリを走らせるコマンドをRUNではなくCMDで走らせてみる。#

今度試したのは、DockerfileのサイドのコマンドをRUNではなくCMDで実行する試みです。

Dockerfile:

FROM ubuntu:latest
ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv
# setup timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# update apt
RUN apt update
# install python and pip
RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip
# save docker layer cache
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
# use git
RUN apt install git -y
# pip install
RUN pip install --no-cache-dir -r requirements.txt
# install landmasterlibrary
RUN pip install git+https://github.com/landmaster135/landmasterlibrary.git@main
# copy files
COPY ./ /usr/src/app
# execute Python code
CMD ["python3", "app.py"]

今度は・・・、Timed outと表示されてしまいました。

でも、エラーメッセージが変わったので、少し光明が見えてきたかも。

Private Serviceではなく、Background Workerでデプロイしてみる。#

ここに有力そうな記事が見つかりました。

Private Serviceは10000番ポートでlistenするように想定されているから、そうじゃないポートで使うとうんちゃらかんちゃらと書いてあるっぽいです。

とりあえず、同じリポジトリから、Private ServiceではなくBackground WorkerでDockerデプロイしてみます。

そうしたら・・・、

なんと! 相変わらず、405: Method Not Allowedのメッセージは表示されていますが、デプロイが終わり「Live」の状態になっています!

Botも特に問題なく動作しています!

まとめ#

以下、今回のDiscord botをデプロイした件のまとめです。

  • 2022/4/16のインシデントが原因で、HerokuがGitHubからのデプロイに対応していない状況である。
  • しかし、Render.comを使えば、Herokuと同様にGitHubからデプロイ出来る。
  • pycordのバージョンが、Python 3.7以前で利用できないものである場合、Dockerでデプロイする。
  • アプリ種別は「Background Worker」でデプロイする。

おしまい#

リサちゃん avatar
リサちゃん
やった! デプロイ出来るじゃないですかあ!
135ml avatar
135ml
なんか例外は出てるけどね・・・
リサちゃん avatar
リサちゃん
変だな〜、変だな〜

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【Render.com】Pythonで作成したDiscord用のボットをGitHubリポジトリからデプロイするやり方(Dockerも利用)
https://endorphinbath.com/posts/renderdotcom-how-to-deploy-discord-bot/
著者
kinkinbeer135ml
公開日
2022-05-05
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【Heroku】Pythonで作成したDiscord用のボットをGitHubリポジトリからデプロイするやり方
Software HerokuでPythonで書いたDiscordアプリをGitHubリポジトリからデプロイします。記載した手順で特に躓くことなく実施できたので、ご参考ください。
2
【Heroku】GitHubのリポジトリから新しいアプリをデプロイするときに「Item could not be retrieved: Internal Server Error」が出た場合
Software この前起きた、GitHubのOAuthインシデント後に、Herokuを使ってデプロイしたアプリを再びデプロイするときにデプロイできなくなっているかと思います。そのときにどう対応するかを紹介します。
3
【GitHub】Pythonでリポジトリの情報を取得するCloud Functionsを作る
Code Pythonを使用してGitHubリポジトリの情報を取得し、Cloud Functionsで処理する方法に関する記事です。PyGithubとThreadingで実装および処理を効率的にしました。
4
【GitHub】Goでリポジトリの情報を取得するCloud Functionsを作って、Pythonと比較する
Code Go言語でGitHubのリポジトリ情報を取得するCloud Functionsを開発し、Pythonで作成した同様の機能と比較した記事です。使ったツールや、並行処理の比較も行っています。
5
【GitHub】PythonとGitHub ActionsでProjectsにIssuesを作る作業を自動化する(前編:Pythonのソース)
Code 日々のタスクをGitHub IssuesおよびGitHub Projectsで管理する時に登録する作業が面倒くさいと思います。いちいちオプションを選択して入力する手間が面倒くさいと思います。本記事では、その作業を省略したツールを紹介します。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次