Everything needed to run the full system on a developer workstation: UI, API, data engine, PostgreSQL, and RabbitMQ. The layout deliberately mirrors the cloud topology (Container Apps + managed Postgres) so "works locally" is a meaningful signal.
| File | Role |
|---|---|
compose.yaml |
Prod-parity baseline — uses each service's real Dockerfile, real nginx for UI. |
compose.override.yaml |
Dev conveniences — hot reload (API source mount, ng serve with proxy), node image swap for UI, debug-friendly envs. Automatically merged by Compose v2 when present. |
The split lets CI smoke-test the same image recipe used in production (compose.yaml alone), while day-to-day dev enjoys hot reload (both files merged).
flowchart LR
dev([Developer]) -->|4200| ui[ea-ui<br/>nginx or ng serve]
dev -->|8000| api[ea-api<br/>ASP.NET Core]
dev -->|15672| mqui[RabbitMQ Mgmt UI]
dev -->|5432| pg[(ea-db<br/>postgres:16)]
ui -.proxy /api.-> api
api -->|EF Core| pg
api -->|AMQP 5672| mq[[ea-rabbitmq<br/>rabbitmq:4-management]]
de[ea-data-engine<br/>Python] -->|AMQP 5672| mq
mq -.admin.-> mqui
| Service | Host Port | Container Port | Credentials |
|---|---|---|---|
| UI | 4200 | 80 (prod image) / 4200 (dev override) | — |
| API | 8000 | 8000 | Bearer token (dev auth handler in Development) |
| Data Engine | — (no inbound) | — | — |
| RabbitMQ AMQP | 5672 | 5672 | guest / guest |
| RabbitMQ Management UI | 15672 | 15672 | guest / guest |
| PostgreSQL | 5432 | 5432 | db postgres, user postgres, password password |
Health checks gate startup: the API waits for ea-db and ea-rabbitmq to report healthy, and has its own /health/live probe.
# Build and start everything (foreground, logs streamed)
docker compose -f deploy/compose.yaml up --build
# Detached
docker compose -f deploy/compose.yaml up --build -d
# Tail logs for one service
docker compose -f deploy/compose.yaml logs -f ea-api
# Reset DB and broker state (destroys volumes)
docker compose -f deploy/compose.yaml down -v
# Rebuild one service only
docker compose -f deploy/compose.yaml up --build ea-data-engineCompose v2 picks up compose.override.yaml automatically when running from the repo root or deploy/.
| Volume | Content | Reset Command |
|---|---|---|
ea-db-data |
PostgreSQL data directory | docker compose ... down -v |
ea-rabbitmq-data |
RabbitMQ definitions + mnesia | docker compose ... down -v |
ui-node-modules (override only) |
Cached node_modules for ng serve |
docker volume rm enterprise-app_ui-node-modules |
- First run builds everything. Allow a few minutes; subsequent runs hit layer cache.
- Port 5432 conflicts with local Postgres installs are common — stop the host service or remap the port in an override.
- Seed data is inserted by the API's
SeedHostedServiceon startup (Development only) and is idempotent. - Migrations run inline locally. In the cloud they run as a dedicated Container Apps Job; locally the API applies them on boot.