From fac6cef0db6eddac7e3f52b329b10ff9f54eecc4 Mon Sep 17 00:00:00 2001 From: jknapp Date: Fri, 11 Jul 2025 19:27:42 -0700 Subject: [PATCH] Fix HAProxy 2.6 compatibility for default backend - Replace http-response set-body (HAProxy 2.8+) with local server approach - Add separate Flask server on port 8080 to serve default page - Update default backend template to use local server instead of inline HTML - Maintain all customization features via environment variables - Fix JavaScript error handling for domains API response --- __pycache__/haproxy_manager.cpython-310.pyc | Bin 0 -> 23812 bytes haproxy_manager.py | 55 +++++++++++++++----- templates/hap_default_backend.tpl | 5 +- templates/index.html | 22 +++++++- 4 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 __pycache__/haproxy_manager.cpython-310.pyc diff --git a/__pycache__/haproxy_manager.cpython-310.pyc b/__pycache__/haproxy_manager.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..362c3cadf3d528e01520048a2a86ed00a02dff9d GIT binary patch literal 23812 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 Not Configured

Site Not Configured

This domain has not been configured yet.

"''' + server default-page 127.0.0.1:8080''' config_parts.append(fallback_backend) # Add Backends config_parts.append('\n' .join(config_backends) + '\n') @@ -898,4 +897,32 @@ if __name__ == '__main__': generate_self_signed_cert(SSL_CERTS_DIR) start_haproxy() certbot_register() + + # Run Flask app on port 8000 for API and port 8080 for default page + from threading import Thread + + def run_default_page_server(): + """Run a separate Flask app on port 8080 for the default page""" + from flask import Flask, render_template + default_app = Flask(__name__) + default_app.template_folder = 'templates' + + @default_app.route('/') + def default_page(): + """Serve the default page for unmatched domains""" + admin_email = os.environ.get('HAPROXY_ADMIN_EMAIL', 'admin@example.com') + + return render_template('default_page.html', + page_title=os.environ.get('HAPROXY_DEFAULT_PAGE_TITLE', 'Site Not Configured'), + main_message=os.environ.get('HAPROXY_DEFAULT_MAIN_MESSAGE', 'This domain has not been configured yet. Please contact your system administrator to set up this website.'), + secondary_message=os.environ.get('HAPROXY_DEFAULT_SECONDARY_MESSAGE', 'If you believe this is an error, please check the domain name and try again.') + ) + + default_app.run(host='0.0.0.0', port=8080) + + # Start the default page server in a separate thread + default_server_thread = Thread(target=run_default_page_server, daemon=True) + default_server_thread.start() + + # Run the main API server app.run(host='0.0.0.0', port=8000) diff --git a/templates/hap_default_backend.tpl b/templates/hap_default_backend.tpl index e080ded..218ace2 100644 --- a/templates/hap_default_backend.tpl +++ b/templates/hap_default_backend.tpl @@ -7,6 +7,5 @@ backend default-backend http-request set-header X-Forwarded-For %[src] http-request set-header X-Real-IP %[src] - # Serve the default page HTML response - http-response set-header Content-Type text/html - http-response set-body "{{ default_page_content }}" \ No newline at end of file + # Serve the default page HTML response using a local server + server default-page 127.0.0.1:8080 \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index f533472..d04fdb3 100644 --- a/templates/index.html +++ b/templates/index.html @@ -346,16 +346,34 @@ function loadDomains() { fetch('/api/domains') - .then(response => response.json()) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + return response.json(); + }) .then(domains => { const domainList = document.getElementById('domainList'); domainList.innerHTML = ''; + + // Ensure domains is an array + if (!Array.isArray(domains)) { + console.error('Expected array of domains, got:', typeof domains, domains); + showStatus('Error: Invalid response format from server', 'error'); + return; + } + + if (domains.length === 0) { + domainList.innerHTML = '

No domains configured yet. Add your first domain above.

'; + return; + } + domains.forEach(domain => { const domainDiv = document.createElement('div'); domainDiv.className = 'domain-list-item'; domainDiv.innerHTML = `

${domain.domain}

-

Backend: ${domain.backend_name}

+

Backend: ${domain.backend_name || 'Not configured'}

SSL: ${domain.ssl_enabled ? 'Enabled' : 'Disabled'}