📝【Flask × SQLite】インフラエンジニアがゼロから作る ToDo アプリ③

IT、仕事

~Render で無料デプロイして Web 公開するまでの手順とハマりポイント~

前回の記事では、Flask と SQLite を使って
ローカルで動く ToDo アプリを作りました。

今回はその続きとして、
作ったアプリを Render(無料)で Web 公開する方法をまとめます。

実際にデプロイ中に遭遇したエラー
「sqlite3.OperationalError: no such table: task」
の解決方法も詳しく紹介します。

※この記事は画像を挿入しながら読めるように構成しています。
Render の画面キャプチャを適宜挿入すると読みやすくなります。


## 1. Render とは?(おさらい)

Render は、Web アプリを簡単にクラウド公開できるホスティングサービスです。

  • GitHub と連携して自動デプロイ
  • HTTPS 対応
  • サーバ構築不要
  • 無料枠あり

個人開発には最適で、Flask アプリとの相性も抜群です。


## 2. デプロイ前に必要なファイル

Render で Flask を動かすには、以下の3つが必須です。


### 2-1. requirements.txt

Flask や SQLAlchemy、そして Gunicorn を必ず入れます。

Flask
Flask-SQLAlchemy
gunicorn

ローカルで以下を実行すれば自動生成できます。

pip freeze > requirements.txt

### 2-2. Procfile

Render に「どうやってアプリを起動するか」を伝えるファイル。

web: gunicorn app:app
  • app.py の中にある app インスタンスを起動
  • 本番環境では Flask の app.run() は使わない

### 2-3. runtime.txt

Render で使用する Python バージョンを指定します。

python-3.12.1

ローカルと合わせるのが安全です。


## 3. GitHub に push する

Render は GitHub のコードを参照してデプロイするため、
必ず push しておきます。

git add .
git commit -m "Add Procfile and runtime.txt"
git push origin main

## 4. Render で Web Service を作成する

ここからは Render の画面操作です。

「ウェブサービス」という項目の「新しいウェブサービス」というボタンをクリックします。


### 4-1. GitHub リポジトリを選択

ToDo アプリのリポジトリを選びます。


### 4-2. 設定項目を入力

項目設定内容
Name任意(例:todo-app)
RegionSingapore
Branchmain
RuntimePython
Build Commandpip install -r requirements.txt
Start Commandgunicorn app:app
Instance TypeFree

### 4-3. Deploy をクリック

Render がビルド → 公開URL発行まで自動で行います。


## 5. デプロイ時に遭遇したエラー

❌ sqlite3.OperationalError: no such table: task

実際にデプロイした際、以下のエラーが発生しました。

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: task

これは Render 上の SQLite にテーブルが存在しないことが原因です。

ローカルでは tasks.db が作られていても、
Render の環境は まっさらな新規環境なので、
テーブルが存在しない状態でアプリが起動してしまいます。


## 6. 解決方法:db.create_all() をアプリ初期化時に実行する

Flask アプリの初期化直後に以下を追加します。

app = Flask(__name__)
db = SQLAlchemy(app)

# Render でも確実に実行される位置
with app.app_context():
    db.create_all()

✔ なぜこれで解決するのか?

  • Gunicorn がアプリを読み込む
  • Flask アプリが初期化される
  • その直後に db.create_all() が実行される
  • テーブルが作成される

Render でもローカルでも同じ動作になります。


## 7. 再デプロイで正常動作

修正後に GitHub に push → Render で再デプロイすると、
無事にアプリが起動し、タスク追加・削除ができるようになりました。


## 8. Render 無料プランの注意点

  • 一定時間アクセスがないとスリープ
  • 再起動時に初期化コードが走る
  • キャッシュが残る場合は翌日の再デプロイで直ることもある

今回のケースでも、翌日の再デプロイで正常動作しました。


## 9. まとめ

この記事では、Flask アプリを Render にデプロイする手順と、
実際に遭遇したエラーの解決方法を紹介しました。

✔ 必要なファイル

  • requirements.txt
  • Procfile
  • runtime.txt

✔ よくあるエラー

  • no such table: taskdb.create_all() を初期化時に実行

✔ Render の無料プランの特徴

  • スリープ → 再起動で初期化コードが走る
  • GitHub 連携で自動デプロイ可能

Render は個人開発に最適で、
Flask アプリを簡単に公開できる素晴らしいサービスです。


## 次回予告

次の記事では、
GitHub Actions を使った CI(自動テスト・Lint)構築編
に進みます。

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