diff --git a/apps/dokploy/server/api/routers/application.ts b/apps/dokploy/server/api/routers/application.ts index c7b1f8642f..6d79fada07 100644 --- a/apps/dokploy/server/api/routers/application.ts +++ b/apps/dokploy/server/api/routers/application.ts @@ -754,7 +754,7 @@ export const applicationRouter = createTRPCRouter({ deployment: ["create"], }); const application = await findApplicationById(input.applicationId); - await clearOldDeployments(application.appName, application.serverId); + await clearOldDeployments(application.applicationId, "application"); await audit(ctx, { action: "delete", resourceType: "application", diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index 51e257ce65..fc34fb4be1 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -298,7 +298,7 @@ export const composeRouter = createTRPCRouter({ deployment: ["create"], }); const compose = await findComposeById(input.composeId); - await clearOldDeployments(compose.appName, compose.serverId); + await clearOldDeployments(compose.composeId, "compose"); await audit(ctx, { action: "update", resourceType: "compose", diff --git a/packages/server/src/services/deployment.ts b/packages/server/src/services/deployment.ts index a5ff577791..362d329dd2 100644 --- a/packages/server/src/services/deployment.ts +++ b/packages/server/src/services/deployment.ts @@ -1035,17 +1035,37 @@ export const findAllDeploymentsByServerId = async (serverId: string) => { }; export const clearOldDeployments = async ( - appName: string, - serverId: string | null, + id: string, + type: "application" | "compose" ) => { - const { LOGS_PATH } = paths(!!serverId); - const folder = path.join(LOGS_PATH, appName); - const command = ` - rm -rf ${folder}; - `; - if (serverId) { - await execAsyncRemote(serverId, command); - } else { - await execAsync(command); + const deploymentsList = await db.query.deployments.findMany({ + where: eq(deployments[`${type}Id`], id), + orderBy: desc(deployments.createdAt), + }); + + const currentDeployment = + deploymentsList.find((d) => d.status === "done") ?? deploymentsList[0]; + + if (!currentDeployment || deploymentsList.length <= 1) { + return; + } + + const deploymentsToDelete = deploymentsList.filter( + (d) => d.deploymentId !== currentDeployment.deploymentId, + ); + + for (const oldDeployment of deploymentsToDelete) { + try { + if (oldDeployment.rollbackId) { + await removeRollbackById(oldDeployment.rollbackId); + } + + await removeDeployment(oldDeployment.deploymentId); + } catch (err) { + console.error( + `Failed to remove deployment ${oldDeployment.deploymentId} during cleanup:`, + err, + ); + } } };