こんにちは、かつコーチです。
ここまで作ってきたFlaskアプリは、自分のパソコンの中でしか動いていません。
この記事では、無料枠から始められるクラウドサービスRenderを使って、Flaskアプリをインターネット上に公開する手順を解説します。
Renderとは?
手軽にデプロイできるPaaS
Renderとは、GitHubのリポジトリと連携するだけでアプリを公開できるPaaS(Platform as a Service)(サーバーの構築や管理を意識せずにアプリを動かせるサービス)です。
AWSのようなクラウドサービスと違い、サーバーの細かい設定を意識せずに、コードをプッシュするだけでデプロイが完了する手軽さが特徴です。
個人開発や学習用途では無料プランでも十分にFlaskアプリを公開できます。
なぜ開発サーバーのままではダメなのか
これまでの記事で使ってきたapp.run(debug=True)は、あくまで開発用サーバーです。
Flask公式のドキュメントでも、この開発用サーバーは同時に多くのアクセスをさばく性能や、セキュリティ面での堅牢性が本番運用に見合っていないと明記されています。
そのため、本番環境で公開する際は、GunicornのようなWSGIサーバー(本番運用に耐えられるように設計された、Webアプリを実行するためのサーバーソフト)を経由させるのが定石です。
基本の書き方・実装手順
手順1: 必要なファイルを準備する
デプロイに必要な3つのファイルを用意します。
requirements.txt(使用ライブラリの一覧):
pip freeze > requirements.txt
gunicornをインストールしていない場合は追加しておきます。
pip install gunicorn
pip freeze > requirements.txt
Procfile(Renderにアプリの起動方法を伝えるファイル。拡張子なし):
web: gunicorn app:app
app:appは「app.pyというファイルの中の、appという名前のFlaskインスタンスを使う」という意味です。
ファイル名や変数名が違う場合は、この部分を実際の名前に合わせて変更してください。
手順2: GitHubにコードをプッシュする
RenderはGitHubリポジトリと連携してデプロイするため、事前にコードをGitHubへプッシュしておきます。
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/yourname/flask-first-app.git
git push -u origin main
このとき、仮想環境フォルダ(venv)を誤ってプッシュしないよう、.gitignoreに追加しておきましょう。
venv/
__pycache__/
*.pyc
app.db
手順3: Renderでサービスを作成する
- Renderにサインアップし、ダッシュボードから「New +」→「Web Service」を選択
- 連携したGitHubリポジトリを選択
- 以下の項目を設定する
| 項目 | 設定値 |
|---|---|
| Environment | Python 3 |
| Build Command | pip install -r requirements.txt |
| Start Command | gunicorn app:app |
Start CommandはProcfileと同じ内容ですが、Render側で直接指定することも可能です。
手順4: 環境変数を設定する
SECRET_KEYのような本番用の秘密情報は、コードに直接書かず、Renderの管理画面から環境変数として設定します。
Renderのダッシュボードの「Environment」タブから、SECRET_KEYやDATABASE_URLなどを追加します。
コード側では、次のように環境変数を読み込む形にしておきます。
import os
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")
設定が完了すると、Renderが自動的にビルド・デプロイを実行し、数分で公開用のURL(https://your-app.onrender.comのような形式)が発行されます。
つまずきやすい設定・注意点
SQLiteはデプロイ先での永続化に注意
学習用に使ってきたSQLiteは、Renderの無料プランではファイルシステムが再デプロイのたびにリセットされることがあり、データが消えてしまう可能性があります。
本番運用でデータを保持し続けたい場合は、Renderが提供するPostgreSQLサービスなど、永続化されたデータベースサービスに切り替える必要があります。
無料プランのスリープ機能
Renderの無料プランは、一定時間アクセスがないとサービスが自動的にスリープ状態になります。
スリープ後の初回アクセスでは、サーバーが起動するまで数十秒待たされることがあります。
学習・検証用途では問題になりにくいですが、常時稼働が必要な本番サービスでは有料プランへの切り替えを検討してください。
よくあるつまずきポイント・エラー対処
Build succeeded但しアプリが起動しない
❌ Before:Procfileの中身をweb: python app.pyにしてしまい、ビルドは成功するのにアプリが正常に応答しない、あるいはRenderのログにWeb process failed to bind to $PORTと出る
✅ After:web: gunicorn app:appのように、Gunicornを経由してポートのバインドを任せる形に修正する
私が初めてRenderにデプロイしたときにまさにこのエラーで詰まりました。
python app.pyで使っていたapp.run()は、Renderが指定するポート番号(環境変数PORT)を自動的に認識してくれません。
GunicornはこのPORT環境変数を自動的に読み取ってくれるため、本番運用ではGunicorn経由の起動が前提になっている、という仕組みを理解していないとハマりやすいポイントです。
ModuleNotFoundErrorがRenderのログに出る
❌ Before:ローカルではライブラリが動いているのに、requirements.txtの更新を忘れており、Render側のビルドでModuleNotFoundError: No module named 'flask_sqlalchemy'が出る
✅ After:新しいライブラリをpip installしたら、必ずpip freeze > requirements.txtを実行し直してからプッシュする
ローカルの仮想環境にはライブラリが入っていても、requirements.txtに反映し忘れていると、Render側のクリーンな環境ではライブラリが見つからずビルドに失敗します。
デプロイ前に、requirements.txtの更新日時が最新かどうかを確認する癖をつけておくと安心です。
応用・一歩先の使い方
render.yamlで設定をコード化する
Renderの管理画面での手動設定の代わりに、render.yamlというファイルで設定をコードとして管理する方法もあります。
services:
- type: web
name: flask-first-app
env: python
buildCommand: pip install -r requirements.txt
startCommand: gunicorn app:app
このファイルをリポジトリに含めておくことで、設定内容もGitで履歴管理できるようになります。
デプロイ前にマイグレーションを自動実行する
Flask-Migrateを使っている場合、デプロイ後に自動でflask db upgradeを実行するよう、ProcfileやbuildCommandにひと工夫加えることもできます。
web: flask db upgrade && gunicorn app:app
デプロイのたびに手動でマイグレーションを実行し忘れる、というミスを防げます。
まとめ
この記事のポイント
- Renderは、GitHub連携だけでFlaskアプリを公開できる手軽なPaaS
- 開発用サーバー(
app.run())ではなく、Gunicornなどの本番用WSGIサーバー経由でデプロイする requirements.txtとProcfileの2ファイルが最低限必要SECRET_KEYなどの秘密情報は環境変数として管理する- SQLiteの永続化制限や無料プランのスリープ挙動は事前に理解しておく
次に読むべき記事
デプロイまで一通り経験したら、最後の総仕上げとして実践的なアプリ作りに挑戦しましょう。
「Flaskでシンプルな家計簿REST APIを作ってみる」で、これまで学んだ知識を組み合わせた実践プロジェクトを扱います。
タグ: Flask, 初心者向け, デプロイ