feat(deployment): improve stuck deployment detection and update status

- Enhanced the stuck deployment check to only consider the most recent deployment.
- Updated the logic to correctly identify if the most recent deployment has been running for more than 9 minutes.
- Added functionality to update the deployment status to "done" upon application and compose cancellation.
This commit is contained in:
Mauricio Siu
2025-09-06 22:05:39 -06:00
parent 4e69c70697
commit 766cd20e90
3 changed files with 33 additions and 9 deletions

View File

@@ -81,22 +81,28 @@ export const ShowDeployments = ({
const [url, setUrl] = React.useState("");
// Check for stuck deployments (more than 9 minutes)
// Check for stuck deployment (more than 9 minutes) - only for the most recent deployment
const stuckDeployment = useMemo(() => {
if (!isCloud || !deployments || deployments.length === 0) return null;
const now = Date.now();
const NINE_MINUTES = 8 * 60 * 1000; // 9 minutes in milliseconds
const NINE_MINUTES = 10 * 60 * 1000; // 9 minutes in milliseconds
return deployments.find((deployment) => {
if (deployment.status !== "running" || !deployment.startedAt)
return false;
// Get the most recent deployment (first in the list since they're sorted by date)
const mostRecentDeployment = deployments[0];
const startTime = new Date(deployment.startedAt).getTime();
const elapsed = now - startTime;
if (
!mostRecentDeployment ||
mostRecentDeployment.status !== "running" ||
!mostRecentDeployment.startedAt
) {
return null;
}
return elapsed > NINE_MINUTES;
});
const startTime = new Date(mostRecentDeployment.startedAt).getTime();
const elapsed = now - startTime;
return elapsed > NINE_MINUTES ? mostRecentDeployment : null;
}, [isCloud, deployments]);
useEffect(() => {
setUrl(document.location.origin);

View File

@@ -24,6 +24,7 @@ import {
unzipDrop,
updateApplication,
updateApplicationStatus,
updateDeploymentStatus,
writeConfig,
writeConfigRemote,
// uploadFileSchema
@@ -919,6 +920,14 @@ export const applicationRouter = createTRPCRouter({
if (IS_CLOUD && application.serverId) {
try {
await updateApplicationStatus(input.applicationId, "idle");
if (application.deployments[0]) {
await updateDeploymentStatus(
application.deployments[0].deploymentId,
"done",
);
}
await cancelDeployment({
applicationId: input.applicationId,
applicationType: "application",

View File

@@ -29,6 +29,7 @@ import {
startCompose,
stopCompose,
updateCompose,
updateDeploymentStatus,
} from "@dokploy/server";
import {
type CompleteTemplate,
@@ -953,6 +954,14 @@ export const composeRouter = createTRPCRouter({
await updateCompose(input.composeId, {
composeStatus: "idle",
});
if (compose.deployments[0]) {
await updateDeploymentStatus(
compose.deployments[0].deploymentId,
"done",
);
}
await cancelDeployment({
composeId: input.composeId,
applicationType: "compose",