You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
refactor(deploy): drop the migrate service and image
The backend migrates itself at boot, so the migrate Dockerfile target,
compose service, and the Swarm playbook's post-deploy migration task
(plus its attachable-network requirement) all go away. Two images
remain: runtime and web. The worker now waits for the backend
healthcheck so it never touches a pre-migration schema.
Verified on a wiped stack: virgin database boots, backend logs
'database migrations applied' before listening, Sales Inquiry Pipeline
runs to execution_completed over live SSE, rate limiter returns 429
past the budget.
Path A is UI-only and does not need Docker. Path B requires `pnpm infra:up` before backend/worker can start, and `db:migrate` on the first run.
25
+
Path A is UI-only and does not need Docker. Path B requires `pnpm infra:up` before backend/worker can start; the backend applies pending migrations automatically at boot.
26
26
27
27
### Agent signals
28
28
@@ -44,7 +44,7 @@ Long-running processes already emit stable log lines that scripts and agents can
44
44
tools/ - Root dev scripts: preflight, setup:env, infra wait
| Postgres ×2 + Temporal services with named volumes, pinned via `node.labels.ai-studio-data==true`| AI Studio is stateful; Swarm volumes are node-local. **One-time setup:**`docker node update --label-add ai-studio-data=true <node>`|
58
-
| Migrations run post-deploy as a one-shot `docker run` on the stack network (with retries) | Swarm ignores compose `depends_on` conditions |
59
-
|`internal` network is `attachable: true`| Lets the migrate container join the overlay |
60
-
| Services carry short DNS aliases (`backend`, `app-db`, `temporal`, …) | The web image's nginx proxies to `http://backend:3001`; aliases keep the images and env defaults identical between compose and Swarm |
61
-
| Gatekeeper is conditional (`AUTH_ENABLED`) | The WB-229 public demo is deliberately login-free; internal instances can keep SSO |
| Postgres ×2 + Temporal services with named volumes, pinned via `node.labels.ai-studio-data==true`| AI Studio is stateful; Swarm volumes are node-local. **One-time setup:**`docker node update --label-add ai-studio-data=true <node>`|
58
+
| No migration step — the backend applies Drizzle migrations at boot and restarts until Postgres answers | Swarm ignores compose `depends_on` conditions, so ordering must not rely on them |
59
+
| Services carry short DNS aliases (`backend`, `app-db`, `temporal`, …) | The web image's nginx proxies to `http://backend:3001`; aliases keep the images and env defaults identical between compose and Swarm |
60
+
| Gatekeeper is conditional (`AUTH_ENABLED`) | The WB-229 public demo is deliberately login-free; internal instances can keep SSO |
62
61
63
62
SSE note: Traefik streams responses by default, so the live execution stream
64
63
works without special ingress config; the 15 s backend heartbeat keeps the
0 commit comments