§5
各步細節
5.1 第 1 步 預檢
upgrade_preflight.sh:285-306。這一步什麼都不能動:不刪映像、不清快取、不停服務(:7)。每一項都跑完才下結論,不過的項目一次列出(:8)。
空間怎麼算(:194-215):
停機預估(:259-272):在複本落點寫 100MB(dd … conv=fsync)量速率,estimate_copy_s=資料庫大小÷速率,estimate_downtime_s=estimate_copy_s×3。量不到就不寫,第 3 步用預設 1800 秒。
寫進度檔:步驟 detail(每項一行)、步驟 failures(不過項目的字串陣列)、頂層 estimate_copy_s/estimate_downtime_s(:297-305)。
陷阱:給人看的不過項目讀 failures,不要讀 detail
步驟失敗時 runner 會在 detail 後面附退出碼(upgrade_preflight.sh:12)。畫面要逐項列,用 failures 陣列。
5.2 第 2 步 停接新工作
upgrade_drain.sh。
陷阱:旗標只在回 0 時留著
放棄、失敗、被 TERM 都要刪旗標,否則主系統一直不接單、畫面看不出原因(upgrade_drain.sh:15-16)。旗標由第 6 步在新版 api 健康後、或第 8 步在舊版起來後才刪。
陷阱:不可用 cm_app 查
cm_app 受 RLS 擋,沒帶租戶脈絡時 count 永遠是 0,會被當成「做完了」直接往下停服務(upgrade_drain.sh:17-18)。
5.3 第 3 步 停服務、複製資料庫
upgrade_db_copy.sh:214-226。
設定快照項目(DBC_CONFIG_ITEMS,:31):.env、guidant.env、docker-compose.yml、certs、pki、seaweedfs/s3.json、ai-gateway-rules。
失敗或被 TERM(:194-212):先起回舊版服務(成功就刪 draining),再刪複本與這次的設定快照,db 改回 copy:null。別次升級留下的快照不動。
證據檔不複製:物件儲存(SeaweedFS)不在複本範圍(:7-8)。
陷阱:「pgdata-next 存在」等於「複本完整」
複製一律先寫 .partial,完整且核對過才改名(upgrade_db_copy.sh:12)。後面每一步都靠這個約定判斷,不要直接寫 pgdata-next。
5.4 第 4 步 在複本上升級
upgrade_apply_on_copy.sh:186-201。
進度怎麼來:init 映像的 migrate.sh 每套一支印一行 PROGRESS<TAB>n/總數<TAB>檔名,這裡轉寫成步驟 progress「migration n/總數 檔名」(:126-141)。
陷阱:migrate 前一定先確認 db 掛的是複本
掛錯就是直接改客戶現在那份資料,退回救不回來(upgrade_apply_on_copy.sh:13)。第 5 步會再確認一次(upgrade_health.sh:41-49)。
連帶:移掉 PROGRESS 那行輸出,「單支 10 分無進度」就判不到,卡住要等總上限 60 分(:11-12)。
陷阱:migration log 不放 upgrade/
前門維護頁唯讀掛整個 upgrade/,migration 輸出不該對未登入的人可見(upgrade_apply_on_copy.sh:145)。
5.5 第 5 步 健康檢查
upgrade_health.sh:129-149。
每次 curl 15 秒逾時(UPG_HEALTH_CURL_TIMEOUT)。受檢容器用完一律刪(:127)。worker 與 socketio 不在這一步起:這時候起 worker 會在還沒驗過的複本上撿單(:29-31)。
陷阱:受檢 api 不可叫 guidant-api
前門靠 docker DNS 名稱 guidant-api 找後端。受檢容器若叫這個名字,前門會立刻把使用者導進還沒驗過的版本、維護頁提早消失;之後檢查不過要退回時,已經有人在新版寫過資料(upgrade_health.sh:7-10)。
5.6 第 6 步 換接
upgrade_switch.sh:120-154。
換接後才逾時:第 6 步若在寫完 succeeded 之後才逾時(前門重建慢),runner 看到 result=upgraded 就不退回、也不改寫結果,退出 0(upgrade_runner.sh:119-123)。
陷阱:前門一定最後才重建
它重建那幾秒是整個升級唯一看不到維護頁的空檔;在它之前進度檔要已經是 succeeded,維護頁才會顯示「已完成」並自己重新整理(upgrade_switch.sh:15-16)。
陷阱:系統檔與維運指令要在 api 起來之前做完
舊前門一看到新 api 就會把人導過去;這兩段若排在後面,舊版畫面會對著新版 api 跑上一兩分鐘(upgrade_switch.sh:127-128)。
5.7 第 7 步 清理
upgrade_cleanup.sh:114-126。任何一項刪不掉只記 warning,結果仍是 upgraded(upgrade_runner.sh:173)。
bundles/<本版>/agent/ 要留著:主系統升完後 Agent 跟進、推送、下載都從這裡找 Agent 包(:86-88)。