version: "3.9" services: prometheus: image: prom/prometheus:v2.53.0 container_name: prometheus command: - --config.file=/etc/prometheus/prometheus.yml volumes: - ./observability/prometheus.yml:/etc/prometheus/prometheus.yml:ro ports: - "9090:9090" healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:9090/-/ready"] interval: 15s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped loki: image: grafana/loki:3.0.0 container_name: loki command: ["-config.file=/etc/loki/config.yaml"] volumes: - ./observability/loki-config.yaml:/etc/loki/config.yaml:ro - ./observability/data/loki:/loki ports: - "3100:3100" healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3100/ready"] interval: 15s timeout: 5s retries: 5 start_period: 15s restart: unless-stopped tempo: image: grafana/tempo:2.4.1 container_name: tempo command: ["-config.file=/etc/tempo/tempo.yaml"] volumes: - ./observability/tempo-config.yaml:/etc/tempo/tempo.yaml:ro - ./observability/data/tempo:/var/tempo ports: - "3200:3200" healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3200/ready"] interval: 15s timeout: 5s retries: 5 start_period: 15s restart: unless-stopped grafana: image: grafana/grafana:10.4.2 container_name: grafana environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - GF_SECURITY_ADMIN_PASSWORD=admin - GF_SECURITY_ADMIN_USER=admin volumes: - ./observability/grafana/provisioning/datasources:/etc/grafana/provisioning/datasources:ro ports: - "3000:3000" depends_on: - prometheus - loki - tempo healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"] interval: 15s timeout: 5s retries: 5 start_period: 20s restart: unless-stopped