version: '3.8' services: # Grafana - Simple Web UI for viewing logs grafana: image: grafana/grafana:latest container_name: ${CONTAINER_NAME}_grafana environment: - GF_SECURITY_ADMIN_USER=${AUTH_USERNAME:-admin} - GF_SECURITY_ADMIN_PASSWORD=${AUTH_PASSWORD:-admin} - GF_AUTH_ANONYMOUS_ENABLED=${AUTH_USERNAME:+false} - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer - GF_INSTALL_PLUGINS= volumes: - grafana_data:/var/lib/grafana - ${CONFIG_PATH}/grafana-datasources.yml:/etc/grafana/provisioning/datasources/datasources.yaml:ro - ${CONFIG_PATH}/grafana-dashboard.yml:/etc/grafana/provisioning/dashboards/dashboard.yaml:ro - ${CONFIG_PATH}/dashboards:/var/lib/grafana/dashboards:ro ports: - "${WEB_PORT:-3000}:3000" restart: unless-stopped depends_on: - loki # Loki - Lightweight log storage (100x simpler than Elasticsearch) loki: image: grafana/loki:2.9.0 container_name: ${CONTAINER_NAME}_loki volumes: - loki_data:/loki - ${CONFIG_PATH}/loki.yaml:/etc/loki/local-config.yaml:ro ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped # Promtail - Collects all logs (Docker + System) promtail: image: grafana/promtail:2.9.0 container_name: ${CONTAINER_NAME}_promtail volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /var/log:/var/log:ro - ${CONFIG_PATH}/promtail.yaml:/etc/promtail/config.yml:ro - promtail_positions:/tmp/positions command: -config.file=/etc/promtail/config.yml restart: unless-stopped depends_on: - loki volumes: grafana_data: loki_data: promtail_positions: