added glance dashboard
This commit is contained in:
388
cluster/applications/the-hub/configmap.yaml
Normal file
388
cluster/applications/the-hub/configmap.yaml
Normal file
@@ -0,0 +1,388 @@
|
||||
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 — Control Plane
|
||||
cache: 1m
|
||||
sites:
|
||||
- title: space-mountain
|
||||
url: https://10.1.71.66:6443/healthz
|
||||
icon: di:kubernetes
|
||||
allow-insecure: true
|
||||
- title: big-thunder-mountain
|
||||
url: https://10.1.71.67:6443/healthz
|
||||
icon: di:kubernetes
|
||||
allow-insecure: true
|
||||
- title: splash-mountain
|
||||
url: https://10.1.71.68:6443/healthz
|
||||
icon: di:kubernetes
|
||||
allow-insecure: true
|
||||
|
||||
- type: monitor
|
||||
title: fastpass — Workers
|
||||
cache: 1m
|
||||
sites:
|
||||
- title: jungle-cruise
|
||||
url: http://10.1.71.69:10248/healthz
|
||||
icon: di:kubernetes
|
||||
- title: haunted-mansion
|
||||
url: http://10.1.71.70:10248/healthz
|
||||
icon: di:kubernetes
|
||||
- title: peter-pans-flight
|
||||
url: http://10.1.71.71:10248/healthz
|
||||
icon: di:kubernetes
|
||||
|
||||
- type: monitor
|
||||
title: magic-kingdom — Proxmox
|
||||
cache: 2m
|
||||
sites:
|
||||
- title: main-street-usa
|
||||
url: https://10.1.71.11:8006
|
||||
icon: di:proxmox
|
||||
allow-insecure: true
|
||||
- title: tomorrowland
|
||||
url: https://10.1.71.12:8006
|
||||
icon: di:proxmox
|
||||
allow-insecure: true
|
||||
- title: fantasyland
|
||||
url: https://10.1.71.13:8006
|
||||
icon: di:proxmox
|
||||
allow-insecure: true
|
||||
|
||||
- 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://10.1.71.11:8006
|
||||
icon: di:proxmox
|
||||
- title: Proxmox (tomorrowland)
|
||||
url: https://10.1.71.12:8006
|
||||
icon: di:proxmox
|
||||
- title: Proxmox (fantasyland)
|
||||
url: https://10.1.71.13: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
|
||||
allow-insecure: true
|
||||
url: https://10.1.71.11: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
|
||||
allow-insecure: true
|
||||
url: https://10.1.71.11: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
|
||||
allow-insecure: true
|
||||
url: https://10.1.71.12: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
|
||||
allow-insecure: true
|
||||
url: https://10.1.71.13: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://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 }}
|
||||
<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
|
||||
Reference in New Issue
Block a user