個人開発でサーバーを持つのは、コストも管理も大変です。だからサーバーレスを選びました。その設計を整理しておきます。カサいる?のバックエンドは、Supabase(PostgreSQL + Edge Functions)を基盤に構築されています。サーバーレスアーキテクチャにより、運用コストを抑えつつスケール性を確保しています。
Edge Functionsの構成
1. get-weather(天気データプロキシ)
Open-Meteo APIへのリクエストをプロキシし、レスポンスをジオインデックス付きでキャッシュします。キャッシュキーは「type_lat_lng」形式(緯度・経度を小数点2桁で丸め)で、近接した位置のユーザー同士がキャッシュを共有できます。TTLは1時間で、upsert戦略で更新されます。
2. find-location(ジオコーディング)
Nominatim APIをラップし、住所文字列から座標への変換を行います。クライアントから直接Nominatimにアクセスするのではなく、Edge Functionを経由させることでレートリミットを適切に管理します。
3. send-scheduled-notifications(定期通知)
pg_cronから起動され、アクティブユーザーへの傘判定通知をバッチ送信します。
Row Level Security(RLS)
すべてのテーブルに「auth.uid() = user_id」のRLSポリシーが適用されており、ユーザーは自分のデータのみアクセス可能です。データベースレベルでのセキュリティを保証することで、API側の認可ロジックを簡素化しています。
データベース設計
主要テーブルは以下の通りです:
・kasairu_user_settings: ユーザー設定(ルート・通勤時刻・感度)
・user_notification_tokens: FCMトークン(デバイス単位)
・weather_cache: ジオインデックス付き天気キャッシュ
・notification_error_logs: 通知エラーログ
サインアップ時にはauth_triggerが自動的にユーザーレコードを作成し、アプリ側での明示的なユーザー作成処理を不要にしています。
サーバーレス設計やSupabaseを活用した高速な開発に興味がある方は、ぜひカサいる?紹介ページやその他の技術解説(降水確率判定ロジックの仕組みなど)も併せてご覧ください。