From 160742c2cfca69da2761fc2dda13cde7d1aeb4a9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 23:55:29 -0600 Subject: [PATCH] refactor(manage-traefik-ports): remove publishMode from port management and update related logic --- .../web-server/manage-traefik-ports.tsx | 72 ++--------- apps/dokploy/server/api/routers/settings.ts | 116 +++++++++--------- packages/server/src/setup/traefik-setup.ts | 1 - 3 files changed, 73 insertions(+), 116 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx index a6958b16f..782e9df8c 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx @@ -19,13 +19,6 @@ import { } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { ArrowRightLeft, Plus, Trash2 } from "lucide-react"; @@ -44,7 +37,6 @@ interface Props { const PortSchema = z.object({ targetPort: z.number().min(1, "Target port is required"), publishedPort: z.number().min(1, "Published port is required"), - publishMode: z.enum(["ingress", "host"]), }); const TraefikPortsSchema = z.object({ @@ -88,7 +80,7 @@ export const ManageTraefikPorts = ({ children, serverId }: Props) => { }, [currentPorts, form]); const handleAddPort = () => { - append({ targetPort: 0, publishedPort: 0, publishMode: "host" }); + append({ targetPort: 0, publishedPort: 0 }); }; const onSubmit = async (data: TraefikPortsForm) => { @@ -154,7 +146,7 @@ export const ManageTraefikPorts = ({ children, serverId }: Props) => {
{fields.map((field, index) => ( - + { )} /> - ( - - - {t( - "settings.server.webServer.traefik.publishMode", - )} - - - - - )} - /> -
diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index 461d3e1f2..a51ff5d1a 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -97,14 +97,20 @@ export const settingsRouter = createTRPCRouter({ toggleDashboard: adminProcedure .input(apiEnableDashboard) .mutation(async ({ input }) => { + const ports = (await getTraefikPorts(input.serverId)).filter( + (port) => + port.targetPort !== 80 && + port.targetPort !== 443 && + port.targetPort !== 8080, + ); await initializeTraefik({ + additionalPorts: ports, enableDashboard: input.enableDashboard, serverId: input.serverId, force: true, }); return true; }), - cleanUnusedImages: adminProcedure .input(apiServerSchema) .mutation(async ({ input }) => { @@ -749,7 +755,6 @@ export const settingsRouter = createTRPCRouter({ z.object({ targetPort: z.number(), publishedPort: z.number(), - publishMode: z.enum(["ingress", "host"]).default("host"), }), ), }), @@ -782,59 +787,7 @@ export const settingsRouter = createTRPCRouter({ getTraefikPorts: adminProcedure .input(apiServerSchema) .query(async ({ input }) => { - const command = `docker container inspect --format='{{json .NetworkSettings.Ports}}' dokploy-traefik`; - - try { - let stdout = ""; - if (input?.serverId) { - const result = await execAsyncRemote(input.serverId, command); - stdout = result.stdout; - } else if (!IS_CLOUD) { - const result = await execAsync(command); - stdout = result.stdout; - } - - const portsMap = JSON.parse(stdout.trim()); - const additionalPorts: Array<{ - targetPort: number; - publishedPort: number; - publishMode: "host" | "ingress"; - }> = []; - - // Convert the Docker container port format to our expected format - for (const [containerPort, bindings] of Object.entries(portsMap)) { - if (!bindings) continue; - - const [port = ""] = containerPort.split("/"); - if (!port) continue; - - const targetPortNum = Number.parseInt(port, 10); - if (Number.isNaN(targetPortNum)) continue; - - // Skip default ports - if ([80, 443, 8080].includes(targetPortNum)) continue; - - for (const binding of bindings as Array<{ HostPort: string }>) { - if (!binding.HostPort) continue; - const publishedPort = Number.parseInt(binding.HostPort, 10); - if (Number.isNaN(publishedPort)) continue; - - additionalPorts.push({ - targetPort: targetPortNum, - publishedPort, - publishMode: "host", // Docker standalone uses host mode by default - }); - } - } - - return additionalPorts; - } catch (error) { - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to get Traefik ports", - cause: error, - }); - } + return await getTraefikPorts(input?.serverId); }), updateLogCleanup: adminProcedure .input( @@ -853,3 +806,56 @@ export const settingsRouter = createTRPCRouter({ return getLogCleanupStatus(); }), }); + +export const getTraefikPorts = async (serverId?: string) => { + const command = `docker container inspect --format='{{json .NetworkSettings.Ports}}' dokploy-traefik`; + try { + let stdout = ""; + if (serverId) { + const result = await execAsyncRemote(serverId, command); + stdout = result.stdout; + } else if (!IS_CLOUD) { + const result = await execAsync(command); + stdout = result.stdout; + } + + const portsMap = JSON.parse(stdout.trim()); + const additionalPorts: Array<{ + targetPort: number; + publishedPort: number; + }> = []; + + // Convert the Docker container port format to our expected format + for (const [containerPort, bindings] of Object.entries(portsMap)) { + if (!bindings) continue; + + const [port = ""] = containerPort.split("/"); + if (!port) continue; + + const targetPortNum = Number.parseInt(port, 10); + if (Number.isNaN(targetPortNum)) continue; + + // Skip default ports + if ([80, 443].includes(targetPortNum)) continue; + + for (const binding of bindings as Array<{ HostPort: string }>) { + if (!binding.HostPort) continue; + const publishedPort = Number.parseInt(binding.HostPort, 10); + if (Number.isNaN(publishedPort)) continue; + + additionalPorts.push({ + targetPort: targetPortNum, + publishedPort, + }); + } + } + + return additionalPorts; + } catch (error) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to get Traefik ports", + cause: error, + }); + } +}; diff --git a/packages/server/src/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts index fc6d04fc2..4c8a32745 100644 --- a/packages/server/src/setup/traefik-setup.ts +++ b/packages/server/src/setup/traefik-setup.ts @@ -22,7 +22,6 @@ interface TraefikOptions { additionalPorts?: { targetPort: number; publishedPort: number; - publishMode?: "ingress" | "host"; }[]; force?: boolean; }