version: '3.8' services: demo-service: build: context: ./demo-service dockerfile: Dockerfile ports: - "8080:8080" environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_SERVICE_NAME=demo-service - PORT=8080 depends_on: - otel-collector networks: - resilienceops backend: build: context: ./backend dockerfile: Dockerfile ports: - "8000:8000" environment: - PORT=8000 networks: - resilienceops frontend: build: context: ./frontend dockerfile: Dockerfile ports: - "3000:3000" environment: - NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1 depends_on: - backend networks: - resilienceops otel-collector: image: otel/opentelemetry-collector-contrib:0.96.0 command: ["--config=/etc/otel-collector-config.yaml"] volumes: - ./observability/otel-collector/otel-collector-config.yaml:/etc/otel-collector-config.yaml ports: - "4317:4317" # OTLP gRPC - "4318:4318" # OTLP HTTP - "8889:8889" # Prometheus metrics endpoint networks: - resilienceops prometheus: image: prom/prometheus:v2.50.1 command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" volumes: - ./observability/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus ports: - "9090:9090" networks: - resilienceops grafana: image: grafana/grafana:10.4.0 environment: - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - ./observability/grafana/provisioning/datasources:/etc/grafana/provisioning/datasources - ./observability/grafana/provisioning/dashboards:/etc/grafana/provisioning/dashboards - ./observability/grafana/dashboards:/etc/grafana/provisioning/dashboards/json - grafana_data:/var/lib/grafana ports: - "3001:3000" depends_on: - prometheus - loki networks: - resilienceops loki: image: grafana/loki:2.9.4 command: -config.file=/etc/loki/local-config.yaml volumes: - ./observability/loki/loki-config.yaml:/etc/loki/local-config.yaml ports: - "3100:3100" networks: - resilienceops networks: resilienceops: driver: bridge volumes: prometheus_data: grafana_data: