Local Docker Compose

Target reader: developers running echo-nebula dependencies and APIs on a local machine.

The infra repository owns local orchestration. dev-up.sh starts PostgreSQL and MinIO. dev-apps-up.sh starts those dependencies plus both Go APIs, the Developer Console, and the docs site for Alpha E2E.

Minimal example

cd ../echo-nebula-infra
./scripts/dev-apps-up.sh
./scripts/wait-for-services.sh
./scripts/e2e-all.sh

Default ports are PostgreSQL 5432, MinIO API 9000, MinIO console 9001, public API 4000, admin API 4100, Developer Console 4173, and docs 4200. Every published service binds to 127.0.0.1 by default.

Mailpit uses SMTP 1025 and capture UI 8025.

Published host boundaries

COMPOSE_BIND_IP changes the shared bind address. The service-specific overrides are POSTGRES_PORT, MINIO_PORT, MINIO_CONSOLE_PORT, PUBLIC_API_PORT, ADMIN_API_PORT, CONSOLE_PORT, DOCS_PORT, MAILPIT_SMTP_PORT, and MAILPIT_HTTP_PORT.

If the MinIO or Console port changes, keep S3_PUBLIC_ENDPOINT aligned with the browser-visible MinIO endpoint and ADMIN_CORS_ALLOWED_ORIGINS aligned with the exact Console origin. A different scheme, host, or port is a different browser origin.

Readiness fault matrix

/healthz checks process liveness; /readyz checks dependencies. The normal full-stack gates require both API component statuses to be ready, even though Admin can remain 200 degraded during an object-storage-only outage.

Run the destructive recovery matrix only through its isolated entry point:

./scripts/e2e-readiness-isolated.sh

It creates a uniquely named Compose project with independent ports and volumes, tests PostgreSQL, MinIO, and combined outages plus recovery without API restarts, writes evidence below reports/readiness/, and removes only that isolated project. It never runs lifecycle commands against the default local project.

Common mistakes

Next step

Call the Public API.