# Glance Dashboard for Kisfenyo # Namespace: glance-system # Domain: kisfenyo.dooplex.hu # Version: v0.8.4 # # Features: # - Custom background image # - Custom logo # - Weather widget (Budapest) # - YouTube subscriptions # - RSS feeds # - To-do list # - iFrames for Cal.com, Google Calendar, Outline # - Bookmarks/Links to all apps # - Calendar widget # # Authentik Integration: # 1. Create Application: "Glance Home" # 2. Create Provider: Proxy Provider with external host https://kisfenyo.dooplex.hu # 3. Create Outpost: glance-outpost # 4. Update auth-url annotation with actual outpost service name --- apiVersion: v1 kind: ConfigMap metadata: name: glance-config-kisfenyo namespace: glance-system labels: app.kubernetes.io/name: glance-kisfenyo app.kubernetes.io/instance: glance-kisfenyo data: glance.yml: | # Glance Configuration # Documentation: https://github.com/glanceapp/glance/blob/main/docs/configuration.md server: host: 0.0.0.0 port: 8080 assets-path: /app/config/assets branding: logo-url: https://web.dooplex.hu/static/DooPlex_logo_3.png favicon-url: https://web.dooplex.hu/static/DooPlex_favicon_2.png app-name: "Kisfenyo's Home" app-icon-url: https://web.dooplex.hu/static/DooPlex_favicon_2.png app-background-color: "#132b66" hide-footer: true theme: background-color: 210 35 12 # Was: 280 30 15 (purple → blue) primary-color: 200 70 60 # Was: 280 60 70 (purple → cyan-blue) positive-color: 150 55 50 # Was: 120 50 50 (green → teal-green, matches better) negative-color: 0 70 60 # Unchanged (red) contrast-multiplier: 1.2 # Unchanged text-saturation-multiplier: 0.8 # Unchanged custom-css-file: /assets/custom.css pages: # ==================== HOME PAGE ==================== - name: Home slug: home width: wide columns: # ---------- LEFT COLUMN ---------- - size: small widgets: # Glance Custom API Widget - System Stats from Prometheus # Add this widget to your glance.yml configuration under a column's widgets section # # Prometheus URL: http://prometheus.mon-system.svc.cluster.local:9090 # # This widget displays: # - Hostname & Uptime # - CPU usage % and Temperature # - Memory usage % # - Disk usage for all mount points with progress bars # - Fan speeds # # Note: Make sure your Glance version is v0.8.0+ for all template functions - type: custom-api title: DooPlex Server cache: 30s url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_uname_info subrequests: uptime_days: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: floor((time() - node_boot_time_seconds) / 86400) uptime_hours: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: floor((time() - node_boot_time_seconds) % 86400 / 3600) cpu: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) memory: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 cpu_temp: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_hwmon_temp_celsius{instance="dooplex",chip="platform_coretemp_0",sensor="temp1"} fans: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: fan_speed_rpm{instance="dooplex"} disk_root: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) disk_root_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / 1073741824 disk_root_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/"} / 1073741824 disk_ssd2: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/ssd_2"} / node_filesystem_size_bytes{mountpoint="/mnt/ssd_2"}) disk_ssd2_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/ssd_2"} - node_filesystem_avail_bytes{mountpoint="/mnt/ssd_2"}) / 1073741824 disk_ssd2_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/ssd_2"} / 1073741824 disk_hdd1: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/1_hdd"} / node_filesystem_size_bytes{mountpoint="/mnt/1_hdd"}) disk_hdd1_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/1_hdd"} - node_filesystem_avail_bytes{mountpoint="/mnt/1_hdd"}) / 1099511627776 disk_hdd1_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/1_hdd"} / 1099511627776 disk_hdd2: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/2_hdd"} / node_filesystem_size_bytes{mountpoint="/mnt/2_hdd"}) disk_hdd2_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/2_hdd"} - node_filesystem_avail_bytes{mountpoint="/mnt/2_hdd"}) / 1099511627776 disk_hdd2_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/2_hdd"} / 1099511627776 disk_hdd3: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/3_hdd"} / node_filesystem_size_bytes{mountpoint="/mnt/3_hdd"}) disk_hdd3_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/3_hdd"} - node_filesystem_avail_bytes{mountpoint="/mnt/3_hdd"}) / 1099511627776 disk_hdd3_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/3_hdd"} / 1099511627776 disk_hdd4: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/4_hdd"} / node_filesystem_size_bytes{mountpoint="/mnt/4_hdd"}) disk_hdd4_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/4_hdd"} - node_filesystem_avail_bytes{mountpoint="/mnt/4_hdd"}) / 1099511627776 disk_hdd4_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/4_hdd"} / 1099511627776 disk_hdd5: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: 100 * (1 - node_filesystem_avail_bytes{mountpoint="/mnt/5_hdd"} / node_filesystem_size_bytes{mountpoint="/mnt/5_hdd"}) disk_hdd5_used: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: (node_filesystem_size_bytes{mountpoint="/mnt/5_hdd"} - node_filesystem_avail_bytes{mountpoint="/mnt/5_hdd"}) / 1099511627776 disk_hdd5_total: url: ${PROMETHEUS_URL}/api/v1/query parameters: query: node_filesystem_size_bytes{mountpoint="/mnt/5_hdd"} / 1099511627776 template: | {{ $hostname := .JSON.String "data.result.0.metric.nodename" }} {{ $uptimeDays := (.Subrequest "uptime_days").JSON.Float "data.result.0.value.1" }} {{ $uptimeHours := (.Subrequest "uptime_hours").JSON.Float "data.result.0.value.1" }} {{ $cpu := (.Subrequest "cpu").JSON.Float "data.result.0.value.1" }} {{ $mem := (.Subrequest "memory").JSON.Float "data.result.0.value.1" }} {{ $temp := (.Subrequest "cpu_temp").JSON.Float "data.result.0.value.1" }} {{ $fans := (.Subrequest "fans").JSON.Array "data.result" }}
Host
{{ $hostname }}
CPU
{{ printf "%.1f" $cpu }}%
Uptime
{{ printf "%.0f" $uptimeDays }}d {{ printf "%.0f" $uptimeHours }}h
Memory
{{ printf "%.1f" $mem }}%
Temp
{{ printf "%.0f" $temp }}°C
Fans (RPM)
{{ range $i, $fan := $fans }}{{ if $i }}/{{ end }}{{ $fan.Int "value.1" }}{{ end }}
Storage
{{ $rootPct := (.Subrequest "disk_root").JSON.Float "data.result.0.value.1" }} {{ $rootUsed := (.Subrequest "disk_root_used").JSON.Float "data.result.0.value.1" }} {{ $rootTotal := (.Subrequest "disk_root_total").JSON.Float "data.result.0.value.1" }}
Root
{{ printf "%.0f" $rootUsed }} / {{ printf "%.0f" $rootTotal }} GB ({{ printf "%.0f" $rootPct }}%)
{{ $ssd2Pct := (.Subrequest "disk_ssd2").JSON.Float "data.result.0.value.1" }} {{ $ssd2Used := (.Subrequest "disk_ssd2_used").JSON.Float "data.result.0.value.1" }} {{ $ssd2Total := (.Subrequest "disk_ssd2_total").JSON.Float "data.result.0.value.1" }}
SSD2
{{ printf "%.0f" $ssd2Used }} / {{ printf "%.0f" $ssd2Total }} GB ({{ printf "%.0f" $ssd2Pct }}%)
{{ $hdd1Pct := (.Subrequest "disk_hdd1").JSON.Float "data.result.0.value.1" }} {{ $hdd1Used := (.Subrequest "disk_hdd1_used").JSON.Float "data.result.0.value.1" }} {{ $hdd1Total := (.Subrequest "disk_hdd1_total").JSON.Float "data.result.0.value.1" }}
HDD1
{{ printf "%.1f" $hdd1Used }} / {{ printf "%.1f" $hdd1Total }} TB ({{ printf "%.0f" $hdd1Pct }}%)
{{ $hdd2Pct := (.Subrequest "disk_hdd2").JSON.Float "data.result.0.value.1" }} {{ $hdd2Used := (.Subrequest "disk_hdd2_used").JSON.Float "data.result.0.value.1" }} {{ $hdd2Total := (.Subrequest "disk_hdd2_total").JSON.Float "data.result.0.value.1" }}
HDD2
{{ printf "%.1f" $hdd2Used }} / {{ printf "%.1f" $hdd2Total }} TB ({{ printf "%.0f" $hdd2Pct }}%)
{{ $hdd3Pct := (.Subrequest "disk_hdd3").JSON.Float "data.result.0.value.1" }} {{ $hdd3Used := (.Subrequest "disk_hdd3_used").JSON.Float "data.result.0.value.1" }} {{ $hdd3Total := (.Subrequest "disk_hdd3_total").JSON.Float "data.result.0.value.1" }}
HDD3
{{ printf "%.1f" $hdd3Used }} / {{ printf "%.1f" $hdd3Total }} TB ({{ printf "%.0f" $hdd3Pct }}%)
{{ $hdd4Pct := (.Subrequest "disk_hdd4").JSON.Float "data.result.0.value.1" }} {{ $hdd4Used := (.Subrequest "disk_hdd4_used").JSON.Float "data.result.0.value.1" }} {{ $hdd4Total := (.Subrequest "disk_hdd4_total").JSON.Float "data.result.0.value.1" }}
HDD4
{{ printf "%.1f" $hdd4Used }} / {{ printf "%.1f" $hdd4Total }} TB ({{ printf "%.0f" $hdd4Pct }}%)
{{ $hdd5Pct := (.Subrequest "disk_hdd5").JSON.Float "data.result.0.value.1" }} {{ $hdd5Used := (.Subrequest "disk_hdd5_used").JSON.Float "data.result.0.value.1" }} {{ $hdd5Total := (.Subrequest "disk_hdd5_total").JSON.Float "data.result.0.value.1" }}
HDD5
{{ printf "%.1f" $hdd5Used }} / {{ printf "%.1f" $hdd5Total }} TB ({{ printf "%.0f" $hdd5Pct }}%)
# Weather Widget - type: weather location: Budapest, Hungary units: metric hour-format: 24h # Calendar Widget - type: calendar first-day-of-week: monday # To-Do List - type: to-do title: Tasks # Quick Links - Productivity - type: bookmarks title: Productivity groups: - title: "" links: - title: Nextcloud url: https://nextcloud.dooplex.hu icon: si:nextcloud - title: Outline url: https://outline.dooplex.hu icon: si:outline - title: Paperless url: https://paperless.dooplex.hu icon: si:paperlessngx - title: Vaultwarden url: https://vaultwarden.dooplex.hu icon: si:bitwarden - title: Actual Budget url: https://actualbudget.dooplex.hu icon: si:actualbudget - title: Tandoor url: https://tandoor.dooplex.hu icon: sh:tandoor-recipes - title: Bookstack url: https://bookstack.dooplex.hu icon: si:bookstack # Quick Links - File Sharing - type: bookmarks title: File Sharing groups: - title: "" links: - title: Fileshare url: https://fileshare.dooplex.hu icon: si:files - title: Privatebin url: https://privatebin.dooplex.hu icon: sh:privatebin - title: Pastes (OpenGist) url: https://paste.dooplex.hu icon: sh:opengist - title: Zipline url: https://zipline.dooplex.hu icon: sh:zipline # ---------- CENTER COLUMN ---------- - size: full widgets: # Outline Notes iframe - type: iframe source: https://outline.dooplex.hu/collection/notes-VVby8kTDMn/recent height: 500 title: Recent Notes # ---------- RIGHT COLUMN ---------- - size: small widgets: # RSS Feeds - Add your favorite feeds here - type: rss title: News & Feeds limit: 15 collapse-after: 8 feeds: - url: https://telex.hu/rss title: telex.hu limit: 3 - url: https://444.hu/feed title: 444.hu limit: 3 - url: https://444.hu/feed title: 444.hu limit: 3 - url: https://hvg.hu/rss title: hvg.hu limit: 3 # ==================== MEDIA PAGE ==================== - name: Media slug: media width: wide columns: - size: small widgets: - type: bookmarks title: Entertainment groups: - links: - title: Plex url: https://plex.dooplex.hu icon: si:plex - title: Immich (Photos) url: https://photos.dooplex.hu icon: si:immich - title: AudioBookshelf url: https://audiobookshelf.dooplex.hu icon: si:audiobookshelf - title: Calibre-Web (eBooks) url: https://books.dooplex.hu icon: si:calibreweb - title: Arcade (Retro Games) url: https://arcade.dooplex.hu icon: si:retroarch - type: bookmarks title: Media Management groups: - links: - title: Sonarr (TV Shows) url: https://sonarr.dooplex.hu icon: si:sonarr - title: Radarr (Movies) url: https://radarr.dooplex.hu icon: si:radarr - title: RadarrKids url: https://radarrkids.dooplex.hu icon: si:radarr - title: Prowlarr (Indexers) url: https://prowlarr.dooplex.hu icon: sh:prowlarr - title: Seerr (Requests) url: https://seerr.dooplex.hu icon: sh:overseerr - size: full widgets: # YouTube Videos - type: videos title: YouTube channels: - UCir93b_ftqInEaDpsWYbo_g #Practical Psychology - @practicalpsychologytips - UCEwsbtepqts935wXykReKxg #CounsellingTutor - @Counsellingtutor1 - UCUdettijNYvLAm4AixZv4RA #SciShow Psych - @SciShowPsych - UClHVl2N3jPEbkNJVx-ItQIQ #HealthyGamerGG - @HealthyGamerGG - UCAvfZQ3r24F-V1JYqn2pfXg #The Psychology Podcast - @ThePsychologyPodcast - UC6Unpcb3T4QijIBs8hPfeyA #Psych Explained - @PsychExplained - UCl8TEoIOnMq_5ntJOYMq-Zg #DrJulie - @DrJulie limit: 12 collapse-after: 6 # Reddit - type: group title: Reddit widgets: - type: reddit subreddit: hungary show-thumbnails: true - type: reddit subreddit: selfhosted show-thumbnails: true - type: reddit subreddit: homeserver show-thumbnails: true - type: reddit subreddit: homelab show-thumbnails: true - type: reddit subreddit: kubernetes show-thumbnails: true - type: reddit subreddit: linux show-thumbnails: true - type: reddit subreddit: sysadmin show-thumbnails: true - type: reddit subreddit: technology show-thumbnails: true - type: reddit subreddit: futurology show-thumbnails: true - size: small widgets: - type: bookmarks title: Other Apps groups: - links: - title: AdventureLog url: https://adventures.dooplex.hu icon: sh:adventurelog - title: Wanderer url: https://wanderer.dooplex.hu icon: sh:wanderer - title: Plant-it url: https://plantit.dooplex.hu icon: sh:plant-it - title: Workout (wger) url: https://workout.dooplex.hu icon: sh:wger - title: Fileshare url: https://fileshare.dooplex.hu icon: si:files - title: Privatebin url: https://privatebin.dooplex.hu icon: sh:privatebin - title: Pastes (OpenGist) url: https://paste.dooplex.hu icon: sh:opengist - title: Zipline url: https://zipline.dooplex.hu icon: sh:zipline # ==================== NECTCLOUD PAGE ==================== - name: NextCloud slug: nextcloud width: wide columns: - size: full widgets: # Nextcloud iframe - type: iframe css-class: iframe-no-tint source: https://nextcloud.dooplex.hu/apps/files/files height: 1200 title: NextCloud custom.css: | /* ========================================================================= WALLPAPER VISIBLE ========================================================================= */ html, body { height: 100%; } html { background: url("https://web.dooplex.hu/static/wallpaper-2.jpg") center / cover no-repeat fixed !important; } /* Glance containers that tend to paint over the wallpaper */ body, .page, #page-content, .page-content, .content-bounds, .page-columns, .page-column { background: transparent !important; } /* Optional readability veil (Homepage-like) */ body::before { content: ""; position: fixed; inset: 0; background: rgba(20, 10, 30, 0.25); pointer-events: none; z-index: 0; } body > * { position: relative; z-index: 1; } /* ========================================================================= ROOT VARIABLES OVERRIDE These override Glance's default theme colors at the CSS variable level ========================================================================= */ :root { /* Primary color - affects many built-in elements */ --color-primary: hsl(190, 70%, 60%) !important; /* These control various UI elements */ --color-text-highlight: #5ac8d8 !important; --color-text-accent: #5ac8d8 !important; } /* ========================================================================= GLOBAL LINK COLORS Affects all tags site-wide (bookmarks, reddit links, video titles, etc.) ========================================================================= */ a { color: #5ac8d8 !important; /* CYAN - main link color */ } a:hover { color: #7ed9e6 !important; /* LIGHTER CYAN - hover state */ } /* Visited links - slightly muted */ a:visited { color: #4ab8c8 !important; /* SLIGHTLY DARKER CYAN */ } /* ========================================================================= HEADER / NAVIGATION The top bar with Home, Media, NextCloud tabs ========================================================================= */ /* Push nav items to bottom of header and align properly */ .header.flex { align-items: flex-end !important; } .header.flex > .nav.flex { height: 100% !important; align-items: flex-end !important; padding-bottom: 0 !important; /* Remove extra padding */ } /* Nav item text styling */ .header .nav .nav-item, .header.flex > .nav.flex > .nav-item { color: #5ac8d8 !important; /* CYAN - nav text color */ font-size: 20px !important; line-height: 1 !important; padding: 8px 14px 12px 14px !important; /* top right bottom left */ letter-spacing: 0.3px !important; text-transform: uppercase !important; font-weight: 500 !important; display: flex !important; align-items: flex-end !important; height: auto !important; /* Let it size naturally */ } /* Nav item hover */ .header .nav .nav-item:hover { color: #7ed9e6 !important; /* LIGHTER CYAN on hover */ } /* Active tab underline - position closer to text */ .header .nav .nav-item-current::after, .header .nav .nav-item[aria-current="page"]::after { bottom: 4px !important; /* Closer to text */ background-color: #5ac8d8 !important; /* CYAN underline */ } .header { min-height: 80px !important; align-items: flex-end !important; } /* This matches your DOM: