Files
homelab-manifests/glance-system/glance.yaml
T
2026-01-10 17:20:55 +01:00

613 lines
19 KiB
YAML

# Glance Dashboard for Orsi
# Namespace: glance-system
# Domain: home.dooplex.hu
# Version: v0.8.4
#
# Features:
# - Custom background image (purple theme matching Homepage)
# - 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://home.dooplex.hu
# 3. Create Outpost: glance-home-outpost
# 4. Update auth-url annotation with actual outpost service name
---
apiVersion: v1
kind: Namespace
metadata:
name: glance-system
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
---
apiVersion: v1
kind: ConfigMap
metadata:
name: glance-config
namespace: glance-system
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
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_orsi_3.png
favicon-url: https://web.dooplex.hu/static/dooplex_favicon_orsi.png
app-name: "Orsi's Home"
app-icon-url: https://web.dooplex.hu/static/dooplex_favicon_orsi.png
app-background-color: "#2d1f3d"
hide-footer: true
theme:
background-color: 280 30 15
primary-color: 280 60 70
positive-color: 120 50 50
negative-color: 0 70 60
contrast-multiplier: 1.2
text-saturation-multiplier: 0.8
custom-css-file: /app/config/assets/custom.css
pages:
# ==================== HOME PAGE ====================
- name: Home
slug: home
width: wide
columns:
# ---------- LEFT COLUMN ----------
- size: small
widgets:
# 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:paperless-ngx
- title: Vaultwarden
url: https://vaultwarden.dooplex.hu
icon: si:bitwarden
- title: Actual Budget
url: https://actualbudget.dooplex.hu
icon: si:actual-budget
- title: Tandoor
url: https://tandoor.dooplex.hu
icon: si:tandoor-recipes
- title: Bookstack
url: https://bookstack.dooplex.hu
icon: si:bookstack
# ---------- CENTER COLUMN ----------
- size: full
widgets:
# Cal.com Booking iframe
- type: iframe
source: https://booking.dooplex.hu/bookings/upcoming
height: 350
title: Upcoming Bookings
# Google Calendar iframe
- type: iframe
source: https://calendar.google.com/calendar/embed?src=b2884faf3db792ac082a6206057552c79080716efd5f966e169a41fc500e1c1c%40group.calendar.google.com&ctz=Europe%2FBudapest
height: 400
title: Calendar
# Outline Notes iframe
- type: iframe
source: https://outline.dooplex.hu/collection/notes-VVby8kTDMn/recent
height: 500
title: Recent Notes
# ---------- RIGHT COLUMN ----------
- size: small
widgets:
# YouTube Videos
- type: videos
title: YouTube
channels:
# Practical Psychology - @practicalpsychologytips
# Channel ID found via NoxInfluencer
- UCir93b_ftqInEaDpsWYbo_g
# Add more channels here:
# - UCxxxxxxxxxxxxxx # Channel Name
limit: 6
collapse-after: 3
# RSS Feeds - Add your favorite feeds here
- type: rss
title: News & Feeds
limit: 10
collapse-after: 5
feeds:
- url: https://selfh.st/rss/
title: selfh.st
limit: 3
- url: https://www.reddit.com/r/selfhosted/.rss
title: r/selfhosted
limit: 3
# Quick Links - Entertainment
- type: bookmarks
title: Entertainment
groups:
- title: ""
links:
- title: Plex
url: https://plex.dooplex.hu
icon: si:plex
- title: Immich
url: https://photos.dooplex.hu
icon: si:immich
- title: AudioBookshelf
url: https://audiobookshelf.dooplex.hu
icon: si:audiobookshelf
- title: Calibre-Web
url: https://books.dooplex.hu
icon: si:calibre-web
- title: Arcade
url: https://arcade.dooplex.hu
icon: si:retroarch
# Quick Links - Media Management
- type: bookmarks
title: Media Management
groups:
- title: ""
links:
- title: Sonarr
url: https://sonarr.dooplex.hu
icon: si:sonarr
- title: Radarr
url: https://radarr.dooplex.hu
icon: si:radarr
- title: Seerr
url: https://seerr.dooplex.hu
icon: si:overseerr
- title: Prowlarr
url: https://prowlarr.dooplex.hu
icon: si:prowlarr
# ==================== APPLICATIONS PAGE ====================
- name: Applications
slug: apps
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:calibre-web
- 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: si:prowlarr
- title: Seerr (Requests)
url: https://seerr.dooplex.hu
icon: si:overseerr
- size: small
widgets:
- type: bookmarks
title: Productivity
groups:
- 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:paperless-ngx
- title: Bookstack
url: https://bookstack.dooplex.hu
icon: si:bookstack
- title: Actual Budget
url: https://actualbudget.dooplex.hu
icon: si:actual-budget
- title: Tandoor Recipes
url: https://tandoor.dooplex.hu
icon: si:tandoor-recipes
- title: Vaultwarden
url: https://vaultwarden.dooplex.hu
icon: si:bitwarden
- size: small
widgets:
- type: bookmarks
title: Other Apps
groups:
- links:
- title: AdventureLog
url: https://adventures.dooplex.hu
icon: si:openstreetmap
- title: Wanderer
url: https://wanderer.dooplex.hu
icon: si:openstreetmap
- title: Plant-it
url: https://plantit.dooplex.hu
icon: si:leaflet
- title: Workout (wger)
url: https://workout.dooplex.hu
icon: si:fitbit
- title: Fileshare
url: https://fileshare.dooplex.hu
icon: si:files
- title: Privatebin
url: https://privatebin.dooplex.hu
icon: si:privatebin
- title: Pastes (OpenGist)
url: https://paste.dooplex.hu
icon: si:github-gist
- title: Zipline
url: https://zipline.dooplex.hu
icon: si:imgur
custom.css: |
/* Custom CSS for Orsi's Glance Dashboard */
/* Purple theme with background image matching Homepage */
/* Background image */
body {
background-image: url('https://web.dooplex.hu/static/wallpaper-orsi.jpg') !important;
background-size: cover !important;
background-attachment: fixed !important;
background-position: center !important;
background-repeat: no-repeat !important;
}
/* Semi-transparent widgets to show background */
.widget {
background-color: rgba(45, 31, 61, 0.85) !important;
backdrop-filter: blur(12px) !important;
-webkit-backdrop-filter: blur(12px) !important;
border-radius: 12px !important;
border: 1px solid rgba(255, 255, 255, 0.1) !important;
}
/* Widget content area */
.widget-content {
background-color: transparent !important;
}
/* Page header styling */
.page-header {
background-color: rgba(45, 31, 61, 0.7) !important;
backdrop-filter: blur(10px) !important;
-webkit-backdrop-filter: blur(10px) !important;
}
/* Navigation styling */
.nav, .navigation {
background-color: rgba(45, 31, 61, 0.8) !important;
backdrop-filter: blur(10px) !important;
}
/* Column containers */
.page-column, .page-columns {
background-color: transparent !important;
}
/* Links styling - purple accent */
a {
color: #e292ff !important;
}
a:hover {
color: #f0b8ff !important;
}
/* Bookmark items */
.bookmark-link {
background-color: rgba(60, 40, 80, 0.6) !important;
border-radius: 8px !important;
transition: background-color 0.2s ease !important;
}
.bookmark-link:hover {
background-color: rgba(80, 50, 110, 0.8) !important;
}
/* Calendar widget styling */
.widget-type-calendar {
background-color: rgba(45, 31, 61, 0.9) !important;
}
/* Weather widget */
.widget-type-weather {
background-color: rgba(45, 31, 61, 0.9) !important;
}
/* To-do widget */
.widget-type-to-do {
background-color: rgba(45, 31, 61, 0.9) !important;
}
/* iFrame containers - add purple tint overlay effect */
.widget-type-iframe {
position: relative;
}
.widget-type-iframe iframe {
border-radius: 8px !important;
filter: sepia(0.15) saturate(2.5) hue-rotate(250deg) brightness(1.02) !important;
}
/* RSS feed items */
.rss-item, .feed-item {
background-color: rgba(60, 40, 80, 0.5) !important;
border-radius: 6px !important;
margin-bottom: 4px !important;
}
/* Video thumbnails */
.video-item, .videos-item {
background-color: rgba(60, 40, 80, 0.5) !important;
border-radius: 8px !important;
}
/* Widget titles */
.widget-header, .widget-title {
color: #e292ff !important;
font-weight: 600 !important;
}
/* Logo in header - make it larger */
.header-logo img, .logo img, .branding-logo img {
max-height: 120px !important;
height: auto !important;
}
/* Scrollbar styling */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: rgba(45, 31, 61, 0.5);
}
::-webkit-scrollbar-thumb {
background: rgba(226, 146, 255, 0.5);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(226, 146, 255, 0.7);
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: glance
namespace: glance-system
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
app.kubernetes.io/version: "v0.8.4"
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
template:
metadata:
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
app.kubernetes.io/version: "v0.8.4"
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- name: glance
image: glanceapp/glance:v0.8.4
imagePullPolicy: IfNotPresent
env:
- name: TZ
value: "Europe/Budapest"
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
resources:
requests:
cpu: 10m
memory: 32Mi
limits:
cpu: 200m
memory: 128Mi
volumeMounts:
- name: config
mountPath: /app/config/glance.yml
subPath: glance.yml
- name: config
mountPath: /app/config/assets/custom.css
subPath: custom.css
volumes:
- name: config
configMap:
name: glance-config
---
apiVersion: v1
kind: Service
metadata:
name: glance
namespace: glance-system
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
spec:
type: ClusterIP
ports:
- name: http
port: 8080
targetPort: http
protocol: TCP
selector:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
---
# Ingress WITH Authentik proxy authentication
# Update the auth-url annotation with your actual outpost service name after creating in Authentik
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: glance
namespace: glance-system
labels:
app.kubernetes.io/name: glance
app.kubernetes.io/instance: glance-orsi
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
external-dns.alpha.kubernetes.io/hostname: home.dooplex.hu
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
nginx.ingress.kubernetes.io/proxy-busy-buffers-size: "32k"
# Authentik Forward Auth annotations
# TODO: Update 'glance-home-outpost' with your actual outpost name after creating in Authentik
nginx.ingress.kubernetes.io/auth-url: http://ak-outpost-glance-home-outpost.auth-system.svc.cluster.local:9000/outpost.goauthentik.io/auth/nginx
nginx.ingress.kubernetes.io/auth-signin: https://home.dooplex.hu/outpost.goauthentik.io/start?rd=$escaped_request_uri
nginx.ingress.kubernetes.io/auth-response-headers: Set-Cookie,X-authentik-username,X-authentik-groups,X-authentik-email
nginx.ingress.kubernetes.io/auth-snippet: |
proxy_set_header X-Forwarded-Host $http_host;
spec:
ingressClassName: nginx-internal
rules:
- host: home.dooplex.hu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: glance
port:
number: 8080
tls:
- hosts:
- home.dooplex.hu
secretName: glance-tls
---
# Alternative Ingress WITHOUT Authentik (for testing)
# Uncomment this and comment out the above ingress if you want to test without auth first
# apiVersion: networking.k8s.io/v1
# kind: Ingress
# metadata:
# name: glance-noauth
# namespace: glance-system
# labels:
# app.kubernetes.io/name: glance
# app.kubernetes.io/instance: glance-orsi
# annotations:
# cert-manager.io/cluster-issuer: letsencrypt-prod
# external-dns.alpha.kubernetes.io/hostname: home.dooplex.hu
# nginx.ingress.kubernetes.io/ssl-redirect: "true"
# spec:
# ingressClassName: nginx-internal
# rules:
# - host: home.dooplex.hu
# http:
# paths:
# - path: /
# pathType: Prefix
# backend:
# service:
# name: glance
# port:
# number: 8080
# tls:
# - hosts:
# - home.dooplex.hu
# secretName: glance-tls