Trouble Shooting / FAQ
運用中によくあるトラブルの対処法、導入時のよくある疑問、アクセス集中時の負荷軽減策
当日のトラブルシューティング
- 店舗の混雑・在庫ランプが更新できない原因: QR トークン認証が切れているか、ネットワークが一時的にオフラインです。
対応: 店舗管理画面を再読み込みするか、責任者用 QR コードを再スキャンしてください。 - 投票ボタンが押せない / 「期間外」と出る原因:
app_settingsの投票開始/終了時刻が現在時刻とズレているか、端末の時計が狂っています。
対応: 管理画面から投票終了時刻を延長するか、端末の自動時刻設定を確認してください。 - 画像や更新が反映されない原因: ブラウザまたは GitHub Pages の CDN キャッシュです。
対応: ブラウザのリロード (スーパーリロード) を行うか、シークレットウィンドウで確認してください。 - オフライン・圏外時の挙動動作: 直近に取得したキャッシュデータ (LocalStorage / SessionStorage) が維持され、画面が真っ白にならずに閲覧を継続できます。
アクセス集中・高負荷時の対策 (負荷軽減の仕組み)
来場者が一斉にアクセスした際、Supabase へのリクエスト集中やサーバーダウンを防ぐための最適化機能が標準で組み込まれています:
- ポーリング間隔の動的変更 (poll_interval_ms):管理画面
/adminまたは Supabase のapp_settingsテーブルでpoll_interval_msの値を変更 (例:30000→60000/120000) することで、再デプロイ不要で全端末の自動更新頻度を一括延長し、サーバー負荷を即座に下げることができます。 - 操作中のポーリング自動一時停止 (Suspended Polling):ユーザーがマップを閲覧中や、模擬店詳細モーダルを開いている間は、バックグラウンドの定期通信を自動でブロックし、無駄な API 通信を削減します。
- Realtime 接続時の通信スキップ:Supabase Realtime の WebSocket 接続が維持されている間は、HTTP による定期取得
fetchStallsOnlyを自動でスキップし、必要最低限の通信に抑えます。 - SessionStorage & メモリキャッシュ (fetchWithCache):取得したデータは端末の
sessionStorageにキャッシュされ、同一 TTL 内の重複リクエストは通信を行わずにキャッシュから瞬時に返却されます。
FAQ: 導入・運用
- Q. 完全無料で運用できますか?
はい。GitHub Pages (または Vercel / Cloudflare Pages) と Supabase の無料枠を組み合わせることで、完全無料で運用可能です。同時接続数が数千人を超える大規模イベントの場合のみ、イベント月だけ Supabase Pro プラン ($25/月) を契約することを推奨します。
- Q. プログラミング初心者でも導入できますか?
はい。基本的な設定は
src/constants/custom.config.tsとpublic/data/*.jsonのテキストを編集するだけで完了します。SQL もFull.sqlを Supabase のエディタに貼り付けて実行するだけで全自動構築されます。 - Q. イベント終了後のデータ保存はどうすればよいですか?
Supabase の管理画面 (Table Editor) から、投票ログやアンケート結果を CSV 形式で一括エクスポートできます。