ボタン一つでHubに昇格 — xGrid Promoteの三層設計
Blog/
||||||

ボタン一つでHubに昇格 — xGrid Promoteの三層設計

SpokeをHubに昇格するのにSSHもラップトップもコマンドライン操作も必要ありません。QRコードでWiFi接続、PWAを開き、ボタンを押す — 3ステップです。その背後にはScript、API、UIの三層アーキテクチャがあり、看護師がシステム管理者の操作を実行できるようにしています。

誤解:「昇格にはSSHが必要」

前回の記事で、xGridのHub-Spokeトポロジーを紹介しました。その最も強力な機能は、どのSpokeでもHubになれること — 電源を抜き、持ち運び、電源を入れ、昇格します。

前回の記事ではこのコマンドを示しました:

sudo xgrid-promote

SSH経由のシェルコマンドです。当然の疑問が生まれます:「では、これを行うにはラップトップとSSHクライアント、コマンドラインの知識が必要なのですか?」

いいえ。

SSHは最下層です。システム管理者と開発者のために構築されたものです。しかし大量傷病者事案では、Spokeを昇格させる必要がある人は看護師、救急救命士、または現場指揮官である可能性が高いです。彼らが持っているのはiPadであり、ラップトップではありません。

そのため、xGridのpromoteは単なるシェルスクリプトではありません。三層アーキテクチャです。

Promoteの三層構造

トリガーユーザー必要なツール
第1層 — Scriptsudo xgrid-promoteシステム管理者SSH + ラップトップ
第2層 — APIPOST /api/failover/promote上級オペレーター任意のHTTPクライアント
第3層 — PWA UI赤いバナー上の「Hubに昇格」ボタン誰でもiPad / iPhone + ブラウザ

第3層が第2層を呼び出します。第2層が第1層を呼び出します。各層が独自のセーフガードを追加しています:

  • 第1層 — 8ステップのアトミックなステートマシン、いかなる失敗時も完全ロールバック
  • 第2層 — ロール検証(すでにHub?拒否)、状態検証(遷移進行中?拒否)、60秒タイムアウト
  • 第3層 — 誤タップ防止のconfirm()ダイアログ、二重クリック防止の青い脈動アニメーション、成功/失敗のトーストフィードバック

三層という設計は、操作の複雑さがシステムではなくユーザーによって決まることを意味します。システム管理者はSSHで細かな制御が可能です。看護師はボタンを押すだけです。

QRコードワークフロー — ゼロから昇格まで

各RPiにはラミネート加工されたQRコードカードが付属し、デバイスの横に設置されています。カードには2つのコードが印刷されています:

┌─────────────────────────────────────────┐
│  DNO-HC02 Connection Card                │
│                                          │
│  ┌──────────┐    ┌──────────┐           │
│  │ WiFi QR  │    │ MIRS QR  │           │
│  │          │    │          │           │
│  │ スキャン │    │ スキャン │           │
│  │ してWiFi │    │ してシス │           │
│  │ 接続     │    │ テム起動 │           │
│  └──────────┘    └──────────┘           │
│                                          │
│  WiFi: DNO-HC02                          │
│  MIRS: http://10.0.0.1:8000             │
└─────────────────────────────────────────┘

ステップ1 — WiFi QRコードをスキャン。iPhoneとiPadのカメラはWiFi QRコードをネイティブサポートしています(形式:WIFI:T:WPA;S:{SSID};P:{password};;)。スキャンすると「ネットワークに参加」のプロンプトが表示されます。ワンタップでRPiのホットスポットに接続します。SSIDやパスワードの手入力は不要です。

ステップ2 — MIRS QRコードをスキャンするかURLを入力。SafariがMIRS PWAを開きます。Service Workerが即座にキャッシュします — 以降のアクセスはオフラインで動作します。

ステップ3 — Hubがオフラインになると、赤いバナーが自動的に表示されます。PWAは30秒ごとにHubの状態をポーリングします。3回連続で失敗すると(90秒後)、画面上部に赤いバナーがスライドインします:

Hub Offline(接続失敗3回)Hubに昇格

ステップ4 — 「Hubに昇格」を押します。確認ダイアログが表示されます:「このノードをHubに昇格しますか?」確認後、バナーが青色に変わり脈動アニメーションが表示されます:「Hubに昇格中、お待ちください…」

60秒以内にスクリプトが8つのステップを完了します。成功すると、ページが自動的にリロードされ、緑のトーストが表示されます:「昇格完了!ロール:HUB | Epoch: N」。

SSHなし。ラップトップなし。覚えるべきコマンドなし。

自動検知であり、手動ナビゲーションではない

第3層の設計上の選択に注目してください:ボタンはユーザーが探し出すメニュー内にはありません。代わりに、Hubが実際にオフラインになったとき、バナーが表示されて尋ねます:「Hubがダウンしました。引き継ぎますか?」

これは意図的です。

Promoteは日常的な操作ではありません。緊急時の操作です。好奇心から誰かが押すことは望ましくありません — それは2番目のHub(スプリットブレイン)を生み出してしまいます。そのため、ボタンは必要な時にのみ表示されます:Hubが本当にオフラインであり、現在のノードがSpokeであり、ロードする有効なスナップショットがある場合のみです。

その場合でも、最初のセーフガードはconfirm()ダイアログです。2番目はhub_epochメカニズムです — 誤ってスプリットブレインが発生した場合、epochの低いHubが2つのネットワークが再接続された際に自動的に降格します。

この設計はミスを不可能にするのではありません。ミスが自己修復するようにしているのです。

SSHが必要な場合

第3層がフィールドシナリオの95%をカバーします。ただし、以下のケースではSSHが必要です:

  • --skip-networkモード:ローカルホストテスト時にhostapd/dnsmasq/静的IP設定をスキップ。PWAボタンはこのフラグをサポートしていません。
  • --dry-runモード:実行せずにpromoteが何を行うかをプレビュー。スナップショットの可用性を確認するのに有用です。
  • Demote:HubをSpokeに降格。これは管理操作であり、自動バナーでは公開されていません(ただし、ステーション管理PWAが手動インターフェースを提供しています)。
  • ロールバック診断:promoteが失敗した場合、ログを確認して原因を特定します。

SSHはフォールバックであり、主要な経路ではありません。航空機の手動飛行制御と同じです — 使える状態にしておきたいですが、めったに必要にならないよう設計します。

iPhone / iPadでSSHは可能ですか

はい。App StoreにはTermius、Prompt、Blink Shellなどの高性能SSHクライアントがあります。

しかし重要なのは:それらは必要ないということです。第3層は、SSHを必須ではなく選択肢にするために存在しています。

大量傷病者事案において、看護師にSSHアプリのインストールを求めることはありません。ラミネートされたQRコードカードを渡すだけです:WiFiに1回スキャン、システムに1回スキャン、昇格時にボタンを1回押す。

これが三層設計の核心思想です:システム管理能力を、誰でも操作できるインターフェースに包み込むことです。


さらに読む:引き抜いて移動 — Hub-Spokeトポロジー、ロール昇格、5分間フェイルオーバー · 「オフラインファースト」は「オフライン許容」ではない · ウォークアウェイテスト — あなたのシステムは切断に耐えられますか?