services: # Prometheus para métricas prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "${PROMETHEUS_PORT:-9090}:9090" volumes: - ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' - '--web.enable-admin-api' - '--web.enable-remote-write-receiver' user: "65534:65534" networks: - monitoring restart: always # Loki para logs loki: image: grafana/loki:latest container_name: loki ports: - "${LOKI_PORT:-3100}:3100" volumes: - ./config/loki/loki.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml networks: - monitoring restart: always # Tempo para trazas - Solo almacenamiento (Alloy maneja la recolección) tempo: image: grafana/tempo:latest container_name: tempo ports: - "${TEMPO_PORT:-3200}:3200" # Solo puerto de consulta, sin endpoints de recepción volumes: - ./config/tempo/tempo.yaml:/etc/tempo/tempo.yaml - tempo_data:/var/tempo command: - -config.file=/etc/tempo/tempo.yaml networks: - monitoring restart: always # Grafana Alloy para colección de datos - ÚNICA PUERTA DE ENTRADA alloy: image: grafana/alloy:latest container_name: alloy ports: - "${ALLOY_UI_PORT:-12345}:12345" # Puerto para la UI de Alloy # Puertos para métricas - "9999:9999" # HTTP receiver para métricas externas # Puertos para logs - "3101:3101" # HTTP receiver para logs externos - "1514:1514" # Syslog TCP receiver # Puertos para trazas - OpenTelemetry - "4317:4317" # OTLP gRPC (ya expuesto en tempo, redirigido aquí) - "4318:4318" # OTLP HTTP (ya expuesto en tempo, redirigido aquí) # Puertos para trazas - Jaeger compatibility - "14250:14250" # Jaeger gRPC - "14268:14268" # Jaeger HTTP - "6831:6831/udp" # Jaeger compact thrift # Puertos para trazas - Zipkin compatibility - "9411:9411" # Zipkin HTTP volumes: - ./config/alloy/alloy.river:/etc/alloy/config.river - /var/run/docker.sock:/var/run/docker.sock:ro - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro - alloy_data:/var/lib/alloy command: - run - --server.http.listen-addr=0.0.0.0:12345 - /etc/alloy/config.river environment: - ALLOY_HOSTNAME=${ALLOY_HOSTNAME:-alloy} networks: - monitoring restart: always depends_on: - prometheus - loki - tempo # Grafana para visualización grafana: image: grafana/grafana:latest container_name: grafana ports: - "${GRAFANA_PORT:-3500}:3000" environment: - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin123} - GF_PATHS_DATA=/var/lib/grafana - GF_PATHS_LOGS=/var/log/grafana - GF_PATHS_PLUGINS=/var/lib/grafana/plugins - GF_PATHS_PROVISIONING=/etc/grafana/provisioning volumes: - ./config/grafana/provisioning:/etc/grafana/provisioning - ./config/grafana/dashboards:/var/lib/grafana/dashboards - grafana_data:/var/lib/grafana user: "472:472" networks: - monitoring restart: always depends_on: - prometheus - loki - tempo # Promtail para exportar logs de todos los contenedores hacia Alloy promtail: image: grafana/promtail:latest container_name: promtail command: -config.file=/etc/promtail/promtail-config.yml volumes: - ./config/promtail/promtail-config.yml:/etc/promtail/promtail-config.yml:ro - promtail_positions:/var/lib/promtail - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro networks: - monitoring restart: always depends_on: - alloy networks: monitoring: driver: bridge volumes: prometheus_data: loki_data: tempo_data: alloy_data: grafana_data: promtail_positions: