Rails 8 + SQLite — プロダクションで使える理由
PostgreSQLなしでもいい時代が来た — 37signalsが証明したSQLiteプロダクション運用
Rails 8からSQLiteがプロダクション環境で公式に推奨されるデータベースになった。「SQLiteは開発用」という認識はもう過去のものだ。
なぜ今SQLiteか?
Rails 8で導入されたSolidシリーズ(Solid Queue、Solid Cache、Solid Cable)がゲームチェンジャーだ。以前はRedis(キャッシュ、ジョブキュー)とPostgreSQL(DB)を別々に運用する必要があったが、今はSQLite1つでDB+キャッシュ+ジョブキュー+WebSocketまで全て処理できる。
37signals(Basecamp、HEY開発元)がこの構成を実際のプロダクションで使用している。DHH(Rails創設者)自身が「ほとんどのWebアプリにPostgreSQLは過剰」と発言している。
SQLiteがプロダクションで使える理由
- サーバーレス — 別プロセス/ポート不要でファイル1つで動作。DBサーバー管理不要
- WALモード — Write-Ahead Loggingで読み書き同時実行性が大幅改善
- Solidシリーズ — Redis/Memcachedなしでキャッシュ・ジョブ・ケーブル全てSQLiteベース
- デプロイ簡素化 — DBサーバー設定、コネクションプール管理、マイグレーション順序の心配不要
- コスト削減 — RDS/CloudSQL等のマネージドDB費用がゼロ
- バックアップ簡単 — ファイルコピー1回で全バックアップ完了
PostgreSQLが依然必要な場合
同時書き込みが非常に多いアプリ(秒間数千件以上のINSERT)
複数サーバーから同じDBにアクセスする場合(SQLiteはシングルサーバー)
jsonb、Full Text Search、PostGIS等PostgreSQL専用機能が必要な場合
既にPostgreSQLベースのインフラが構築された大規模チーム
ほとんどの中小規模アプリ、1人/少人数チームプロジェクト、SaaS MVP、サイドプロジェクトにはSQLiteで十分。
Rails 8 Solidシリーズ — Redis/PostgreSQLなしで全てSQLite
| 機能 | 以前(Rails 7) | 現在(Rails 8) |
|---|---|---|
| データベース | PostgreSQL / MySQL | SQLite(WALモード) |
| バックグラウンドジョブ | Sidekiq + Redis | Solid Queue(SQLite) |
| キャッシュ | Redis / Memcached | Solid Cache(SQLite) |
| WebSocket | Action Cable + Redis | Solid Cable(SQLite) |
| 必要な外部サービス | PostgreSQL + Redis(最低2つ) | なし(ファイルのみ) |
SQLite推奨
- ✓ 1人または少人数チーム
- ✓ SaaS MVP、サイドプロジェクト
- ✓ インフラコスト最小化
- ✓ 読み取り中心のアプリ
- ✓ シングルサーバーで十分
PostgreSQL推奨
- ✓ 秒間数千件以上の同時書き込み
- ✓ マルチサーバー構成が必要
- ✓ jsonb、PostGIS、FTSが必要
- ✓ 既存PostgreSQLインフラがあるチーム
- ✓ 水平スケーリング計画あり
キーポイント
Rails 8プロジェクト作成時、デフォルトDBが既にSQLite(別途設定不要)
config/database.ymlでWALモード有効化を確認(Rails 8デフォルト設定)
Solid Queue(ジョブ)、Solid Cache(キャッシュ)、Solid Cable(WebSocket)を有効化
KamalまたはFly.ioでデプロイ — DBサーバー設定自体が不要
jsonbの代わりにjson型を使用(SQLiteはjsonb非対応)
メリット
- ✓ インフラ構成ゼロ — DBサーバー、Redis、Memcached全て不要
- ✓ デプロイ簡素化 — ファイルコピーだけでDB移行可能
- ✓ RDS/CloudSQL費用ゼロ — 毎月数千円節約
- ✓ レイテンシ最小 — ネットワークホップなしでディスク直接アクセス
- ✓ 37signalsが実プロダクションで検証済み
デメリット
- ✗ シングルサーバー専用 — 複数サーバーからの同時アクセス不可
- ✗ 同時書き込みボトルネック — 大量INSERT時にパフォーマンス低下の可能性
- ✗ jsonb、PostGIS、Full Text Search等PostgreSQL専用機能非対応
- ✗ 水平スケーリング不可 — トラフィック急増時は垂直スケーリングのみ