From b741618251a7dfb9c3eef421e4f7c41d9e4ce7f9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 7 Feb 2026 01:53:52 -0600 Subject: [PATCH] feat(dashboard): add clean all deployment queue action - Introduced a new action in the dashboard to clean the entire deployment queue, enhancing user control over deployment processes. - Implemented error handling with toast notifications to inform users of the success or failure of the action. - Updated the API to support the new clean all deployment queue functionality. --- .../servers/actions/show-dokploy-actions.tsx | 17 +++++++++++++++++ apps/dokploy/server/api/routers/settings.ts | 7 +++++++ apps/dokploy/server/queues/queueSetup.ts | 6 ++++++ 3 files changed, 30 insertions(+) diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx index 2bafe7e64..42b73cf59 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx @@ -23,6 +23,8 @@ export const ShowDokployActions = () => { const { mutateAsync: cleanRedis } = api.settings.cleanRedis.useMutation(); const { mutateAsync: reloadRedis } = api.settings.reloadRedis.useMutation(); + const { mutateAsync: cleanAllDeploymentQueue } = + api.settings.cleanAllDeploymentQueue.useMutation(); return ( @@ -87,6 +89,21 @@ export const ShowDokployActions = () => { Clean Redis + { + await cleanAllDeploymentQueue() + .then(() => { + toast.success("Deployment queue cleaned"); + }) + .catch(() => { + toast.error("Error cleaning deployment queue"); + }); + }} + > + Clean all deployment queue + + { diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index 5082114cd..cbf6ba56c 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -64,6 +64,7 @@ import { projects, server, } from "@/server/db/schema"; +import { cleanAllDeploymentQueue } from "@/server/queues/queueSetup"; import { removeJob, schedule } from "@/server/utils/backup"; import packageInfo from "../../../package.json"; import { appRouter } from "../root"; @@ -115,6 +116,12 @@ export const settingsRouter = createTRPCRouter({ return true; }), + cleanAllDeploymentQueue: adminProcedure.mutation(async () => { + if (IS_CLOUD) { + return true; + } + return cleanAllDeploymentQueue(); + }), reloadTraefik: adminProcedure .input(apiServerSchema) .mutation(async ({ input }) => { diff --git a/apps/dokploy/server/queues/queueSetup.ts b/apps/dokploy/server/queues/queueSetup.ts index 351f5d1c0..d84bfff64 100644 --- a/apps/dokploy/server/queues/queueSetup.ts +++ b/apps/dokploy/server/queues/queueSetup.ts @@ -3,6 +3,7 @@ import { execAsyncRemote, } from "@dokploy/server/utils/process/execAsync"; import { Queue } from "bullmq"; +import { deploymentWorker } from "./deployments-queue"; import { redisConfig } from "./redis-connection"; const myQueue = new Queue("deployments", { @@ -34,6 +35,11 @@ export const cleanQueuesByApplication = async (applicationId: string) => { } }; +export const cleanAllDeploymentQueue = async () => { + deploymentWorker.cancelAllJobs("User requested cancellation"); + return true; +}; + export const cleanQueuesByCompose = async (composeId: string) => { const jobs = await myQueue.getJobs(["waiting", "delayed"]);