# ADR-110: GCP Ollama 三層容災拓撲

**狀態**: 已採用
**日期**: 2026-05-03 (台北時區)
**決策者**: 統帥
**關聯**: 取代 ADR-105（Revert A2 Ollama Primary）

> 2026-05-05 修正：本 ADR 的「GCP-A → GCP-B → 111 → paid provider」邏輯仍有效，
> 但公網 GCP IP / 110 nginx proxy 僅為過渡傳輸。正式傳輸與 runtime
> 管理由 ADR-125（GCP Ollama Private Mesh and AwoooP Inference Gateway）取代。

---

## 背景

2026-04-27 訂立「192.168.0.111 唯一 Ollama」鐵律（ADR-105），當時 GCP 主機尚未就緒。
2026-05-03 兩台 GCP SSD 主機（34.143.170.20 / 34.21.145.224）正式上線，具備：
- 9x 模型載速（SSD vs HDD）
- 2x 推理效能
- 免費方案（成本零增加）

## 決策

採用三層 Ollama 容災架構，GCP 主機優先：

### 路由優先序

| 層級 | URL | 說明 |
|------|-----|------|
| Primary (GCP-A) | http://34.143.170.20:11434 | SSD 高效能主機 |
| Secondary (GCP-B) | http://34.21.145.224:11434 | SSD 高效能備援 |
| Fallback (Local) | http://192.168.0.111:11434 | M1 Pro Local HDD 最後防線 |
| 緊急 | Gemini → Nemotron → Claude | 全部 Ollama 掛掉時 |

### 決策矩陣

```
GCP-A HEALTHY                     → primary=GCP-A, fallback=[GCP-B, Local]
GCP-A not HEALTHY + GCP-B HEALTHY → primary=GCP-B, fallback=[Local]
GCP-A + GCP-B 不健康 + Local OK  → primary=Local, fallback=[Gemini]
所有 Ollama 不健康                 → primary=Gemini, fallback=[Nemotron, Claude]
```

### Config 欄位映射

| 欄位 | 值 | 說明 |
|------|-----|------|
| OLLAMA_URL | http://34.143.170.20:11434 | GCP-A Primary |
| OLLAMA_SECONDARY_URL | http://34.21.145.224:11434 | GCP-B Secondary（新增欄位）|
| OLLAMA_FALLBACK_URL | http://192.168.0.111:11434 | Local HDD Fallback |

## 安全考量

GCP IP（34.143.170.20, 34.21.145.224）屬公網 IP，已加入 config.py 的 `_ALLOWED_PUBLIC_IPS`
白名單，繞過 RFC1918 私網限制。任何不在白名單的公網 IP 仍會被拒絕（端點中毒防護不變）。

K8s NetworkPolicy egress 已新增 GCP-A/GCP-B 的 /32 出口規則（port 11434）。

## 取代的決策

- **ADR-105**: Revert A2 Ollama Primary（已廢止，被本 ADR 取代）
- `feedback_ollama_111_only.md`：更新為新三層容災鐵律

## 結果

- Ollama 主要流量走 GCP SSD，效能提升
- Local 111 保留為最後防線，不棄用
- Gemini/Nemotron/Claude fallback 鏈不變

## 2026-05-05 現場校正

冷啟動救援期間的實測顯示：

- GCP-A / GCP-B 透過 110 nginx proxy 可連線，但長 prompt 曾出現 504。
- `/api/ps` 顯示 GCP-A / GCP-B `size_vram: 0`，因此不可假設它們等同 111 GPU/VRAM 推理能力。
- 告警同步路徑必須使用 `gemma3:4b` 這類 fast lane 模型；14B/32B 模型需移到 async 或 111/GPU 節點。
- 公網 `34.143.170.20:11434` / `34.21.145.224:11434` 不再視為最終安全架構。

後續以 ADR-125 為準：WireGuard private mesh 是正式網路層，AwoooP
Inference Gateway 是正式 runtime 層。
