services: # --- MinIO --- minio: container_name: loki-minio image: minio/minio:latest entrypoint: - sh - -euc - | mkdir -p /data/loki-chunks && \ minio server /data --console-address ":9001" environment: MINIO_ROOT_USER: loki MINIO_ROOT_PASSWORD: supersecret ports: - "9000:9000" - "9001:9001" volumes: - minio-data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 10 networks: loki-net: ipv4_address: 192.168.97.10 # --- Loki Write --- loki-write: container_name: loki-write image: grafana/loki:3.4.2 hostname: loki-write command: -config.file=/etc/loki/loki-config.yaml -config.expand-env=true -target=write volumes: - ./loki-config.yaml:/etc/loki/loki-config.yaml:ro - loki-write-data:/loki depends_on: minio: condition: service_healthy networks: loki-net: ipv4_address: 192.168.97.11 # --- Loki Read --- loki-read: container_name: loki-read image: grafana/loki:3.4.2 hostname: loki-read command: -config.file=/etc/loki/loki-config.yaml -config.expand-env=true -target=read volumes: - ./loki-config.yaml:/etc/loki/loki-config.yaml:ro - loki-read-data:/loki depends_on: minio: condition: service_healthy networks: loki-net: ipv4_address: 192.168.97.12 # --- Loki Backend --- loki-backend: container_name: loki-backend image: grafana/loki:3.4.2 hostname: loki-backend command: -config.file=/etc/loki/loki-config.yaml -config.expand-env=true -target=backend volumes: - ./loki-config.yaml:/etc/loki/loki-config.yaml:ro - loki-backend-data:/loki depends_on: minio: condition: service_healthy networks: loki-net: ipv4_address: 192.168.97.13 # --- Gateway (nginx) --- gateway: container_name: loki-gateway image: nginx:1.27-alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro ports: - "3100:3100" - "3000:3000" depends_on: - loki-write - loki-read - loki-backend - grafana healthcheck: test: ["CMD-SHELL", "wget --quiet --tries=1 --output-document=- http://192.168.97.14:3100/ready | grep -q 'ready'"] interval: 10s timeout: 5s retries: 15 networks: loki-net: ipv4_address: 192.168.97.14 # --- Vector --- vector: container_name: loki-vector image: timberio/vector:0.44.0-alpine volumes: - ./vector.yaml:/etc/vector/vector.yaml:ro - /var/run/docker.sock:/var/run/docker.sock:ro depends_on: gateway: condition: service_healthy networks: loki-net: ipv4_address: 192.168.97.15 # --- Grafana --- grafana: container_name: loki-grafana image: grafana/grafana:12.4 environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: Admin volumes: - ./provisioning:/etc/grafana/provisioning:ro - grafana-data:/var/lib/grafana depends_on: loki-read: condition: service_started networks: loki-net: ipv4_address: 192.168.97.16 # --- Log Generator --- log-generator: container_name: loki-log-generator image: mingrammer/flog:0.4.3 command: -f json -d 2s -l labels: vector.collect: "true" depends_on: - vector networks: loki-net: ipv4_address: 192.168.97.17 networks: loki-net: driver: bridge ipam: config: - subnet: 192.168.97.0/24 gateway: 192.168.97.1 volumes: minio-data: loki-write-data: loki-read-data: loki-backend-data: grafana-data: