From 73ac554add77992ece9ab7550122d9cf720578fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Taylan=20Bak=C4=B1rc=C4=B1o=C4=9Flu?= Date: Mon, 17 Nov 2025 10:09:05 +0300 Subject: [PATCH] fix(backend): Skip backends with no servers in HAProxy config generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CRITICAL FIX: Backends without servers were causing HAProxy validation failures Problem: - Backend 'silbeni' (ID: 118) oluşturuldu ama server eklenmedi - Config generator backend'i haproxy.cfg'ye yazdı ama server satırı olmadan - HAProxy validation FAIL: 'backend has no servers' - Agent config'i apply etmedi - Frontend'de backend görünmedi (validation fail nedeniyle) Root Cause: - Config generator server olup olmadığını kontrol etmiyordu - HAProxy en az 1 server gerektirir, yoksa validation fail olur - Validation fail = agent apply etmez = backend haproxy.cfg'de görünmez Solution: - Backend loop başında server pre-check eklendi - Server yoksa backend config'e yazılmaz ve WARNING log'lanır - HAProxy validation her zaman başarılı olur (sadece valid backend'ler yazılır) Impact: ✅ Server olmayan backend'ler artık config'e yazılmayacak ✅ HAProxy validation artık fail olmayacak ✅ Agent successfully apply edecek ✅ Kullanıcı frontend'de backend'i görecek (0/0 servers ⚠️ Empty tag ile) ✅ Kullanıcı server ekledikten sonra Apply yapınca backend haproxy.cfg'ye yazılacak Testing: - Server olmayan backend oluştur → Config'e yazılmaz (log: SKIPPING) - Server ekle → Config'e yazılır - Apply → Başarılı Related: a39a5d6 (frontend null/undefined check) Refs: #backend-validation #haproxy-config-generator --- backend/services/haproxy_config.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/services/haproxy_config.py b/backend/services/haproxy_config.py index 919ad80..0ceba1f 100644 --- a/backend/services/haproxy_config.py +++ b/backend/services/haproxy_config.py @@ -441,6 +441,19 @@ async def generate_haproxy_config_for_cluster(cluster_id: int, conn: Optional[An logger.error("Backend with missing name detected - skipping") continue + # CRITICAL PRE-CHECK: Get servers BEFORE starting backend config + # This allows us to skip backends with no servers before writing anything + # CRITICAL FIX: Handle servers with NULL cluster_id (legacy data) + # CRITICAL: Select ssl_certificate_id for SSL ca-file path generation + servers_precheck = await db_conn.fetch(""" + SELECT id FROM backend_servers + WHERE backend_name = $1 AND (cluster_id = $2 OR cluster_id IS NULL) AND is_active = TRUE + """, backend["name"], cluster_id) + + if not servers_precheck or len(servers_precheck) == 0: + logger.warning(f"⚠️ CONFIG GENERATION: Skipping backend '{backend['name']}' - NO ACTIVE SERVERS. HAProxy requires at least one server per backend.") + continue + config_lines.append(f"backend {backend['name']}") # --- HAProxy Configuration Best Practice Order ---