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

Code

はじまり

リサちゃん
リサちゃん

ちっくしょおーー!!

HerokuからGitHubリポジトリのソースをデプロイ出来ないなんて、何てことだあああ!!

135ml
135ml

まあ、2022/4/16のOAuth漏れた騒動があったからねー・・・

リサちゃん
リサちゃん

ぐぬぬ・・・、同じ感じでGitHubからデプロイ出来るサービスはないのだろうか・・・

135ml
135ml

じゃあ、Render.comを使ってみますかあ?

リサちゃん
リサちゃん

むむっ? なんだそれは、教えてくれ!

Renderとは

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

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

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

【格安本番運用が可能に】Render.com のメリット・デメリットを Heroku と比較してみた

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

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

RenderをGitHubに連携する

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

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

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

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

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

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

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

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

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

Connect GitHub | Render · Cloud Hosting for Developers
RenderconnectswithGitHubtodeployyourappsandwebsitesautomaticallyoneverypushtoyourproject.UsethisquickstartguidetoconnectRendertoGitHub.

デプロイの設定をする。

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

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

Build Command

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

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でデプロイしてみろとのことです。

Specifying a Python Version | Render
RenderisaunifiedcloudtobuildandrunallyourappsandwebsiteswithfreeTLScertificates,globalCDN,privatenetworksandautodeploysfromGit.

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となっています。どうやら、このコード自体はメモリ不足が原因のようです。

Search
Lookingforsomethingspecific?SearchDockerDocumentationforguides,manuals,andmorerelatedtoyourspecifictopic.

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

試しにサーバを「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でデプロイしてみる。

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

Deploy of Docker as private service fails with timeout
IcreatedaprivateservicewhereIdeployaDockerimage.Itfailsafteracoupleofminuteswithatimeout.MysupervisorinthecontainerreceivesaSIGTERMandshutsdown.Thereisnothingin...

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」でデプロイする。

おしまい

リサちゃん
リサちゃん

やった! デプロイ出来るじゃないですかあ!

135ml
135ml

なんか例外は出てるけどね・・・

リサちゃん
リサちゃん

変だな〜、変だな〜

以上になります!

コメント

タイトルとURLをコピーしました