# GCP Ollama Nginx Proxy 部署指南 > ADR-110 三層容災 — 啟用 GCP Ollama 的關鍵步驟 > > 2026-05-05 修正:此 runbook 只保留為過渡 / rollback bridge。正式方案改用 > ADR-125 的 WireGuard private mesh 與 AwoooP Inference Gateway。新部署不得把 > GCP `11434/tcp` 對 `0.0.0.0/0` 長期開放。 --- ## 背景 GCP Ollama (34.143.170.20 / 34.21.145.224) 已部署完成。 最初透過 192.168.0.110 (DevOps 金庫) 架設 nginx 反向代理,讓 K3s Pod 走內網連線 GCP Ollama。 2026-05-06 現況:K3s Pod 已可直連 GCP-A/GCP-B `11434/tcp`,且 production 暫時改用 direct endpoint,避開 110 上舊 `conf.d/ollama-gcp-proxy.conf` 的 120s `proxy_read_timeout`。正式長期方案仍是 ADR-125 WireGuard mesh。 --- ## 部署檔案 | 檔案 | 用途 | |-----|------| | `infra/ansible/roles/nginx/templates/110-ollama-proxy.conf.j2` | nginx 配置模板 | | `infra/ansible/playbooks/nginx-sync.yml` | Ansible Playbook | --- ## 執行部署 ```bash # 1. 進入 Ansible 目錄 cd /Users/ogt/awoooi/infra/ansible # 2. 部署到 110 (Dry-run 先驗證) ansible-playbook -i inventory/hosts.yml playbooks/nginx-sync.yml --tags 110 --check # 3. 正式部署 ansible-playbook -i inventory/hosts.yml playbooks/nginx-sync.yml --tags 110 ``` --- ## 驗證部署 ### 從 110 本機驗證 ```bash # 測試 GCP-A proxy curl http://127.0.0.1:11435/api/tags # 測試 GCP-B proxy curl http://127.0.0.1:11436/api/tags ``` ### 從 K3s Node 驗證 ```bash # 進入 K3s node (120 或 121) ssh wooo@192.168.0.120 # 測試連線 110 proxy curl http://192.168.0.110:11435/api/tags curl http://192.168.0.110:11436/api/tags ``` ### 從 K8s Pod 驗證 ```bash # 進入 API Pod kubectl exec -it -n awoooi-prod deployment/awoooi-api -- bash # 測試連線 apt-get update && apt-get install -y curl curl http://192.168.0.110:11435/api/tags ``` --- ## 啟用 GCP Ollama 代理部署完成後,修改 ConfigMap 啟用 GCP 端點: ```bash # 編輯 ConfigMap kubectl edit configmap -n awoooi-prod awoooi-config ``` 若使用 nginx bridge,修改以下欄位: ```yaml # 修改前 OLLAMA_URL: "http://192.168.0.111:11434" OLLAMA_SECONDARY_URL: "http://192.168.0.110:11435" OLLAMA_FALLBACK_URL: "http://192.168.0.110:11436" # 修改後 (啟用 GCP-A 作為 Primary) OLLAMA_URL: "http://192.168.0.110:11435" # GCP-A via proxy OLLAMA_SECONDARY_URL: "http://192.168.0.110:11436" # GCP-B via proxy OLLAMA_FALLBACK_URL: "http://192.168.0.111:11434" # Local GPU 最後防線 ``` 重啟 Deployment: ```bash kubectl rollout restart deployment/awoooi-api -n awoooi-prod ``` 若需要繞過 110 bridge timeout,使用 direct GCP endpoint: ```yaml OLLAMA_URL: "http://34.143.170.20:11434" OLLAMA_SECONDARY_URL: "http://34.21.145.224:11434" OLLAMA_FALLBACK_URL: "http://192.168.0.111:11434" OLLAMA_DIAGNOSE_TIMEOUT_SECONDS: "300" INCIDENT_LLM_TIMEOUT_SECONDS: "360" ``` --- ## 確認模型已載入 GCP Ollama 必須已載入以下模型: ```bash # GCP-A 檢查 curl http://34.143.170.20:11434/api/tags | jq '.models[].name' # 必須包含: # - bge-m3:latest (embedding) # - qwen2.5:7b-instruct (health check) # - qwen3:14b (RCA analysis) # - hermes3:latest (tool calling) # - deepseek-r1:14b (reasoning) ``` 若模型未載入,SSH 到 GCP 主機執行: ```bash ollama pull bge-m3:latest ollama pull qwen2.5:7b-instruct ollama pull qwen3:14b ollama pull hermes3:latest ollama pull deepseek-r1:14b ``` --- ## 部署檢查清單 - [ ] Ansible playbook 執行成功 (110) - [ ] 110:11435 監聽確認 (`ss -tlnp | grep 11435`) - [ ] 110:11436 監聽確認 (`ss -tlnp | grep 11436`) - [ ] K3s node 可連線 110:11435/11436 - [ ] K8s Pod 可連線 110:11435/11436 - [ ] GCP-A/B 模型已載入 - [ ] ConfigMap 已修改 - [ ] Deployment 已重啟 - [ ] API Pod 啟動無錯誤 - [ ] 推理測試成功 (檢查 latency < 10s) --- ## 常見問題 ### 1. K3s Pod 連線被拒絕 檢查 NetworkPolicy: ```bash kubectl describe networkpolicy -n awoooi-prod allow-required-egress ``` 確認包含: ```yaml - to: - ipBlock: cidr: 192.168.0.110/32 ports: - protocol: TCP port: 11435 - protocol: TCP port: 11436 ``` ### 2. nginx 無法連線 GCP 檢查 110 外網連線: ```bash curl -v http://34.143.170.20:11434/api/tags ``` 若失敗,只允許短時間確認 GCP 防火牆是否對 110 的固定出口 IP 開放 `11434/tcp`。不得把 `0.0.0.0/0:11434` 當成正式設定。 正式切換請改走 [GCP-OLLAMA-WIREGUARD-MESH.md](GCP-OLLAMA-WIREGUARD-MESH.md)。 ### 3. 模型載入但推理失敗 檢查 GCP VM 記憶體/CPU 使用率: ```bash # GCP Console → Compute Engine → VM 執行個體 → 監控 ``` 若記憶體不足,升級機型或減少同時載入模型數量。 --- ## 相關文件 - ADR-110: GCP 三層容災架構 - ADR-125: GCP Ollama Private Mesh and AwoooP Inference Gateway - `k8s/awoooi-prod/04-configmap.yaml` - `k8s/awoooi-prod/02-network-policy.yaml` - `docs/runbooks/RUNBOOK-OLLAMA-FAILOVER.md` - `docs/runbooks/GCP-OLLAMA-WIREGUARD-MESH.md` - `docs/runbooks/AWOOOP-INFERENCE-GATEWAY.md` --- ## 負責人 - 建立: Claude Sonnet 4.6 — 2026-05-04 - 審查: 首席架構師 ogt