apiVersion: v1 kind: ConfigMap metadata: name: the-hub-config namespace: the-hub labels: app.kubernetes.io/name: the-hub app.kubernetes.io/part-of: mk-labs data: glance.yml: | # ============================================================ # the-hub — mk-labs dashboard # Managed by ArgoCD. Edit here, commit, let ArgoCD sync. # Secrets injected as env vars from the-hub-secrets (ESO/1Password) # ============================================================ server: port: 8080 proxied: true # behind ingress-nginx; use X-Forwarded-* headers branding: app-name: "mk-labs | the hub" logo-text: "MK" hide-footer: false theme: # Deep dark — feels right for a server room background-color: 220 13 10 primary-color: 213 80 60 contrast-multiplier: 1.1 # ============================================================ # PAGE 1 — OVERVIEW # The park map. One pane of glass for the whole kingdom. # ============================================================ pages: - name: Overview columns: # --- LEFT: fastpass cluster + uptime monitors --- - size: small widgets: - type: monitor title: fastpass — Cluster cache: 1m sites: # Talos locks down all node health endpoints behind mTLS. # Monitor ArgoCD and ingress-nginx as cluster health proxies instead. # Node-level health is covered by Prometheus/Grafana on cinderella-castle. - title: ArgoCD url: https://argocd.local.mk-labs.cloud/healthz icon: di:argocd - title: ingress-nginx url: https://the-hub.local.mk-labs.cloud icon: mdi:kubernetes allow-insecure: true - type: monitor title: magic-kingdom — Proxmox cache: 2m sites: - title: main-street-usa url: https://main-street-usa.local.mk-labs.cloud:8006 icon: di:proxmox - title: tomorrowland url: https://tomorrowland.local.mk-labs.cloud:8006 icon: di:proxmox - title: fantasyland url: https://fantasyland.local.mk-labs.cloud:8006 icon: di:proxmox - type: monitor title: utilidor — Storage cache: 2m sites: - title: emporium (Synology) url: https://10.1.71.9:5001 icon: di:synology allow-insecure: true - title: utilidor (FlashArray) url: https://10.1.71.28 icon: mdi:database allow-insecure: true # --- CENTER: Core services health --- - size: full widgets: - type: monitor title: Platform Services cache: 1m sites: - title: lightning-lane (Traefik) url: https://traefik.local.mk-labs.cloud/ping icon: di:traefik - title: guest-relations (Authentik) url: https://authentik.local.mk-labs.cloud/-/health/live/ icon: di:authentik - title: monorail (DNS) url: http://10.1.71.32:5380 icon: di:technitium - title: fire-station (NetBox) url: https://netbox.local.mk-labs.cloud/api/ icon: di:netbox - title: mad-tea-party (Gitea) url: https://gitea.mk-labs.cloud/-/health icon: di:gitea - title: city-hall (Control Node) url: http://10.1.71.38:8080 icon: mdi:ansible - title: imagineering (Semaphore) url: https://semaphore.local.mk-labs.cloud/api/ping icon: di:semaphore - title: tiki-room (n8n) url: https://n8n.local.mk-labs.cloud/healthz icon: di:n8n - title: cinderella-castle (Grafana) url: https://grafana.local.mk-labs.cloud/api/health icon: di:grafana - title: turnstile (step-ca) url: https://10.1.71.34:8443/health icon: mdi:certificate allow-insecure: true - title: the-grid (Nextcloud) url: https://nextcloud.local.mk-labs.cloud/status.php icon: di:nextcloud - title: timekeeper (PBS) url: https://pbs.local.mk-labs.cloud icon: di:proxmox allow-insecure: true - type: bookmarks title: Navigation groups: - title: Cluster links: - title: ArgoCD url: https://argocd.local.mk-labs.cloud icon: di:argocd - title: Grafana url: https://grafana.local.mk-labs.cloud icon: di:grafana - title: Prometheus url: https://prometheus.local.mk-labs.cloud icon: di:prometheus - title: Infrastructure links: - title: Proxmox (main-street-usa) url: https://main-street-usa.local.mk-labs.cloud:8006 icon: di:proxmox - title: Proxmox (tomorrowland) url: https://tomorrowland.local.mk-labs.cloud:8006 icon: di:proxmox - title: Proxmox (fantasyland) url: https://fantasyland.local.mk-labs.cloud:8006 icon: di:proxmox - title: NetBox url: https://netbox.local.mk-labs.cloud icon: di:netbox - title: Technitium DNS url: http://10.1.71.32:5380 icon: di:technitium - title: Apps links: - title: Gitea url: https://gitea.mk-labs.cloud icon: di:gitea - title: Semaphore url: https://semaphore.local.mk-labs.cloud icon: di:semaphore - title: n8n url: https://n8n.local.mk-labs.cloud icon: di:n8n - title: Nextcloud url: https://nextcloud.local.mk-labs.cloud icon: di:nextcloud - title: Authentik url: https://authentik.local.mk-labs.cloud icon: di:authentik # --- RIGHT: Gitea repo activity + releases --- - size: small widgets: - type: repository title: homelab repo repository: rblundon/homelab # Uses Gitea (self-hosted) — point at your instance # Once Gitea mirroring from GitHub is live, switch url here url: https://gitea.mk-labs.cloud token: ${GITEA_TOKEN} pull-requests-limit: 5 issues-limit: 5 commits-limit: 5 - type: releases title: Stack Releases cache: 6h releases: - repository: argoproj/argo-cd - repository: cilium/cilium - repository: cert-manager/cert-manager - repository: kubernetes/kubernetes - repository: glanceapp/glance - repository: talos-systems/talos - repository: traefik/traefik # ============================================================ # PAGE 2 — INFRA # Proxmox cluster stats via community custom-api widgets # ============================================================ - name: Infrastructure columns: - size: full widgets: - type: custom-api title: magic-kingdom — Cluster Overview cache: 2m url: https://main-street-usa.local.mk-labs.cloud:8006/api2/json/cluster/resources headers: Authorization: "PVEAPIToken=${PROXMOX_TOKEN}" template: | {{ $vms := 0 }}{{ $lxcs := 0 }}{{ $running := 0 }} {{ range .JSON.Array "data" }} {{ if eq (.String "type") "qemu" }}{{ $vms = add $vms 1 }}{{ end }} {{ if eq (.String "type") "lxc" }}{{ $lxcs = add $lxcs 1 }}{{ end }} {{ if eq (.String "status") "running" }}{{ $running = add $running 1 }}{{ end }} {{ end }}
{{ $vms }}
VMs
{{ $lxcs }}
LXCs
{{ $running }}
Running
# Proxmox VE node stats (community widget pattern) # One block per node — copy and adjust IP for each - type: custom-api title: main-street-usa (10.1.71.11) cache: 1m url: https://main-street-usa.local.mk-labs.cloud:8006/api2/json/nodes/main-street-usa/status headers: Authorization: "PVEAPIToken=${PROXMOX_TOKEN}" template: | {{ $cpu := mul (.JSON.Float "data.cpu") 100.0 }} {{ $memUsed := .JSON.Float "data.memory.used" }} {{ $memTotal := .JSON.Float "data.memory.total" }} {{ $memPct := mul (div $memUsed $memTotal) 100.0 }}
CPU: {{ printf "%.1f" $cpu }}%
RAM: {{ printf "%.1f" $memPct }}%
- type: custom-api title: tomorrowland (10.1.71.12) cache: 1m url: https://tomorrowland.local.mk-labs.cloud:8006/api2/json/nodes/tomorrowland/status headers: Authorization: "PVEAPIToken=${PROXMOX_TOKEN}" template: | {{ $cpu := mul (.JSON.Float "data.cpu") 100.0 }} {{ $memUsed := .JSON.Float "data.memory.used" }} {{ $memTotal := .JSON.Float "data.memory.total" }} {{ $memPct := mul (div $memUsed $memTotal) 100.0 }}
CPU: {{ printf "%.1f" $cpu }}%
RAM: {{ printf "%.1f" $memPct }}%
- type: custom-api title: fantasyland (10.1.71.13) cache: 1m url: https://fantasyland.local.mk-labs.cloud:8006/api2/json/nodes/fantasyland/status headers: Authorization: "PVEAPIToken=${PROXMOX_TOKEN}" template: | {{ $cpu := mul (.JSON.Float "data.cpu") 100.0 }} {{ $memUsed := .JSON.Float "data.memory.used" }} {{ $memTotal := .JSON.Float "data.memory.total" }} {{ $memPct := mul (div $memUsed $memTotal) 100.0 }}
CPU: {{ printf "%.1f" $cpu }}%
RAM: {{ printf "%.1f" $memPct }}%
- size: small widgets: # Proxmox Backup Server — community widget # Requires PBS_TOKEN env var (PBSAPIToken=user@pam!token=) - type: custom-api title: timekeeper (PBS) cache: 5m allow-insecure: true url: https://pbs.local.mk-labs.cloud:8007/api2/json/nodes/localhost/status headers: Authorization: "${PBS_TOKEN}" template: | {{ $cpu := mul (.JSON.Float "data.cpu") 100.0 }} {{ $memUsed := .JSON.Float "data.memory.used" }} {{ $memTotal := .JSON.Float "data.memory.total" }} {{ $memPct := mul (div $memUsed $memTotal) 100.0 }}
CPU: {{ printf "%.1f" $cpu }}%
RAM: {{ printf "%.1f" $memPct }}%
- type: iframe title: cinderella-castle — Grafana source: https://grafana.local.mk-labs.cloud/d/rYdddlPWk/node-exporter-full?orgId=1&kiosk height: 400 # ============================================================ # PAGE 3 — HOMELAB RSS # Stay current. Jarvis reads the feeds so you don't have to. # ============================================================ - name: Updates columns: - size: full widgets: - type: rss title: Homelab Community style: horizontal-cards feeds: - url: https://www.youtube.com/feeds/videos.xml?channel_id=UCZNhwA1B5YqiY1nLzmM0ZRg title: Christian Lempa - url: https://www.youtube.com/feeds/videos.xml?channel_id=UCOk-gHyjcWZNj3Br4oxwh0A title: Techno Tim - url: https://www.youtube.com/feeds/videos.xml?channel_id=UCg6gPGh8HU2U01vaFCAsvmQ title: Network Chuck - url: https://www.youtube.com/feeds/videos.xml?channel_id=UCrRQxEQyp3H2aCMYmXTMfhQ title: Jim's Garage limit: 6 collapse-after: 4 - type: releases title: Pure Storage cache: 12h releases: - repository: pure-storage/purity-fb-python-client - repository: portworx/px-backup - type: rss title: Tech / Ops News feeds: - url: https://feeds.feedburner.com/TheHackersNews title: The Hacker News - url: https://kubernetes.io/feed.xml title: Kubernetes Blog - url: https://blog.argoproj.io/feed title: Argo Blog limit: 8 collapse-after: 5