誤解:「昇格にはSSHが必要」
前回の記事で、xGridのHub-Spokeトポロジーを紹介しました。その最も強力な機能は、どのSpokeでもHubになれること — 電源を抜き、持ち運び、電源を入れ、昇格します。
前回の記事ではこのコマンドを示しました:
sudo xgrid-promote
SSH経由のシェルコマンドです。当然の疑問が生まれます:「では、これを行うにはラップトップとSSHクライアント、コマンドラインの知識が必要なのですか?」
いいえ。
SSHは最下層です。システム管理者と開発者のために構築されたものです。しかし大量傷病者事案では、Spokeを昇格させる必要がある人は看護師、救急救命士、または現場指揮官である可能性が高いです。彼らが持っているのはiPadであり、ラップトップではありません。
そのため、xGridのpromoteは単なるシェルスクリプトではありません。三層アーキテクチャです。
Promoteの三層構造
| 層 | トリガー | ユーザー | 必要なツール |
|---|---|---|---|
| 第1層 — Script | sudo xgrid-promote | システム管理者 | SSH + ラップトップ |
| 第2層 — API | POST /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秒後)、画面上部に赤いバナーがスライドインします:
ステップ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分間フェイルオーバー · 「オフラインファースト」は「オフライン許容」ではない · ウォークアウェイテスト — あなたのシステムは切断に耐えられますか?
