Commit Graph

14 Commits

Author SHA1 Message Date
taylanbakircioglu 8a24d22e5d debug: Add console logs for tcp_request_rules in frontend edit modal
Added debug logging to track tcp_request_rules value when frontend edit modal opens.
This will help diagnose why tcp_request_rules from bulk import are not appearing in the edit form.
2025-11-14 01:06:38 +03:00
taylanbakircioglu 1276725f45 fix: Frontend modal - preserve tcp_request_rules, redirect_rules and use-service on update
🐛 Bug Düzeltmeleri:

1. tcp_request_rules field'ı edit modal'da gösterilmiyordu
   - handleEdit() setFieldsValue'ya tcp_request_rules eklendi
   - Artık DB'deki TCP rules edit modal'da görünüyor

2. use-service header'ları (prometheus-exporter gibi) bulk import'ta siliniyordu
   - config.py bulk_create_entities'e merge stratejisi eklendi
   - Mevcut use-service direktifleri parse edilip yeni header'larla birleştiriliyor
   - Manuel eklenmiş servisler korunuyor

3. redirect_rules field'ı form'da hiç yoktu (yeni bulgu!)
   - ACL Rules panel'ına redirect_rules textarea eklendi
   - HTTP to HTTPS redirect kuralları için kullanılabilir

✅ Diğer modaller kontrol edildi:
   - Backend modal: Tam ✓
   - Server modal: Tam ✓
   - SSL modal: Tam ✓
   - WAF modal: Tam ✓
2025-11-14 01:06:38 +03:00
taylanbakircioglu 4272dbb4ef feat: Add 'option httpchk' validation and auto-filtering across all layers
CRITICAL FIX: Prevent 'option httpchk' duplication in HAProxy config by implementing 3-layer validation:

1. BULK IMPORT PARSER:
   - Frontend: Filter out 'option httpchk' with warning (not applicable to frontends)
   - Backend: Already filtering 'option httpchk' (handled by health_check_uri field)

2. BACKEND API:
   - Backend create/update: Auto-filter 'option httpchk' from options field
   - Frontend create/update: Auto-filter 'option httpchk' from options field
   - Added filter_httpchk_from_options() helper function in both routers

3. FRONTEND UI:
   - Backend modal: Real-time warning when 'option httpchk' is typed
   - Frontend modal: Real-time warning when 'option httpchk' is typed
   - Warning messages guide users to use proper fields instead

Changes:
- backend/utils/haproxy_config_parser.py: Added httpchk filtering for frontend parsing
- backend/routers/backend.py: Added filter function + applied to create/update
- backend/routers/frontend.py: Added filter function + applied to create/update
- frontend/src/components/BackendServers.js: Added dynamic warning for httpchk
- frontend/src/components/FrontendManagement.js: Added dynamic warning for httpchk

User Experience:
✅ Bulk Import: Automatically filters httpchk, shows warning in preview
✅ Manual Entry: Shows real-time warning, auto-filters on save
✅ No Config Duplication: 'option httpchk' never appears twice in generated config

Impact: Users can safely paste or type 'option httpchk' without breaking HAProxy config. System automatically filters it and guides users to use the Health Check URI field instead.
2025-11-13 10:12:30 +03:00
taylanbakircioglu 0fc18fde38 feat: Add HAProxy options support for backends and frontends
Implemented comprehensive HAProxy options field support for both backend and frontend entities to enable standard HAProxy directives like 'option http-keep-alive', 'option httplog', 'option forwardfor', etc.

Changes:
- Database: Added 'options' TEXT column to backends and frontends tables
- Models: Added options field to BackendConfig, BackendConfigUpdate, and FrontendConfig
- API Endpoints: Updated CREATE, UPDATE, and GET endpoints to handle options field
  * Backend: CREATE/UPDATE/GET with options support
  * Frontend: CREATE/UPDATE/GET with options support (fixed 5 SELECT queries)
- Config Generator: Added options block generation for both backends and frontends
- Bulk Import Parser:
  * Added options field to ParsedBackend and ParsedFrontend dataclasses
  * Implemented option directive parsing with validation
  * Added unknown option warnings
  * Fixed bulk parse response to include options field
- Bulk Import Merge: Added options field comparison in UPDATE logic
- UI Components:
  * BackendServers.js: Added options TextArea form field
  * FrontendManagement.js: Added options TextArea form field

Features:
- Multi-line options support (newline-separated format)
- Option validation with known HAProxy options list
- Backward compatible (NULL options for existing entities)
- Bulk import support with merge strategy
- Full CRUD support for both manual and bulk operations

Technical Details:
- Format: Newline-separated TEXT field for multiple options
- Validation: Warns about unknown options but allows them
- Config Generation: Each option written as separate directive
- Agent: Standard HAProxy config validation applies

Total: 10 files modified, ~195 lines added, 26 integration points verified
2025-11-13 10:12:30 +03:00
taylanbakircioglu 281e23ea27 feat: Add SSL usage_type (Frontend/Server) with conditional private key requirement
This is a comprehensive update that adds SSL certificate differentiation
for frontend (HAProxy bind) and server (backend verification) use cases.

FEATURES:
- SSL certificates can be marked as 'frontend' or 'server' usage type
- Frontend SSL: Private key REQUIRED (for HAProxy bind ssl crt)
- Server SSL: Private key OPTIONAL (CA cert only for backend verification)
- UI dropdown for usage type selection
- Dynamic form validation based on usage type
- Filtering: Frontends see only Frontend SSL, Backends see only Server SSL

DATABASE:
- Added usage_type column to ssl_certificates (default: 'frontend')
- Made private_key_content nullable for server SSL support
- Migration automatically runs on pod restart

BACKEND:
- Pydantic v2 compatibility (@field_validator, @model_validator)
- SSL router: usage_type filtering support
- Agent endpoint: usage_type field included
- Improved migration robustness with better error handling
- Fixed duplicate ensure_agents_table() function
- Fixed JSONB permissions insert with json.dumps()
- Fixed ON CONFLICT constraints with explicit checks

FRONTEND:
- SSL Management: Usage Type dropdown with visual feedback
- Frontend Management: Filters only Frontend SSL certificates
- Backend Servers: Filters only Server SSL certificates
- Dynamic private key validation (required for Frontend, optional for Server)
- Improved form UX with color-coded hints

AGENT SCRIPTS (Linux & macOS):
- Support for Server SSL without private key
- Conditional PEM file creation (cert+key vs cert-only)
- usage_type awareness in SSL deployment
- Backward compatible with existing Frontend SSL certificates

DOCKER:
- Increased npm timeout for slow networks (300s → 600s)
- Increased fetch-retries (5 → 10)
- Reduced maxsockets for stability (3 → 1)

All changes are backward compatible. Existing SSL certificates
default to 'frontend' type and continue working unchanged.

Tested with: HAProxy 2.8+, PostgreSQL 15, React 18
2025-11-11 03:41:47 +03:00
taylanbakircioglu e7f2bc30aa Cleanup: Remove emoji from Frontend SSL field description
Code cleanup - removed emoji from form field
Changed: extra="🆕 Select one or more..."
To: extra="Select one or more..."

Note: Backend Server SSL is single select (correct)
Frontend SSL is multiple select (correct - supports SNI)
2025-11-07 11:51:15 +03:00
taylanbakircioglu a1a2206098 Fix: Race condition in FrontendManagement - Guard clauses added
CRITICAL RACE CONDITION FIX - FrontendManagement:
Same race condition pattern found and fixed

Component Analysis:
  BackendServers: FIXED (guard clause added)
  FrontendManagement: FIXED (guard clause added)
  SSLManagement: Already has guard clause
  WAFManagement: Already has guard clause

FrontendManagement Issues Fixed:
1. fetchFrontends() - Added guard clause
   if (!selectedCluster) → Clear state and return

2. fetchBackends() - Added guard clause
   if (!selectedCluster) → Clear state and return

Race Condition Pattern:
  Mount → selectedCluster=undefined → fetch() → API returns ALL
  Load → selectedCluster=1 → fetch() → API returns filtered
  Problem: First response arrives late and overwrites correct data

Solution - Guard Clauses:
  if (!selectedCluster) {
    setEntities([]);
    setFilteredEntities([]);
    return; // Don't call API
  }

Risk Assessment - SAFE:
  - Only adds early return if no cluster selected
  - Doesn't change existing logic when cluster IS selected
  - Same pattern already used in SSLManagement and WAFManagement
  - No breaking changes to other functions

Impact:
  - Prevents race condition on component mount
  - Prevents all entities appearing briefly
  - Consistent behavior across all management pages

Tested Components:
  Backend/Frontend/SSL/WAF Management all now protected
2025-11-07 11:51:15 +03:00
taylanbakircioglu 97fd0e7dad Migration: Add ssl_certificate_id to backend_servers + Remove emojis
Database Migration:
- Added ssl_certificate_id column to backend_servers table
- Added FK constraint to ssl_certificates table
- ON DELETE SET NULL behavior
- Idempotent migration (safe to run multiple times)

Column Details:
  Name: ssl_certificate_id
  Type: INTEGER
  Nullable: YES
  Foreign Key: ssl_certificates(id)
  On Delete: SET NULL

Migration Function:
  add_ssl_certificate_id_to_backend_servers()
  Called in run_migrations() at Line 1523

Code Cleanup:
- Removed emojis from migration logs
- Removed emojis from SSL dropdown status icons
- Changed to text: Valid, Expiring, Expired
- Changed to text: Global, Cluster

Error Fixed:
  GET /api/backends - 500
  column "ssl_certificate_id" does not exist

After migration runs on startup, column will exist and API will work
2025-11-07 11:51:15 +03:00
taylanbakircioglu a5e281b284 Feature: Backend Server SSL certificate support + Frontend SSL dropdown enhancement
✨ Backend Server SSL Certificate - Complete Implementation:

1. Model Update (backend/models/backend.py):
   - Added ssl_certificate_id field to ServerConfig model
   - Allows selecting SSL certificate from dropdown

2. API Endpoints (backend/routers/backend.py):
   - CREATE server: Added ssl_certificate_id to INSERT query
   - UPDATE server: Added ssl_certificate_id to allowed_fields
   - GET servers: Added ssl_certificate_id to SELECT queries (2 places)

3. Config Generation (backend/services/haproxy_config.py):
   - SSL certificate lookup by ID
   - Auto-generate ca-file path: /etc/ssl/haproxy/{cert_name}.pem
   - Added to server line in HAProxy config

Example Generated Config:
  Before: server es1 10.0.0.1:9200 ssl verify required
  After:  server es1 10.0.0.1:9200 ssl verify required ca-file /etc/ssl/haproxy/star-burgan-com-tr.pem

✨ Frontend SSL Dropdown Enhancement:
- Added Global/Cluster-specific tags to Frontend SSL dropdown
- Matches Backend Server SSL dropdown design
- Shows: [🌍 Global] or [📍 Cluster] with color coding

🔧 Complete SSL Workflow:
1. User edits Backend Server
2. Enables SSL
3. Selects SSL certificate from dropdown
4. Saves → ssl_certificate_id stored in DB
5. Apply Changes → Config generated with ca-file path
6. Agent downloads SSL cert to /etc/ssl/haproxy/
7. HAProxy uses ca-file for SSL verification

✅ Database Schema:
  backend_servers table now includes:
  - ssl_enabled (bool)
  - ssl_verify (str: none/required)
  - ssl_certificate_id (int, FK to ssl_certificates)

✅ HAProxy Config Format:
  server {name} {addr}:{port} ssl verify required ca-file {path}

Impact: Backend Server SSL now fully functional with certificate management
2025-11-07 11:51:15 +03:00
taylanbakircioglu 8c4d7c246c Fix: Cross-cluster data bleeding + Enhanced SSL dropdown UI
🐛 Critical Cross-Cluster Data Bleeding - System-Wide Fix:
Fixed old cluster's data appearing when switching clusters across 4 components

Root Cause:
- User switches from Cluster A to Cluster B
- Old cluster data remains in React state during API fetch
- Race condition: UI shows Cluster A data while fetching Cluster B
- Backend page: Data persisted after fetch
- Frontend page: Data briefly appeared then disappeared

✅ Components Fixed (State Clearing on Cluster Change):

1. BackendServers.js (Line 115-122)
   - Clear: backends, filteredBackends, frontends, sslCertificates

2. FrontendManagement.js (Line 150-157)
   - Clear: frontends, filteredFrontends, backends, sslCertificates

3. WAFManagement.js (Line 277-282)
   - Clear: rules, filteredRules, frontends

4. DashboardV2.js (Line 402-407)
   - Clear: statsData, frontendOptions, backendOptions, backendHealth, slowestBackends

Already Had State Clearing:
  ✓ SSLManagement.js
  ✓ AgentManagement.js
  ✓ Configuration.js
  ✓ ApplyManagement.js

✨ UI Enhancement: Backend Server SSL Dropdown

Redesigned to match Frontend SSL dropdown design:

Before:
  star-burgan-com-tr - *.burgan.com.tr (Expires: 2/25/2026)

After:
  star-burgan-com-tr - *.burgan.com.tr [🌍 Global] ✅ (125 days)
  demo-cert - *.apps.cluster.example.com [📍 Cluster] ✅ (1502 days)

Features Added:
  ✅ Status icons: valid, ⚠️ expiring soon, ❌ expired
  ✅ Days until expiry countdown
  ✅ SSL type tags: 🌍 Global (blue) or 📍 Cluster (green)
  ✅ Better layout with flex spacing
  ✅ optionLabelProp for compact selected view

🎯 Impact Analysis - All Components Safe:

Tested 8 components with selectedCluster dependency:
  ✓ BackendServers - State clearing added
  ✓ FrontendManagement - State clearing added
  ✓ WAFManagement - State clearing added
  ✓ DashboardV2 - State clearing added
  ✓ SSLManagement - Already had clearing
  ✓ AgentManagement - Already had clearing
  ✓ Configuration - Already had clearing
  ✓ ApplyManagement - Already had clearing

No Breaking Changes:
  - Only added state clearing in useEffect
  - Fetch logic unchanged
  - Response handling unchanged
  - UI components unchanged (except SSL dropdown enhancement)

✅ Cross-cluster data bleeding completely resolved
2025-11-07 11:51:14 +03:00
taylanbakircioglu 199ade8ce5 Fix: Browser cache causing phantom deleted entities across all pages
🐛 Critical Browser Cache Bug - System-Wide Fix:
- Fixed deleted entities reappearing on normal page refresh
- Hard refresh (Cmd+Shift+R) worked, normal refresh showed stale cache data
- Applied cache-busting to ALL entity fetch operations across entire application

🔧 Cache-Control Headers Added to 10 Components:

1. BackendServers.js - fetchBackends(), fetchFrontends(), fetchSSLCertificates()
2. FrontendManagement.js - fetchFrontends(), fetchBackends(), fetchSSLCertificates()
3. SSLManagement.js - fetchCertificates()
4. ApplyManagement.js - fetchPendingChanges() (4 API calls: frontends, backends, WAF, SSL)
5. WAFManagement.js - fetchFrontends()
6. AgentManagement.js - fetchAgents(), fetchPools()
7. PoolManagement.js - fetchPools(), fetchPoolAgents()
8. UserManagement.js - fetchUsers()
9. Configuration.js - fetchAgents()
10. ClusterContext.js - fetchClusters()

Headers Applied:
  'Cache-Control': 'no-cache, no-store, must-revalidate'
  'Pragma': 'no-cache'
  'Expires': '0' (some components)

🎯 Impact Analysis - SAFE Changes:

✅ Only GET requests affected (POST/PUT/DELETE unchanged)
✅ Response format unchanged (only headers added to request)
✅ No breaking changes to existing functionality
✅ Performance impact minimal (entities change frequently anyway)

🛡️ Protected Against Cache:
- Deleted backends/frontends won't reappear
- Deleted agents won't show in lists
- SSL certificates always fresh
- User list always current
- Cluster/Pool data always accurate

🔍 Testing Performed:
- Backend API verified: Only active backends returned (is_active=TRUE)
- SSL API verified: Returns 4 certificates correctly
- All axios.get calls now have cache-control headers
- No linter errors

✅ Root Cause Solved:
Browser/Axios caching GET responses → Stale data on normal refresh
Solution: Force fresh data from API on every request

Impact: Phantom entities bug completely resolved across entire application
2025-11-07 11:51:14 +03:00
taylanbakircioglu bfa0caa006 Feature: Full UI support for use_backend rules editing
✨ New Features:
- Added use_backend_rules validator to Frontend model
- UI now supports editing use_backend rules from Frontend Management page
- Array to string conversion for use_backend rules in edit modal

🔧 Model Improvements:
- Changed use_backend_rules field type from Optional[str] to Any (list support)
- Added parse_use_backend_rules validator (same logic as ACL/redirect rules)
- Handles 3 formats: Array, Textarea string (newline-separated), JSON string

💡 UI Improvements:
- Frontend edit modal automatically converts use_backend array to multi-line text
- Users can edit routing rules line by line in textarea
- Format: 'use_backend BackendName if condition'

✅ Complete Workflow:
1. Bulk Import: Config parsed → ACL + use_backend stored as array
2. Frontend Edit: Arrays converted to multi-line string in textarea
3. User edits ACL/use_backend rules in UI
4. Save: Textarea string → validator → array → database
5. Config Generation: Array → HAProxy config format

Example workflow:
  Parse: ['use_backend API if is_api']
  → Edit UI: 'use_backend API if is_api' (textarea)
  → User edits: 'use_backend API_v2 if is_api_v2'
  → Save: ['use_backend API_v2 if is_api_v2']
  → Generate: 'use_backend API_v2 if is_api_v2' (HAProxy config)
2025-11-07 11:51:14 +03:00
taylanbakircioglu 704a0c0022 Fix: Bulk import parsing and entity status management improvements
🐛 Bug Fixes:
- Fixed http-response capture directive parsing with improved regex pattern
- Fixed ACL rules display in Frontend UI (array to multi-line string conversion)
- Added SSL certificate dropdown to Backend Server edit when ssl_enabled=true
- Fixed rejected entity config status remaining after apply operation

🔧 Improvements:
- Enhanced SSL ca-file detection with user-friendly warnings
- Apply operation now correctly updates both PENDING and REJECTED entities to APPLIED
- Added dynamic SSL certificate selection for backend servers with validation
- Improved bulk import warnings for SSL management workflow

📝 Technical Details:
- Parser: Enhanced capture pattern matching for flexible http-response directives
- UI: Added conditional SSL certificate select field in BackendServers component
- Backend: Updated apply cleanup to handle REJECTED status in addition to PENDING
- Frontend: Fixed ACL/redirect rules formatting for proper textarea display

✅ All changes tested and verified with scenario analysis
2025-11-07 11:51:14 +03:00
taylanbakircioglu 6aae0f4309 Initial commit 2025-10-27 12:14:03 +03:00