【Django】Heroku無料枠がなくなるのでRenderを使ってみた。

この記事は約8分で読めます。
広告

Herokuが2022/11/末から有料になるため代わりになるRenderを使ってみました。どうにかデプロイできたので、その様子をご紹介します。Herokuで動いていたものを動かすことができました。HerokuやRailwayとは違ってアプリによってはアプリ自体の修正が必要になりました。まずはAnacondaで作ったDjangoアプリをRenderにデプロイしたときにハマったことと解決策のご紹介。それとHerokuで動いていたものをRenderにデプロイしたときにハマった内容のご紹介です。
Renderの登録方法などは省略しています。
使用した環境Windows11、Anaconda、Git、VSCode
Renderにデプロイしたアプリ(表示するまで数分かかることがあります)
こちらの記事で作ったアプリです。(私の他のDjangoの記事でも成果物はRailwayとRenderにそれぞれデプロイしています。)

同じくHerokuの代替Railwayについてはこちらの記事。

広告

AnacondaでDjangoアプリを作る

Anacondaを使っていない人は読み飛ばしてください。
以下を参考にプロジェクトが作れるところまでやります。エディタはVSCodeを使ったほうがいいです。というのはRender.comを使うときに作るbuild.shファイルの改行コードがLFでなければエラーになりVSCodeだとこの変換が簡単にできます。(Spyderを使ってもできると思いますが、やり方は調べてません。)
【Python】「Anaconda」で「Django」の開発環境を作る。
Anaconda仮想環境でVSCodeを使うには下の「Djangoプロジェクトを作成する。」までやり出来上がったプロジェクトフォルダをVSCodeのファイル→フォルダーを開くでやっていけます。Python拡張機能のエラーが2つ出ますが×で大丈夫でした。
【Python】「Django」プロジェクトを作成して、起動してみる。

Renderにデプロイ

Renderにデプロイする方法はこちらを参考にしました。
参考サイトDjangoをRenderにデプロイする方法
Anacondaをインストールしていない環境では、この通りいけると思います。
私はデプロイの前の仮想環境でつまづきました。というのもAnacondaをインストールしているとうまくいきません。
Anacondaをアンインストールしたくなかったので上述のAnaconda仮想環境で、参考サイトのアプリを作りデプロイしました。参考サイトと違う部分を記述します。

Anacondaの場合、上の「Environments」→「該当の仮想環境」→「Open Terminal」でこのターミナルを使っていきます。
この状態で参考サイトの「仮想環境の作成」と「仮想環境の実行」は不要になります。

python3 manage~ではエラーになるのでpython manageでやりました。
例えばpython manage.py startapp app

RenderのNew Blueprint Instance ボタンをクリックしたときレポジトリがないときはConfigure accountをクリックRepository accessがOnly select repositoriesになっているためこうなります。select  repositoriesでレポジトリが選べるようになります。

デプロイでCreate web service django_render
(git branch not found: "main" in https://api.github.com/repos/miyamiko/mysite/commits/main)とエラーが出たので
render.yamlのservices:の branch: main →master変更でOKでした。
目次へ

Heroku、Railwayでうまくいっていたのにエラーが出たこと

Heroku、Railwayで動いていたアプリをRenderにデプロイするときにはまったことです。

/usr/bin/env: ‘bash\r’: No such file or directoryが出る

/usr/bin/env: ‘bash\r’: No such file or directoryが出たときの対処法を参考に
VSCodeでbuild.shを開いて改行をlfに変えてok
VSCodeで*.shでファイルを新規作成したときは自動的に改行コードがLFになっているので何もする必要はありません。

Not Found: /

ルートに何かを表示する処理がないとデプロイ失敗になります。
なので処理を追加、具体的にはプロジェクトのほうのurls.pyにルートの表示処理を追加する。

urlpatterns = [
    path('',~)←これがないとデプロイ失敗になる。

app.models.モデル名.DoesNotExist: モデル名matching query does not exist.

デプロイ完了後いきなりアプリが立ち上がりデータオブジェクトがない処理だとデプロイ失敗になってしまう。Herokuでは起動する前にPythonシェル起動やadminを起動してデータオブジェクトを作成できたので、デプロイ失敗にはならなかった。
get_or_create()を使うと最初の1回だけオブジェクトを作成する処理を作れる。
参考【django】モデルの get_or_create()の使い方

djangorestframework==3.10.0だとエラー

何かimportできないエラーが出た。(具体的には忘れました)
Djangoのバージョンとの関係だと思いますがrequirements.txtでバージョン指定しないでdjangorestframeworkとすればデプロイは通る。
また参考サイトではrequirements.txtでdjango==4.1.2にしてRenderのEnviroment環境変数設定でPYTHON_VERSION 3.8.10に変更しています。最初からrequirements.txtで3.8.10にしてみましたが、これではヴァージョンがないというエラーになりました。なので参考サイトの手順でやらないとダメでした。

細かいところまでチェックされダメだとデプロイ失敗になる。

HerokuやRailwayではチェックされないところまでチェックされます。やっかいなのはデプロイ失敗として扱われて先に進めないところです。

具体的に出たエラーは
The JS file 'app_cal/js/chunk-vendors.17cbe1d3.js' references a file which could not be found:
Nov 23 05:51:19 PM    app_cal/js/chunk-vendors.17cbe1d3.js.map
mapファイル(デバックで使う)がないというエラー

jsファイルの以下の該当部分を削除したらOKでした。
//# sourceMappingURL=app.e34c0f45.js.map

アプリが違っても同じモデル名だと動作がおかしい

HerokuやRailwayでは問題なかったのに別アプリの同じモデル名だと干渉してしまう。アプリを作り直した。

5秒ごとに”GET / HTTP/1.1″ 200 10831 “-” “kube-probe//”が発生する

プログラムによっては問題になるので注意です。Renderが5秒おきにアクセスしてヘルスチェック(ちゃんと動いてるか)してるようです。私はアクセスカウンターのアプリで、これによりうまくカウントできなくなりました。
views.pyにprint(request.headers)をおいて、どんなrequestが来てるか見ようとしましたが何も入ってません。またチェックしてるのはルートのアプリだけのようで他のところのアプリのアクセスカウンタでは不具合はおきません。なのでurls.pyでルートから変えてみたけどダメでした。最初にルートのアプリに設定したらそれについてくるのか?個人的対策として、ヘルスチェックを受けたくないアプリは最初のデプロイでルートにおかないようにしようと思います。
HerokuやRailwayでは起きていなかったのに。うまくいかなくなったアプリの記事

Postgressに変更する方法

SQLiteからPostgressへ変更する方法。簡単にできるので本当にPostgressで動いているのか確認の仕方がわかりませんがエラーにはなりませんでした。

settings.pyで以下のように変更する
import dj_database_url
# DATABASES = {
    # "default": config("DATABASE_URL", default=default_dburl, cast=dburl),
# }
DATABASES = {"default": dj_database_url.config()}

参考
Getting Started with Django on Render | Render
This guide demonstrates how to set up a local Django development environment, create a simple view, and deploy it to Render.
超神速でDjangoをRender.comにデプロイ!!【まさかの5分】ウサインボルトよりも速い!? | 日本語で学ぶDjango | Django Baby
2022年にDjangoを「最速で」デプロイしたい、そんな時には Render.comが便利。Herokuの上位互換と噂のRender.comを試してみました。
deploy_django_on_render/settings.py at main · yeconnect/deploy_django_on_render
DjangoをRenderにDeployするサンプル. Contribute to yeconnect/deploy_django_on_render development by creating an account on GitHub.

Postgressは無料期限があるような情報を見たので私はSQLiteで動かしてます。
目次へ

まとめ

気づいたことがあったら随時更新します。

  • HerokuやRailwayではハマらなかった内容でハマった。
  • アプリが異なっていても同じデータベースのモデル名を使っていると干渉してしまいアプリを作り直した。
  • 5秒おきに実行されるへルスチェック(ちゃんと動いてるか)も動作に影響がある。
  • スリープ状態から立ち上がるまで数分かかるときがある
  • BlueprintsのstatusがSync failed(原因未調査)でもとりあえず動く。
  • ローカルでうまくいっていたページネーションがうまくいかない。(原因未調査)

この記事を書いたイチゲを応援する
Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ

コメント

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