Zenovayは4つの相互接続されたサービスの分散システムとして構築されており、それぞれが特定の役割のために最適化されています。それらが共にどのように機能するかを理解することは、効果的な開発とデバッグに不可欠です。
サービスの概要
プラットフォームはCloudflareのエッジネットワーク上に独立してデプロイされた4つの主要サービスで構成されています:
- ランディング(zenovay.com) — マーケティングサイトとパブリックページ。SEOと高速ロードのために最適化された静的Next.jsエクスポート。
- 認証(auth.zenovay.com) — 集中認証サービス。ログイン、サインアップ、OAuth、SSO、MFAフローを処理します。
- アプリ(app.zenovay.com) — メインのアナリティクスダッシュボード。リアルタイムデータビジュアライゼーション、セッションリプレイ、チーム管理。
- API(api.zenovay.com) — バックエンドサービス。イベントトラッキング、データ処理、請求、サードパーティ統合。
クロスサービスコミュニケーション
サービスは、セキュリティを維持しながらシームレスなユーザーエクスペリエンスを実現するために、明確に定義されたパターンを通じて通信します:
- 認証 → アプリ: 認証が成功すると、ユーザーはセキュアなトークンとともにアプリにリダイレクトされます。セッション状態はBroadcastChannel APIを使用してタブ間で同期されます。
- アプリ → API: ダッシュボードはベアラートークンを使用してAPIに認証済みリクエストを行います。すべてのアナリティクスクエリ、請求操作、データ変更がここを経由します。
- トラッキング → API: 軽量トラッキングスクリプト(5KB未満)は、広告ブロッカーフレンドリーなエンドポイントへのPOSTリクエストを通じてAPIにイベントを直接送信します。
トークンフロー
認証はサービス間でセキュアなフローに従います:
- ユーザーがauth.zenovay.comにログイン
- Supabaseがアクセストークンとリフレッシュトークンを発行
- トークンはXSS保護のためにhttpOnlyクッキーに保存
- アプリはミドルウェアを通じて各リクエストでトークンを検証
- APIエンドポイントは認可のためにベアラートークンを検証
- リフレッシュトークンは再利用を防ぐために自動的にローテーション
Cloudflareのデプロイ
パフォーマンスと信頼性のためにCloudflareのエコシステムを広範に活用しています:
- Pages: ランディングとアプリフロントエンドの静的サイトホスティング
- Workers: エッジで動作するサーバーレスAPI関数
- KV: レート制限、セッションロック、カスタムエンドポイントマッピングのためのキーバリューストレージ
- R2: チームアバターとセッション録画のためのオブジェクトストレージ
- Turnstile: ユーザーに摩擦を与えないボット保護
データベースアーキテクチャ
Supabase(PostgreSQL)はいくつかの重要な設計判断を伴う主要データベースです:
- チームベースのマルチテナンシー: すべてのデータは個々のユーザーではなくチームにスコープされています。これによりデフォルトでコラボレーションが可能になります。
- Row Level Security(RLS): データベースレベルのポリシーにより、ユーザーは自分が閲覧を許可されたデータのみにアクセスできます。
- リアルタイムサブスクリプション: ライブ訪問者データがSupabaseのリアルタイムチャネルを通じてダッシュボードにストリームされます。
- 適用のためのトリガー: プランの上限と使用状況の追跡はアプリケーションコードだけでなく、データベースレベルで適用されます。