Prerequisites
Make sure the following tools are installed before you begin:
- Docker 24+
- Docker Compose v2 (ships with Docker Desktop)
- Python 3.11+ (only needed if you want to run scripts or the Python examples below)
Create your environment file
Copy the example environment file and edit it if needed:The default
.env.example contains:.env.example
ORIGINS is a comma-separated list of allowed CORS origins. Add any additional frontend URLs here. All other service URLs (MongoDB, Redis, RabbitMQ) are wired together automatically through Docker Compose.The
docker-compose.override.yml file automatically injects RABBITMQ_URL, port bindings, and the RabbitMQ service when you run docker compose up, so no extra configuration is needed for local development.Start all services
| Service | Container name | Purpose |
|---|---|---|
indicator-service | indicator-service | FastAPI application on port 8080 |
indicators-mongo | indicators-mongo | MongoDB data store |
indicators-redis | indicators-redis | Redis cache |
rabbitmq | indicator-rabbitmq | Message broker (AMQP on 5672, management UI on 15674) |
Verify the service is running
Once the container is healthy, ping the health endpoint:Expected response:
The Docker health check (
curl -f http://localhost:8080/health/) runs every 10 seconds with a 5-second timeout. Wait for indicator-service to show healthy in docker ps before proceeding.Create a domain
Indicators are organized under domains and subdomains. Create a domain first:The response includes the new domain’s
id. Copy it — you need it in the next step.Create an indicator
Create an indicator under the domain and one of its subdomains. Replace A successful response returns the full indicator object with a nested domain object:
<domain_id> with the id from the previous step:Verify data ingestion via RabbitMQ
The service listens on the The service also consumes the
resource_data queue for time-series data published by external producers. When a message arrives, the data ingestor stores it as a raw segment in MongoDB, updates the merged_indicators collection, and clears the related Redis cache entries.To test ingestion, publish a message to the resource_data queue using the RabbitMQ management UI at http://localhost:15674 (credentials: guest / guest):A
resource_id must be linked to an indicator via POST /indicators/{indicator_id}/resources before messages for that resource are processed. Messages with no matching indicator are acknowledged and discarded.resource_deleted queue — when a resource is deleted, the service removes the associated data segments, re-merges remaining data, and invalidates the cache.