fix: don't show health status for exited containers (#7317)

This commit is contained in:
Andras Bacsai authored and GitHub committed 2025-11-24 10:29:57 +01:00
commit bf428a0e1c
11 files changed
+65 -48

No files matched your search

+3 -1
View File
@@ -107,6 +107,8 @@ class GetContainersStatus
if ($containerStatus === 'restarting') {
$healthSuffix = $containerHealth ?? 'unknown';
$containerStatus = "restarting:$healthSuffix";
} elseif ($containerStatus === 'exited') {
// Keep as-is, no health suffix for exited containers
} else {
$healthSuffix = $containerHealth ?? 'unknown';
$containerStatus = "$containerStatus:$healthSuffix";
@@ -332,7 +334,7 @@ class GetContainersStatus
if ($recentlyRestarted) {
// Keep it as degraded if it was recently in a crash loop
$application->update(['status' => 'degraded (unhealthy)']);
$application->update(['status' => 'degraded:unhealthy']);
} else {
// Reset restart count when application exits completely
$application->update([
+4 -4
View File
@@ -20,11 +20,11 @@ class ComplexStatusCheck
$is_main_server = $application->destination->server->id === $server->id;
if (! $server->isFunctional()) {
if ($is_main_server) {
$application->update(['status' => 'exited:unhealthy']);
$application->update(['status' => 'exited']);
continue;
} else {
$application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited:unhealthy']);
$application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited']);
continue;
}
@@ -49,11 +49,11 @@ class ComplexStatusCheck
}
} else {
if ($is_main_server) {
$application->update(['status' => 'exited:unhealthy']);
$application->update(['status' => 'exited']);
continue;
} else {
$application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited:unhealthy']);
$application->additional_servers()->updateExistingPivot($server->id, ['status' => 'exited']);
continue;
}
+4 -1
View File
@@ -148,7 +148,10 @@ class PushServerUpdateJob implements ShouldBeEncrypted, ShouldQueue, Silenced
$containerStatus = data_get($container, 'state', 'exited');
$rawHealthStatus = data_get($container, 'health_status');
$containerHealth = $rawHealthStatus ?? 'unknown';
$containerStatus = "$containerStatus:$containerHealth";
// Only append health status if container is not exited
if ($containerStatus !== 'exited') {
$containerStatus = "$containerStatus:$containerHealth";
}
$labels = collect(data_get($container, 'labels'));
$coolify_managed = $labels->has('coolify.managed');
+6 -1
View File
@@ -223,7 +223,12 @@ class Service extends BaseModel
return 'unknown:unknown:excluded';
}
return 'exited:unhealthy:excluded';
return 'exited';
}
// If health is null/empty, return just the status without trailing colon
if ($complexHealth === null || $complexHealth === '') {
return $complexStatus;
}
return "{$complexStatus}:{$complexHealth}";
+4 -6
View File
@@ -23,7 +23,7 @@ use Illuminate\Support\Facades\Log;
* 5. Dead/Removing → degraded:unhealthy
* 6. Paused → paused:unknown
* 7. Starting/Created → starting:unknown
* 8. Exited → exited:unhealthy
* 8. Exited → exited
*/
class ContainerStatusAggregator
{
@@ -52,7 +52,7 @@ class ContainerStatusAggregator
}
if ($containerStatuses->isEmpty()) {
return 'exited:unhealthy';
return 'exited';
}
// Initialize state flags
@@ -79,7 +79,6 @@ class ContainerStatusAggregator
}
} elseif (str($status)->contains('exited')) {
$hasExited = true;
$hasUnhealthy = true;
} elseif (str($status)->contains('created') || str($status)->contains('starting')) {
$hasStarting = true;
} elseif (str($status)->contains('paused')) {
@@ -128,7 +127,7 @@ class ContainerStatusAggregator
}
if ($containers->isEmpty()) {
return 'exited:unhealthy';
return 'exited';
}
// Initialize state flags
@@ -157,7 +156,6 @@ class ContainerStatusAggregator
}
} elseif ($state === 'exited') {
$hasExited = true;
$hasUnhealthy = true;
} elseif ($state === 'created' || $state === 'starting') {
$hasStarting = true;
} elseif ($state === 'paused') {
@@ -248,6 +246,6 @@ class ContainerStatusAggregator
}
// Priority 8: All containers exited (no restart count = truly stopped)
return 'exited:unhealthy';
return 'exited';
}
}
+1 -1
View File
@@ -86,7 +86,7 @@ trait CalculatesExcludedStatus
}
if (str($status)->startsWith('exited')) {
return 'exited:excluded';
return 'exited';
}
// For running states, keep the health status: "running:healthy:excluded"