Files
homelab/cluster/applications/the-hub/configmap.yaml
2026-05-24 21:15:08 -05:00

362 lines
15 KiB
YAML

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://fire-station.local.mk-labs.cloud/api/
icon: di:netbox
- title: mad-tea-party (Gitea)
url: https://gitea.mk-labs.cloud/-/health
icon: di:gitea
- title: imagineering (Semaphore)
url: https://semaphore.local.mk-labs.cloud/api/ping
icon: di:semaphore
- title: tiki-room (n8n)
url: https://tiki-room.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://timekeeper.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://fire-station.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://tiki-room.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 }}
<div class="flex gap-4 justify-around">
<div class="text-center">
<div class="text-2xl font-bold">{{ $vms }}</div>
<div class="text-sm text-muted">VMs</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold">{{ $lxcs }}</div>
<div class="text-sm text-muted">LXCs</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-ok">{{ $running }}</div>
<div class="text-sm text-muted">Running</div>
</div>
</div>
# 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 }}
<div class="flex gap-4">
<div>CPU: <strong>{{ printf "%.1f" $cpu }}%</strong></div>
<div>RAM: <strong>{{ printf "%.1f" $memPct }}%</strong></div>
</div>
- 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 }}
<div class="flex gap-4">
<div>CPU: <strong>{{ printf "%.1f" $cpu }}%</strong></div>
<div>RAM: <strong>{{ printf "%.1f" $memPct }}%</strong></div>
</div>
- 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 }}
<div class="flex gap-4">
<div>CPU: <strong>{{ printf "%.1f" $cpu }}%</strong></div>
<div>RAM: <strong>{{ printf "%.1f" $memPct }}%</strong></div>
</div>
- size: small
widgets:
# Proxmox Backup Server — community widget
# Requires PBS_TOKEN env var (PBSAPIToken=user@pam!token=<secret>)
- type: custom-api
title: timekeeper (PBS)
cache: 5m
allow-insecure: true
url: https://timekeeper.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 }}
<div class="flex gap-4">
<div>CPU: <strong>{{ printf "%.1f" $cpu }}%</strong></div>
<div>RAM: <strong>{{ printf "%.1f" $memPct }}%</strong></div>
</div>
- 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