0. はじめに
watnowの秋プロでPythonを使ったプロダクトを開発をしていて初めてデプロイを行うことになりちょうど勉強していた時に、アドベントカレンダーを書くことになったので今回はその内容を軽くまとめていきます。
今回はいま実際に開発中のプロダクトで使っているFastapiやSupabaseでのやり方がメインになります。(ほかのフレームワークやデータベースにも軽く触れてます)
これからデプロイする人の参考になればと思います。
1. Render デプロイの手順
デプロイ完了までの大まかな流れを説明します。
1. GitHub と連携
Render のダッシュボードから New + ボタンを押し、Web Service を選択して対象の GitHub リポジトリと連携します。
2. 言語・プラン選択
言語に Python 3 を選択し、Freeプラン(無料枠)を選びます。
3. Start Command の入力
サーバーを起動するためのコマンドを入力します。(※ 書き方は第3章で解説します)
4. Environment Variables の設定
DBの接続URLなどの環境変数を設定します。(※ 必要な変数は第4章で解説します)
2. requirements.txtの準備
Renderは最初の設定でPythonと指定しますが、中身は空っぽでライブラリが入っていません。あなたのパソコン(ローカル)では pip install したライブラリが入っていますがRenderにはその履歴がありません。そのときに必要なライブラリを伝えるのが requirements.txt です。
1 最低限の構成(FastAPI + Supabase)
今回はFastAPI + Supabaseでの最低限の構成とその役割を説明します。
fastapi
uvicorn[standard]
sqlalchemy
psycopg2-binary
python-dotenv
これらのそれぞれの技術的な役割は次の通りです
-
fastapi
Webアプリケーションフレームワーク本体です。依存するpydanticなども自動で入ります。 -
uvicorn[standard]
ASGIサーバーです。FastAPI を動かすためのエンジン(ASGIサーバー)です。[standard]を付けることで本番用の高速化ライブラリが含まれます。 -
sqlalchemy
Python でデータベースを操作するための便利な道具(ORM)です。SQL を直接書かずに済みます。 -
psycopg2-binary
PostgreSQL に接続するためのドライバです。Render では、通常のpsycopg2だとエラーが出やすいため、ビルド済みのbinary版を指定してください。 -
python-dotenv
ローカル開発で環境変数を読み込むために使います。
2-2. (参考) 他のフレームワークやDBを使う場合
もし上で説明した技術以外を使う場合は、以下を参考に構成を入れ替えると大丈夫です。
◆ フレームワークの比較
| フレームワーク | Start Command (Render設定) | requirements.txt への追加 | 備考 |
|---|---|---|---|
| FastAPI | uvicorn main:app --host 0.0.0.0 --port $PORT |
uvicorn[standard] |
今回の構成(ASGI準拠) |
| Flask | gunicorn app:app |
gunicorn |
WSGI準拠のため |
| Django | gunicorn project.wsgi |
gunicorn |
大規模構成向け |
◆ データベースの比較
| データベース | 必要なライブラリ (ドライバ) |
|---|---|
| Supabase (PostgreSQL) | psycopg2-binary |
| Firebase (Firestore) | firebase-admin |
| MongoDB (Atlas) | motor |
| MySQL |
mysqlclient または pymysql
|
これで、ライブラリの準備ができました。次は起動のためのコマンドが必要です。
3. Start Commandとは
Render の設定画面に入力する Start Command は重要な設定です。サーバーを起動するための命令にあたります。
3-1. 正しいコマンドの意味
FastAPI の場合、以下のコマンドを入力します。
uvicorn main:app --host 0.0.0.0 --port $PORT
このコマンドには、以下の意味があります。
-
uvicorn main:app: 「main.pyというファイルの中にあるappという変数(FastAPIの本体)を動かせ」という指示です。- 注意:
srcフォルダに入れている場合はsrc.main:appになります。
- 注意:
-
--host 0.0.0.0ローカル開発で使う127.0.0.1は自分専用ですが、0.0.0.0にすることで「外部(インターネット)からのアクセス」を受け付けるようになります。 -
--port $PORT: Render は起動するたびに「今回は10000番ポートを使ってね」と場所を指定してきます。その番号が環境変数$PORTに入っています。8000などと固定するとエラーになるため、必ず変数を使います。
4. Environment Variables(環境変数)の管理
DBの接続URLやAPIキーなどの機密情報を GitHub に上げてしまうと、世界中にパスワードを公開することになります。これを防ぐために、コードとは別の場所で秘密情報を管理する仕組みが「環境変数」です。
4-1. 仕組みの理解
-
ローカル開発:
.envファイルを作成し、python-dotenvライブラリで環境変数としてロードします。 - Render 本番: `Render のコンテナ環境変数として値を登録します。
4-2. Render での設定手順と例
Render ダッシュボードの [Environment] タブで設定します。
- サイドバーの [Environment] をクリック。
- [Add Environment Variable] をクリック。
- Key と Value を入力して保存します。
設定例:Supabase (PostgreSQL)
-
Key:
DATABASE_URL - Value: Supabase のダッシュボード (Connect → ORM → URI) からコピーした接続文字列
最後にエラーの対処法を押さえます。
5. よくあるエラーと対処法
デプロイに失敗した時は、Render ダッシュボードの [Logs] を確認してください。初心者が遭遇しやすいエラーの解決策は以下の通りです。
| エラーログ例 | 考えられる原因 | 解決策 |
|---|---|---|
ModuleNotFoundError |
ライブラリ不足 |
requirements.txt に対象ライブラリがあるか確認し、Push し直す。 |
Health check failed |
ポート設定ミス | Start Command が --port $PORT になっているか確認する。 |
Error: pg_config ... |
ビルド環境不足 |
requirements.txt の psycopg2 を psycopg2-binary に書き換える。 |
ArgumentError: ... None |
環境変数未設定 | Render の Environment に DATABASE_URL が設定されているか確認する。 |
6. 最後に
Render へのデプロイは、以下の3つの要素が鍵となります。
- requirements.txt: 必要なライブラリを入れる
- Start Command: 正しい起動命令とポート設定をする
- Environment Variables: 秘密情報はダッシュボードで管理する
最初はエラーが出るかもしれませんが、ログを読んで一つずつ解消していけば必ず動きます。
今回の記事が、私と同じように初めてデプロイに挑戦する方の助けになれば嬉しいです。最後まで読んでいただき、ありがとうございました!!