오해: "승격하려면 SSH가 필요하다"
이전 글에서 xGrid의 Hub-Spoke 토폴로지를 설명했습니다. 가장 강력한 기능은 어떤 Spoke든 Hub가 될 수 있다는 것입니다 — 전원을 뽑고, 들고 가서, 전원을 켜고, 승격합니다.
그 글에서 이 명령어를 보여 주었습니다:
sudo xgrid-promote
SSH를 통한 셸 명령입니다. 자연스러운 후속 질문은 이것입니다: "그러면 이것을 하려면 노트북, SSH 클라이언트, 명령줄 기술이 필요합니까?"
아닙니다.
SSH는 최하위 계층입니다 — 시스템 관리자와 개발자를 위해 구축된 것입니다. 그러나 대량 사상자 상황에서 Spoke를 승격해야 하는 사람은 간호사, 응급구조사 또는 현장 지휘관일 가능성이 높습니다. 그들이 가진 것은 iPad이지 노트북이 아닙니다.
따라서 xGrid의 promote는 단순한 셸 스크립트가 아닙니다. 3계층 아키텍처입니다.
Promote의 3계층
| 계층 | 트리거 | 사용자 | 필요한 도구 |
|---|---|---|---|
| 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()대화상자, 이중 클릭 방지 파란색 맥동 애니메이션, 성공/실패 토스트 피드백
3계층이라는 설계는 다음을 의미합니다: 작업의 복잡도는 시스템이 아닌 사용자가 결정합니다. 시스템 관리자는 SSH로 세밀한 제어가 가능합니다. 간호사는 버튼만 누르면 됩니다.
QR 코드 워크플로우 — 제로에서 승격까지
각 RPi에는 라미네이팅된 QR 코드 카드가 기기 옆에 부착되어 함께 제공됩니다. 카드에는 두 개의 코드가 있습니다:
┌─────────────────────────────────────────┐
│ 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는 일상적인 작업이 아닙니다. 긴급 작업입니다. 호기심에서 누군가 누르는 것은 바람직하지 않습니다 — 두 번째 Hub(스플릿 브레인)를 만들어 버리기 때문입니다. 따라서 버튼은 필요할 때만 나타납니다: Hub가 진정으로 오프라인이고, 현재 노드가 Spoke이며, 로드할 유효한 스냅샷이 있는 경우에만입니다.
그 상황에서도 첫 번째 안전장치는 confirm() 대화상자입니다. 두 번째는 hub_epoch 메커니즘입니다 — 실수로 스플릿 브레인이 발생하면, 더 낮은 epoch의 Hub가 두 네트워크가 재연결될 때 자동으로 강등됩니다.
SSH가 여전히 필요한 경우
3계층이 현장 시나리오의 95%를 처리합니다. 그러나 일부 경우에는 여전히 SSH가 필요합니다:
--skip-network모드: localhost 테스트 시 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에 한 번 스캔, 시스템에 한 번 스캔, 승격할 때 버튼 한 번.
이것이 3계층 설계의 핵심 철학입니다: 시스템 관리 능력을 누구나 조작할 수 있는 인터페이스로 감싸는 것입니다.
추가 읽기: 뽑아서 이동 — Hub-Spoke 토폴로지, 역할 승격, 5분 장애 조치 · "오프라인 퍼스트"는 "오프라인 허용"이 아닙니다 · 워크어웨이 테스트 — 당신의 시스템은 연결 해제에서 살아남을 수 있습니까?
