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 métricas y logs alloy: image: grafana/alloy:latest container_name: alloy ports: - "${ALLOY_UI_PORT:-12345}:12345" # Puerto para la UI de Alloy - "${ALLOY_METRICS_PORT:-9999}:9999" # HTTP receiver para métricas externas - "${ALLOY_LOGS_HTTP_PORT:-3101}:3101" # HTTP receiver para logs externos 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 extra_hosts: - "host.docker.internal:host-gateway" depends_on: - prometheus - loki # 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 # # Node Exporter para métricas del host # node-exporter: # image: prom/node-exporter:latest # container_name: node-exporter # ports: # - "${NODE_EXPORTER_PORT:-9100}:9100" # command: # - '--path.rootfs=/host' # volumes: # - /proc:/host/proc:ro # - /sys:/host/sys:ro # - /:/host:ro # networks: # - monitoring # restart: always # # cAdvisor para métricas detalladas de Docker # cadvisor: # image: gcr.io/cadvisor/cadvisor:latest # container_name: cadvisor # privileged: true # ports: # - "${CADVISOR_PORT:-8081}:8080" # volumes: # - /:/rootfs:ro # - /var/run/docker.sock:/var/run/docker.sock:ro # - /sys:/sys:ro # - /var/lib/docker/:/var/lib/docker:ro # - /dev/disk/:/dev/disk:ro # networks: # - monitoring # restart: always # # 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: alloy_data: grafana_data: # tempo_data: # promtail_positions: