回滾計畫範本(Rollback Plan)

參照標準:ITIL 4(Release and Deployment Management)/ ISO/IEC 20000-1:2018
文件用途:定義版本上線後若出現嚴重問題時的回復策略與操作步驟
適用階段:部署上線階段(Deployment Phase)— Change Enablement


📋 章節目錄

  1. 文件資訊
  2. 回滾觸發條件
  3. 回滾決策流程
  4. 回滾策略
  5. 回滾前準備
  6. 回滾執行步驟
  7. 資料庫回滾
  8. 回滾驗證
  9. 通知與溝通
  10. 回滾後行動

1. 文件資訊

📝 範本

項目內容
文件編號RP-{專案代碼}-{版本}-{序號}
文件名稱{系統名稱} v{x.x.x} 回滾計畫
版本v{主版本}.{次版本}
對應發佈版本v{x.x.x}
建立日期{YYYY-MM-DD}
撰寫者{DevOps/SRE 姓名}
審核者{Tech Lead / SM}
回滾時間窗口上線後 {N} 小時內
最大容許停機{N} 分鐘
回滾方式Blue-Green / Canary Rollback / 全量回滾

📖 使用說明

  • 回滾計畫是部署計畫的必要附件,每次上線都需準備
  • 回滾時間窗口:超過此時間,資料可能已累積,回滾成本大幅增加
  • 回滾方式取決於部署架構:
    • Blue-Green:切換流量至舊版(秒級)
    • Canary Rollback:停止灰度,流量回到舊版(秒級)
    • 全量回滾:重新部署舊版 Image(分鐘級)

💡 範例

項目內容
文件編號RP-HRM-v2.1.0-001
對應發佈版本v2.1.0
回滾時間窗口上線後 4 小時內
最大容許停機5 分鐘
回滾方式Blue-Green(K8s Service 切換)

2. 回滾觸發條件

📝 範本

2.1 自動觸發(需設定監控告警)

條件 ID觸發條件監控指標閾值
RT-AUTO-{xxx}{條件描述}{指標}{閾值}

2.2 人工判斷觸發

條件 ID觸發條件判斷依據決策者
RT-MANUAL-{xxx}{條件描述}{判斷依據}{角色}

📖 使用說明

  • 自動觸發:由監控系統偵測到異常時自動發起(或告警後快速決策)
  • 人工判斷:需要人為判斷的複雜情境
  • 觸發條件需事先定義並經團隊共識,避免上線時臨時爭論

💡 範例

2.1 自動觸發

條件 ID觸發條件監控指標閾值
RT-AUTO-001API 錯誤率飆升HTTP 5xx Rate> 5% 持續 3 分鐘
RT-AUTO-002回應時間嚴重惡化P95 Latency> 5s 持續 5 分鐘
RT-AUTO-003核心服務健康檢查失敗Health Check連續 3 次失敗
RT-AUTO-004資料庫連線耗盡DB Connection Pool> 95% 使用率持續 2 分鐘

2.2 人工判斷觸發

條件 ID觸發條件判斷依據決策者
RT-MANUAL-001核心業務流程異常(薪資計算錯誤)使用者回報 + 日誌確認Tech Lead
RT-MANUAL-002資安事件(疑似資料洩露)資安告警 + SOC 確認資安主管
RT-MANUAL-003資料損壞(不一致/遺失)DB 檢查確認DBA + Tech Lead

3. 回滾決策流程

📝 範本

偵測異常 → 通知值班人員 → 初步評估(5 分鐘內)
    │
    ├── 可快速修復(Hotfix) → 修復並部署 → 持續觀察
    │
    └── 無法快速修復 → 啟動回滾決策
            │
            ├── 決策者確認回滾 → 執行回滾
            │
            └── 暫時降級(Feature Flag) → 持續觀察

決策權限矩陣

情境決策者升級時機
{情境}{角色}{超過 N 分鐘未解決時升級}

📖 使用說明

  • 決策流程需在 5-15 分鐘內完成,避免長時間討論
  • 權限矩陣確保深夜/假日也有人可做決策
  • Feature Flag 降級是比全量回滾更輕量的選項(如果有準備的話)

💡 範例

決策權限矩陣

情境決策者升級時機
上班時間(09-18)Tech Lead → PM10 分鐘未決定 → VP Engineering
下班/假日值班 SRE → On-call Tech Lead15 分鐘未回應 → VP Engineering
資安事件資安主管(不論時段)立即通知 CTO

4. 回滾策略

📝 範本

4.1 回滾方式比較

方式停機時間適用場景風險
{方式}{時間}{場景}{風險}

4.2 本次採用策略

項目說明
回滾方式{Blue-Green / Canary / Rolling / 全量}
回滾目標版本v{x.x.x}
預計停機時間{N} 分鐘
資料庫回滾是/否(需要/不需要)
Feature Flag是/否(可局部降級)

📖 使用說明

  • 選擇回滾策略需考量:停機影響、資料安全、回復速度
  • Blue-Green 最快(秒級切換)但需雙倍資源
  • 有 DB Schema 變更時回滾最複雜,需額外評估
  • 若有 Feature Flag,優先考慮關閉新功能而非全量回滾

💡 範例

4.1 回滾方式比較

方式停機時間適用場景風險
Blue-Green 切換< 30sK8s Service selector 切換新舊版 DB Schema 需相容
Canary 回滾< 30s灰度比例回 0%僅灰度階段可用
K8s Rolling Rollback2-5 minkubectl rollout undo過程中有混合版本
全量回滾 + DB Restore15-30 minDB Schema 不相容時停機長、可能丟失資料

4.2 本次採用策略

項目說明
回滾方式Blue-Green(K8s 保留舊版 Deployment)
回滾目標版本v2.0.3
預計停機時間< 1 分鐘
資料庫回滾否(DB Migration 向後相容)
Feature Flag是(可先關閉 WebSocket 推播功能)

5. 回滾前準備

📝 範本

5.1 準備清單(部署前完成)

#準備事項負責人狀態
1{準備事項}{人員}
2{準備事項}{人員}

5.2 環境快照

項目備份位置備份時間保留期限
{項目}{位置}{時間}{期限}

📖 使用說明

  • 回滾準備必須在部署「前」完成,而非出問題才做
  • 資料庫快照是最重要的準備(資料不可逆)
  • 確認舊版 Image 仍可取得、舊版設定仍可存取

💡 範例

5.1 準備清單

#準備事項負責人狀態
1資料庫全量備份(pg_dump)DBA
2保留舊版 Deployment(hrms-blue, replicas=0)DevOps
3確認舊版 Image 可拉取:hrms:v2.0.3DevOps
4備份 Kong 路由設定DevOps
5確認 Feature Flag 可遠端關閉後端組
6值班人員確認聯絡方式SM

5.2 環境快照

項目備份位置備份時間保留期限
PostgreSQL Full BackupAzure Blob / hrm-backup/部署前 30 分鐘7 天
Redis RDB SnapshotAzure Blob / redis-backup/部署前 30 分鐘3 天
Kong Config ExportGit repo / infra/kong/部署前 commit永久
K8s Manifest (old)Git repo / k8s/部署前 Tag永久

6. 回滾執行步驟

📝 範本

6.1 執行步驟(依序執行)

步驟動作命令/操作預期結果執行者
1{動作}{命令}{預期}{人員}
2{動作}{命令}{預期}{人員}

6.2 回滾腳本

#!/bin/bash
# Rollback Script - {系統名稱} v{x.x.x} → v{x.x.x}
# 使用方式:./rollback.sh
{腳本內容}

📖 使用說明

  • 步驟需足夠詳細,讓非撰寫者也能執行
  • 回滾腳本需事前測試(在 Staging 環境驗證)
  • 每個步驟標明預期結果,便於判斷是否正確執行
  • 腳本優先於手動操作(減少人為失誤)

💡 範例

6.1 執行步驟

步驟動作命令/操作預期結果執行者
1確認決策Slack 記錄回滾決策決策者確認SM
2關閉新功能 Feature FlagLaunchDarkly: payroll-scheduler=OFF, ws-notification=OFFFlag 生效後端組
3切換流量至舊版kubectl patch svc hrms -p '{"spec":{"selector":{"version":"v2.0.3"}}}'流量轉到 BlueDevOps
4Scale up 舊版kubectl scale deploy hrms-blue --replicas=33 Pod RunningDevOps
5驗證舊版健康curl https://hrms.internal/healthHTTP 200 + version=v2.0.3DevOps
6Scale down 新版kubectl scale deploy hrms-green --replicas=00 PodDevOps
7更新 Kong 路由移除 /ws 路由WebSocket 端點移除DevOps
8驗證完整功能執行冒煙測試腳本All PassQA

6.2 回滾腳本

#!/bin/bash
# Rollback Script - HRMS v2.1.0 → v2.0.3
# 使用方式:./rollback-hrms-v2.1.0.sh
set -euo pipefail

echo "=== HRMS Rollback: v2.1.0 → v2.0.3 ==="
echo "開始時間: $(date -Iseconds)"

# Step 1: Scale up old version
echo "[1/5] Scaling up v2.0.3 (Blue)..."
kubectl scale deploy hrms-blue --replicas=3 -n hrms
kubectl rollout status deploy/hrms-blue -n hrms --timeout=120s

# Step 2: Switch traffic
echo "[2/5] Switching Service to v2.0.3..."
kubectl patch svc hrms-api -n hrms \
  -p '{"spec":{"selector":{"version":"v2.0.3"}}}'

# Step 3: Verify health
echo "[3/5] Verifying health..."
sleep 5
HEALTH=$(curl -s -o /dev/null -w "%{http_code}" https://hrms.internal/health)
if [ "$HEALTH" != "200" ]; then
  echo "ERROR: Health check failed! Manual intervention required."
  exit 1
fi

# Step 4: Scale down new version
echo "[4/5] Scaling down v2.1.0 (Green)..."
kubectl scale deploy hrms-green --replicas=0 -n hrms

# Step 5: Remove WebSocket route
echo "[5/5] Removing WebSocket route from Kong..."
curl -s -X DELETE http://kong-admin:8001/routes/hrms-websocket

echo "=== Rollback Complete: $(date -Iseconds) ==="
echo "請執行冒煙測試驗證: ./smoke-test.sh"

7. 資料庫回滾

📝 範本

7.1 DB Migration 相容性評估

Migration描述向後相容回滾方式
{Migration 名稱}{描述}是/否{回滾方式}

7.2 資料庫回滾步驟(若需要)

步驟動作命令風險
1{動作}{命令}{風險}

📖 使用說明

  • 向後相容的 Migration:新增欄位/表 → 不需回滾(舊版忽略新欄位即可)
  • 不相容的 Migration:刪除/重命名欄位 → 必須回滾
  • 資料庫回滾最危險,可能造成資料遺失,需事先做好備份
  • 原則:盡量設計向後相容的 Migration(Expand-Contract Pattern)

💡 範例

7.1 DB Migration 相容性評估

Migration描述向後相容回滾方式
AddNotificationLogs新增 notification_logs 表✅ 是不需回滾(舊版不使用此表)
AddSchedulerColumnspayroll 表新增 3 個 nullable 欄位✅ 是不需回滾(舊版忽略)

✅ 本版所有 Migration 均為向後相容,無需資料庫回滾


8. 回滾驗證

📝 範本

8.1 冒煙測試清單

#驗證項目預期結果實際結果通過
1{驗證項目}{預期}{實際}

8.2 監控確認

指標回滾前(異常值)回滾後(預期恢復)實際值
{指標}{異常值}{預期}{實際}

📖 使用說明

  • 回滾後必須執行驗證,確認系統已恢復正常
  • 冒煙測試覆蓋核心功能路徑
  • 監控指標確認效能/錯誤率已恢復正常水位
  • 驗證通過後才能宣佈回滾完成

💡 範例

8.1 冒煙測試清單

#驗證項目預期結果實際結果通過
1登入功能成功登入並取得 Token-
2員工查詢 API回傳 200 + 正確資料-
3薪資計算 API回傳 200 + 正確計算結果-
4請假申請流程成功送出 + 狀態變更-
5報表匯出(小量)PDF/Excel 正常下載-

8.2 監控確認

指標回滾前(異常值)回滾後(預期恢復)實際值
HTTP 5xx Rate12%< 0.1%-
P95 Latency8.5s< 1s-
CPU Usage95%< 60%-
Active DB Connections98/100< 50/100-

9. 通知與溝通

📝 範本

9.1 通知時序

時機通知對象通知方式內容
決定回滾時{對象}{方式}{內容}
回滾完成時{對象}{方式}{內容}

9.2 通知範本

回滾開始通知

[系統公告] {系統名稱} 回滾通知
時間:{YYYY-MM-DD HH:MM}
影響:{描述影響}
預計恢復:{預計時間}

📖 使用說明

  • 透明溝通建立信任,避免使用者恐慌
  • 通知需簡潔明確:發生什麼、影響什麼、何時恢復
  • 分層通知:內部團隊(立即)→ 管理層(5 分鐘內)→ 使用者(10 分鐘內)

💡 範例

9.1 通知時序

時機通知對象通知方式內容
決定回滾開發團隊Slack #hrms-ops通知開始回滾 + 原因
決定回滾PM / 管理層Email + Slack摘要影響與預計恢復時間
回滾執行中使用者系統公告 Banner「系統維護中,預計 5 分鐘恢復」
回滾完成全部Slack + Email確認恢復 + 後續計畫

10. 回滾後行動

📝 範本

10.1 立即行動(24 小時內)

#行動負責人期限
1{行動}{人員}{期限}

10.2 Root Cause Analysis

項目內容
問題發生時間{時間}
偵測時間{時間}
回滾完成時間{時間}
影響範圍{描述}
根本原因{待分析 → 填入}
改善措施{待分析 → 填入}

📖 使用說明

  • 回滾不是結束,而是問題解決的開始
  • 24 小時內需完成緊急事項(如客戶溝通、暫時方案)
  • RCA(Root Cause Analysis)需在 3-5 個工作日內完成
  • 重點是改善流程,避免相同問題再次發生(Blameless PostMortem)

💡 範例

10.1 立即行動

#行動負責人期限
1確認資料完整性(比對回滾前後)DBA當日
2通知受影響使用者 + 補救方案PM當日
3隔離問題程式碼(建立修復分支)開發組長當日
4排程 RCA 會議(3 天內)SM隔日
5更新問題追蹤系統(Jira/ADO)SM當日

10.2 Root Cause Analysis

項目內容
問題發生時間2026-05-20 10:15
偵測時間2026-05-20 10:18(監控告警)
回滾完成時間2026-05-20 10:28
影響範圍薪資查詢功能 500 Error,影響約 200 名使用者
根本原因薪資排程 Job 與手動薪資計算 API 的 DB Lock 衝突
改善措施1. 排程 Job 使用 Read Replica 2. 增加 DB Lock 超時設定 3. 整合測試增加並發場景

📌 範本使用注意事項

  1. 本範本依據 ITIL 4 Release and Deployment Management 與 ISO/IEC 20000-1:2018 編製
  2. 回滾計畫必須在部署「前」完成並經審核,不是出問題才寫
  3. 搭配「部署指引範本」使用 — 部署與回滾是一體兩面
  4. 搭配「事件報告/RCA 範本」使用 — 回滾後需正式記錄與分析
  5. 建議每季度在 Staging 環境進行「回滾演練」(Rollback Drill),驗證計畫可行性