From 000ea3b9e6cefed8d0bf27f561be57d6ba967641 Mon Sep 17 00:00:00 2001 From: 7ttp <117663341+7ttp@users.noreply.github.com> Date: Wed, 5 Aug 2026 20:33:28 +0530 Subject: [PATCH] fix(cli): exit analytics container when migrations fail --- .../commands/start/services/logflare.service.ts | 12 ++++++++---- .../start/services/logflare.service.unit.test.ts | 2 +- packages/stack/src/services/analytics.ts | 4 +++- packages/stack/src/services/services.unit.test.ts | 3 +++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/cli/src/legacy/commands/start/services/logflare.service.ts b/apps/cli/src/legacy/commands/start/services/logflare.service.ts index 3b61d6a9d7..c2b27361ea 100644 --- a/apps/cli/src/legacy/commands/start/services/logflare.service.ts +++ b/apps/cli/src/legacy/commands/start/services/logflare.service.ts @@ -46,12 +46,16 @@ const LEGACY_LOGFLARE_API_KEY = "api-key"; /** * Go's Logflare entrypoint script (`start.go:358-362`): the image's own * entrypoint conflicts with the container healthcheck due to a 15-second - * sleep, so Go writes its own `run.sh` and runs that instead. Transcribed - * byte-for-byte, including the trailing newline after `EOF` (Go's raw string - * literal ends with a newline before the closing backtick). + * sleep, so Go writes its own `run.sh` and runs that instead. + * + * Deliberate divergence from Go, do not revert in a parity sweep (issue + * #6088): `migrate && start`, so a failed migrate exits the container and the + * `unless-stopped` restart policy retries until the db is ready — Go boots + * Logflare against the unmigrated database, where Oban dies on the missing + * `public.oban_jobs`. */ const LEGACY_LOGFLARE_ENTRYPOINT_SCRIPT = - "cat <<'EOF' > run.sh && sh run.sh\n./logflare eval Logflare.Release.migrate\n./logflare start --sname logflare\nEOF\n"; + "cat <<'EOF' > run.sh && sh run.sh\n./logflare eval Logflare.Release.migrate &&\n./logflare start --sname logflare\nEOF\n"; export interface LegacyLogflareContainerSpecInput { /** diff --git a/apps/cli/src/legacy/commands/start/services/logflare.service.unit.test.ts b/apps/cli/src/legacy/commands/start/services/logflare.service.unit.test.ts index 881f243f7d..7a9cf7aa93 100644 --- a/apps/cli/src/legacy/commands/start/services/logflare.service.unit.test.ts +++ b/apps/cli/src/legacy/commands/start/services/logflare.service.unit.test.ts @@ -32,7 +32,7 @@ describe("legacyBuildLogflareContainerSpec", () => { expect(spec.entrypoint).toBe("sh"); expect(spec.cmd).toEqual([ "-c", - "cat <<'EOF' > run.sh && sh run.sh\n./logflare eval Logflare.Release.migrate\n./logflare start --sname logflare\nEOF\n", + "cat <<'EOF' > run.sh && sh run.sh\n./logflare eval Logflare.Release.migrate &&\n./logflare start --sname logflare\nEOF\n", ]); expect(spec.exposedPorts).toEqual([{ containerPort: "4000" }]); expect(spec.ports).toEqual([{ hostPort: "54327", containerPort: "4000" }]); diff --git a/packages/stack/src/services/analytics.ts b/packages/stack/src/services/analytics.ts index 78c62f895e..45569457f5 100644 --- a/packages/stack/src/services/analytics.ts +++ b/packages/stack/src/services/analytics.ts @@ -76,8 +76,10 @@ export const makeAnalyticsServiceDocker = (opts: DockerAnalyticsOptions): Servic entrypoint: "sh", cmd: [ "-c", + // migrate && start: a failed migrate exits the container and the + // unless-stopped restart retries until the db is ready (supabase/cli#6088). `cat <<'EOF' > /tmp/run.sh && sh /tmp/run.sh -./logflare eval Logflare.Release.migrate +./logflare eval Logflare.Release.migrate && ./logflare start --sname logflare EOF `, diff --git a/packages/stack/src/services/services.unit.test.ts b/packages/stack/src/services/services.unit.test.ts index 2db96bb9af..c777062c83 100644 --- a/packages/stack/src/services/services.unit.test.ts +++ b/packages/stack/src/services/services.unit.test.ts @@ -600,6 +600,9 @@ describe("docker-backed auxiliary services", () => { expect(args).toContain("PHX_HTTP_PORT=4000"); expect(args).toContain("54328:4000"); expect(args).toContain("LOGFLARE_NODE_HOST=0.0.0.0"); + expect(args.at(-1)).toBe( + `cat <<'EOF' > /tmp/run.sh && sh /tmp/run.sh\n./logflare eval Logflare.Release.migrate &&\n./logflare start --sname logflare\nEOF\n`, + ); }); it("keeps analytics on its container port when Linux uses bridge networking", () => {