Learn by Directing AI
All materials

docker-compose.yml

ymldocker-compose.yml
# VERIFICATION: Run `docker compose up -d` and verify all services are healthy before use.
# Expected services: juice-shop, dvwa, grafana, loki, alloy
# Expected ports: 3000 (Juice Shop), 8080 (DVWA), 3001 (Grafana), 3100 (Loki)

services:
  juice-shop:
    image: bkimminich/juice-shop:v17.1.1
    container_name: todorovi-juice-shop
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=ctf
    volumes:
      - ./juice-shop/custom-config.yml:/juice-shop/config/custom.yml:ro
    networks:
      - todorovi-net
    restart: unless-stopped

  dvwa:
    image: vulnerables/web-dvwa:1.9
    container_name: todorovi-dvwa
    ports:
      - "8080:80"
    environment:
      - DVWA_DEFAULT_SECURITY_LEVEL=medium
    networks:
      - todorovi-net
    restart: unless-stopped

  grafana:
    image: grafana/grafana:11.4.0
    container_name: todorovi-grafana
    ports:
      - "3001:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
      - grafana-data:/var/lib/grafana
    networks:
      - todorovi-net
    restart: unless-stopped

  loki:
    image: grafana/loki:3.3.2
    container_name: todorovi-loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - todorovi-net
    restart: unless-stopped

  alloy:
    image: grafana/alloy:v1.5.1
    container_name: todorovi-alloy
    volumes:
      - ./alloy/config.alloy:/etc/alloy/config.alloy:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command:
      - run
      - /etc/alloy/config.alloy
    depends_on:
      - loki
    networks:
      - todorovi-net
    restart: unless-stopped

networks:
  todorovi-net:
    driver: bridge

volumes:
  grafana-data: