services: caddy: image: caddy:latest container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile - ./caddy/data:/data - ./caddy/config:/config - ./caddy/log:/var/log/caddy networks: - monitor-net prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml networks: - monitor-net loki: image: grafana/loki:latest container_name: loki volumes: - ./loki/loki-config.yml:/etc/loki/local-config.yaml command: -config.file=/etc/loki/local-config.yaml networks: - monitor-net promtail: image: grafana/promtail:latest container_name: promtail volumes: - ./caddy/log:/var/log/caddy - ./promtail/promtail-config.yml:/etc/promtail/config.yml command: -config.file=/etc/promtail/config.yml networks: - monitor-net grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" networks: - monitor-net backend: image: caddymanager/caddymanager-backend:latest container_name: caddymanager-backend restart: unless-stopped environment: - PORT=3000 - DB_ENGINE=sqlite - SQLITE_DB_PATH=/app/data/caddymanager.sqlite - CORS_ORIGIN=* - LOG_LEVEL=debug - CADDY_SANDBOX_URL=http://caddy:2019 - PING_INTERVAL=30000 - PING_TIMEOUT=2000 - AUDIT_LOG_MAX_SIZE_MB=100 - AUDIT_LOG_RETENTION_DAYS=90 - METRICS_HISTORY_MAX=1000 - JWT_SECRET=your_jwt_secret_key_here - JWT_EXPIRATION=24h volumes: - ./caddymanager-backend/data:/app/data networks: - monitor-net frontend: image: caddymanager/caddymanager-frontend:latest container_name: caddymanager-frontend restart: unless-stopped depends_on: - backend environment: - BACKEND_HOST=backend:3000 - APP_NAME=Caddy Manager - DARK_MODE=true ports: - 9080:80 networks: - monitor-net networks: monitor-net: driver: bridge