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;
}