From 210da55e7a51ccafd49f0273224a389f99799d18 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 4 Apr 2026 21:03:04 +0200 Subject: [PATCH] feat: add Traefik routing labels for customer apps with exposed ports Co-Authored-By: Claude Sonnet 4.6 --- .../cameleer/saas/deployment/DeploymentService.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/siegeln/cameleer/saas/deployment/DeploymentService.java b/src/main/java/net/siegeln/cameleer/saas/deployment/DeploymentService.java index 8f06be8..e33cc33 100644 --- a/src/main/java/net/siegeln/cameleer/saas/deployment/DeploymentService.java +++ b/src/main/java/net/siegeln/cameleer/saas/deployment/DeploymentService.java @@ -126,6 +126,17 @@ public class DeploymentService { }); } + // Build Traefik labels for inbound routing + var labels = new java.util.HashMap(); + if (app.getExposedPort() != null) { + labels.put("traefik.enable", "true"); + labels.put("traefik.http.routers." + containerName + ".rule", + "Host(`" + app.getSlug() + "." + env.getSlug() + "." + + tenantSlug + "." + runtimeConfig.getDomain() + "`)"); + labels.put("traefik.http.services." + containerName + ".loadbalancer.server.port", + String.valueOf(app.getExposedPort())); + } + var containerId = runtimeOrchestrator.startContainer(new StartContainerRequest( deployment.getImageRef(), containerName, @@ -141,7 +152,7 @@ public class DeploymentService { runtimeConfig.parseMemoryLimitBytes(), runtimeConfig.getContainerCpuShares(), runtimeConfig.getAgentHealthPort(), - Map.of() + labels )); deployment.setOrchestratorMetadata(Map.of("containerId", containerId));