From 3d64ec9061bd596e6cff1da227322fad8547c95a Mon Sep 17 00:00:00 2001 From: Fusion Date: Wed, 20 May 2026 17:21:21 +0200 Subject: [PATCH] fix(tunnels): connect tool containers to backend network for cloudflared access --- apps/api/src/api/tool_instances.py | 16 ++++++++++------ apps/api/src/services/docker.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/apps/api/src/api/tool_instances.py b/apps/api/src/api/tool_instances.py index a7c6b4f..06477b0 100644 --- a/apps/api/src/api/tool_instances.py +++ b/apps/api/src/api/tool_instances.py @@ -23,18 +23,14 @@ from src.models.tool_instance import ToolInstance from src.models.tool_type import ToolType from src.models.user import User from src.services.docker import ( - check_tunnel_health, + connect_container_to_network, ensure_instance_directory, execute_compose_command, find_free_port, get_container_id, - recreate_tunnel, + get_container_name, start_cloudflared_tunnel, stop_cloudflared_tunnel, - get_container_name, - get_container_logs, - get_container_status, - render_compose_template, write_compose_file, write_config_files, write_env_file, @@ -411,6 +407,14 @@ async def start_instance( if container_name: instance.container_name = container_name logger.info("Container name for instance %s: %s", instance.id, container_name) + + # Connect container to backend network so API can reach it + logger.info("Connecting container %s to backend network...", container_name) + connected = connect_container_to_network(container_name, "backend") + if connected: + logger.info("Successfully connected %s to backend network", container_name) + else: + logger.warning("Failed to connect %s to backend network", container_name) instance.status = "running" instance.last_started_at = datetime.now() diff --git a/apps/api/src/services/docker.py b/apps/api/src/services/docker.py index ca58298..312e65b 100644 --- a/apps/api/src/services/docker.py +++ b/apps/api/src/services/docker.py @@ -173,6 +173,24 @@ def get_container_name(instance_name: str) -> str | None: return None +def connect_container_to_network(container_name: str, network_name: str = "backend") -> bool: + """Connect a Docker container to an existing network. + + Args: + container_name: Name or ID of the container + network_name: Name of the Docker network (default: backend) + + Returns: + True if successful, False otherwise + """ + result = subprocess.run( + ["docker", "network", "connect", network_name, container_name], + capture_output=True, + text=True, + ) + return result.returncode == 0 + + def get_container_status(container_id: str) -> str: """Get the status of a Docker container.