はじめに
前回までで、家計簿アプリの機能面(一覧表示、追加・削除、データベース保存、集計・グラフ表示)はひと通り完成した。最終回となる今回は、これまでCodespaces上だけで動かしてきたこのアプリを、Renderを使ってインターネット上に公開する。
今回やること
- 本番環境向けのWebサーバー「gunicorn」を導入する
Procfileを用意し、Renderにアプリの起動方法を伝える- RenderでWebサービスを作成し、実際にデプロイする
なぜgunicornが必要なのか
これまで使ってきたflask --app app run --debugは、あくまで開発中の動作確認用のサーバーである。実際、起動時にも次のような警告が表示されていたはずである。
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
本番環境(実際にインターネット上に公開する環境)では、多くのアクセスを安定してさばけるgunicornのような、本番用のWSGIサーバーを使うのが一般的である。今回はこのgunicornを導入する。
requirements.txtに1行追加するだけでよい。
Flask==3.0.3
gunicorn==22.0.0
Procfileの用意
Renderに「このアプリをどうやって起動すればよいか」を伝えるため、Procfileという名前のファイルを用意する。
Procfile
web: gunicorn --bind 0.0.0.0:$PORT app:app
web::Webサービスとして起動することを示すgunicorn --bind 0.0.0.0:$PORT app:app:app.pyの中のapp(Flaskインスタンス)を、gunicornで起動するコマンド$PORT:Render側が自動的に割り当てる、待ち受けポート番号。コード側で指定する必要は無く、環境変数としてRenderが用意してくれる
Renderとは
Renderは、GitHubリポジトリと連携するだけでWebアプリを公開できる、クラウドホスティングサービスである。自分でサーバーを用意したり、OSのセットアップをしたりする必要が無く、「コードをpushすれば、そのまま公開される」という手軽さが特徴である。無料プランも用意されているため、今回のような学習用アプリの公開先として利用する。
Renderでのデプロイ手順
ここからはRenderのダッシュボード上での作業になる。
1. Renderのアカウントを作成する
1.Render公式サイトにアクセスし、「Start for free」ボタンを押下する。
2.「Create an account」画面が表示される。GitHub・GitLab・Bitbucket・Googleのアイコンが並んでいるので、「GitHub」を選択しよう。GitHubアカウントと連携しておくと、あとでリポジトリを選ぶ際にそのままアカウントが使え、認証の手間が省ける(メールアドレスとパスワードでの登録も可能だが、その場合は後述の手順でGitHubとの連携を別途行うことになる)

GitHub側の認証画面が表示されたら、「Authorize Render」のようなボタンを押して連携を許可する
認証が完了すると、そのまま「Create a new Service」という画面に進む。これでアカウント作成は完了である
2. 新しいWebサービスを作成する
「Create a new Service」画面には、「Choose service → Configure → Deploy」という3段階のステップが表示されており、今は最初の「Choose service」の段階にいる。画面には、Static Sites・Web Services・Private Services・Background Workers・Cron Jobs・Postgres・Key Value・Workflowといった、サービスの種類がカードで並んでいる。

1.「Web Services」のカードにある「New Web Service」を選ぶ
2.「Git Provider」タブが選ばれた状態の画面が表示される。サインアップ時の連携だけではリポジトリへのアクセス権限までは付与されていないため、ここでは「No repositories found」と表示される

3.「Configure your Git provider to give Render permission to access your repositories」という案内の下にある「GitHub」ボタンを押下する
「Install Render」という画面に移動し、「Where do you want to install Render?」と聞かれる。GitHubアカウントを複数お持ちの場合はここに一覧が表示されるので、今回のブログ用アカウント(例:HappyTalk10)を選ぶ
「Install & Request Render」という画面になる。「All repositories」(すべてのリポジトリ)と「Only select repositories」(リポジトリを個別に選択)のどちらかを選べるので、ここでは「Only select repositories」を選び、「Select repositories」からpc-labo-python-learningだけを選択する

画面下部で、Renderに許可する権限(コードの読み取りなど)が表示されるので、内容を確認して「Install & Request」を押す
Renderの画面に戻ると、リポジトリの一覧にpc-labo-python-learningが表示されるようになるので、選択して「Connect」を押す
3. サービスの設定を入力する
リポジトリを選択すると、設定画面に移る。以下の項目を入力する。
| 項目 | 値 |
|---|---|
| Name | お好みのサービス名(例:pc-labo-kakeibo) |
| Root Directory | 06_deploy-render |
| Runtime | Python 3 |
| Build Command | pip install -r requirements.txt |
| Start Command | gunicorn --bind 0.0.0.0:$PORT app:app |
| Instance Type | Free |
「Root Directory」を06_deploy-renderに指定するのがポイントである。これまでの連載では、1つのリポジトリの中に複数回分のフォルダが並んでいるため、「どのフォルダを対象にデプロイするか」をRender側に教えてあげる必要がある。これを指定し忘れると、リポジトリのルートを対象にビルドしようとしてエラーになる。
なお「Instance Type」は、料金プランを選ぶ一覧($0/月・$7/月・$25/月……)の形で表示される。一番上の「$0 / month」(0.1 CPU・512 MB RAM)が無料プランなので、これを選ぶ。この一覧のすぐ上には、無料プランに関する注意書きが表示される。
無料プランは、一定時間操作が無いとスリープする。また、SSHアクセス・スケーリング・単発ジョブ・永続ディスクには対応していない。

「永続ディスクには対応していない」という一文が、まさに今回のdatabase.dbに関わる部分である。この点は後ほど改めて説明しよう。
4. デプロイを開始する
1.画面下部の「Deploy web service」を押すと、ビルドとデプロイが自動的に始まる

2.画面にはビルド・起動の様子を示すログが表示される。なお、ビルドが数十秒程度で終わることも多く、あっという間に流れて見えないこともある。あとから確認したい場合は、サービス画面の「Logs」タブから、pip installの実行内容やStarting gunicornといった起動ログを振り返って見ることができる
3.ビルドが完了すると、画面上部にhttps://(サービス名).onrender.comのようなURLが表示される
動作確認
発行されたURLにアクセスし、これまでCodespaces上で確認してきたのと同じように、一覧表示・追加・削除・集計ページが動作することを確認しよう。


データが消えることについて
Renderの無料プランには、実用上、大事な制約が2つある。
- ファイルシステムが永続化されない
database.dbは、Renderのファイルシステムが永続化されないため、再デプロイやサーバーの再起動などによって、サーバー上で追加・変更したデータが失われる。
今回はSQLiteのファイルをそのままサーバー上に置く構成のため、この制約を受ける。 - 一定時間アクセスが無いとスリープする
しばらく誰もアクセスしないと自動的に停止し、次のアクセス時に起動し直すため、初回アクセス時には起動に時間がかかり、表示までしばらく待たされることがある。
学習用の題材としては、これらの制約があっても「実際に公開してみる」という体験自体に価値があるため、今回はこの構成のまま進めている。もし本番のサービスとしてデータを保持し続けたい場合は、Render Postgresなどの永続化されたデータベースサービスを使うのが一般的である。
シリーズを振り返って
第1回のFlask環境構築から始まり、テンプレート表示、フォーム操作、SQLiteでの永続化、集計・グラフ表示、そして今回のデプロイまで、全6回で家計簿アプリを一通り完成させた。
React編がフロントエンドの基礎を扱ったのに対し、今回のPython編ではバックエンド・データベース・デプロイという、Webアプリのサーバー側の基礎を体験できたのではないかと思う。
ソースコード
GitHub:pc-labo-python-learning/06_deploy-render


