Ops Notes 系列 Roadmap

計畫文件,不會被 Quartz 渲染(無 frontmatter)。案例計畫 + 子目錄規劃 + 寫作流程都在這。 公開頁 → ops-notes/index.md


系列定位

實戰踩坑筆記——不是教學,是「我踩過這個坑,症狀 / 診斷 / 根因 / 修法」的原始紀錄。主要資料來源是 proto/infra 專案真實 commit 歷史,未來吸收其他專案(quartz-blog、AI 工具、K8s 壓測平台)的踩坑。

跟 backend / infra / management 的分工

系列
ops-notes/(本系列)事件:真實踩坑案例(症狀驅動)
infra/設施:平台建立與運維設計
management/engineering-process/流程:事件處理方法論 / 事故管理
case-studies/案例:拆別人家的系統(不是自己踩的)

三層切法

  • 方法論(how to think)→ management/engineering-process/04-incident-management/
  • 平台設計(how the platform works)→ infra/
  • 具體事件(what happened to me)→ 本系列

每篇 ops-note 的標準模板

症狀(見到什麼錯)
   ↓
診斷(排除什麼、怎麼找到問題)
   ↓
原因(真正的根因)
   ↓
修法(commit 連結)
   ↓
可推廣教訓

Frontmatter:

---
title: "..."
tags: [ops-notes, k8s, kong, ...]
description: "..."
date: YYYY-MM-DD
severity: P0 / P1 / P2
time-to-fix: X hours / days
commits: [sha1, sha2]
---

資料來源

  • C:/Users/home/work/proto/infra/micro-service/ (微服務壓測平台)
  • C:/Users/home/work/proto/infra/gitlab/
  • C:/Users/home/work/proto/infra/monitor/
  • C:/Users/home/work/prd/quartz-blog/ (本部落格的踩坑)
  • C:/Users/home/work/tools/openclaw/ (AI Agent 平台)
  • 未來的新專案

主題群規劃(15 群)

Stage:🌱 seed(還沒寫)/ 🌿 growing / 🌳 mature

案例數 ≥ 5 的群 → 預先開子目錄(寫第一篇就建,避免後面搬)。

主題群案例數子目錄路徑狀態
O01 K8s 部署阻斷5ops-notes/k8s-deploy/✅ 已預開
O02 Kong Gateway8infra/gateway-mesh/kong/✅ 已在 I02 章
O03 Ingress 路由5ops-notes/ingress/✅ 已預開
O04 Docker / Registry5ops-notes/docker/✅ 已預開
O05 Probe 健康檢查4先扁平
O06 Env / Secret5ops-notes/env-secret/✅ 已預開
O07 CI/CD Pipeline5ops-notes/cicd/✅ 已預開
O08 資源限制可靠性4先扁平
O09 可觀測性5ops-notes/observability/✅ 已預開
O10 前端部署坑3先扁平
O11 Submodule4先扁平
O12 壓測調校3先扁平
O13 Meta / 方法論4先扁平吸收自 I10
O14 AI 工具踩坑估 6ops-notes/ai-tools/✅ 已預開(新增)
O15 Blog / 部落格部署估 5ops-notes/blog-deploy/✅ 已預開(新增)

案例總數:約 71(56 既有 + 15 新增 O14/O15 + 4 方法論)


主題群詳細清單

O01 K8s 部署阻斷排除(5 案例)

部署上不去、Pod 起不來、Service 連不通的系列。

#案例症狀來源 commitstage
01PVC 名稱與 NetworkPolicy 缺漏P0 部署阻斷3a99526🌱
02SecurityContext、Migration Job、Loki config部署驗證失敗3bc972c🌱
03Init Container resources 不足Migration 跑不起來ef48204🌱
04emptyDir 沒設 sizeLimit + hostPath 沒驗證 type安全性問題8f5b610🌱
05RabbitMQ SecurityContext 過嚴寫入權限錯誤72145bc🌱

O02 Kong Gateway 實戰坑(8 案例)

注意:Kong 案例歸到 infra/gateway-mesh/kong/ 子目錄(Kong 身份是 Gateway,不是純 ops 分類)。

#案例症狀來源 commitstage
01Kong ConfigMap YAML 縮進錯誤kustomize build 失敗1367e7byaml-indent 🌿
02Kong RSA Key 縮排 + YAML block scalarJWT plugin 載入失敗f422f66🌱
03Kong ConfigMap 被 kustomize 覆蓋為 placeholder路由失效a3ec1e9🌱
04Kong Sandbox 不允許 cjsonpost-function 失敗50fdb56🌱
05Kong ConfigMap Big5/ISO-8859 編碼載入失敗c4b5083🌱
06Kong 健康路由 + CORS origin 設定NodePort 連不通deb0ec7🌱
07Kong public key injectionJWT 驗證失敗b9469f7🌱
08Kong Metrics Port 與 Prometheus scrape指標收不到4ce0436🌱

O03 Ingress 與路由(5 案例)

#案例症狀來源 commitstage
01Ingress 綁 host 導致 OrbStack / IP 直連失敗無法直接 IP 連ab1eb5f🌱
02Ingress SSL redirect 先關閉(TLS 未備)連線迴圈a1dece6🌱
03Host-based routing + proxy-redirectbackstage 路由錯1e312da🌱
04backstage SPA base path 修正靜態資源 404aa656e8🌱
05frontstage SSR healthcheck 調整liveness probe 失敗7000cab🌱

O04 Docker / Registry 問題(5 案例)

#案例症狀來源 commitstage
01地端 Registry imagePullPolicy IfNotPresent拉不到 image10f6682🌱
02Migration Job image source 改地端CI 失敗d0b538c🌱
03DinD insecure registry + TLS 關閉Docker login 失敗c252a03🌱
04Frontend Docker build:.dockerignore + env schemabuild 時爆2d22aa6🌱
05Wait for DinD daemon before docker login時序 race175a612🌱

O05 Probe 與健康檢查(4 案例,先扁平)

#案例症狀來源 commitstage
01Fluent-bit HTTP server 沒啟用liveness probe 失敗760d9c4🌱
02Smoke test 改用 busybox podkubectl exec 失敗7ff47cf🌱
03Health check 路由修正/api/health 錯路徑0cb095f🌱
04FE startupProbe + Ingress TLS 預備啟動時探測過早af0b7b4🌱

O06 Env / Secret 管理(5 案例)

#案例症狀來源 commitstage
01Redis 密碼 $$ 跳脫(Docker Compose 提前展開)密碼變空419ed88🌱
02env 檔案 .env.example 對齊欄位漏掉08e41fd🌱
03env_file 管理(移除 environment)secret 洩漏風險dd9db1f🌱
04SecretGenerator + Staging Overlay環境隔離df802e1🌱
05CI variables 注入 secrets不走 file4ec506b🌱

O07 CI/CD Pipeline(5 案例)

#案例症狀來源 commitstage
01Typo bse64base64 in rollback stagerollback 失敗d0d93a6🌱
02地端 CI/CD 適配:lint + deployGitLab runner 設定4ec506b🌱
03Blue-green deploy + —no-switch 選項切換控制66ed6dc🌱
04藍綠部署腳本自動化人工切換風險642573e🌱
05Discord 部署通知無法得知部署狀態98a5281🌱

O08 資源限制與可靠性(4 案例,先扁平)

#案例症狀來源 commitstage
01HPA / PDB 設計(auth-service stress test)擴容不及3fc8ba8🌱
02Resource requests + DB pool 壓測調校OOM / 連線 timeoutcf96a90🌱
03Migration TTL 設定Job 殘留ef48204🌱
04FE HPA/PDB + Kong HPA流量波動應對e307265🌱

O09 可觀測性修補(5 案例)

#案例症狀來源 commitstage
01Prometheus scrape + NP port 限制指標丟失4ce0436🌱
02Grafana 穩定性 + PVC 註解重啟資料丟失2ba4871🌱
03Kong Prometheus plugin + Grafana dashboards缺 Kong 儀表板5dd4456🌱
04OTEL env vars 注入 backendtrace 不完整ec61ede🌱
05fluent-bit RBAC 加固日誌收集缺權限eb59114🌱

O10 前端部署坑(3 案例,先扁平)

#案例症狀來源 commitstage
01SPA base path 修正資源 404aa656e8🌱
02SSR healthcheck 調整probe 失敗7000cab🌱
03.dockerignore + env schema 對齊build 時 env 缺2d22aa6🌱

O11 Submodule 與多 repo 協作(4 案例,先扁平)

#案例症狀來源 commitstage
01auth-service 從 tracked files 改 submodule單 repo 太大5f80b21🌱
02switch-gitlab.sh 切換 remote本機 / 雲端 GitLab 切換5f80b21🌱
03Submodule 同步時機主 repo / sub repo 版本錯dbde1b9🌱
04b2e/f2e 前綴命名統一submodule 命名衝突5f5c2e1🌱

O12 壓測驅動的調校(3 案例,先扁平)

#案例症狀來源 commitstage
01HPA/PDB 調整(壓測 MS.2/MS.5/MS.8)負載下 scale 不夠3fc8ba8🌱
02Resource requests / DB pool tune壓測發現瓶頸cf96a90🌱
03Rate limit 調高(k6 壓測)壓測自己 rate limit 被擋e97c980🌱

O13 Meta / 方法論(吸收自 I10,4 篇)

跟 O01-O12 案例軸不同:O01-O12 是「踩過什麼」,O13 是「怎麼系統化處理這類問題」。

#主題SlugStage大綱
01為什麼需要 Runbook 系統o13-why-runbook-system🌱Tribal knowledge 散落在人腦;on-call 半夜 page 沒 context;Runbook 是機構記憶
02Runbook 系統設計o13-runbook-system-design🌱跟 alert 綁定;template 設計;git-based vs wiki vs Backstage TechDocs;怎麼避免 Runbook 過時
03K8s Troubleshooting 方法論o13-k8s-troubleshooting-methodology🌱Pod stuck Pending / CrashLoopBackOff / OOMKilled / ImagePullBackOff 的系統化診斷流程;具體案例見 O01
04K8s / Helm Upgrade 策略o13-upgrade-strategy🌱跨 version 升級計畫;破壞性變更對策;rollback 流程;跟 infra/k8s/07-k8s-troubleshooting 連動

O14 AI 工具踩坑(新增,估 6 案例)

資料來源tools/openclaw/ + prd/quartz-blog/ + 日常用 AI 工具踩的坑。

#案例(預期主題)子類Stage
01Claude Code Context 爆超耗 tokenClaude Code🌱
02Cursor rules 跟 Claude Code .claude/ 衝突Multi-tool🌱
03Ollama 本地模型 GPU / RAM 超限Local model🌱
04OpenAI / Anthropic API Rate Limit + Retry 策略API🌱
05MCP Server 連線不通 / tool schema 亂填MCP🌱
06AI Agent 無限 loop / Memory 爆Agent🌱

O15 Blog / 部落格部署坑(新增,估 5 案例)

資料來源prd/quartz-blog/ 本部落格的踩坑。

#案例(預期主題)子類Stage
01Quartz wikilink resolver 抓不到(文件重命名 / 搬家後)Wikilink🌱
02GitHub Actions build fail(frontmatter 格式 / plugin 錯)CI🌱
03Image 路徑問題(images/ 相對 vs 絕對 / 大小寫)Asset🌱
04Quartz plugin 設定導致 FolderPage 失效Plugin🌱
05部署到 GitHub Pages 失敗(build size / 路徑 / CNAME)Deploy🌱

跟 I09 Disaster Recovery 的 workflow 整合

I09 #26「DR event 完整 workflow」設計了閉環:

告警(I05 #26 chain)
   ↓
open ticket(PM07 Issue Tracker)
   ↓
runbook 執行(ops-notes O13 methodology)
   ↓
具體案例 commit(ops-notes O01-O12, O14-O15)
   ↓
postmortem(management/engineering-process/04)
   ↓
update runbook(ops-notes O13 #02)
   ↓
update Chaos test(infra/disaster-recovery/#23)

Convention:每個 ops-note 結尾加「相關 Runbook / Postmortem / Chaos test」區塊,做成閉環 traceability。

## 相關 Runbook / Postmortem / Chaos test
 
- Runbook:`ops-notes/O13/<runbook-slug>`
- Postmortem:`management/engineering-process/04-incident-management/<incident-slug>`
- Chaos test:`infra/disaster-recovery/25-first-chaos-experiment`(如有)
- Alert rule:`infra/observability/22-alert-design`(如有)

進度追蹤

Milestone

  • M1:O01 K8s 部署阻斷(5 篇,最多人踩)+ O02 Kong 第一案例(已 🌿)
  • M2:O06 Env/Secret + O07 CI/CD(5+5)
  • M3:O13 方法論 4 篇(建立 runbook 系統)
  • M4:O14 AI 工具 + O15 Blog 部署(新增)
  • M5:O09 可觀測性 + 剩餘

下一步

  1. 先從 O01(K8s 部署阻斷)、O02(Kong 坑)開始,這兩類最多人會踩
  2. 每篇以「症狀驅動」寫,讓 Google 搜尋症狀時能找到
  3. 抽離真實 commit 內容,去敏感化(密碼、internal URL 等)
  4. 每篇結尾加「相關 Runbook / Postmortem / Chaos test」閉環區塊

跨系列連結