From 8c260eff72c424eeb05f01ad9eb28509a33d68d5 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 19 Mar 2025 00:51:27 -0600 Subject: [PATCH 1/2] feat(cluster): enhance AddNode and ShowNodes components for better user guidance and functionality - Added an AlertBlock in AddNode to inform users about architecture compatibility when adding nodes. - Updated ShowNodes to correctly handle node deletion actions based on ManagerStatus. - Refactored cluster API to remove cloud-specific checks and improve command execution for remote servers. --- .../settings/cluster/nodes/add-node.tsx | 5 ++ .../settings/cluster/nodes/show-nodes.tsx | 2 +- apps/dokploy/server/api/routers/cluster.ts | 55 +++++++++---------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/add-node.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/add-node.tsx index a59681ba..966055b4 100644 --- a/apps/dokploy/components/dashboard/settings/cluster/nodes/add-node.tsx +++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/add-node.tsx @@ -12,6 +12,7 @@ import { ExternalLink, PlusIcon } from "lucide-react"; import Link from "next/link"; import { AddManager } from "./manager/add-manager"; import { AddWorker } from "./workers/add-worker"; +import { AlertBlock } from "@/components/shared/alert-block"; interface Props { serverId?: string; @@ -48,6 +49,10 @@ export const AddNode = ({ serverId }: Props) => { Architecture + + Make sure you use the same architecture as the node you are + adding. +
diff --git a/apps/dokploy/components/dashboard/settings/cluster/nodes/show-nodes.tsx b/apps/dokploy/components/dashboard/settings/cluster/nodes/show-nodes.tsx index 46cf3058..827fc520 100644 --- a/apps/dokploy/components/dashboard/settings/cluster/nodes/show-nodes.tsx +++ b/apps/dokploy/components/dashboard/settings/cluster/nodes/show-nodes.tsx @@ -144,7 +144,7 @@ export const ShowNodes = ({ serverId }: Props) => { Actions - {node?.ManagerStatus?.Leader && ( + {!node?.ManagerStatus?.Leader && ( { - if (IS_CLOUD) { - return []; - } - const docker = await getRemoteDocker(input.serverId); const workers: DockerNode[] = await docker.listNodes(); @@ -33,17 +30,17 @@ export const clusterRouter = createTRPCRouter({ }), ) .mutation(async ({ input }) => { - if (IS_CLOUD) { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "Functionality not available in cloud version", - }); - } try { - await execAsync( - `docker node update --availability drain ${input.nodeId}`, - ); - await execAsync(`docker node rm ${input.nodeId} --force`); + const drainCommand = `docker node update --availability drain ${input.nodeId}`; + const removeCommand = `docker node rm ${input.nodeId} --force`; + + if (input.serverId) { + await execAsyncRemote(input.serverId, drainCommand); + await execAsyncRemote(input.serverId, removeCommand); + } else { + await execAsync(drainCommand); + await execAsync(removeCommand); + } return true; } catch (error) { throw new TRPCError({ @@ -60,20 +57,20 @@ export const clusterRouter = createTRPCRouter({ }), ) .query(async ({ input }) => { - if (IS_CLOUD) { - return { - command: "", - version: "", - }; - } const docker = await getRemoteDocker(input.serverId); const result = await docker.swarmInspect(); const docker_version = await docker.version(); + let ip = await getPublicIpWithFallback(); + if (input.serverId) { + const server = await findServerById(input.serverId); + ip = server?.ipAddress; + } + return { command: `docker swarm join --token ${ result.JoinTokens.Worker - } ${await getPublicIpWithFallback()}:2377`, + } ${ip}:2377`, version: docker_version.Version, }; }), @@ -84,19 +81,19 @@ export const clusterRouter = createTRPCRouter({ }), ) .query(async ({ input }) => { - if (IS_CLOUD) { - return { - command: "", - version: "", - }; - } const docker = await getRemoteDocker(input.serverId); const result = await docker.swarmInspect(); const docker_version = await docker.version(); + + let ip = await getPublicIpWithFallback(); + if (input.serverId) { + const server = await findServerById(input.serverId); + ip = server?.ipAddress; + } return { command: `docker swarm join --token ${ result.JoinTokens.Manager - } ${await getPublicIpWithFallback()}:2377`, + } ${ip}:2377`, version: docker_version.Version, }; }), From 03bd4398d0b37d282cdfce5df75413ef2b538b6d Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 19 Mar 2025 00:51:49 -0600 Subject: [PATCH 2/2] chore(package): bump version to v0.20.8 --- apps/dokploy/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 1d7ad131..22649f92 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.20.7", + "version": "v0.20.8", "private": true, "license": "Apache-2.0", "type": "module",