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.

Baseline Setup, Part 5 – Service Visibility with Homepage
Photo by Scott Webb / Unsplash

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.