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

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約11分で読めます。

Heroku が 2022年11月末から有料になったため、代わりになる Render を使ってみました。
どうにかデプロイできたので、その様子をご紹介します。

Heroku で動いていたものを Render で動かすことができましたが、Railway とは違い、アプリ自体の修正が必要になるケースがありました。

この記事では以下の 2 点を紹介します。

  1. Anaconda で作った Django アプリを Render にデプロイしたときにハマったことと解決策
  2. Heroku で動いていたものを Render にデプロイしたときにハマった内容

Render の登録方法などは省略しています。

使用環境: Windows 11、Git、VSCode


こちらも参考にしてください。

【Django入門】DjangoアプリをWeb開発環境で開発、公開するまでの手順-ステップ1(GitHub Codespaces、PaizaCloud)
無料のWeb開発環境(PaizaCloudやGitHub Codespaces)でDjangoアプリを開発する簡単な手順になります。この記事ではDjangoのプログラムの内容の詳しい解説はありません。Djangoアプリをサーバーでデプロイ(…
【Django入門】DjangoアプリをWeb開発環境で開発、公開するまでの手順-ステップ2(GitHub、Git、Render)
PaizaCloudまたはGitHub CodespacesからGitHubを経由してRenderへデプロイする方法です。GitとGitHubに関してはRenderへデプロイするための「コードの転送手段」として利用しますので、それぞれの詳し…
広告
MINISFORUM日本公式ストア

運用してわかったこと(2023年4月時点)

  • 無料プランは起動がとても遅い(スリープ後の復帰に数十秒〜数分かかる)
  • データの保存ができない(最初の90日間は PostgreSQL が使えたが、以降はデータが消える)
  • 有料プランにしないとこれらの問題は解消できません。

2023年2月のメール通知

以下のメールが届き、90日経過後に PostgreSQL データベースへアクセスできなくなりました。

Your free Render PostgreSQL database, django_render_db, will be suspended on 2023-02-17.
The database will become inaccessible unless you upgrade to a paid plan.

SQLite3 を使っているから大丈夫と思っていましたが、データが保存されなくなったりエラーが発生したりしました。
→ 対処法は「PostgreSQL → SQLite3」セクションを参照。


Render にデプロイしたアプリ

Renderにデプロイしたアプリ一覧↓

イチゲブログ2
イチゲブログの姉妹サイト

関連記事

Djangoでデータベースを使わず掲示板を作ってみた!【Render+シンクラウド for Free】
Djangoが使えるRenderの無料だとPostgreSQL(数か月は使える)やMySQLのデータベースが使えない。さらにファイルに保存するデータベースsqlite3は使えるが保存ができない。(スリープ状態になるとデフォルトのdb.sql…

ヒント: ローカルで Django アプリを作る場合はエディタに VSCode を使うことをおすすめします。
Render で使う build.sh の改行コードを LF にしないとエラーになりますが、VSCode なら簡単に変換できます。方法は後述。


GitHubとの連携が切れていたので再連携した(2026/2/16 追記)

久しぶりにデプロイしたら GitHub との連携が切れていました。以下の手順で再接続できました。

1. GitHub 側で Render の権限を一度削除する

GitHub 右上のアイコン → Settings → Applications → Installed GitHub Apps → Render → Configure → 最下部の Uninstall(削除)

Applicationsに戻ってAuthorized GitHub Apps タブに Render が残っていたら同様に削除。

2. Render 側で再接続する

  1. 画面右上のプロフィールアイコン → Account Settings
  2. Git Deployment Credentials セクションを開く
  3. 「Add credential」 をクリック
  4. 「GitHub」 を選択
  5. GitHub の認証画面が開くので、Render へのアクセスを許可

完了すると、GitHub Apps として Render が再登録され、リポジトリの一覧が表示されるようになります。


Render Dashboard でのデプロイ

こちらを参考にしてください。

【Django入門】DjangoアプリをWeb開発環境で開発、公開するまでの手順-ステップ1(GitHub Codespaces、PaizaCloud)
無料のWeb開発環境(PaizaCloudやGitHub Codespaces)でDjangoアプリを開発する簡単な手順になります。この記事ではDjangoのプログラムの内容の詳しい解説はありません。Djangoアプリをサーバーでデプロイ(…
【Django入門】DjangoアプリをWeb開発環境で開発、公開するまでの手順-ステップ2(GitHub、Git、Render)
PaizaCloudまたはGitHub CodespacesからGitHubを経由してRenderへデプロイする方法です。GitとGitHubに関してはRenderへデプロイするための「コードの転送手段」として利用しますので、それぞれの詳し…

Heroku・Railway でうまくいっていたのに Render でエラーになったこと

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

build.sh の改行コードが LF になっていないと発生します。

対処法: VSCode で build.sh を開き、右下の改行コード表示(CRLF / LF)をクリックして LF に変更します。
※ VSCode で *.sh ファイルを新規作成した場合は自動的に LF になるため、変更不要です。


Not Found: /(デプロイ失敗)

ルート URL(/)に対応する処理がないとデプロイが失敗します。

対処法: プロジェクトの urls.py にルートの処理を追加します。

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

理由: Render の Health Check Path に / が設定されており、/ へのリクエストに 200 OK が返ってこないとエラーになります。また、ヘルスチェック自体を止めればでない。


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

デプロイ直後にアプリが起動した際、データオブジェクトが存在しない状態で処理が走るとデプロイ失敗になります。
Heroku では事前に Python シェルや admin からデータを作成できましたが、Render では起動と同時に処理が走ります。

対処例:adminのスーパーユーザーを起動時に作成する方法

【Django入門】DjangoアプリをWeb開発環境で開発、公開するまでの手順-ステップ2(GitHub、Git、Render)
PaizaCloudまたはGitHub CodespacesからGitHubを経由してRenderへデプロイする方法です。GitとGitHubに関してはRenderへデプロイするための「コードの転送手段」として利用しますので、それぞれの詳し…

SQLite3 を使う場合: ローカルでデータを入力しておけばデプロイ後もそのまま使えます。
ただし、.gitignore で db.sqlite3 を除外していると GitHub にプッシュされないため、除外設定を外す必要があります。


relation “モデル名” does not exist

admin やAPIでモデルにアクセスすると発生することがあります。migrate が正常に適用されていないことが原因です。

例:relation "article_vtfyarticle" does not existarticleはアプリ名、vtfyarticleはモデル名)

対処法: build.sh の migrate コマンドを以下のように変更します。

# 変更前
python manage.py migrate

# 変更後(article はアプリ名)
python manage.py migrate --fake article zero
python manage.py migrate article

デプロイログで article.0001_initial が正常に適用されているか確認できます。

Apply all migrations: article
Running migrations:
  Applying article.0001_initial... OK

参考:django.db.utils.ProgrammingError: relation does not exist(Stack Overflow)


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

HerokuやRailway ではスルーされていた部分まで Render ではチェックされます。デプロイ失敗になると先に進めないのが難点です。

発生例:

The JS file 'app_cal/js/chunk-vendors.17cbe1d3.js' references a file which could not be found:
  app_cal/js/chunk-vendors.17cbe1d3.js.map

.map ファイル(デバッグ用)がないというエラーです。

対処法: 該当 JS ファイル末尾の以下の行を削除します。

//# sourceMappingURL=app.e34c0f45.js.map

別プロジェクトでも同じモデル名・アプリ名だと動作がおかしい

Heroku や Railway では問題なかったのに、別プロジェクトで同じモデル名やアプリ名を使っていると干渉してしまうことがあります。アプリを作り直して解決しました。


5秒ごとに “GET / HTTP/1.1” 200 が発生する(ヘルスチェック)

Render が5秒おきにルートにアクセスしてヘルスチェック(kube-probe)を行っています。
アクセスカウンターのようなアプリでは正確なカウントができなくなるため注意が必要です。

根本原因: 上述の「Not Found: /」と同様、urls.py でルートに処理を追加したことでヘルスチェックのアクセスが記録されるようになります。

応急対処: Dashboard → Settings → Health Check Path を空欄にするとヘルスチェックが止まります。


502 Bad Gateway(デプロイ成功後に 400 エラーが連発してデプロイ失敗)

ログでは最初デプロイ成功と表示されるのに GET / HTTP/1.1" 400 が連発し、最終的に deploy failed になります。

原因と対処法:

settings.py の ALLOWED_HOSTS の設定が原因でした。

# ❌ ダメだった設定
ALLOWED_HOSTS = ['.onrender.com', 'localhost-abc-1.paiza-user-free.cloud', '.herokuapp.com']

# ❌ ワイルドカードも動くが非推奨
ALLOWED_HOSTS = ['*']

# ✅ 最終的にOKだった設定
ALLOWED_HOSTS = ['vtfy2article2.onrender.com', '127.0.0.1']

ログに以下が出ていたため、'127.0.0.1' を追加しました。

Invalid HTTP_HOST header: '127.0.0.1:10000'. You may need to add '127.0.0.1' to ALLOWED_HOSTS.

127.0.0.1 は localhost と同じ「ループバックアドレス(自分自身を指す IP)」です。


Worker (pid:xxx) was sent SIGKILL! Perhaps out of memory?

たまに Server unhealthy になってログに上記エラーが出ていました。直前に以下のログがありました。

Matplotlib is building the font cache; this may take a moment.

Matplotlib がメモリを大量消費してエラーになっていたようです。

対処法: 不要な matplotlib のインポートをコメントアウトしました。

# import matplotlib                   # ← コメントアウト
# matplotlib.use('Agg')               # ← コメントアウト
import matplotlib.pyplot as plt       # ← これだけで動いた

関連記事:

【Django入門】データ入力してグラフを描画する方法【Matplotlib】
データーを入力しグラフを表示するアプリの簡単な例になります。formで入力したデータをセッションを利用して描画する関数に渡しています。Django初心者でもPythonのプログラムを公開デプロイできるように手順を書いてあります。Django…

SQLite3 から PostgreSQL へ変更する方法

簡単に切り替えられますが、実際に PostgreSQL で動いているか確認しづらいです。エラーにはなりませんでした。

settings.py の変更:

import dj_database_url

# DATABASES = {
#     "default": config("DATABASE_URL", default=default_dburl, cast=dburl),
# }
DATABASES = {"default": dj_database_url.config()}

conn_max_age を指定する場合もあります(例:dj_database_url.config(conn_max_age=600))。書かなくても動きました。

参考:


SQLite3 で最初から動かす場合

現在私が運用しているこの方法では、ローカルで作った db.sqlite3 は更新保存されません(理由は後述)。
シンプルに運用できるため紹介しておきます。

ローカルで事前準備

python manage.py makemigrations  # ← migration フォルダができないときはアプリ名を最後に追加
python manage.py migrate
python manage.py createsuperuser

その後アプリを起動してデータベース(db.sqlite3)にデータを入れておきます。

build.sh

set -o errexit

pip install -r requirements.txt

python manage.py collectstatic --no-input

SQLite3 でデータが保存されない理由

SQLite3 はデータを db.sqlite3 ファイルに保存しています。
Render でデータが残らない原因は、更新された db.sqlite3 ファイルが永続化されないためです。

Railway と Render の違い

RailwayRender
スリープしない(20日間)する(一定時間後)
SQLite3 のデータ維持される再起動のたびにデプロイ時の状態に戻る
起動速度速い遅い(30秒〜数分)

Render は再起動するたびにデプロイ時と同じ状態に戻るため、途中で追加されたデータが消えてしまいます。

CSV ファイルでデータ保存も試みましたが、同様にファイルが保存されないため意味がありません。

→ Railway や Render で永続的なデータ保存をするには、有料の PostgreSQL などを使う必要があります。


まとめ

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

  • Heroku・Railway ではハマらなかった内容で Render ではハマった
  • 別プロジェクトでも同じデータベースのモデル名・アプリ名を使っていると干渉する
  • 5秒おきのヘルスチェックがアクセスカウンターなどの動作に影響する
  • スリープ状態からの起動に数分かかることがある
  • Blueprints の Status が Sync failed でもとりあえず動く(現在は Blueprints を削除して使用)
  • 3カ月後に PostgreSQL が使えなくなる。SQLite3 に切り替えてもデータは残らない
    (スリープすると SQLite3 のデータは GitHub にプッシュした時点の状態に戻る)

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

コメント

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