はじまり

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

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

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

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

むむっ? なんだそれは、教えてくれ!
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
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でデプロイしてみろとのことです。

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

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

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

変だな〜、変だな〜
以上になります!
コメント