montana/Node/External-Audit/SEAMLESS-FAILOVER.md

71 lines
3.6 KiB
Markdown
Raw Normal View History

2026-05-21 03:44:38 +03:00
# Бесшовный failover при падении узла
Версия: **2026-05-20**
## Проблема
Хостинг VPN-узла (например THE.Hosting для Helsinki) может упасть в любой момент. Пользователи на этом узле получают разрыв и таймаут.
## Решение — DNS-failover на уровне per-city hostname
`fi.montana.quest`, `de.montana.quest`, `us.montana.quest` — A-записи Cloudflare, TTL=120s.
**В нормальном режиме** каждая указывает на «свой» узел.
**При падении** orchestrator watchdog (Moscow) автоматически:
1. Детектит offline за ≤60 секунд (2 fails подряд × 30s).
2. PATCH-ит A-запись через Cloudflare API: `<dead-host>.montana.quest` → IP fallback узла.
3. Клиент при reconnect перерезолвит hostname → попадёт на живой узел.
4. **Ключ универсальный** — Reality auth проходит на любом узле тем же UUID/pbk/sid.
5. Когда узел восстанавливается → A-запись возвращается на родной IP.
## Fallback таблица
| Hostname | Native | Fallback (по приоритету) |
|---|---|---|
| `fi.montana.quest` | 91.132.142.42 (FI) | de → us |
| `de.montana.quest` | 89.19.208.158 (FRA) | fi → us |
| `us.montana.quest` | 86.104.72.12 (US) | de → fi |
## Endpoints
| URL | Что |
|---|---|
| `/vpn/node/failover` | Текущее соответствие hostname → IP и причина |
| `/vpn/node/uptime` | Статус каждого узла (online/offline + 24h uptime) |
## Гарантии
| Свойство | Как достигается |
|---|---|
| Detection ≤ 60s | Watchdog probe каждые 30s, threshold 2 fails |
| DNS update ≤ 5s | Cloudflare API PATCH, propagation мгновенная на CF NS |
| Клиент перейдёт ≤ 120s | TTL=120s + reconnect клиента |
| **End-to-end seamless** | ~60-120s от момента падения до бесшовной работы |
## E2E доказательство (2026-05-20)
```
00:00:10 — ssh montana-us 'systemctl stop xray'
00:00:45 — us.montana.quest перепрыгнул на 89.19.208.158 (Frankfurt) за 35 секунд
00:00:45 — ssh montana-us 'systemctl start xray'
00:01:?? — us.montana.quest вернулся на 86.104.72.12 (native US)
```
## Что НЕ маскируется
- **Geo-location пользователя:** клиент думает что подключён к Хельсинки, реально на Frankfurt. На сайте `/vpn/node/failover` это видно публично.
- **Latency:** failover-узел может быть географически дальше, latency возрастёт. Это лучше чем «нет VPN».
## Что показано пользователю
На сайте `montana.quest/vpn/`:
- 🇫🇮 Хельсинки Монтана: 🟢 Онлайн | 🔴 Офлайн (по `/vpn/node/uptime`)
- Можно добавить badge «⚠ временно через FRA» когда failover активен (P1).
## Roadmap
- **P1:** Бейдж на сайте «обслуживается через X» когда узел в failover.
- **P2:** Per-region fallback policy — европейцы получают европейский fallback, NA — американский.
- **P3:** Multi-A для каждого per-city hostname с health-based weighting.