一個按鈕升級為主站 — xGrid Promote 的三層設計
Blog/

一個按鈕升級為主站 — xGrid Promote 的三層設計

Spoke 升級成 Hub 不需要 SSH、不需要筆電、不需要懂命令列。掃 QR Code 連 WiFi、打開 PWA、按一個按鈕——三步完成。背後是 Script → API → UI 的三層架構,讓護理師也能執行系統管理員等級的操作。

誤解:「升級需要 SSH」

上一篇文章,我們描述了 xGrid 的 Hub-Spoke 拓撲。其中最強大的能力是任何 Spoke 都能升級為 Hub——帶走、接電、下指令。

那篇文章裡寫的是:

sudo xgrid-promote

一個 SSH 指令。很多人讀完後的直覺反應是:「所以我需要一台筆電、一個 SSH client、會打命令列才能操作?」

不需要。

SSH 是最底層的方法——給系統管理員和開發者用的。但在災難現場,執行 promote 的人很可能不是工程師,而是護理師、EMT、或指揮官。他們手上有的是 iPad,不是筆電。

所以 xGrid 的 promote 不只是一個 shell script。它是三層架構。

三層 Promote

層級觸發方式使用者需要的工具
Layer 1 — Scriptsudo xgrid-promote系統管理員SSH + 筆電
Layer 2 — APIPOST /api/failover/promote進階操作員任何 HTTP client
Layer 3 — PWA UI紅色 Banner 上的「升級為 Hub」按鈕任何人iPad / iPhone + 瀏覽器

Layer 3 呼叫 Layer 2,Layer 2 呼叫 Layer 1。每一層都有自己的防護:

  • Layer 1 — 8 步原子狀態機,任何步驟失敗全部回滾
  • Layer 2 — 驗證角色(已經是 Hub?拒絕)、狀態(轉換中?拒絕)、60 秒 timeout
  • Layer 3confirm() 對話框防誤觸、藍色脈衝動畫防重複點擊、成功/失敗 toast 回饋

三層架構意味著:操作的複雜度由使用者決定,不是由系統強制。 系統管理員可以用 SSH 做精細控制;護理師只需要按一個按鈕。

QR Code 工作流 — 從零到升級

每台 RPi 出廠時都附帶一張護貝的 QR Code 連線卡,貼在設備旁邊。上面有兩個 QR Code:

┌─────────────────────────────────────────┐
│  DNO-HC02 連線卡                         │
│                                          │
│  ┌──────────┐    ┌──────────┐           │
│  │ WiFi QR  │    │ MIRS QR  │           │
│  │          │    │          │           │
│  │  掃描    │    │  掃描    │           │
│  │  加入    │    │  開啟    │           │
│  │  WiFi    │    │  系統    │           │
│  └──────────┘    └──────────┘           │
│                                          │
│  WiFi: DNO-HC02                          │
│  MIRS: http://10.0.0.1:8000             │
└─────────────────────────────────────────┘

Step 1 — 掃描 WiFi QR Code。 iPhone/iPad 的相機 App 原生支援 WiFi QR Code(格式:WIFI:T:WPA;S:{SSID};P:{密碼};;)。掃描後自動跳出「加入網路」提示,點一下就連上 RPi 的熱點。不需要手動輸入 SSID 和密碼。

Step 2 — 掃描 MIRS QR Code 或直接輸入 URL。 Safari 開啟 MIRS PWA。PWA 會被 Service Worker 快取,之後離線也能開啟。

Step 3 — Hub 斷線時,紅色 Banner 自動出現。 PWA 每 30 秒 poll 一次 Hub 狀態。連續 3 次失敗(90 秒)後,畫面頂端跳出紅色 Banner:

Hub 離線 (3 次連線失敗)升級為 Hub

Step 4 — 按下「升級為 Hub」。 跳出確認對話框:「確定要將此節點升級為 Hub?」。確認後,Banner 變成藍色脈衝動畫:「正在升級為 Hub,請稍候...」。

60 秒內,腳本完成 8 個步驟。成功後,頁面自動刷新,綠色 toast:「升級完成!角色: HUB | Epoch: N」。

全程不需要 SSH。不需要筆電。不需要記任何命令。

自動偵測,不是手動操作

注意 Layer 3 的設計選擇:不是在選單裡藏一個「升級」按鈕讓使用者自己去找。 而是在 Hub 真的斷線時,Banner 自動跳出來告訴你「Hub 斷了,你要接手嗎?」

這是刻意的。

Promote 不是日常操作。它是緊急操作。你不希望有人在好奇心驅使下按了按鈕——那會導致系統突然多了一個 Hub(split-brain)。所以按鈕只在需要的時候出現:Hub 確實離線、你確實是 Spoke、你確實有能力接手。

同樣的邏輯:按鈕出現後,第一道防線是 confirm() 對話框。第二道是 hub_epoch 機制——即使有人誤觸導致 split-brain,較低 epoch 的 Hub 會在重新連網時自動降級。

設計不是讓錯誤不可能發生,而是讓錯誤發生後能自動修正。

什麼時候你仍然需要 SSH?

Layer 3 覆蓋了 95% 的使用場景。但有些情況你仍然需要 SSH:

  • --skip-network 模式:在本機測試時跳過 hostapd/dnsmasq/靜態 IP 設定。PWA 按鈕不支援這個參數。
  • --dry-run 模式:看看 promote 會做什麼,但不真的執行。用於確認 snapshot 是否可用。
  • Demote:將 Hub 降級為 Spoke。這是管理員操作,PWA 不直接暴露(但站點管理 PWA 提供了手動觸發的介面)。
  • Rollback 診斷:promote 失敗時,查看 log 確認原因。

SSH 是後備,不是主要路徑。就像飛機有手動駕駛模式——你希望它永遠不需要用到,但它必須在那裡。

iPhone / iPad 能 SSH 嗎?

可以。App Store 有 Termius、Prompt、Blink Shell 等 SSH client。

但重點是:你不需要。 Layer 3 的存在就是為了讓 SSH 變成選項而不是必要條件。

在災難現場,你不會要求護理師安裝 SSH App。你給她一張 QR Code 卡片:掃一下連 WiFi,掃一下開系統,需要升級時按一個按鈕。

這是三層設計的核心理念:把系統管理員的能力,包裝成任何人都能操作的介面。


延伸閱讀:拔線即走 — Hub-Spoke 拓撲、角色升級與五分鐘接手 · 「離線優先」不是「離線堪用」 · 拔線測試 — 你的系統敢斷網運作嗎?