version: '3.8' services: # OpenTelemetry Collector otel-collector: image: otel/opentelemetry-collector-contrib:latest container_name: otel-collector command: ["--config=/etc/otel-collector-config.yml"] volumes: - ./otel/otel-collector-config.yml:/etc/otel-collector-config.yml ports: - "4317:4317" # OTLP gRPC receiver - "4318:4318" # OTLP HTTP receiver - "8888:8888" # Prometheus metrics - "8889:8889" # Prometheus metrics (internal) depends_on: - jaeger - prometheus - elasticsearch networks: - observability # Jaeger for distributed tracing jaeger: image: jaegertracing/all-in-one:latest container_name: jaeger ports: - "16686:16686" # Jaeger UI - "14250:14250" # gRPC environment: - COLLECTOR_OTLP_ENABLED=true networks: - observability # Prometheus for metrics prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' networks: - observability # VictoriaMetrics as alternative metrics storage victoriametrics: image: victoriametrics/victoria-metrics:latest container_name: victoriametrics ports: - "8428:8428" volumes: - victoriametrics-data:/victoria-metrics-data command: - '--storageDataPath=/victoria-metrics-data' - '--httpListenAddr=:8428' networks: - observability # Elasticsearch for logs elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - elasticsearch-data:/usr/share/elasticsearch/data networks: - observability # Kibana for log visualization kibana: image: docker.elastic.co/kibana/kibana:8.11.0 container_name: kibana environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" depends_on: - elasticsearch networks: - observability # Grafana for unified dashboards grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana-data:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning - ./grafana/dashboards:/var/lib/grafana/dashboards depends_on: - prometheus - jaeger - elasticsearch networks: - observability # FastAPI Backend fastapi-backend: build: context: ./backend dockerfile: Dockerfile container_name: fastapi-backend ports: - "8000:8000" environment: - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - OTEL_SERVICE_NAME=fastapi-backend - OTEL_RESOURCE_ATTRIBUTES=service.name=fastapi-backend,service.version=1.0.0 depends_on: - otel-collector networks: - observability # Frontend (Nginx serving Vue/Angular app) frontend: build: context: ./frontend dockerfile: Dockerfile container_name: frontend ports: - "80:80" depends_on: - fastapi-backend networks: - observability volumes: prometheus-data: victoriametrics-data: elasticsearch-data: grafana-data: networks: observability: driver: bridge