Why a Self-Hosted Dashboard Belongs in Every Homelab
As your homelab grows, so does the list of services you manage. Traefik routes traffic, Portainer manages containers, Grafana visualizes metrics, Pi-hole filters DNS — each with its own URL, port, and login page. A self-hosted dashboard gives you a single entry point to launch any service, see which containers are healthy, and monitor system resources at a glance.
Homepage is the most polished option in this space. It is a lightweight, YAML-driven dashboard that integrates directly with Docker containers, exposes real-time system stats, and provides API widgets for services like Traefik, Pi-hole, Prometheus, Proxmox, and Uptime Kuma. Unlike heavier solutions like Homer or Heimdall, Homepage requires no database and no complex backend — just a Docker container and a few YAML files.
What you will end up with:
- A single dashboard at
http://homelab:3000or via your reverse proxy - Auto-discovered Docker containers with live status, CPU, and memory
- System resource widgets (CPU, memory, disk, uptime)
- Service-specific API widgets for Traefik, Pi-hole, Uptime Kuma, and Proxmox
- A clean, customizable interface with bookmarks and search
Prerequisites
- Docker and Docker Compose v2 installed on any Linux host
- A working reverse proxy (Traefik or Nginx) if you want TLS and a clean domain
- Port 3000 available on the host (or change it in compose)
- Docker socket access for container discovery
Deploying Homepage with Docker Compose
Homepage runs as a single container with no external dependencies. The Docker Compose deployment is straightforward:
|
|
Create the project directory and start the container:
|
|
Open http://your-host:3000. You will see a blank page — Homepage ships with no configuration by default. The config directory is empty until you populate it.
Adding a Traefik Reverse Proxy
If you run Traefik, add labels for automatic TLS and routing:
|
|
Security note: Mounting the Docker socket (
/var/run/docker.sock) gives Homepage access to control Docker. This is required for automatic container discovery. If you prefer to avoid the socket mount, you can manually define services inservices.yamlwithout Docker stats.
Configuration Structure
Homepage reads its configuration from three YAML files in the config directory. You can start with just services.yaml and bookmarks.yaml and add more as needed:
~/docker/homepage/config/
├── services.yaml # Service groups and links
├── bookmarks.yaml # Quick-access bookmarks
├── widgets.yaml # Widget configuration for API integrations
├── docker.yaml # Docker container overrides
├── settings.yaml # Layout, theme, and general settings
└── custom.css # Theme overrides
After adding or modifying any config file, restart the container:
|
|
Homepage reloads configuration on restart only — there is no hot-reload.
Services Configuration with Docker Integration
The services.yaml file defines how services are grouped and displayed. Combined with the Docker socket mount, Homepage automatically shows the health status and resource usage of each container.
Manual Service Groups
Create config/services.yaml:
|
|
Key fields:
- icon: Homepage ships with 200+ built-in icons — just use the service name
- container: Links the service to a Docker container name; Homepage uses the socket to show status, CPU, and memory
- ping: Homepage periodically checks the URL and shows a green/red dot status indicator
- description: Shown beneath the service name
Docker Auto-Discovery with docker.yaml
Without any configuration, Homepage can auto-discover all running containers if the Docker socket is mounted. By default, it creates a group called “Docker” with every container listed. To control what appears and in which group, create config/docker.yaml:
|
|
This creates a server group named “my-docker-host” with only the listed containers. Each container shows its status, CPU usage, and memory consumption pulled from the Docker API.
Docker Labels for Customization
You can override Homepage display settings by adding labels to your Docker compose files:
|
|
This approach keeps everything in the container’s own configuration — Homepage picks it up from Docker labels automatically.
System Monitoring Widgets
The widgets.yaml file adds panels to the top of the dashboard showing real-time system information. Homepage supports several built-in widgets:
Resources Widget
|
|
This widget displays CPU usage, memory usage, root disk usage, and system uptime for the host running Homepage.
Docker Engine Widget
|
|
Shows total container count, running count, and a quick health summary.
Search Widget
|
|
For a privacy-respecting homelab, point it at your own SearXNG instance:
|
|
Clock and Greeting
|
|
Or with the date:
|
|
All widgets in one widgets.yaml:
|
|
Service-Specific API Widgets
Homepage’s real power is in API widgets — live data pulled directly from your services’ APIs and rendered as panel cards.
Traefik Widget
Enable the Traefik API endpoint first:
|
|
Then in widgets.yaml:
|
|
If Traefik is behind authentication, you can pass the credentials as the key. Check the Traefik widget docs for exact authentication methods.
Pi-hole Widget
Requires the Pi-hole API token. Find it in Pi-hole’s Settings → API/Web Interface → “Show API Token”.
|
|
Shows total queries blocked today, percentage blocked, and query count.
Uptime Kuma Widget
Uptime Kuma exposes a status page API by default. Enable the status page in Uptime Kuma settings, then:
|
|
The widget shows a green/red indicator for each monitored endpoint.
Proxmox Widget
Requires an API token with read permissions. Create one in Proxmox at Datacenter → Permissions → API Tokens:
|
|
Shows node status, memory usage, CPU load, and running VM/LXC counts.
Bookmark Organization
Bookmarks are grouped links for quick access. Create config/bookmarks.yaml:
|
|
Bookmarks appear in a collapsible sidebar on the dashboard.
Theming and Customization
Homepage supports full visual customization through settings.yaml and custom.css.
Layout and Layout Settings
Create config/settings.yaml:
|
|
Custom CSS
Add config/custom.css with your own style overrides:
|
|
Common customizations include accent colors, card border radius, and header opacity. See the Homepage theming guide for the full variable list.
Advanced: Custom API Widgets
If a service isn’t in Homepage’s built-in widget list, you can build a custom widget that fetches from any JSON API.
|
|
Use jsonpath to extract a specific field from the JSON response. This works with any HTTP endpoint that returns JSON — NUT UPS status, TrueNAS API, or a custom script.
Troubleshooting Common Issues
Empty Dashboard After Deployment
Homepage starts with a blank page until you create config files. Create at least services.yaml with a service group and restart the container.
Docker Socket Permission Denied
Permission denied on /var/run/docker.sock
The PUID/PGID in the container must match a user that belongs to the docker group on the host. Verify:
|
|
Then set PUID=$(id -u youruser) and PGID=$(getent group docker | cut -d: -f3).
Containers Not Appearing
If Docker auto-discovery isn’t showing containers:
- Verify the socket is mounted correctly:
docker exec homepage ls -l /var/run/docker.sockshould show the socket - Check
docker.yamlis loading the correct host (defaults to127.0.0.1) - Ensure containers are running:
docker ps --all
Widget Not Showing Data
API widgets fail silently if the endpoint is unreachable or authentication is wrong. Check the Homepage container logs:
|
|
Common causes:
- Wrong URL or port (containers behind a Docker network need the internal URL, not the public one)
- Missing or expired API token
- Self-signed TLS certificate causing connection errors
Putting It All Together
A self-hosted dashboard transforms a scattered collection of services into a unified homelab experience. Homepage delivers this with minimal overhead — a single container, three YAML files, and optional API integrations give you a polished, responsive interface that works on desktop and mobile.
Key takeaways:
- Start with the basic compose file and add service groups one at a time
- Mount the Docker socket for automatic container health, CPU, and memory display
- Add API widgets for Traefik, Pi-hole, and Uptime Kuma as high-value integrations
- Use
docker.yamlto filter which containers appear instead of showing everything - Customize the theme through
settings.yamland optionalcustom.css - Test changes with
docker compose restart— no database or rebuild needed
Your dashboard will become the first page you open every time you check on the homelab. Start with the basics, then layer on widgets and integrations as your infrastructure grows.