From d20578c91aceff18b884bd5717b6ef6ed7708772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Murat=20=C3=96ZDEM=C4=B0R?= Date: Wed, 17 Jun 2026 15:04:09 +0300 Subject: [PATCH] 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. --- facts/node-recovery-failover.md | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/facts/node-recovery-failover.md b/facts/node-recovery-failover.md index e742be3..57dfa74 100644 --- a/facts/node-recovery-failover.md +++ b/facts/node-recovery-failover.md @@ -91,6 +91,45 @@ Tüm bu servislerin verileri ve konfigürasyonları StorageBox'ta tutulur: - **Prometheus:** `/mnt/storagebox/prometheus/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 = ^ - - \[[^\]]+\] "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ü ### 1. Servisleri Başka Node'a Taşı