feat!: universal redesign — drop Minecraft stack, single-crate architecture
- remove Java plugins (velocity/paper), dashboard, all MC-specific code
(handshake, death_code, varint, hostname-HMAC); available in history pre-v0.2
- merge crates/* into one package with src/bin/{rampart,rampart-manager,rampart-cli}
- ProtocolHandler trait + registry (no implementations yet), universal PoW kept
- XDP: universal L3/L4 filter (xdp/core/) + pluggable hook API (xdp/hooks/),
fix IPv6 saddr bug; clang build verified
- docs: bilingual knowledge base (docs/kb/: attacks x4, defense-levels,
practice x3), rewrite README/architecture for universal concept
- TODO.md v4.0: <=300-line module limit, competitor benchmark section (ref/)
- deploy/CI/docs cleanup: no MC references, new binary names
cargo build/clippy(-D warnings)/test green (55 tests)
This commit is contained in:
parent
0b53ed720b
commit
15f474486a
179 changed files with 5044 additions and 11519 deletions
|
|
@ -1,76 +1,55 @@
|
|||
# Disaster Recovery - Rampart
|
||||
|
||||
> Что делать когда что-то пошло не так.
|
||||
> Что делать, когда что-то пошло не так.
|
||||
|
||||
## Схема failover
|
||||
|
||||
```
|
||||
Redis упал:
|
||||
Edge: продолжает с локальным кэшем
|
||||
Velocity: продолжает с последним кэшем серверов
|
||||
Manager: API не работает → рестарт Redis, рестарт Manager
|
||||
Edge: продолжает автономно на локальном кэше блэклиста
|
||||
Manager: API отдаёт пустые списки / ошибки → рестарт Redis
|
||||
|
||||
Manager упал:
|
||||
Edge: продолжает автономно
|
||||
Velocity: читает Redis напрямую
|
||||
Dashboard: недоступен → рестарт Manager
|
||||
Edge: продолжает фильтрацию (фильтрация не зависит от Manager)
|
||||
Управление (CLI/API) недоступно до восстановления
|
||||
|
||||
Edge нода упала:
|
||||
Игроки на ней теряют коннект
|
||||
При реконнекте → BGP/DNS → другая Edge нода
|
||||
Если Edge одна → все офлайн
|
||||
Клиенты за ней теряют соединение
|
||||
При нескольких edge → DNS round-robin на живые
|
||||
Если edge одна — сервис недоступен
|
||||
|
||||
Полный сбой дата-центра:
|
||||
Edge ноды в других ДЦ продолжают работу
|
||||
Игроки на живых серверах продолжают играть
|
||||
Новые регистрации/баны не синхронизируются до восстановления
|
||||
Edge в других ДЦ продолжают работу
|
||||
Баны/ноды не синхронизируются до восстановления Redis
|
||||
```
|
||||
|
||||
Все компоненты кроме Manager продолжают работать в degraded mode.
|
||||
Manager - единственная single point of failure (без Redis Sentinel).
|
||||
|
||||
---
|
||||
|
||||
## 1. Redis упал
|
||||
|
||||
### Симптомы
|
||||
- Velocity не видит новые серверы
|
||||
- Edge не синхронизирует блэклист
|
||||
- Manager API возвращает 500
|
||||
- Edge перестал синхронизировать блэклист
|
||||
- Manager API отдаёт пустые списки nodes/servers/blacklist
|
||||
|
||||
### Влияние
|
||||
- **Edge:** Продолжает работать с локальным кэшем блэклиста. Новые баны не синхронизируются между нодами.
|
||||
- **Velocity:** Продолжает работать с последним кэшем server registry. Новые серверы недоступны до восстановления Redis.
|
||||
- **Manager:** API не работает.
|
||||
- **Edge:** работает с локальным кэшем; новые баны не распространяются между нодами.
|
||||
- **Manager:** данные из Redis недоступны.
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. Проверка Redis
|
||||
redis-cli ping
|
||||
systemctl status redis
|
||||
redis-cli ping || systemctl restart redis
|
||||
|
||||
# 2. Если Redis завис - рестарт
|
||||
systemctl restart redis
|
||||
|
||||
# 3. Если Redis навсегда умер - поднять новый
|
||||
# Убедись что пароль совпадает с конфигами
|
||||
docker run -d --name rampart-redis \
|
||||
-p 6379:6379 \
|
||||
# Поднять новый (пароль должен совпадать):
|
||||
docker run -d --name rampart-redis -p 6379:6379 \
|
||||
redis:7-alpine redis-server --requirepass "$REDIS_PASSWORD"
|
||||
|
||||
# 4. Перезапустить Manager (он переподключится)
|
||||
systemctl restart rampart-manager
|
||||
|
||||
# 5. Edge ноды переподключатся автоматически (retry в драйвере Redis)
|
||||
# Если не переподключились - рестарт:
|
||||
systemctl restart rampart-edge
|
||||
|
||||
# 6. Velocity переподключится с задержкой до 5 сек
|
||||
systemctl restart rampart-manager # переподключится
|
||||
# Edge переподключается сам (retry в драйвере); иначе:
|
||||
systemctl restart rampart
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- Redis Sentinel для HA (3 ноды)
|
||||
- AOF + RDB persistence включены
|
||||
- Регулярные бэкапы: `redis-cli SAVE`
|
||||
|
||||
|
|
@ -79,245 +58,92 @@ systemctl restart rampart-edge
|
|||
## 2. Manager упал
|
||||
|
||||
### Симптомы
|
||||
- API не отвечает
|
||||
- Blacklist изменения не применяются
|
||||
- Edge heartbeat пропадает
|
||||
- `rampart-cli` команды падают с ошибкой соединения
|
||||
- `/api/v1/health` не отвечает
|
||||
|
||||
### Влияние
|
||||
- **Edge:** Продолжает работать автономно. Локальный блэклист активен.
|
||||
- **Velocity:** Продолжает работать. Server registry из Redis доступен.
|
||||
- **Dashboard:** Недоступен.
|
||||
- Edge продолжает фильтровать трафик автономно.
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. Проверка
|
||||
systemctl status rampart-manager
|
||||
journalctl -u rampart-manager -n 50 --no-pager
|
||||
|
||||
# 2. Рестарт
|
||||
systemctl restart rampart-manager
|
||||
|
||||
# 3. Если не стартует - проверить логи
|
||||
# Не стартует? Частая причина — env:
|
||||
# JWT_SECRET < 32 байт или API_PASSWORD=changeme → процесс выходит с ошибкой.
|
||||
journalctl -u rampart-manager -e | grep ERROR
|
||||
|
||||
# 4. Если проблема в конфиге
|
||||
# Откатить последние изменения конфига
|
||||
git checkout HEAD~1 -- config/manager.toml
|
||||
systemctl restart rampart-manager
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- systemd `Restart=always`
|
||||
- Мониторинг: Prometheus alert `EdgeNodeDown`
|
||||
- Два Manager в active/passive (v0.6+)
|
||||
|
||||
---
|
||||
|
||||
## 3. Edge нода упала
|
||||
|
||||
### Симптомы
|
||||
- Игроки на этой ноде теряют соединение
|
||||
- Prometheus alert: `EdgeNodeDown`
|
||||
- Метрики перестали приходить
|
||||
|
||||
### Влияние
|
||||
- Игроки, подключённые через эту ноду, дисконнектятся
|
||||
- При переподключении → попадают на другую edge ноду
|
||||
- Если edge нода одна → **все игроки офлайн**
|
||||
- Клиенты теряют соединение, метрики :9090 пропали
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. Проверка
|
||||
systemctl status rampart-edge
|
||||
journalctl -u rampart-edge -n 50 --no-pager
|
||||
systemctl status rampart
|
||||
journalctl -u rampart -n 50 --no-pager
|
||||
|
||||
# 2. Если OOM kill
|
||||
dmesg | grep -i "oom\|rampart"
|
||||
dmesg | grep -i "oom\|rampart" # OOM kill?
|
||||
systemctl restart rampart
|
||||
|
||||
# 3. Рестарт
|
||||
systemctl restart rampart-edge
|
||||
|
||||
# 4. Если не стартует - проверить конфиг
|
||||
rampart doctor
|
||||
|
||||
# 5. Если аппаратная проблема - переключить DNS на другую edge ноду
|
||||
# (при нескольких edge нодах)
|
||||
# Не стартует — проверь конфиг и логи (см. runbook.md §2)
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- Минимум 2 edge ноды
|
||||
- DNS round-robin или BGP Anycast
|
||||
- Минимум 2 edge ноды + DNS round-robin
|
||||
- systemd `Restart=always`
|
||||
- `rampart drain` для graceful maintenance
|
||||
- Несколько edge нод за одним DNS-именем
|
||||
|
||||
---
|
||||
|
||||
## 4. ClickHouse упал
|
||||
|
||||
### Симптомы
|
||||
- Attack log не пишется
|
||||
- Dashboard по блокировкам пустой
|
||||
|
||||
### Влияние
|
||||
- **Edge / Velocity / Manager:** Продолжают работать. Потеря аналитики.
|
||||
- Данные не теряются (буферизация в Manager на 1 секунду с батчем до 1000).
|
||||
Только потеря аналитики: события буферизуются и пишутся асинхронно,
|
||||
фильтрация не зависит от ClickHouse.
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. Проверка
|
||||
systemctl status clickhouse-server
|
||||
curl http://localhost:8123/ping
|
||||
|
||||
# 2. Рестарт
|
||||
systemctl restart clickhouse-server
|
||||
|
||||
# 3. Если долго восстанавливается - проверить диск
|
||||
df -h /var/lib/clickhouse
|
||||
|
||||
# 4. Если диск полон - почистить старые партиции
|
||||
clickhouse-client --query "ALTER TABLE rampart.blocked DROP PARTITION '2025-01'"
|
||||
curl http://localhost:8123/ping || systemctl restart clickhouse-server
|
||||
df -h /var/lib/clickhouse # диск полон?
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- TTL на таблицах (90 дней автоочистка)
|
||||
- ClickHouse Cloud или Cluster (v0.6+)
|
||||
- Alertmanager при заполнении диска > 80%
|
||||
|
||||
---
|
||||
|
||||
## 5. Root CA key скомпрометирован
|
||||
|
||||
### Симптомы
|
||||
- Вы знаете что ключ утек
|
||||
- Подозрительные сертификаты в сети
|
||||
|
||||
### Влияние
|
||||
- **Полная компрометация mTLS:** Атакующий может выпустить сертификаты для любой ноды
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. НЕМЕДЛЕННО: Сгенерировать новый Root CA
|
||||
rampart pki init --root-ca rampart-ca-v2 --force
|
||||
|
||||
# 2. Выпустить новые сертификаты для ВСЕХ нод
|
||||
for node in edge-eu-1 edge-us-1 vel-1 manager; do
|
||||
rampart pki issue --ca edge-ca --name "$node" \
|
||||
--ip "$(dig +short $node.rampart.internal)" \
|
||||
--san "$node.rampart.internal" \
|
||||
--output "/etc/rampart/pki/$node/"
|
||||
done
|
||||
|
||||
# 3. Разослать новые сертификаты на все ноды
|
||||
rampart pki sync --all-nodes
|
||||
|
||||
# 4. Перезапустить все сервисы (с новыми сертификатами)
|
||||
rampart restart --all
|
||||
|
||||
# 5. Отозвать старый Root CA
|
||||
rampart pki revoke --ca rampart-ca-v1
|
||||
|
||||
# 6. Расследовать утечку
|
||||
# - Проверить кто имел доступ к ключу
|
||||
# - Проверить логи доступа
|
||||
# - Сменить все пароли
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- Root CA ключ хранить **вне серверов** (на YubiKey или в Vault)
|
||||
- Использовать Intermediate CA для повседневной работы
|
||||
- Audit лог доступа к CA ключу
|
||||
|
||||
---
|
||||
|
||||
## 6. Полный сбой инфраструктуры
|
||||
|
||||
### Ситуация
|
||||
Упали нода Manager + Redis + NATS одновременно (например, отключили дата-центр).
|
||||
|
||||
### Влияние
|
||||
- Все edge ноды продолжают работать автономно
|
||||
- Блэклист не синхронизируется
|
||||
- Server registry не обновляется
|
||||
- **Игроки продолжают играть на уже запущенных серверах**
|
||||
|
||||
### Восстановление
|
||||
## 5. Полный сбой инфраструктуры
|
||||
|
||||
```bash
|
||||
# 1. Поднять Manager на новой VDS
|
||||
docker compose up -d
|
||||
docker compose up -d redis && cargo run --release --bin rampart-manager
|
||||
|
||||
# 2. Восстановить Redis из бэкапа
|
||||
redis-cli --pipe < /backup/rampart-redis-$(date +%Y-%m-%d).rdb
|
||||
|
||||
# 3. Edge ноды и Velocity переподключатся автоматически
|
||||
# (они реконнектятся с экспоненциальной задержкой: 1s, 2s, 4s, 8s... max 60s)
|
||||
# 3. Edge ноды переподключатся автоматически
|
||||
|
||||
# 4. Проверить что всё синхронизировалось
|
||||
rampart doctor
|
||||
```
|
||||
|
||||
### Предотвращение
|
||||
- Бэкапы Redis: ежедневно, хранить 30 дней
|
||||
- Terraform для быстрого поднятия инфраструктуры
|
||||
- DNS записи с низким TTL (60 сек)
|
||||
|
||||
---
|
||||
|
||||
## 7. DDoS на Manager/Redis
|
||||
|
||||
### Симптомы
|
||||
- Manager API не отвечает
|
||||
- Redis latency > 1 секунды
|
||||
- CPU Manager 100%
|
||||
|
||||
### Действия
|
||||
|
||||
```bash
|
||||
# 1. Изолировать Manager - закрыть все порты кроме WireGuard
|
||||
iptables -P INPUT DROP
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|
||||
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
|
||||
iptables -A INPUT -j DROP
|
||||
|
||||
# 2. Если DDoS идёт на публичный IP - отключить его
|
||||
# (Оставить только WireGuard туннель)
|
||||
|
||||
# 3. Edge ноды переживут без Manager несколько часов
|
||||
# (они кэшируют блэклист локально)
|
||||
# 4. Проверить
|
||||
rampart-cli doctor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Cheatsheet быстрых команд
|
||||
## 6. Cheatsheet быстрых команд
|
||||
|
||||
```bash
|
||||
# Рестарт всего
|
||||
systemctl restart rampart-edge rampart-manager redis clickhouse-server
|
||||
|
||||
# Проверка здоровья всей системы
|
||||
rampart doctor
|
||||
|
||||
# Последние 50 строк логов edge
|
||||
journalctl -u rampart-edge -n 50 -f
|
||||
|
||||
# CPU/memory edge
|
||||
htop -p $(pgrep -d',' rampart-edge)
|
||||
|
||||
# Трафик на интерфейсе
|
||||
systemctl restart rampart rampart-manager redis clickhouse-server
|
||||
journalctl -u rampart -n 50 -f
|
||||
htop -p $(pgrep -d',' rampart)
|
||||
iftop -i eth0
|
||||
|
||||
# Статистика Redis
|
||||
redis-cli info stats | grep -E "total_connections|total_commands|rejected"
|
||||
|
||||
# Активные соединения
|
||||
ss -s | grep TCP
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Версия: 1.0 | Июль 2026*
|
||||
*Версия: 2.0 | Август 2026*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue