From 240f0b6017bf9a9b9da12d0e110f7fb57454eae8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 31 Dec 2025 06:04:25 +0000 Subject: [PATCH] Add jobId to deployment flow for tracking deployments Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com> --- apps/dokploy/server/api/routers/application.ts | 10 ++++++++-- apps/dokploy/server/api/routers/compose.ts | 12 ++++++++---- apps/dokploy/server/queues/deployments-queue.ts | 5 +++++ apps/dokploy/server/queues/queue-types.ts | 3 +++ packages/server/src/services/application.ts | 9 +++++++++ packages/server/src/services/compose.ts | 6 ++++++ packages/server/src/services/deployment.ts | 9 ++++++--- 7 files changed, 45 insertions(+), 9 deletions(-) diff --git a/apps/dokploy/server/api/routers/application.ts b/apps/dokploy/server/api/routers/application.ts index c0666fcc7..85aa21d11 100644 --- a/apps/dokploy/server/api/routers/application.ts +++ b/apps/dokploy/server/api/routers/application.ts @@ -325,6 +325,7 @@ export const applicationRouter = createTRPCRouter({ message: "You are not authorized to redeploy this application", }); } + const jobId = nanoid(); const jobData: DeploymentJob = { applicationId: input.applicationId, titleLog: input.title || "Rebuild deployment", @@ -332,6 +333,7 @@ export const applicationRouter = createTRPCRouter({ type: "redeploy", applicationType: "application", server: !!application.serverId, + jobId, }; if (IS_CLOUD && application.serverId) { @@ -339,7 +341,7 @@ export const applicationRouter = createTRPCRouter({ deploy(jobData).catch((error) => { console.error("Background deployment failed:", error); }); - return true; + return { jobId }; } await myQueue.add( "deployments", @@ -349,6 +351,7 @@ export const applicationRouter = createTRPCRouter({ removeOnFail: true, }, ); + return { jobId }; }), saveEnvironment: protectedProcedure .input(apiSaveEnvironmentVariables) @@ -693,6 +696,7 @@ export const applicationRouter = createTRPCRouter({ message: "You are not authorized to deploy this application", }); } + const jobId = nanoid(); const jobData: DeploymentJob = { applicationId: input.applicationId, titleLog: input.title || "Manual deployment", @@ -700,6 +704,7 @@ export const applicationRouter = createTRPCRouter({ type: "deploy", applicationType: "application", server: !!application.serverId, + jobId, }; if (IS_CLOUD && application.serverId) { jobData.serverId = application.serverId; @@ -707,7 +712,7 @@ export const applicationRouter = createTRPCRouter({ console.error("Background deployment failed:", error); }); - return true; + return { jobId }; } await myQueue.add( "deployments", @@ -717,6 +722,7 @@ export const applicationRouter = createTRPCRouter({ removeOnFail: true, }, ); + return { jobId }; }), cleanQueues: protectedProcedure diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index 4ad2ca00a..d69e681f0 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -406,6 +406,7 @@ export const composeRouter = createTRPCRouter({ message: "You are not authorized to deploy this compose", }); } + const jobId = nanoid(); const jobData: DeploymentJob = { composeId: input.composeId, titleLog: input.title || "Manual deployment", @@ -413,6 +414,7 @@ export const composeRouter = createTRPCRouter({ applicationType: "compose", descriptionLog: input.description || "", server: !!compose.serverId, + jobId, }; if (IS_CLOUD && compose.serverId) { @@ -420,7 +422,7 @@ export const composeRouter = createTRPCRouter({ deploy(jobData).catch((error) => { console.error("Background deployment failed:", error); }); - return true; + return { jobId }; } await myQueue.add( "deployments", @@ -430,7 +432,7 @@ export const composeRouter = createTRPCRouter({ removeOnFail: true, }, ); - return { success: true, message: "Deployment queued" }; + return { jobId }; }), redeploy: protectedProcedure .input(apiRedeployCompose) @@ -445,6 +447,7 @@ export const composeRouter = createTRPCRouter({ message: "You are not authorized to redeploy this compose", }); } + const jobId = nanoid(); const jobData: DeploymentJob = { composeId: input.composeId, titleLog: input.title || "Rebuild deployment", @@ -452,13 +455,14 @@ export const composeRouter = createTRPCRouter({ applicationType: "compose", descriptionLog: input.description || "", server: !!compose.serverId, + jobId, }; if (IS_CLOUD && compose.serverId) { jobData.serverId = compose.serverId; deploy(jobData).catch((error) => { console.error("Background deployment failed:", error); }); - return true; + return { jobId }; } await myQueue.add( "deployments", @@ -468,7 +472,7 @@ export const composeRouter = createTRPCRouter({ removeOnFail: true, }, ); - return { success: true, message: "Redeployment queued" }; + return { jobId }; }), stop: protectedProcedure .input(apiFindCompose) diff --git a/apps/dokploy/server/queues/deployments-queue.ts b/apps/dokploy/server/queues/deployments-queue.ts index 4c117e7e3..863204b3e 100644 --- a/apps/dokploy/server/queues/deployments-queue.ts +++ b/apps/dokploy/server/queues/deployments-queue.ts @@ -24,12 +24,14 @@ export const deploymentWorker = new Worker( applicationId: job.data.applicationId, titleLog: job.data.titleLog, descriptionLog: job.data.descriptionLog, + jobId: job.data.jobId, }); } else if (job.data.type === "deploy") { await deployApplication({ applicationId: job.data.applicationId, titleLog: job.data.titleLog, descriptionLog: job.data.descriptionLog, + jobId: job.data.jobId, }); } } else if (job.data.applicationType === "compose") { @@ -41,12 +43,14 @@ export const deploymentWorker = new Worker( composeId: job.data.composeId, titleLog: job.data.titleLog, descriptionLog: job.data.descriptionLog, + jobId: job.data.jobId, }); } else if (job.data.type === "redeploy") { await rebuildCompose({ composeId: job.data.composeId, titleLog: job.data.titleLog, descriptionLog: job.data.descriptionLog, + jobId: job.data.jobId, }); } } else if (job.data.applicationType === "application-preview") { @@ -60,6 +64,7 @@ export const deploymentWorker = new Worker( titleLog: job.data.titleLog, descriptionLog: job.data.descriptionLog, previewDeploymentId: job.data.previewDeploymentId, + jobId: job.data.jobId, }); } } diff --git a/apps/dokploy/server/queues/queue-types.ts b/apps/dokploy/server/queues/queue-types.ts index ef8df6943..023247622 100644 --- a/apps/dokploy/server/queues/queue-types.ts +++ b/apps/dokploy/server/queues/queue-types.ts @@ -7,6 +7,7 @@ type DeployJob = type: "deploy" | "redeploy"; applicationType: "application"; serverId?: string; + jobId?: string; } | { composeId: string; @@ -16,6 +17,7 @@ type DeployJob = type: "deploy" | "redeploy"; applicationType: "compose"; serverId?: string; + jobId?: string; } | { applicationId: string; @@ -26,6 +28,7 @@ type DeployJob = applicationType: "application-preview"; previewDeploymentId: string; serverId?: string; + jobId?: string; }; export type DeploymentJob = DeployJob; diff --git a/packages/server/src/services/application.ts b/packages/server/src/services/application.ts index 61a77ae5a..73d2716da 100644 --- a/packages/server/src/services/application.ts +++ b/packages/server/src/services/application.ts @@ -167,10 +167,12 @@ export const deployApplication = async ({ applicationId, titleLog = "Manual deployment", descriptionLog = "", + jobId, }: { applicationId: string; titleLog: string; descriptionLog: string; + jobId?: string; }) => { const application = await findApplicationById(applicationId); const serverId = application.buildServerId || application.serverId; @@ -180,6 +182,7 @@ export const deployApplication = async ({ applicationId: applicationId, title: titleLog, description: descriptionLog, + jobId, }); try { @@ -270,10 +273,12 @@ export const rebuildApplication = async ({ applicationId, titleLog = "Rebuild deployment", descriptionLog = "", + jobId, }: { applicationId: string; titleLog: string; descriptionLog: string; + jobId?: string; }) => { const application = await findApplicationById(applicationId); const serverId = application.buildServerId || application.serverId; @@ -283,6 +288,7 @@ export const rebuildApplication = async ({ applicationId: applicationId, title: titleLog, description: descriptionLog, + jobId, }); try { @@ -337,11 +343,13 @@ export const deployPreviewApplication = async ({ titleLog = "Preview Deployment", descriptionLog = "", previewDeploymentId, + jobId, }: { applicationId: string; titleLog: string; descriptionLog: string; previewDeploymentId: string; + jobId?: string; }) => { const application = await findApplicationById(applicationId); @@ -349,6 +357,7 @@ export const deployPreviewApplication = async ({ title: titleLog, description: descriptionLog, previewDeploymentId: previewDeploymentId, + jobId, }); const previewDeployment = diff --git a/packages/server/src/services/compose.ts b/packages/server/src/services/compose.ts index 89a12a156..c4eea5ab0 100644 --- a/packages/server/src/services/compose.ts +++ b/packages/server/src/services/compose.ts @@ -205,10 +205,12 @@ export const deployCompose = async ({ composeId, titleLog = "Manual deployment", descriptionLog = "", + jobId, }: { composeId: string; titleLog: string; descriptionLog: string; + jobId?: string; }) => { const compose = await findComposeById(composeId); @@ -219,6 +221,7 @@ export const deployCompose = async ({ composeId: composeId, title: titleLog, description: descriptionLog, + jobId, }); try { @@ -321,10 +324,12 @@ export const rebuildCompose = async ({ composeId, titleLog = "Rebuild deployment", descriptionLog = "", + jobId, }: { composeId: string; titleLog: string; descriptionLog: string; + jobId?: string; }) => { const compose = await findComposeById(composeId); @@ -332,6 +337,7 @@ export const rebuildCompose = async ({ composeId: composeId, title: titleLog, description: descriptionLog, + jobId, }); try { diff --git a/packages/server/src/services/deployment.ts b/packages/server/src/services/deployment.ts index 6244ec8eb..3e21e8af0 100644 --- a/packages/server/src/services/deployment.ts +++ b/packages/server/src/services/deployment.ts @@ -71,7 +71,7 @@ export const createDeployment = async ( deployment: Omit< typeof apiCreateDeployment._type, "deploymentId" | "createdAt" | "status" | "logPath" - >, + > & { jobId?: string }, ) => { const application = await findApplicationById(deployment.applicationId); try { @@ -107,6 +107,7 @@ export const createDeployment = async ( const deploymentCreate = await db .insert(deployments) .values({ + ...(deployment.jobId && { deploymentId: deployment.jobId }), applicationId: deployment.applicationId, title: deployment.title || "Deployment", status: "running", @@ -152,7 +153,7 @@ export const createDeploymentPreview = async ( deployment: Omit< typeof apiCreateDeploymentPreview._type, "deploymentId" | "createdAt" | "status" | "logPath" - >, + > & { jobId?: string }, ) => { const previewDeployment = await findPreviewDeploymentById( deployment.previewDeploymentId, @@ -191,6 +192,7 @@ export const createDeploymentPreview = async ( const deploymentCreate = await db .insert(deployments) .values({ + ...(deployment.jobId && { deploymentId: deployment.jobId }), title: deployment.title || "Deployment", status: "running", logPath: logFilePath, @@ -235,7 +237,7 @@ export const createDeploymentCompose = async ( deployment: Omit< typeof apiCreateDeploymentCompose._type, "deploymentId" | "createdAt" | "status" | "logPath" - >, + > & { jobId?: string }, ) => { const compose = await findComposeById(deployment.composeId); try { @@ -268,6 +270,7 @@ echo "Initializing deployment\n" >> ${logFilePath}; const deploymentCreate = await db .insert(deployments) .values({ + ...(deployment.jobId && { deploymentId: deployment.jobId }), composeId: deployment.composeId, title: deployment.title || "Deployment", description: deployment.description || "",