services: prometheus: image: prom/prometheus:v3.14.0 command: - --config.file=/etc/prometheus/prometheus.yaml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention.time=6h ports: - "${PROMETHEUS_PORT:-19090}:9090" volumes: - ./observability/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yaml:ro - ./observability/alerts:/etc/prometheus/rules:ro - prometheus-data:/prometheus tempo: image: grafana/tempo:3.0.3 command: ["-config.file=/etc/tempo.yaml"] volumes: - ./observability/tempo/tempo.yaml:/etc/tempo.yaml:ro tmpfs: - /var/tempo:uid=10001,gid=10001,mode=0755 loki: image: grafana/loki:3.7.6 command: ["-config.file=/etc/loki/local-config.yaml"] volumes: - ./observability/loki/loki.yaml:/etc/loki/local-config.yaml:ro tmpfs: - /var/loki:uid=10001,gid=10001,mode=0755 otel-collector: volumes: - ./observability/otel-collector/local.yaml:/etc/otelcol-contrib/config.yaml:ro depends_on: - tempo - loki grafana: image: grafana/grafana:13.2.0 environment: GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: Admin GF_AUTH_DISABLE_LOGIN_FORM: "true" ports: - "${GRAFANA_PORT:-13000}:3000" volumes: - ./observability/grafana/provisioning:/etc/grafana/provisioning:ro - ./observability/grafana/dashboards:/var/lib/grafana/dashboards:ro - grafana-data:/var/lib/grafana depends_on: - prometheus - tempo - loki volumes: prometheus-data: grafana-data: