362 lines
15 KiB
YAML
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 |