FR-172 · 機制問答
每題先給結論,再給事實與程式位置
整理 PM 與業務最常問的 16 題。版號、流程、程式路徑以主系統 1.28.3、Agent 1.5.5 為準;完整交付內容看 FINAL-SPEC.md。
結論:是。兩個安裝包、兩條版本線、各自升級,互不需要對方先升。
| 主系統 | Agent | |
|---|---|---|
| 安裝包 | guidant-ai-<版>.tar.gz(約 3.5 GB) |
guidant-agent-compose-<版>.tar.gz(約 1.7 GB) |
| 更新站版本線 | 主系統 | Agent |
| 目前版號 | 1.28.3 | 1.5.5 |
主系統包裡已經不帶 Agent。修 Agent 不必再出一包主系統、也不必停主系統。
結論:三種,最後都走同一條升級流程。
| 方式 | 在哪按 | 適合 |
|---|---|---|
| 主系統更新中心 Agent 區 | 勾選要更新的台,按「更新選取的 N 台到 X」 | 管理員一次更新多台 |
| Agent 主控台「更新到 X」 | 每台 Agent 自己的主控台(8444) | 在現場、只更新這一台 |
| Agent 主控台「離線上傳更新包」 | 同上 | Agent 連不到主系統時 |
前兩種實際上都是主系統去下載、驗證、推送;主控台那顆只是「請主系統替這一台做」。
結論:不用。直接勾選按更新即可,主系統會自己判斷要不要先下載。
下載途中又有人按更新(例如另一台的主控台),會併進同一份待推清單,不會把先按的人選的台蓋掉。
程式:app/product_update/service/agent_release_service.py(bundle_is_latest、newer_on_site)、product_update_app_service.py(agent_push)。
結論:主系統下載並驗證包 → 直接推指令給 Agent → Agent 跟主系統拿包、寫升級單 → Agent 所在主機跑升級步驟 → 每一步即時回報主系統。
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
sequenceDiagram
autonumber
participant P as 管理員
participant M as 主系統
participant U as 更新站
participant A as Agent
participant H as Agent 主機
P->>M: 更新選取的台到 X
opt 手上不是最新
M->>U: 下載 Agent X 並驗章
end
M->>A: 推送更新指令(版號、雜湊、大小)
Note over A: 進入維護模式,停收新工作
A->>M: 下載包、核對雜湊
A->>H: 寫升級單
H->>H: 驗新版簽章 → 換版 → 健康檢查
A-->>M: 每一步、結果、升級紀錄
M-->>P: 畫面顯示每台進度
完整版時序圖(含端點名稱)看 FINAL-SPEC §2;每一步跑哪支程式看 upgrade-flow-guide.md。
結論:主系統直接連到 Agent 推指令,不靠心跳。心跳只代表「Agent 活著」,不帶任何指令或資料。
POST /update。/agents/events),不是主系統去問。程式:主系統 core/plugins/_agent_commands.py(push_update_soon);Agent guidant_agent/sync/api/cmd_update.py、sync/app/update_sync.py。通道設計見 FR-171。
結論:不能,會進入維護模式。從收到更新指令那一刻起就停收新的掃描工作,進行中的工作先做完再換版,完成後自動恢復。
| 階段 | 算升級中 |
|---|---|
| 下載主系統推來的包 | 是 |
| 等進行中的工作做完 | 是 |
| 升級單已寫好、主機在換版 | 是 |
換版完成後主控台不必重新登入(登入狀態存在磁碟上,換容器不會掉)。
結論:Agent 回報「升級中」時就整頁鎖住,只顯示進度。不管是誰發動的都一樣。
這 30 秒內 Agent 已經停收新工作,使用者頂多看到畫面還能點,但送出的掃描會被拒絕。要做到「一收到就鎖」得讓 Agent 主動推給瀏覽器,目前裁示先不做。
程式:FE console/useUpdateStatus.js(輪詢與鎖定)、console/update.js(lockState)、console/components/UpdateLockMask.vue。
結論:按「更新到 X」的人看到全頁遮罩加進度;其他人在停機那幾步看到維護頁。
結論:會自動退回原版;失敗原因分兩層,畫面看得到摘要,也能下載完整紀錄。
結論:一律經過主系統。主系統向更新站下載、驗證,再交給 Agent;Agent 從不直接連更新站。
主控台的「立即檢查」也是請主系統當下去更新站查,主系統再告訴 Agent 有沒有新版(全機 5 分鐘內只查一次)。主系統斷線時,主控台只提供離線上傳。
結論:每一手都驗。驗章只認本機已經裝好的公鑰,不拿包裡附的公鑰驗自己。
| 誰驗 | 驗什麼 |
|---|---|
| 主系統下載後 | 發布清單的章(Agent 專用章型別)、整包雜湊 |
| Agent 從主系統拿包 | 大小與雜湊(數字來自主系統驗過的清單) |
| Agent 主機升級前 | 用舊版 Agent 驗新版程式樹的完整性章 |
| 離線上傳 | 用現行版的公鑰驗章、雜湊、版本、磁碟 |
結論:不會,用完就清。
incoming/ 只留清單(之後要重試會重新下載)。結論:只擋一種情況——Agent 新版要求的主系統版本比現在的主系統新,按鈕會反灰並說明要先升主系統。
結論:測試機專用,把目前這一版照正式升級流程重跑一次。正式環境不會出現,因為按鈕要靠兩個環境變數才會打開,任何出貨範本都不帶這兩個鍵。
PRODUCT_UPDATE_ALLOW_SAME_VERSION=1;Agent:AGENT_UPDATE_ALLOW_SAME_VERSION=1。結論:主系統完整出包約 51 分鐘、Agent 約 16 分鐘(測試包)。編譯只佔不到四成,大部分時間在打包壓縮與安全掃描。
| 段落 | 時間(主系統+Agent) |
|---|---|
| Nuitka 編譯 | 約 19.5 分 |
| 打包壓縮 | 約 13 分 |
| SBOM+弱點掃描 | 約 9 分 |
| 建映像、smoke、其他 | 約 10 分 |
已做的加速:
Nuitka 在 build 機本來就沒開 LTO,--lto=no 不會更快。出版自動化(CI、Vault 簽章)在 FR-173。
結論:功能已在 190 實測通過,但還沒出正式版。目前更新站上的都是測試章簽的內部測試包;第一個正式版是 1.29,用 FR-173 的自架 Vault 簽章。
| 機器 | 主系統 | Agent |
|---|---|---|
| 190 測試機 | 1.28.3 | 1.5.5 |
| 189 POC | 1.27.x | 1.4.x |
189 升到 1.28.x 時,Agent 要手動升一次:1.4.x 的 Agent 沒有新的推送端點,主系統推不動它。之後就都能從主系統更新。