fix(domains): provision routes when domains are linked
Build and publish Docker image / build-and-publish (push) Successful in 10s

This commit is contained in:
wfalkowski committed 2026-10-20 18:50:46 +00:00
1 parent 8cb6820bea
commit 9822e43592
3 files changed
+131 -154

No files matched your search

+44 -81
View File
@@ -822,83 +822,6 @@ async def handle_websocket(websocket):
if client_id in connected_clients:
del connected_clients[client_id]
# Domain WebSocket handlers
# Replace the domain WebSocket handlers in app.py with these fixed versions:
# Domain WebSocket handlers
"""Handle create domain request"""
client_info = connected_clients.get(client_id)
if not client_info or not client_info['authenticated']:
await send_message(client_id, {'type': 'error', 'error': 'Not authenticated'})
return
user_id = client_info['user_id']
username = client_info['username']
subdomain_name = data.get('subdomain')
server_id = data.get('serverId')
logger.info(f"DEBUG: Creating domain for user {username}, subdomain: {subdomain_name}")
if not subdomain_name:
await send_message(client_id, {'type': 'error', 'error': 'Subdomain name required'})
return
if not domain_manager:
logger.error("Domain manager not initialized!")
await send_message(client_id, {'type': 'error', 'error': 'Domain service not available'})
return
# Add API token check
if not domain_manager.desesec_api_token:
logger.warning("Using default API token - this might not work!")
try:
# Check if subdomain is available
availability_result = domain_manager.check_domain_availability(subdomain_name, username)
logger.info(f"DEBUG: Availability check: {availability_result}")
if not availability_result.get('available', False):
await send_message(client_id, {'type': 'error', 'error': availability_result.get('message', 'Domain not available')})
return
# Create the subdomain
result = domain_manager.create_subdomain(username, subdomain_name)
logger.info(f"DEBUG: Create subdomain result: {result}")
if result.get('success') and result.get('domain_data'):
# Save to database
domain_record = {
'user_id': user_id,
'subdomain': result['domain_data']['subdomain'],
'full_domain': result['domain_data']['domain'],
'record_type': result['domain_data']['record_type'],
'ip_address': result['domain_data']['ip_address'],
'ttl': result['domain_data'].get('ttl', 3600),
'server_id': server_id,
'created_at': result['domain_data'].get('created_at', datetime.now().isoformat())
}
db_domain = create_domain_record(domain_record)
if db_domain:
await send_message(client_id, {
'type': 'domain_created',
'domain': db_domain,
'message': result.get('message', 'Domain created successfully')
})
else:
logger.error("Failed to save domain to database!")
await send_message(client_id, {
'type': 'error',
'error': 'Domain created in DNS but failed to save to database'
})
else:
await send_message(client_id, {'type': 'error', 'error': result.get('message', 'Failed to create domain')})
except Exception as e:
logger.error(f"Error creating domain: {e}", exc_info=True)
await send_message(client_id, {'type': 'error', 'error': str(e)})
async def handle_delete_domain(client_id, data):
"""Handle delete domain request - FIXED VERSION with proper domain type handling"""
client_info = connected_clients.get(client_id)
@@ -1384,7 +1307,21 @@ async def handle_create_domain(client_id, data):
user_id = client_info['user_id']
username = client_info['username']
subdomain_name = '' if data.get('useUsernameDomain') is True else data.get('subdomain')
server_id = data.get('serverId')
server_id = data.get('serverId') or None
if server_id:
if not isinstance(server_id, str):
await send_message(client_id, {'type': 'error', 'error': 'Server ID must be a string'})
return
server = get_server_by_id(server_id)
requester = get_user_by_id(user_id)
owner_id = str(server.get('owner_id') or '') if server else ''
if not server or (owner_id != str(user_id) and (not requester or requester.get('role') != 'admin')):
await send_message(client_id, {'type': 'error', 'error': 'Server not found or access denied'})
return
if server.get('type') not in ('website', 'vps'):
await send_message(client_id, {'type': 'error', 'error': 'Domain can only be linked to Website or VPS servers'})
return
logger.info(f"DEBUG: Creating domain for user {username}, subdomain: {subdomain_name}")
@@ -1444,10 +1381,15 @@ async def handle_create_domain(client_id, data):
db_domain = create_domain_record(domain_record)
if db_domain:
routing_ready = not server_id or db_domain.get('server_id') == server_id
await send_message(client_id, {
'type': 'domain_created',
'domain': db_domain,
'message': result.get('message', 'Domain created successfully')
'message': result.get('message', 'Domain created successfully') if routing_ready else (
'Domain created, but routing could not be provisioned. '
'It remains unlinked; retry linking it after checking Kubernetes.'
),
'routingReady': routing_ready
})
else:
logger.error("Failed to save domain to database!")
@@ -3635,7 +3577,21 @@ async def handle_create_custom_domain(client_id, data):
user_id = client_info['user_id']
domain = data.get('domain')
server_id = data.get('serverId')
server_id = data.get('serverId') or None
if server_id:
if not isinstance(server_id, str):
await send_message(client_id, {'type': 'error', 'error': 'Server ID must be a string'})
return
server = get_server_by_id(server_id)
requester = get_user_by_id(user_id)
owner_id = str(server.get('owner_id') or '') if server else ''
if not server or (owner_id != str(user_id) and (not requester or requester.get('role') != 'admin')):
await send_message(client_id, {'type': 'error', 'error': 'Server not found or access denied'})
return
if server.get('type') not in ('website', 'vps'):
await send_message(client_id, {'type': 'error', 'error': 'Domain can only be linked to Website or VPS servers'})
return
if not domain:
await send_message(client_id, {'type': 'error', 'error': 'Domain required'})
@@ -3691,10 +3647,17 @@ async def handle_create_custom_domain(client_id, data):
db_domain = create_custom_domain_record(domain_record)
if db_domain:
routing_ready = not server_id or db_domain.get('server_id') == server_id
await send_message(client_id, {
'type': 'custom_domain_created',
'domain': db_domain,
'message': f'Custom domain {domain} added successfully'
'message': (
f'Custom domain {domain} added successfully'
if routing_ready else
f'Custom domain {domain} was added but routing could not be provisioned. '
'It remains unlinked; retry linking it after checking Kubernetes.'
),
'routingReady': routing_ready
})
else:
await send_message(client_id, {'type': 'error', 'error': 'Failed to create custom domain'})