docs: Document SWAG fail2ban configuration for Grafana Live WebSocket 401s

Explains that SWAG's `fail2ban` configurations reside in a node-local Docker volume, not StorageBox. Details a scenario where Grafana Live WebSocket reconnects can cause 401s, leading to IP bans. Provides an Ansible mitigation strategy and highlights the need to ensure consistent `fail2ban` overrides across all potential failover nodes for smooth recovery.
This commit is contained in:
Murat ÖZDEMİR 2026-06-17 15:04:09 +03:00
parent 8875af8e8a
commit d20578c91a

View File

@ -91,6 +91,45 @@ Tüm bu servislerin verileri ve konfigürasyonları StorageBox'ta tutulur:
- **Prometheus:** `/mnt/storagebox/prometheus/data` - **Prometheus:** `/mnt/storagebox/prometheus/data`
- **Grafana:** `/mnt/storagebox/grafana/data` - **Grafana:** `/mnt/storagebox/grafana/data`
### SWAG Config Kaynağı ve fail2ban Notu
Mevcut stack dosyasında SWAG ana `/config` dizini Docker named volume olarak bağlıdır:
- `swag-vl:/config`
StorageBox üzerinden ayrıca sadece şu alt dizinler bind edilir:
- `${SWAG_DNS_CONFIG_DIR}:/config/dns-conf`
- `${SWAG_SITE_CONFS_DIR}:/config/nginx/site-confs`
- `${SWAG_PROXY_CONFS_DIR}:/config/nginx/proxy-confs`
- `swag-logs-vl:/config/log`
Bu nedenle SWAG'in nginx site config'leri deploy pipeline tarafından StorageBox altına render edilirken, SWAG container içindeki fail2ban config'leri (`/config/fail2ban/...`) `swag-vl` named volume içinde kalır. Bu alan Ansible `storagebox` rolü tarafından yönetilmez.
Grafana açık kalan tarayıcı sekmeleri `wss://grafana.iklim.co/api/live/ws` için tekrar tekrar 401 döndürebilir. SWAG içindeki `nginx-unauthorized` fail2ban jail'i bu 401'leri sayarsa ofis IP'si banlanabilir. Bu auth login problemi değildir; `/v1/auth/login` 200 dönerken Grafana Live WebSocket reconnect'leri fail2ban eşiğini doldurabilir.
Kalıcı çözüm için deploy pipeline içinde runtime config yazılmamalıdır; bu Ansible ile drift yaratır. Bunun yerine Ansible tarafında SWAG persistent config'i yöneten ayrı ve küçük bir rol kullanılmalıdır. Rol `iklim-app-01` üzerinde `iklimco_swag-vl` Docker volume mountpoint'ini bulup şu override dosyasını idempotent şekilde yazmalıdır:
```text
/config/fail2ban/filter.d/nginx-unauthorized.local
```
Önerilen içerik:
```ini
[Definition]
ignoreregex = ^<HOST> - - \[[^\]]+\] "GET /api/live/ws HTTP/[0-9.]+" 401\b
```
SWAG container çalışıyorsa rol değişiklikten sonra sadece ilgili jail'i reload etmelidir:
```bash
docker exec $(docker ps -q -f name=iklimco_swag | head -1) \
fail2ban-client reload nginx-unauthorized
```
Failover sırasında SWAG `iklim-app-02` veya `iklim-app-03` üzerine taşınacaksa, `swag-vl` Docker named volume'unun node-local olduğu unutulmamalıdır. Hedef node üzerinde aynı fail2ban override dosyasının mevcut olduğundan emin olunmalıdır. Bu nedenle `swag_config` Ansible rolü failover hedefi olabilecek app node'ları için de çalıştırılabilir tasarlanmalıdır; prod varsayılanında aktif SWAG node'u `iklim-app-01` olduğu için ilk uygulama orada yapılır.
## Prod Senaryo: `iklim-app-01` Çöktü ## Prod Senaryo: `iklim-app-01` Çöktü
### 1. Servisleri Başka Node'a Taşı ### 1. Servisleri Başka Node'a Taşı