09 DB 同期仕様
9.1 通常時の同期
自宅鯖の PostgreSQL(マスター)への書き込みと同時に Turso + Cloudflare D1 へ即時同期する。
書き込みリクエスト(BOT / WebUI)
↓
自宅鯖 API
↓ 即時
PostgreSQL(マスター)
↓ 即時同期
Turso + Cloudflare D1(ミラー)
9.2 CF 障害時の動作
Google ping ✅ / Cloudflare ping ❌ と判定された場合:
- 自宅鯖のみで運用
- Turso・D1 への同期をスキップ
- CF 側への書き込みは受け付けない
CF 障害復旧時
PostgreSQL 全量を Turso + D1 へ再同期(キューなし・全量方式)。
CF 障害復旧を検知
↓
PostgreSQL → Turso 全量再同期
PostgreSQL → D1 全量再同期
9.3 自宅鯖ダウン時の動作
Tunnel 切断を検知し、CF Pages WebUI へリダイレクト。
- CF Pages WebUI → CF Workers API → Turso / D1 への書き込みバッファとして機能
- 書き込みは Turso・D1 両方へ行う
9.4 自宅鯖復旧時のマージロジック
ネットワーク監視(ping)が復旧を検知後、以下の手順で PostgreSQL を最新化する。
復旧検知(3 回連続 ping 成功・90 秒後確定)
↓
Turso → 自宅鯖内コピー DB(Turso コピー)
D1 → 自宅鯖内コピー DB(D1 コピー)
↓ タイムスタンプ・データ比較(レコード単位)
├── Turso コピーと D1 コピーの両方に同じレコード → PostgreSQL へ書き込み
├── 片方のみにあるレコード → 両方のコピーに書き込み後 PostgreSQL へ
└── 両方にないレコード → 無視
↓
PostgreSQL 最新化
↓
Turso + D1 全量再同期
比較ルール
| 状態 | 処理 |
|---|---|
| Turso・D1 両方に同じ | PostgreSQL へ書き込み |
| 片方のみに存在 | 存在しない方へ書き込み → PostgreSQL へ書き込み |
| 両方に存在しない | 無視 |
9.5 バックアップ同期
日次で PostgreSQL を GitHub へダンプ・push する。
詳細は 13_operation.md を参照。