Files
haproxy-openmanager/backend/models/backend.py
T
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

85 lines
3.2 KiB
Python

from pydantic import BaseModel, validator
from typing import Optional, List
class ServerConfig(BaseModel):
server_name: str
server_address: str
server_port: int
weight: int = 100
max_connections: Optional[int] = None
check_enabled: bool = True
check_port: Optional[int] = None
backup_server: bool = False
ssl_enabled: bool = False
ssl_verify: Optional[str] = None
ssl_certificate_id: Optional[int] = None # SSL certificate for backend server
cookie_value: Optional[str] = None
inter: Optional[int] = None
fall: Optional[int] = None
rise: Optional[int] = None
is_active: bool = True
class BackendConfig(BaseModel):
name: str
cluster_id: int
balance_method: str = 'roundrobin'
mode: str = 'http'
health_check_uri: Optional[str] = None
health_check_interval: Optional[int] = 2000
health_check_expected_status: Optional[int] = 200
fullconn: Optional[int] = None
cookie_name: Optional[str] = None
cookie_options: Optional[str] = None
default_server_inter: Optional[int] = None
default_server_fall: Optional[int] = None
default_server_rise: Optional[int] = None
request_headers: Optional[str] = None
response_headers: Optional[str] = None
timeout_connect: Optional[int] = 10000
timeout_server: Optional[int] = 60000
timeout_queue: Optional[int] = 60000
servers: List[ServerConfig] = []
@validator('health_check_interval', 'timeout_connect', 'timeout_server', 'timeout_queue', 'fullconn')
def check_positive(cls, v):
if v is not None and v <= 0:
raise ValueError('Timeout, interval, and connection values must be positive')
return v
@validator('health_check_expected_status')
def check_http_status(cls, v):
if v is not None and (v < 100 or v > 599):
raise ValueError('HTTP status code must be between 100 and 599')
return v
class BackendConfigUpdate(BaseModel):
name: Optional[str] = None
balance_method: Optional[str] = None
mode: Optional[str] = None
health_check_uri: Optional[str] = None
health_check_interval: Optional[int] = None
health_check_expected_status: Optional[int] = None
fullconn: Optional[int] = None
cookie_name: Optional[str] = None
cookie_options: Optional[str] = None
default_server_inter: Optional[int] = None
default_server_fall: Optional[int] = None
default_server_rise: Optional[int] = None
request_headers: Optional[str] = None
response_headers: Optional[str] = None
timeout_connect: Optional[int] = None
timeout_server: Optional[int] = None
timeout_queue: Optional[int] = None
servers: Optional[List[ServerConfig]] = None
@validator('health_check_interval', 'timeout_connect', 'timeout_server', 'timeout_queue', 'fullconn')
def check_positive_update(cls, v):
if v is not None and v <= 0:
raise ValueError('Timeout, interval, and connection values must be positive')
return v
@validator('health_check_expected_status')
def check_http_status_update(cls, v):
if v is not None and (v < 100 or v > 599):
raise ValueError('HTTP status code must be between 100 and 599')
return v