【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 Docs
Render connects with GitHub to deploy your apps and websites automatically on every push to your project. Use this quick...

デプロイの設定をする。

デプロイの設定に入ります。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でデプロイしてみろとのことです。

Setting Your Python Version – Render Docs
Use a specific version of Python for your Render service.

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

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

試しにサーバを「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
I created a private service where I deploy a Docker image. It fails after a couple of minutes with a timeout. My supervi...

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をコピーしました