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: