<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>部署管理 on Eric 個人部落格</title><link>https://chihhung.github.io/Blog/tags/%E9%83%A8%E7%BD%B2%E7%AE%A1%E7%90%86/</link><description>Recent content in 部署管理 on Eric 個人部落格</description><generator>Hugo -- 0.151.0</generator><language>zh-TW</language><lastBuildDate>Mon, 18 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://chihhung.github.io/Blog/tags/%E9%83%A8%E7%BD%B2%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>回滾計畫範本（Rollback Plan Template）</title><link>https://chihhung.github.io/Blog/posts/%E6%95%99%E5%AD%B8/templates/deployment/rollbackplan_template/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://chihhung.github.io/Blog/posts/%E6%95%99%E5%AD%B8/templates/deployment/rollbackplan_template/</guid><description>&lt;h1 id="回滾計畫範本rollback-plan"&gt;回滾計畫範本（Rollback Plan）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;參照標準&lt;/strong&gt;：ITIL 4（Release and Deployment Management）/ ISO/IEC 20000-1:2018&lt;br&gt;
&lt;strong&gt;文件用途&lt;/strong&gt;：定義版本上線後若出現嚴重問題時的回復策略與操作步驟&lt;br&gt;
&lt;strong&gt;適用階段&lt;/strong&gt;：部署上線階段（Deployment Phase）— Change Enablement&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="-章節目錄"&gt;📋 章節目錄&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-%E6%96%87%E4%BB%B6%E8%B3%87%E8%A8%8A"&gt;文件資訊&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E5%9B%9E%E6%BB%BE%E8%A7%B8%E7%99%BC%E6%A2%9D%E4%BB%B6"&gt;回滾觸發條件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E5%9B%9E%E6%BB%BE%E6%B1%BA%E7%AD%96%E6%B5%81%E7%A8%8B"&gt;回滾決策流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E5%9B%9E%E6%BB%BE%E7%AD%96%E7%95%A5"&gt;回滾策略&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E5%9B%9E%E6%BB%BE%E5%89%8D%E6%BA%96%E5%82%99"&gt;回滾前準備&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E5%9B%9E%E6%BB%BE%E5%9F%B7%E8%A1%8C%E6%AD%A5%E9%A9%9F"&gt;回滾執行步驟&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E8%B3%87%E6%96%99%E5%BA%AB%E5%9B%9E%E6%BB%BE"&gt;資料庫回滾&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E5%9B%9E%E6%BB%BE%E9%A9%97%E8%AD%89"&gt;回滾驗證&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E9%80%9A%E7%9F%A5%E8%88%87%E6%BA%9D%E9%80%9A"&gt;通知與溝通&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E5%9B%9E%E6%BB%BE%E5%BE%8C%E8%A1%8C%E5%8B%95"&gt;回滾後行動&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="1-文件資訊"&gt;1. 文件資訊&lt;/h2&gt;
&lt;h3 id="-範本"&gt;📝 範本&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;內容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;文件編號&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RP-{專案代碼}-{版本}-{序號}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;文件名稱&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{系統名稱} v{x.x.x} 回滾計畫&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;版本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v{主版本}.{次版本}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;對應發佈版本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v{x.x.x}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;建立日期&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{YYYY-MM-DD}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;撰寫者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{DevOps/SRE 姓名}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;審核者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{Tech Lead / SM}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回滾時間窗口&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;上線後 {N} 小時內&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最大容許停機&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;{N} 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回滾方式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blue-Green / Canary Rollback / 全量回滾&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;回滾計畫是部署計畫的必要附件，每次上線都需準備&lt;/li&gt;
&lt;li&gt;回滾時間窗口：超過此時間，資料可能已累積，回滾成本大幅增加&lt;/li&gt;
&lt;li&gt;回滾方式取決於部署架構：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blue-Green&lt;/strong&gt;：切換流量至舊版（秒級）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canary Rollback&lt;/strong&gt;：停止灰度，流量回到舊版（秒級）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全量回滾&lt;/strong&gt;：重新部署舊版 Image（分鐘級）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例"&gt;💡 範例&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;內容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;文件編號&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RP-HRM-v2.1.0-001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;對應發佈版本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;v2.1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回滾時間窗口&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;上線後 4 小時內&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最大容許停機&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;回滾方式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blue-Green（K8s Service 切換）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-回滾觸發條件"&gt;2. 回滾觸發條件&lt;/h2&gt;
&lt;h3 id="-範本-1"&gt;📝 範本&lt;/h3&gt;
&lt;h4 id="21-自動觸發需設定監控告警"&gt;2.1 自動觸發（需設定監控告警）&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;條件 ID&lt;/th&gt;
&lt;th&gt;觸發條件&lt;/th&gt;
&lt;th&gt;監控指標&lt;/th&gt;
&lt;th&gt;閾值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RT-AUTO-{xxx}&lt;/td&gt;
&lt;td&gt;{條件描述}&lt;/td&gt;
&lt;td&gt;{指標}&lt;/td&gt;
&lt;td&gt;{閾值}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="22-人工判斷觸發"&gt;2.2 人工判斷觸發&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;條件 ID&lt;/th&gt;
&lt;th&gt;觸發條件&lt;/th&gt;
&lt;th&gt;判斷依據&lt;/th&gt;
&lt;th&gt;決策者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RT-MANUAL-{xxx}&lt;/td&gt;
&lt;td&gt;{條件描述}&lt;/td&gt;
&lt;td&gt;{判斷依據}&lt;/td&gt;
&lt;td&gt;{角色}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明-1"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自動觸發：由監控系統偵測到異常時自動發起（或告警後快速決策）&lt;/li&gt;
&lt;li&gt;人工判斷：需要人為判斷的複雜情境&lt;/li&gt;
&lt;li&gt;觸發條件需事先定義並經團隊共識，避免上線時臨時爭論&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-1"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="21-自動觸發"&gt;2.1 自動觸發&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;條件 ID&lt;/th&gt;
&lt;th&gt;觸發條件&lt;/th&gt;
&lt;th&gt;監控指標&lt;/th&gt;
&lt;th&gt;閾值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RT-AUTO-001&lt;/td&gt;
&lt;td&gt;API 錯誤率飆升&lt;/td&gt;
&lt;td&gt;HTTP 5xx Rate&lt;/td&gt;
&lt;td&gt;&amp;gt; 5% 持續 3 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RT-AUTO-002&lt;/td&gt;
&lt;td&gt;回應時間嚴重惡化&lt;/td&gt;
&lt;td&gt;P95 Latency&lt;/td&gt;
&lt;td&gt;&amp;gt; 5s 持續 5 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RT-AUTO-003&lt;/td&gt;
&lt;td&gt;核心服務健康檢查失敗&lt;/td&gt;
&lt;td&gt;Health Check&lt;/td&gt;
&lt;td&gt;連續 3 次失敗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RT-AUTO-004&lt;/td&gt;
&lt;td&gt;資料庫連線耗盡&lt;/td&gt;
&lt;td&gt;DB Connection Pool&lt;/td&gt;
&lt;td&gt;&amp;gt; 95% 使用率持續 2 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="22-人工判斷觸發-1"&gt;2.2 人工判斷觸發&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;條件 ID&lt;/th&gt;
&lt;th&gt;觸發條件&lt;/th&gt;
&lt;th&gt;判斷依據&lt;/th&gt;
&lt;th&gt;決策者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RT-MANUAL-001&lt;/td&gt;
&lt;td&gt;核心業務流程異常（薪資計算錯誤）&lt;/td&gt;
&lt;td&gt;使用者回報 + 日誌確認&lt;/td&gt;
&lt;td&gt;Tech Lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RT-MANUAL-002&lt;/td&gt;
&lt;td&gt;資安事件（疑似資料洩露）&lt;/td&gt;
&lt;td&gt;資安告警 + SOC 確認&lt;/td&gt;
&lt;td&gt;資安主管&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RT-MANUAL-003&lt;/td&gt;
&lt;td&gt;資料損壞（不一致/遺失）&lt;/td&gt;
&lt;td&gt;DB 檢查確認&lt;/td&gt;
&lt;td&gt;DBA + Tech Lead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="3-回滾決策流程"&gt;3. 回滾決策流程&lt;/h2&gt;
&lt;h3 id="-範本-2"&gt;📝 範本&lt;/h3&gt;
&lt;div class="highlight"&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-" data-lang=""&gt;偵測異常 → 通知值班人員 → 初步評估（5 分鐘內）
│
├── 可快速修復（Hotfix） → 修復並部署 → 持續觀察
│
└── 無法快速修復 → 啟動回滾決策
│
├── 決策者確認回滾 → 執行回滾
│
└── 暫時降級（Feature Flag） → 持續觀察&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id="決策權限矩陣"&gt;決策權限矩陣&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;情境&lt;/th&gt;
&lt;th&gt;決策者&lt;/th&gt;
&lt;th&gt;升級時機&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{情境}&lt;/td&gt;
&lt;td&gt;{角色}&lt;/td&gt;
&lt;td&gt;{超過 N 分鐘未解決時升級}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明-2"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;決策流程需在 5-15 分鐘內完成，避免長時間討論&lt;/li&gt;
&lt;li&gt;權限矩陣確保深夜/假日也有人可做決策&lt;/li&gt;
&lt;li&gt;Feature Flag 降級是比全量回滾更輕量的選項（如果有準備的話）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-2"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="決策權限矩陣-1"&gt;決策權限矩陣&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;情境&lt;/th&gt;
&lt;th&gt;決策者&lt;/th&gt;
&lt;th&gt;升級時機&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;上班時間（09-18）&lt;/td&gt;
&lt;td&gt;Tech Lead → PM&lt;/td&gt;
&lt;td&gt;10 分鐘未決定 → VP Engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下班/假日&lt;/td&gt;
&lt;td&gt;值班 SRE → On-call Tech Lead&lt;/td&gt;
&lt;td&gt;15 分鐘未回應 → VP Engineering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資安事件&lt;/td&gt;
&lt;td&gt;資安主管（不論時段）&lt;/td&gt;
&lt;td&gt;立即通知 CTO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="4-回滾策略"&gt;4. 回滾策略&lt;/h2&gt;
&lt;h3 id="-範本-3"&gt;📝 範本&lt;/h3&gt;
&lt;h4 id="41-回滾方式比較"&gt;4.1 回滾方式比較&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;停機時間&lt;/th&gt;
&lt;th&gt;適用場景&lt;/th&gt;
&lt;th&gt;風險&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{方式}&lt;/td&gt;
&lt;td&gt;{時間}&lt;/td&gt;
&lt;td&gt;{場景}&lt;/td&gt;
&lt;td&gt;{風險}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="42-本次採用策略"&gt;4.2 本次採用策略&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;說明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;回滾方式&lt;/td&gt;
&lt;td&gt;{Blue-Green / Canary / Rolling / 全量}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;回滾目標版本&lt;/td&gt;
&lt;td&gt;v{x.x.x}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;預計停機時間&lt;/td&gt;
&lt;td&gt;{N} 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資料庫回滾&lt;/td&gt;
&lt;td&gt;是/否（需要/不需要）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature Flag&lt;/td&gt;
&lt;td&gt;是/否（可局部降級）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明-3"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;選擇回滾策略需考量：停機影響、資料安全、回復速度&lt;/li&gt;
&lt;li&gt;Blue-Green 最快（秒級切換）但需雙倍資源&lt;/li&gt;
&lt;li&gt;有 DB Schema 變更時回滾最複雜，需額外評估&lt;/li&gt;
&lt;li&gt;若有 Feature Flag，優先考慮關閉新功能而非全量回滾&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-3"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="41-回滾方式比較-1"&gt;4.1 回滾方式比較&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;停機時間&lt;/th&gt;
&lt;th&gt;適用場景&lt;/th&gt;
&lt;th&gt;風險&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blue-Green 切換&lt;/td&gt;
&lt;td&gt;&amp;lt; 30s&lt;/td&gt;
&lt;td&gt;K8s Service selector 切換&lt;/td&gt;
&lt;td&gt;新舊版 DB Schema 需相容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canary 回滾&lt;/td&gt;
&lt;td&gt;&amp;lt; 30s&lt;/td&gt;
&lt;td&gt;灰度比例回 0%&lt;/td&gt;
&lt;td&gt;僅灰度階段可用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K8s Rolling Rollback&lt;/td&gt;
&lt;td&gt;2-5 min&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl rollout undo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;過程中有混合版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;全量回滾 + DB Restore&lt;/td&gt;
&lt;td&gt;15-30 min&lt;/td&gt;
&lt;td&gt;DB Schema 不相容時&lt;/td&gt;
&lt;td&gt;停機長、可能丟失資料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="42-本次採用策略-1"&gt;4.2 本次採用策略&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;說明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;回滾方式&lt;/td&gt;
&lt;td&gt;Blue-Green（K8s 保留舊版 Deployment）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;回滾目標版本&lt;/td&gt;
&lt;td&gt;v2.0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;預計停機時間&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 分鐘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;資料庫回滾&lt;/td&gt;
&lt;td&gt;否（DB Migration 向後相容）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature Flag&lt;/td&gt;
&lt;td&gt;是（可先關閉 WebSocket 推播功能）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="5-回滾前準備"&gt;5. 回滾前準備&lt;/h2&gt;
&lt;h3 id="-範本-4"&gt;📝 範本&lt;/h3&gt;
&lt;h4 id="51-準備清單部署前完成"&gt;5.1 準備清單（部署前完成）&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;準備事項&lt;/th&gt;
&lt;th&gt;負責人&lt;/th&gt;
&lt;th&gt;狀態&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;{準備事項}&lt;/td&gt;
&lt;td&gt;{人員}&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;{準備事項}&lt;/td&gt;
&lt;td&gt;{人員}&lt;/td&gt;
&lt;td&gt;☐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="52-環境快照"&gt;5.2 環境快照&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;備份位置&lt;/th&gt;
&lt;th&gt;備份時間&lt;/th&gt;
&lt;th&gt;保留期限&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{項目}&lt;/td&gt;
&lt;td&gt;{位置}&lt;/td&gt;
&lt;td&gt;{時間}&lt;/td&gt;
&lt;td&gt;{期限}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明-4"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;回滾準備必須在部署「前」完成，而非出問題才做&lt;/li&gt;
&lt;li&gt;資料庫快照是最重要的準備（資料不可逆）&lt;/li&gt;
&lt;li&gt;確認舊版 Image 仍可取得、舊版設定仍可存取&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-4"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="51-準備清單"&gt;5.1 準備清單&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;準備事項&lt;/th&gt;
&lt;th&gt;負責人&lt;/th&gt;
&lt;th&gt;狀態&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;資料庫全量備份（pg_dump）&lt;/td&gt;
&lt;td&gt;DBA&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;保留舊版 Deployment（hrms-blue, replicas=0）&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;確認舊版 Image 可拉取：&lt;code&gt;hrms:v2.0.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;備份 Kong 路由設定&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;確認 Feature Flag 可遠端關閉&lt;/td&gt;
&lt;td&gt;後端組&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;值班人員確認聯絡方式&lt;/td&gt;
&lt;td&gt;SM&lt;/td&gt;
&lt;td&gt;☑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="52-環境快照-1"&gt;5.2 環境快照&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;th&gt;備份位置&lt;/th&gt;
&lt;th&gt;備份時間&lt;/th&gt;
&lt;th&gt;保留期限&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL Full Backup&lt;/td&gt;
&lt;td&gt;Azure Blob / hrm-backup/&lt;/td&gt;
&lt;td&gt;部署前 30 分鐘&lt;/td&gt;
&lt;td&gt;7 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis RDB Snapshot&lt;/td&gt;
&lt;td&gt;Azure Blob / redis-backup/&lt;/td&gt;
&lt;td&gt;部署前 30 分鐘&lt;/td&gt;
&lt;td&gt;3 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kong Config Export&lt;/td&gt;
&lt;td&gt;Git repo / infra/kong/&lt;/td&gt;
&lt;td&gt;部署前 commit&lt;/td&gt;
&lt;td&gt;永久&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K8s Manifest (old)&lt;/td&gt;
&lt;td&gt;Git repo / k8s/&lt;/td&gt;
&lt;td&gt;部署前 Tag&lt;/td&gt;
&lt;td&gt;永久&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="6-回滾執行步驟"&gt;6. 回滾執行步驟&lt;/h2&gt;
&lt;h3 id="-範本-5"&gt;📝 範本&lt;/h3&gt;
&lt;h4 id="61-執行步驟依序執行"&gt;6.1 執行步驟（依序執行）&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步驟&lt;/th&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;th&gt;命令/操作&lt;/th&gt;
&lt;th&gt;預期結果&lt;/th&gt;
&lt;th&gt;執行者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;{動作}&lt;/td&gt;
&lt;td&gt;{命令}&lt;/td&gt;
&lt;td&gt;{預期}&lt;/td&gt;
&lt;td&gt;{人員}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;{動作}&lt;/td&gt;
&lt;td&gt;{命令}&lt;/td&gt;
&lt;td&gt;{預期}&lt;/td&gt;
&lt;td&gt;{人員}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="62-回滾腳本"&gt;6.2 回滾腳本&lt;/h4&gt;
&lt;div class="highlight"&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-bash" data-lang="bash"&gt;#!/bin/bash
# Rollback Script - {系統名稱} v{x.x.x} → v{x.x.x}
# 使用方式：./rollback.sh
{腳本內容}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id="-使用說明-5"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;步驟需足夠詳細，讓非撰寫者也能執行&lt;/li&gt;
&lt;li&gt;回滾腳本需事前測試（在 Staging 環境驗證）&lt;/li&gt;
&lt;li&gt;每個步驟標明預期結果，便於判斷是否正確執行&lt;/li&gt;
&lt;li&gt;腳本優先於手動操作（減少人為失誤）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-5"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="61-執行步驟"&gt;6.1 執行步驟&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步驟&lt;/th&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;th&gt;命令/操作&lt;/th&gt;
&lt;th&gt;預期結果&lt;/th&gt;
&lt;th&gt;執行者&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;確認決策&lt;/td&gt;
&lt;td&gt;Slack 記錄回滾決策&lt;/td&gt;
&lt;td&gt;決策者確認&lt;/td&gt;
&lt;td&gt;SM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;關閉新功能 Feature Flag&lt;/td&gt;
&lt;td&gt;LaunchDarkly: &lt;code&gt;payroll-scheduler=OFF&lt;/code&gt;, &lt;code&gt;ws-notification=OFF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flag 生效&lt;/td&gt;
&lt;td&gt;後端組&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;切換流量至舊版&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl patch svc hrms -p '{&amp;quot;spec&amp;quot;:{&amp;quot;selector&amp;quot;:{&amp;quot;version&amp;quot;:&amp;quot;v2.0.3&amp;quot;}}}'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流量轉到 Blue&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Scale up 舊版&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl scale deploy hrms-blue --replicas=3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 Pod Running&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;驗證舊版健康&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl https://hrms.internal/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP 200 + version=v2.0.3&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Scale down 新版&lt;/td&gt;
&lt;td&gt;&lt;code&gt;kubectl scale deploy hrms-green --replicas=0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0 Pod&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;更新 Kong 路由&lt;/td&gt;
&lt;td&gt;移除 &lt;code&gt;/ws&lt;/code&gt; 路由&lt;/td&gt;
&lt;td&gt;WebSocket 端點移除&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;驗證完整功能&lt;/td&gt;
&lt;td&gt;執行冒煙測試腳本&lt;/td&gt;
&lt;td&gt;All Pass&lt;/td&gt;
&lt;td&gt;QA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="62-回滾腳本-1"&gt;6.2 回滾腳本&lt;/h4&gt;
&lt;div class="highlight"&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-bash" data-lang="bash"&gt;#!/bin/bash
# Rollback Script - HRMS v2.1.0 → v2.0.3
# 使用方式：./rollback-hrms-v2.1.0.sh
set -euo pipefail
echo &amp;#34;=== HRMS Rollback: v2.1.0 → v2.0.3 ===&amp;#34;
echo &amp;#34;開始時間: $(date -Iseconds)&amp;#34;
# Step 1: Scale up old version
echo &amp;#34;[1/5] Scaling up v2.0.3 (Blue)...&amp;#34;
kubectl scale deploy hrms-blue --replicas=3 -n hrms
kubectl rollout status deploy/hrms-blue -n hrms --timeout=120s
# Step 2: Switch traffic
echo &amp;#34;[2/5] Switching Service to v2.0.3...&amp;#34;
kubectl patch svc hrms-api -n hrms \
-p &amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;selector&amp;#34;:{&amp;#34;version&amp;#34;:&amp;#34;v2.0.3&amp;#34;}}}&amp;#39;
# Step 3: Verify health
echo &amp;#34;[3/5] Verifying health...&amp;#34;
sleep 5
HEALTH=$(curl -s -o /dev/null -w &amp;#34;%{http_code}&amp;#34; https://hrms.internal/health)
if [ &amp;#34;$HEALTH&amp;#34; != &amp;#34;200&amp;#34; ]; then
echo &amp;#34;ERROR: Health check failed! Manual intervention required.&amp;#34;
exit 1
fi
# Step 4: Scale down new version
echo &amp;#34;[4/5] Scaling down v2.1.0 (Green)...&amp;#34;
kubectl scale deploy hrms-green --replicas=0 -n hrms
# Step 5: Remove WebSocket route
echo &amp;#34;[5/5] Removing WebSocket route from Kong...&amp;#34;
curl -s -X DELETE http://kong-admin:8001/routes/hrms-websocket
echo &amp;#34;=== Rollback Complete: $(date -Iseconds) ===&amp;#34;
echo &amp;#34;請執行冒煙測試驗證: ./smoke-test.sh&amp;#34;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id="7-資料庫回滾"&gt;7. 資料庫回滾&lt;/h2&gt;
&lt;h3 id="-範本-6"&gt;📝 範本&lt;/h3&gt;
&lt;h4 id="71-db-migration-相容性評估"&gt;7.1 DB Migration 相容性評估&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Migration&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;向後相容&lt;/th&gt;
&lt;th&gt;回滾方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{Migration 名稱}&lt;/td&gt;
&lt;td&gt;{描述}&lt;/td&gt;
&lt;td&gt;是/否&lt;/td&gt;
&lt;td&gt;{回滾方式}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="72-資料庫回滾步驟若需要"&gt;7.2 資料庫回滾步驟（若需要）&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;步驟&lt;/th&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;風險&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;{動作}&lt;/td&gt;
&lt;td&gt;{命令}&lt;/td&gt;
&lt;td&gt;{風險}&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="-使用說明-6"&gt;📖 使用說明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向後相容的 Migration&lt;/strong&gt;：新增欄位/表 → 不需回滾（舊版忽略新欄位即可）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不相容的 Migration&lt;/strong&gt;：刪除/重命名欄位 → 必須回滾&lt;/li&gt;
&lt;li&gt;資料庫回滾最危險，可能造成資料遺失，需事先做好備份&lt;/li&gt;
&lt;li&gt;原則：盡量設計向後相容的 Migration（Expand-Contract Pattern）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-範例-6"&gt;💡 範例&lt;/h3&gt;
&lt;h4 id="71-db-migration-相容性評估-1"&gt;7.1 DB Migration 相容性評估&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Migration&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;向後相容&lt;/th&gt;
&lt;th&gt;回滾方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AddNotificationLogs&lt;/td&gt;
&lt;td&gt;新增 notification_logs 表&lt;/td&gt;
&lt;td&gt;✅ 是&lt;/td&gt;
&lt;td&gt;不需回滾（舊版不使用此表）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AddSchedulerColumns&lt;/td&gt;
&lt;td&gt;payroll 表新增 3 個 nullable 欄位&lt;/td&gt;
&lt;td&gt;✅ 是&lt;/td&gt;
&lt;td&gt;不需回滾（舊版忽略）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 本版所有 Migration 均為向後相容，無需資料庫回滾&lt;/p&gt;</description></item></channel></rss>