Render にデプロイ(Free プラン)¶
デプロイ のページでは Rocky Linux のサーバーに Gunicorn と systemd で動かす方法を書いたけど、ここでは Render に無料(Free プラン)でデプロイする方法を。サーバーの OS やプロセス管理を自分で面倒みなくていいのがラク: cf. Deploy for Free
Info
GitHub のリポジトリと uv.lock がある前提で。 Render が連携したリポジトリを見て、 push のたびに自動でビルド&デプロイしてくれる。
Web Service を作成する¶
Render のダッシュボードで New → Web Service を選んで、デプロイしたい GitHub リポジトリを連携する。 Python プロジェクトだと Render が中身を見て、いくつかのフィールドを自動で埋めてくれる。

主な項目はこんな感じ。
Language…Python 3が自動で選ばれる。Branch… ビルド対象のブランチ。ここに push するたびに自動デプロイされる。Region… リージョン。近いところを選ぶ(Free プランでも選べる)。Build Command… デプロイのたびに最初に走るコマンド。Start Command… ビルドのあとにアプリを起動するコマンド。
Build Command¶
uv.lock があると Render は uv を検出して、下記を自動で入れてくれる。
uv sync --frozen…uv.lockの通りに依存をインストールする(ロックを更新しない)。uv cache prune --ci… ビルドで使った uv のキャッシュを削ってデプロイを軽くする: cf. uv の Caching ドキュメント
Start Command¶
Build Command と違って自動では埋まらないので、自分で入力する。
fastapi run は Uvicorn でアプリを起動する。 fastapi dev と違って 0.0.0.0 を listen するので外から繋がる: cf. uv で FastAPI を動かすガイド
Free プランは 0.1 CPU / 512 MB RAM で弱いので、 デプロイ でやったような Gunicorn の複数ワーカーは使わない方がいいかな。
Free プランを選ぶ¶
設定画面を下にスクロールすると Instance Type でプランを選べるので Free を選ぶ。 *.onrender.com の HTTPS 付き URL がもらえて、 TLS 証明書も Render が用意してくれる。
環境変数を設定する¶
SECRET_KEY みたいな秘密の値はリポジトリに置かず、 Render の Environment で環境変数として設定する。 設定管理(pydantic-settings) のように .env から読む作りにしておけば、ローカルは .env、本番は Render の環境変数、で同じコードのまま動かせる。
Note
.env ファイル自体は .gitignore で除外してリポジトリに含めない。 Render には Environment 画面から 1 つずつ、または .env の中身をまとめて貼り付けて登録できる。
Free プランの制限¶
無料なので当然いろいろ制限がある。
一定時間アクセスがないとスリープする¶
Free プランの Web Service は 15 分アクセスがないとスリープ(spin down)して、次のリクエストで起こされる。起き上がるまで 1 分くらいかかるので、しばらく放置したあとの 1 回目のレスポンスがすごく遅い。常時すぐ応答してほしいものには向かない。
データの保存はできない¶
Free プランは永続ディスク(Persistent Disk)が使えない。デプロイ・再起動・スリープのたびにファイルシステムがまっさらになるので、 データベース で使った SQLite の app.db のようなファイルは消える。残したいデータは外部のマネージド DB(Render の PostgreSQL など)を使う。
Warning
Render の無料 PostgreSQL は作成から一定期間で削除されるらしい。残したいデータは有料 DB か別サービスで。
無料の稼働時間に上限がある¶
Free プランは全体で月 750 時間まで。 Web Service を 1 個だけ常時動かすぶんには 1 か月(約 730 時間)まかなえる。
自動デプロイ¶
連携した GitHub ブランチに push すると、 Render が自動でビルドして再デプロイしてくれる。
Warning
とはいえバグった状態をデプロイしたくないので、 GitHub Actions で pytest を PASS したらデプロイする、みたいなプロセスにしておくといいと思う。