5-minute Quickstart¶
Boot the entire Azothedge Pulse stack on your machine with Docker Compose, then verify it's healthy. This is the fastest path from a fresh clone to a running CDP.
Prerequisites¶
- Docker and the Docker Compose plugin (
docker compose version). - GNU Make (the repo's
maketargets wrap Compose). - About 4 GB of free RAM for the full stack.
For a host-native development loop (running the API or worker outside containers), you'll also want uv and Node 24 LTS — see Local Development.
1. Clone and boot¶
git clone git@github.com:azothedge/pulse.git
cd pulse
make up # builds + boots the stack, waits up to 90s for health
make up starts the API, the ingestion worker, Postgres, Redpanda (Kafka API), MinIO (object storage), and the full observability stack (Grafana, Prometheus, Loki, Tempo), plus Mailpit and the web portal. It then polls container health for up to 90 seconds and reports when everything is ready.
2. Smoke-test the API¶
curl -s http://localhost:8000/health
# {"status":"healthy","service":"azothedge-pulse-api"}
curl -s http://localhost:8000/ready
# {"status":"ready","checks":{"postgres":true,"kafka":true,"minio":true}}
/health is a liveness probe; /ready checks that Postgres, Kafka, and MinIO are all reachable.
3. Open the consoles¶
| Service | URL | Credentials |
|---|---|---|
| API (Swagger UI) | http://localhost:8000/docs | — |
| Web portal | http://localhost:3001 | — |
| Grafana | http://localhost:3000 | admin / admin |
| Redpanda Console | http://localhost:8080 | — |
| MinIO Console | http://localhost:9001 | pulse / pulsepulse |
| Mailpit | http://localhost:8025 | — |
Port 3001, not 3000
The web portal is published on host port 3001 (it maps to container port 3000) because Grafana already owns 3000. The full port map is in Local Development.
4. Send your first event¶
You have a running CDP, but no data yet. The next page walks the full path — create a tenant, register a schema, materialize a dataset, and collect an event end to end.
Stopping the stack¶
make down # stop containers, keep data volumes
make clean # stop AND delete volumes (DESTRUCTIVE — wipes all local data)