02 インフラ構成
2.1 全体構成
【通常時】
Discord / WebUI (app.example.com)
↓ Cloudflare Tunnel
自宅鯖
├── DiscordBOT
├── WebUI(SvelteKit)
└── PostgreSQL(マスターDB)
↓ 即時同期
Turso + Cloudflare D1(ミラーDB)
↓ 日次
GitHub(バックアップ)
【自宅鯖ダウン時】
app.example.com
└── Tunnel切断時 → CF Pages WebUI へリダイレクト
CF Pages WebUI
↓ CF Workers API
Turso + Cloudflare D1(書き込みバッファ)
【自宅鯖復旧時】
ネットワーク監視(ping)が復旧を検知
↓
Turso + D1 → 自宅鯖内コピーDB(各々)
↓ タイムスタンプ・データ比較
├── 両方に同じ → PostgreSQL へ書き込み
├── 片方のみ → 両方に書き込み後 PostgreSQL へ
└── 両方にない → 無視
↓
PostgreSQL 最新化 → Turso + D1 全量再同期
2.2 フェイルオーバー
Cloudflare Tunnel のフォールバック機能を使用(CF Workers は不要)。
app.example.com
├── Tunnel 接続中 → 自宅鯖 WebUI へ
└── Tunnel 切断時 → CF Pages WebUI へリダイレクト
2.3 DBの役割
| DB | 役割 | 備考 |
|---|---|---|
| PostgreSQL | マスターDB・履歴保持 | 自宅鯖 |
| Turso | ミラー・障害時バッファ | SLA あり |
| Cloudflare D1 | ミラー・障害時バッファ | SLA なし・補助的 |
| GitHub | 日次バックアップ | 日次 dump |
2.4 ネットワーク監視
- 自宅鯖から外向きに ping
- ping 先:
8.8.8.8(Google)と1.1.1.1(Cloudflare)の両方 - 間隔:30 秒
- 復旧確定:3 回連続成功(90 秒後に確定)
ネットワーク状態判定
| Cloudflare | 判定 | 動作 | |
|---|---|---|---|
| ✅ | ✅ | 正常 | 通常運用 |
| ✅ | ❌ | CF 障害 | 自宅鯖のみで運用・同期スキップ |
| ❌ | ✅ | ネット切断 | 外部アクセス不可 |
| ❌ | ❌ | ネット切断 | 外部アクセス不可 |
2.5 CF 障害復旧時
PostgreSQL 全量を Turso + D1 へ再同期(キューなし・全量方式)。
2.6 データ出典(source 値)
| 値 | 説明 |
|---|---|
home-bot |
自宅鯖 DiscordBOT 経由 |
home-web |
自宅鯖 WebUI 経由 |
cf-web |
Cloudflare Pages WebUI 経由 |
d1 |
Cloudflare D1 経由 |
turso |
Turso 経由 |