fix(compose): wait for the API to be healthy before starting nomos
nomos declared `depends_on: api: condition: service_started`, which only waits for the container to exist. It came up while the API was still binding :8090, failed its MCP initialize with "connection refused", exited 1, and crash-looped for ~25 seconds on every single deploy. It always recovered on its own, which is precisely why it went unnoticed. service_healthy waits for the API to answer, so this needs api to declare a healthcheck — wget is BusyBox's, already present in the alpine runtime image, so nothing new is installed. /healthz pings the database, so "healthy" means genuinely able to serve rather than merely listening. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -83,6 +83,18 @@ services:
|
|||||||
command: ["api"]
|
command: ["api"]
|
||||||
stop_signal: SIGTERM
|
stop_signal: SIGTERM
|
||||||
stop_grace_period: 30s
|
stop_grace_period: 30s
|
||||||
|
# Exists so nomos can wait for the API to actually answer rather than just
|
||||||
|
# for its container to exist — see nomos's depends_on below. wget is
|
||||||
|
# BusyBox's, already in the alpine runtime image, so this adds no
|
||||||
|
# dependency. /healthz pings the DB, so "healthy" means genuinely ready.
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:8090/healthz"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 10
|
||||||
|
# Migrations and seed run before this container, but the first bind can
|
||||||
|
# still take a moment; failures inside the start period don't count.
|
||||||
|
start_period: 10s
|
||||||
|
|
||||||
# Scheduler (Phase 3) — observe loop
|
# Scheduler (Phase 3) — observe loop
|
||||||
scheduler:
|
scheduler:
|
||||||
@@ -139,7 +151,12 @@ services:
|
|||||||
profiles: ["full"]
|
profiles: ["full"]
|
||||||
depends_on:
|
depends_on:
|
||||||
api:
|
api:
|
||||||
condition: service_started
|
# service_started only waits for the container to exist, so nomos came
|
||||||
|
# up while the API was still binding :8090, failed its MCP initialize,
|
||||||
|
# exited 1, and crash-looped for ~25s on every single deploy. It always
|
||||||
|
# recovered, which is exactly why it went unnoticed. service_healthy
|
||||||
|
# waits for the API to actually answer.
|
||||||
|
condition: service_healthy
|
||||||
environment:
|
environment:
|
||||||
NOMOS_MCP_URL: http://api:8090/mcp
|
NOMOS_MCP_URL: http://api:8090/mcp
|
||||||
NOMOS_AGENT_SLUG: agent:nomos
|
NOMOS_AGENT_SLUG: agent:nomos
|
||||||
|
|||||||
Reference in New Issue
Block a user