--- title: "Traefik Log Dashboard" --- This is a community guide and is not officially supported. For issues or advanced configuration, please visit the [official repository](https://github.com/hhftechnology/traefik-log-dashboard). If you’re already using the **Pangolin stack with Traefik as your reverse proxy**, you have powerful routing in place. But raw log files and scattered metrics make it difficult to truly understand traffic patterns. The **Enhanced Traefik Log Dashboard** adds **real-time monitoring, OpenTelemetry support, and geolocation analytics**, giving you a full picture of your traffic. ## Features * **OpenTelemetry OTLP Support**: Real-time traces from Traefik v3+ * **Hybrid Monitoring**: Combine OTLP traces with traditional log parsing * **Geolocation**: MaxMind GeoIP integration with automatic updates * **Analytics**: Live request rates, response times, error tracking * **Production Ready**: Resource limits, health checks, optimized GC/memory ## Prerequisites * Docker + Docker Compose * Traefik v3.0+ (for OTLP) or v2.x (logs only) * A working Pangolin stack ## Step 1: Configure Traefik ### For OTLP + Logs (Recommended) Update `./config/traefik/traefik_config.yml`: ```yaml log: level: INFO filePath: "/var/log/traefik/traefik.log" format: json accessLog: filePath: "/var/log/traefik/access.log" format: json tracing: otlp: http: endpoint: "http://log-dashboard-backend:4318/v1/traces" sampleRate: 0.1 # Adjust as needed - 0.1 for 10% sampling globalAttributes: environment: "production" service.version: "v3.0" deployment.environment: "pangolin" ``` ### For Logs Only ```yaml log: level: INFO filePath: "/var/log/traefik/traefik.log" accessLog: filePath: "/var/log/traefik/access.log" format: json ``` ## Step 2: Add Dashboard Services Extend your existing `docker-compose.yml` with: ```yaml log-dashboard-backend: image: ghcr.io/hhftechnology/traefik-log-dashboard-backend:latest container_name: log-dashboard-backend restart: unless-stopped ports: - "4317:4317" # OTLP gRPC - "4318:4318" # OTLP HTTP volumes: - ./config/traefik/logs:/logs:ro - ./config/maxmind:/maxmind:ro environment: - PORT=3001 - TRAEFIK_LOG_FILE=/logs/access.log - OTLP_ENABLED=true - OTLP_GRPC_PORT=4317 - OTLP_HTTP_PORT=4318 - USE_MAXMIND=true - MAXMIND_DB_PATH=/maxmind/GeoLite2-City.mmdb - MAXMIND_FALLBACK_ONLINE=true - GOGC=50 - GOMEMLIMIT=500MiB log-dashboard-frontend: image: ghcr.io/hhftechnology/traefik-log-dashboard-frontend:latest container_name: log-dashboard-frontend restart: unless-stopped ports: - "3000:80" environment: - BACKEND_SERVICE=log-dashboard-backend - BACKEND_PORT=3001 depends_on: - log-dashboard-backend ``` ## Step 3: Setup MaxMind GeoIP (Optional but Recommended) 1. Create a free MaxMind account → [GeoLite2 signup](https://www.maxmind.com/en/geolite2/signup) 2. Generate a license key 3. Create directory: ```bash mkdir -p ./config/maxmind export MAXMIND_LICENSE_KEY=your_key_here ``` 4. (Optional) Add updater service: ```yaml maxmind-updater: image: alpine:latest container_name: maxmind-db-updater volumes: - ./config/maxmind:/data environment: - MAXMIND_LICENSE_KEY=${MAXMIND_LICENSE_KEY} command: > sh -c " apk add --no-cache wget tar && cd /data && wget -O GeoLite2-City.tar.gz 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=$MAXMIND_LICENSE_KEY&suffix=tar.gz' && tar -xzf GeoLite2-City.tar.gz --strip-components=1 '*/GeoLite2-City.mmdb' && rm -f GeoLite2-City.tar.gz " ``` ## Step 4: Launch Stack ```bash docker compose up -d docker compose ps ``` ## Step 5: Access the Dashboard * **Frontend UI** → [http://localhost:3000](http://localhost:3000) ## Key Features * **Real-time statistics** (requests, response times, error rates) * **Interactive world map** (request origins via MaxMind) * **Service insights** (performance by router/service) * **Hybrid monitoring** (OTLP + logs together) ## Performance Tuning For production or high-traffic environments, you may want to adjust settings to optimize resource usage and throughput. ### Reduce OTLP Sampling Lower sampling to avoid overwhelming storage and dashboards: ```yaml tracing: sampleRate: 0.1 # 10% sampling in production ```` ### Prefer gRPC over HTTP For lower latency and higher throughput, enable gRPC instead of HTTP: ```yaml tracing: otlp: grpc: endpoint: "log-dashboard-backend:4317" insecure: true ``` ### Tune Backend Memory Set environment variables in `log-dashboard-backend`: ```yaml environment: - GOGC=20 # More aggressive garbage collection - GOMEMLIMIT=1GiB # Hard memory limit ``` ### Resource Limits Add CPU and memory constraints to containers: ```yaml deploy: resources: limits: cpus: "1.0" memory: 512M reservations: cpus: "0.2" memory: 128M ``` These adjustments help keep the dashboard responsive while minimizing resource overhead. ## Troubleshooting * **OTLP not showing** → Check Traefik `tracing` config + ports `4317/4318` * **Logs not loading** → Ensure Traefik logs in JSON, volume mounted correctly * **GeoIP errors** → Verify `MAXMIND_LICENSE_KEY` and DB path * **Maxmind download errors** → Check license key validity by trying url with key directly in your browser * **Docker logs for Traefik not showing** → Use `docker exec -it traefik tail -f /var/log/traefik/traefik.log` instead of `docker logs traefik -f` to see real-time logs on the command line. ---