A fully containerized web app to monitor, manage, and view live stats/logs for all your Docker containers.
100% Docker-based | No local dependencies | Linux optimized
- 📊 Live Monitoring: Real-time CPU, RAM, Network, and Disk usage with interactive charts
- 📡 Bandwidth Tracking: Monitor total data downloaded/uploaded by each container
- 🔗 qBittorrent Integration: Accurate bandwidth tracking for VPN-bound qBittorrent containers
- ⏱️ Time Range Controls: View bandwidth stats for Last 24h, Week, Month, or All Time
- 📝 Log Streaming: View live container logs with WebSocket streaming
- 🎛️ Container Management: Start, stop, and restart containers with one click
- 🎨 Modern UI: Ultra-modern glass-morphism design with animated gradients
- 🔐 Authentication: Optional login system with bcrypt password hashing
- 🐳 Portainer Integration: Use Portainer as a gateway for multi-host support
- 📦 Fully Containerized: No Node.js, npm, or any local dependencies required
- 🐧 Linux Optimized: Designed and tested for Linux servers
Monitor all your containers at a glance with real-time stats
Detailed metrics with interactive charts and live updates
# Clone the repository
git clone https://github.com/MNDL-27/docker-dashboard.git
cd docker-dashboard
# Copy the example compose file
cp docker-compose.example.yml docker-compose.yml
# Edit docker-compose.yml if needed (optional authentication, port changes, etc.)
nano docker-compose.yml
# Build and start
docker compose up -d --buildThat's it! 🎉 Access the dashboard at http://localhost:3002
By default, authentication is disabled. To enable it:
- Set
AUTH_ENABLED=trueindocker-compose.yml - Add user credentials:
environment: - AUTH_ENABLED=true - AUTH_USER=admin - AUTH_PASSWORD=yourpassword
- Restart:
docker compose restart dashboard
For accurate bandwidth tracking of VPN-bound qBittorrent containers:
- Ensure your qBittorrent WebUI is accessible from the Dashboard container
- Add these environment variables to
docker-compose.yml:environment: - QBITTORRENT_URL=http://qbittorrent:8080 - QBITTORRENT_USERNAME=admin - QBITTORRENT_PASSWORD=adminpass
- Restart:
docker compose restart dashboard
To manage containers across multiple Docker hosts:
- Ensure you have Portainer running
- Add these environment variables:
environment: - PORTAINER_ENABLED=true - PORTAINER_URL=http://portainer:9000 - PORTAINER_API_KEY=your_api_key
- Restart:
docker compose restart dashboard
┌─────────────────────────────────────────┐
│ Docker Dashboard Container │
│ ┌─────────────────────────────────┐ │
│ │ Node.js Backend (Express) │ │
│ │ - WebSocket for live updates │ │
│ │ - Docker API integration │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ Frontend (HTML/CSS/JS) │ │
│ │ - Chart.js for visualizations │ │
│ │ - Modern glass-morphism UI │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓ Docker Socket (Mounted)
┌─────────────────────────────────────────┐
│ Host Docker Daemon │
│ (monitors all containers) │
└─────────────────────────────────────────┘
- Container Stats: Fetched via Docker API using
/var/run/docker.sock - Network Bandwidth: Calculated from container network interface stats
- qBittorrent Stats: Retrieved from qBittorrent WebUI API (if configured)
- Real-time Updates: Pushed to frontend via WebSocket every second
- 🐳 Docker with Compose V2
- 🐧 Linux host (Ubuntu, Debian, etc.)
- 💾 50MB disk space
- 🔌 Port 3002 available (or customizable)
Note: This dashboard is designed for Linux servers. Some features may not work correctly on macOS or Windows due to Docker networking differences.
Edit docker-compose.yml:
ports:
- "8080:3002" # Access at localhost:8080Bandwidth stats are stored in /app/data/bandwidth.db (SQLite). Mount a volume to persist data:
volumes:
- ./data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:roFor WebSocket support, ensure your proxy passes upgrade headers:
Nginx:
location / {
proxy_pass http://localhost:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}Caddy:
dashboard.example.com {
reverse_proxy localhost:3002
}
- Ensure
/var/run/docker.sockis mounted correctly - Check container logs:
docker compose logs dashboard
- Verify WebUI is accessible from the Dashboard container
- Test:
docker exec dashboard curl http://qbittorrent:8080 - Check credentials in environment variables
- If behind a reverse proxy, ensure WebSocket upgrade headers are passed
- Check firewall rules
docker-dashboard/
├── src/
│ ├── server.js # Main Express server
│ ├── public/ # Frontend files
│ │ ├── index.html
│ │ ├── styles.css
│ │ └── script.js
│ └── utils/
│ ├── dockerStats.js # Docker API wrapper
│ └── bandwidthDB.js # SQLite database handler
├── docker-compose.example.yml
├── Dockerfile
└── README.md
- docker-compose.example.yml - Example Docker Compose configuration
- Dockerfile - Container build instructions
- start.sh - Interactive helper script
Contributions are welcome! We'd love your help to make Docker Dashboard even better.
- 🐛 Report bugs using our bug report template
- ✨ Suggest features using our feature request template
- 💻 Submit pull requests following our PR template
- 📚 Improve documentation in the wiki or README
- Fork the repository
- Read our Contributing Guide
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
Please read CONTRIBUTING.md for detailed guidelines.
This project is licensed under the Apache 2.0 License with Commons Clause.
- ✅ Free to use for personal and educational purposes
- ✅ Open source - view, modify, and contribute to the code
- ✅ Share and redistribute with proper attribution
- ❌ Cannot be sold or offered as a commercial service
What is Commons Clause?
Commons Clause prevents companies from selling this software as a product or service without contributing back. You can use it freely, but you cannot monetize it commercially.
See LICENSE for full details.
Made with ❤️ for the Docker community