version: '3.8' services: # Grafana - Simple Web UI grafana: image: grafana/grafana:latest container_name: ${CONTAINER_NAME}_grafana environment: - GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin} - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-changeme} - GF_USERS_ALLOW_SIGN_UP=false 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 networks: - loki-net # Loki - Log storage (not exposed directly) loki: image: grafana/loki:latest container_name: ${CONTAINER_NAME}_loki volumes: - loki_data:/loki - ${CONFIG_PATH}/loki.yaml:/etc/loki/local-config.yaml:ro command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped networks: - loki-net # Nginx - Authentication proxy for Loki nginx: image: nginx:alpine container_name: ${CONTAINER_NAME}_nginx volumes: - ${CONFIG_PATH}/nginx.conf:/etc/nginx/nginx.conf:ro - ${CONFIG_PATH}/.htpasswd:/etc/nginx/.htpasswd:ro ports: - "${LOKI_PORT:-3100}:80" restart: unless-stopped depends_on: - loki networks: - loki-net networks: loki-net: volumes: grafana_data: loki_data: