diff --git a/CLAUDE.md b/CLAUDE.md index a0bab872..0b866933 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -123,6 +123,26 @@ | **部署層級** | `feedback_deployment_layer_decision.md` 🔴🔴🔴 主機/容器/K3s 必須評估 | | **告警鏈路** | `feedback_alertchain_e2e_validation.md` 🔴🔴🔴 Alertmanager→API→Telegram | | **Telegram Secrets** | `feedback_telegram_secrets_injection.md` 🔴🔴🔴 CD 必須自動注入 K8s Secrets | +| **🔴🔴🔴 前端內網禁令** | `feedback_docker_nextjs_api_url.md` + `feedback_sentry_local_network.md` | + +--- + +## 🔴🔴🔴 前端內網 IP 禁令 (2026-03-30) + +→ **詳細文件:** `feedback_docker_nextjs_api_url.md` + `feedback_sentry_local_network.md` + +**絕對禁止** 在 CD 建置時使用內網 IP: + +```yaml +# ❌ 觸發瀏覽器「存取區域網路」權限對話框 +--build-arg NEXT_PUBLIC_API_URL=http://192.168.0.125:32334 +--build-arg NEXT_PUBLIC_SENTRY_DSN=http://...@192.168.0.110:9000/2 + +# ✅ 必須使用公網域名 +--build-arg NEXT_PUBLIC_API_URL=https://awoooi.wooo.work +``` + +**原因**: `NEXT_PUBLIC_*` 是 build-time 變數,會寫死到 JS Bundle --- diff --git a/docs/HARD_RULES.md b/docs/HARD_RULES.md index aa29bf3a..b2006635 100644 --- a/docs/HARD_RULES.md +++ b/docs/HARD_RULES.md @@ -8,10 +8,10 @@ | 欄位 | 值 | |------|-----| -| **版本** | v1.5 | +| **版本** | v1.6 | | **建立日期** | 2026-03-20 (台北) | | **建立者** | Claude Code | -| **最後修改** | 2026-03-26 13:00 (台北) | +| **最後修改** | 2026-03-30 02:30 (台北) | | **修改者** | Claude Code | ### 變更紀錄 @@ -23,7 +23,8 @@ | v1.2 | 2026-03-24 | Claude Code | 新增 Deployment Verification | | v1.3 | 2026-03-25 | Claude Code | 新增 Timezone Taipei | | v1.4 | 2026-03-25 | Claude Code | 新增 Change Annotation + 文件資訊區塊 | -| v1.5 | 2026-03-26 | Claude Code | 關聯紅區治理 (RED_ZONES.md) +| v1.5 | 2026-03-26 | Claude Code | 關聯紅區治理 (RED_ZONES.md) | +| v1.6 | 2026-03-30 | Claude Code | 🔴🔴🔴 前端內網 IP 禁令 (瀏覽器權限事故) | --- @@ -46,6 +47,33 @@ | **簽核 UI** | **清空內容** | **保留原始內容** | [→ Approval Preserve Content](#approval-preserve-content) | | **時區** | **UTC/utcnow** | **台北時區 +8** | [→ Timezone Taipei](#timezone-taipei) | | **變更追蹤** | **無註解** | **人事物+版本+台北時區** | [→ Change Annotation](#change-annotation) | +| **🔴🔴🔴 前端建置** | **內網 IP** | **公網域名** | [→ Frontend Internal IP](#frontend-internal-ip) | + +--- + +## 🔴🔴🔴 Frontend Internal IP + +**Memory:** `feedback_docker_nextjs_api_url.md` + `feedback_sentry_local_network.md` + +**絕對禁止** 在 CD 建置時使用內網 IP: + +```yaml +# ❌ 禁止 - 觸發瀏覽器「存取區域網路」權限對話框 +--build-arg NEXT_PUBLIC_API_URL=http://192.168.0.125:32334 +--build-arg NEXT_PUBLIC_SENTRY_DSN=http://...@192.168.0.110:9000/2 + +# ✅ 正確 - 使用公網域名 +--build-arg NEXT_PUBLIC_API_URL=https://awoooi.wooo.work +``` + +**為什麼這是 Hard Rule:** +- `NEXT_PUBLIC_*` 是 **build-time** 變數,會寫死到 JS Bundle +- Runtime 設定 (K8s ConfigMap/Secret) 對 Next.js 無效 +- 內網 IP 會觸發瀏覽器安全機制,彈出權限對話框 +- UX 極差,尤其無痕模式 + +**2026-03-30 事故回顧:** +CD Pipeline 使用 `http://192.168.0.125:32334` 建置,導致所有 API 請求指向內網 VIP。 --- diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index b9545e63..18243cbd 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -5,7 +5,7 @@ --- -## 📍 當前狀態 (2026-03-30 14:30 台北) +## 📍 當前狀態 (2026-03-30 02:30 台北) | 項目 | 狀態 | |------|------| @@ -43,6 +43,43 @@ | **Wave 2 Worker HPA** | ✅ **已部署** (min:1 max:3, CPU 70%) | | **Wave C-D 監控** | ✅ **全部完成** (generate + discover + coverage_report) | +## 🔴 RCA: 瀏覽器區域網路權限對話框 (2026-03-30 02:30 台北) + +### 問題 + +瀏覽器彈出「存取區域網路上的其他裝置」權限對話框,Dashboard SSE 連線失敗。 + +### 根因 + +CD Pipeline 建置時使用內網 IP: +```yaml +--build-arg NEXT_PUBLIC_API_URL=http://192.168.0.125:32334 # ❌ 內網 VIP +``` + +`NEXT_PUBLIC_*` 是 build-time 變數,寫死到 JS Bundle,Runtime ConfigMap 無效。 + +### 修復 + +```yaml +--build-arg NEXT_PUBLIC_API_URL=https://awoooi.wooo.work # ✅ 公網域名 +``` + +### 已更新文件 + +| 文件 | 更新內容 | +|------|----------| +| `.gitea/workflows/cd.yaml` | 改用公網域名 | +| `CLAUDE.md` | 新增前端內網 IP 禁令章節 | +| `docs/HARD_RULES.md` | v1.6 新增 Frontend Internal IP 規則 | +| `feedback_docker_nextjs_api_url.md` | 新增禁止內網 IP 說明 | +| `feedback_sentry_local_network.md` | 新增事故回顧 | + +### 下一步 + +- 推版觸發 CD 重新建置 + +--- + ## ✅ Phase 19.4 Terminal Service API 整合 (2026-03-30 14:30 台北) ### 實作內容