Baseline Setup, Part 5 – Service Visibility with Homepage
See how I deployed Homepage in Kubernetes to create a clean, fast, and live dashboard for my homelab. From grouped services to container health, it’s my daily launchpad.
At this point in the rebuild, the core is online:
- The cluster is stable
- Routing is automated
- Auth is centralized
Now I need a place to see it all—and launch what I need fast. That’s where Homepage comes in.
I’ve used dashboards before (Heimdall, Dashy, Organizr), but Homepage hits the sweet spot: it’s fast, modern, readable, and integrates with my stack without extra hacks. This post walks through how I deployed it in Kubernetes, configured it with live service data, and structured it for my daily use.
🧠 Why Homepage?
Because I wanted:
- A single-pane-of-glass for my services
- Live container and uptime stats
- Clean, readable UI (that didn’t feel like 2010)
- Easy YAML-based config I can version control
It doesn’t try to be a login portal or media manager. It’s just a great dashboard. And that’s what I needed.
🚀 How I Deployed It
I’m running Homepage in its own namespace in Kubernetes (homepage
) with a pretty standard manifest:
apiVersion: apps/v1
kind: Deployment
metadata:
name: homepage
namespace: homepage
spec:
replicas: 1
selector:
matchLabels:
app: homepage
template:
metadata:
labels:
app: homepage
spec:
containers:
- name: homepage
image: ghcr.io/gethomepage/homepage:latest
volumeMounts:
- mountPath: /app/config
name: config
volumes:
- name: config
configMap:
name: homepage-config
I manage the YAML files (services.yaml
, bookmarks.yaml
, etc.) via ConfigMap, all generated from a /config
folder and applied via Kustomize + kubectl.
🧭 What It Shows Me
My Homepage dashboard includes:
- Grouped service tiles (infra, media, dev, etc.)
- Container uptime, CPU, and RAM
- Service health checks (using the built-in ping)
- Quick bookmarks (both internal and external)
- Uptime Kuma and system stats widgets
It’s basically my new tab homepage now.
🛠️ Example services.yaml Snippet
- name: Authentik
icon: authentik.png
url: https://auth.petieclark.com
description: SSO login and identity provider
widget:
type: authentik
url: http://authentik:9000
username: admin
password: yourpassword
I also use widgets for Portainer, Traefik, and my NAS, all using local network connections since they're inside the cluster.
🔐 Protected with Authentik
The Homepage route is protected via Authentik reverse proxy using Traefik middleware (just like I covered in Part 4). That way, only users in the admin
or family
group can access the dashboard.
🧠 Lessons Learned
- Use the
configMap
method if you're comfortable with K8s—it keeps your YAML tidy and portable - Homepage is fast—even with dozens of tiles and live widgets
- Traefik + Authentik + Homepage makes for a secure, useful, beautiful control surface
- YAML isn’t scary when it’s this clean
🔜 Final Wrap-Up
The core of the homelab is up, visible, and secured. In the next and final post of the Baseline Setup series, I’ll share how I use Ansible and Git to keep this whole thing repeatable—so the next time I tear it all down, I’m back online in minutes.