montana/Node/External-Audit/SEAMLESS-FAILOVER.md
2026-05-21 03:44:38 +03:00

71 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Бесшовный 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.