services: api: container_name: demografana-api build: context: . dockerfile: Dockerfile target: api environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://+:8080 - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=demografana;Username=postgres;Password=postgres - RabbitMq__Host=rabbitmq - RabbitMq__Username=guest - RabbitMq__Password=guest - OTEL_EXPORTER_OTLP_ENDPOINT=http://alloy:4317 ports: - "8080:8080" networks: - observability depends_on: migrator: condition: service_completed_successfully rabbitmq: condition: service_healthy alloy: condition: service_started restart: unless-stopped relay: container_name: demografana-relay build: context: . dockerfile: Dockerfile target: relay environment: - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=demografana;Username=postgres;Password=postgres - RabbitMq__Host=rabbitmq - RabbitMq__Username=guest - RabbitMq__Password=guest - OTEL_EXPORTER_OTLP_ENDPOINT=http://alloy:4317 networks: - observability depends_on: migrator: condition: service_completed_successfully rabbitmq: condition: service_healthy alloy: condition: service_started restart: unless-stopped worker: container_name: demografana-worker build: context: . dockerfile: Dockerfile target: worker environment: - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=demografana;Username=postgres;Password=postgres - RabbitMq__Host=rabbitmq - RabbitMq__Username=guest - RabbitMq__Password=guest - OTEL_EXPORTER_OTLP_ENDPOINT=http://alloy:4317 networks: - observability depends_on: migrator: condition: service_completed_successfully rabbitmq: condition: service_healthy alloy: condition: service_started restart: unless-stopped k6: image: grafana/k6 volumes: - ./k6:/scripts command: run /scripts/order-lifecycle.js environment: - API_URL=http://api:8080 networks: - observability depends_on: - api profiles: - load-test migrator: container_name: demografana-migrator build: context: . dockerfile: Dockerfile target: migrator environment: - ConnectionStrings__DefaultConnection=Host=postgres;Port=5432;Database=demografana;Username=postgres;Password=postgres networks: - observability depends_on: postgres: condition: service_healthy restart: on-failure postgres: container_name: postgres image: postgres:17-alpine shm_size: 128mb environment: - POSTGRES_DB=demografana - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data networks: - observability restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d demografana"] interval: 5s timeout: 5s retries: 10 adminer: container_name: adminer image: adminer ports: - "8081:8080" networks: - observability restart: unless-stopped rabbitmq: container_name: rabbitmq image: rabbitmq:4-management-alpine ports: - "5672:5672" - "15672:15672" volumes: - rabbitmq-data:/var/lib/rabbitmq networks: - observability restart: unless-stopped healthcheck: test: ["CMD", "rabbitmq-diagnostics", "ping"] interval: 5s timeout: 5s retries: 10 alloy: container_name: alloy image: grafana/alloy:v1.16.1 command: - run - --server.http.listen-addr=0.0.0.0:12345 - --storage.path=/var/lib/alloy/data - /etc/alloy/config.alloy volumes: - ./observability/alloy/config.alloy:/etc/alloy/config.alloy:ro - alloy-data:/var/lib/alloy/data ports: - "4317:4317" - "4318:4318" - "12345:12345" networks: - observability depends_on: - loki restart: unless-stopped loki: container_name: loki image: grafana/loki:3.7.2 command: ["-config.file=/etc/loki/config.yaml"] volumes: - ./observability/loki/config.yaml:/etc/loki/config.yaml:ro - loki-data:/loki ports: - "3100:3100" networks: - observability restart: unless-stopped tempo: container_name: tempo image: grafana/tempo:2.5.0 command: ["-config.file=/etc/tempo/tempo.yaml"] volumes: - ./observability/tempo/tempo.yaml:/etc/tempo/tempo.yaml:ro - tempo-data:/var/tempo ports: - "3200:3200" networks: - observability restart: unless-stopped grafana: container_name: grafana image: grafana/grafana:main-slim environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_AUTH_DISABLE_LOGIN_FORM=true - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor traceToMetrics metricsSummary volumes: - ./observability/grafana/provisioning:/etc/grafana/provisioning:ro - grafana-data:/var/lib/grafana ports: - "3000:3000" networks: - observability depends_on: - loki restart: unless-stopped networks: observability: name: observability volumes: alloy-data: loki-data: tempo-data: prometheus-data: grafana-data: postgres-data: rabbitmq-data: