From b5f4a666f0f2d7c18230973212083d2a52d46933 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Wed, 25 Feb 2026 20:24:47 +0100 Subject: [PATCH] fix: accept StateStarting in OnStackStart lifecycle hook Containers with Docker healthchecks show 'starting' state for ~30s after compose up. The container is connectable, just hasn't passed its healthcheck yet. Accept both running and starting. Co-Authored-By: Claude Opus 4.6 --- controller/internal/integrations/lifecycle.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/controller/internal/integrations/lifecycle.go b/controller/internal/integrations/lifecycle.go index 3c60eaa..1ebcd42 100644 --- a/controller/internal/integrations/lifecycle.go +++ b/controller/internal/integrations/lifecycle.go @@ -82,14 +82,15 @@ func (m *Manager) OnStackStart(_ context.Context, stackName string) { continue } - // Both provider and target must be running to re-apply + // Both provider and target must be running (or starting) to re-apply. + // StateStarting = container running but healthcheck hasn't passed yet — still connectable. provStack, pOk := m.stacks.GetStack(provider) - if !pOk || !provStack.Deployed || provStack.State != stacks.StateRunning { + if !pOk || !provStack.Deployed || !isStackUp(provStack.State) { continue } if target != "filebrowser" { tgtStack, tOk := m.stacks.GetStack(target) - if !tOk || !tgtStack.Deployed || tgtStack.State != stacks.StateRunning { + if !tOk || !tgtStack.Deployed || !isStackUp(tgtStack.State) { continue } } @@ -120,6 +121,11 @@ func (m *Manager) OnStackStart(_ context.Context, stackName string) { } } +// isStackUp returns true if the stack is running or starting (healthcheck pending). +func isStackUp(state stacks.ContainerState) bool { + return state == stacks.StateRunning || state == stacks.StateStarting +} + // OnStackRemove is called when a stack is removed. // Permanently revokes and deletes integration state. func (m *Manager) OnStackRemove(_ context.Context, stackName string) {