Files
homelab-manifests/glance-system/glance-orsi.yaml
T

811 lines
26 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:
disable-picker: true
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: /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
# 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: https://web.dooplex.hu/static/white-icons/tandoor.png
- 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: https://web.dooplex.hu/static/white-icons/privatebin.png
- title: Pastes (OpenGist)
url: https://paste.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/opengist.png
- title: Zipline
url: https://zipline.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/zipline.png
# ---------- 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:
- type: to-do
title: Tasks
# 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
- url: http://www.socialpsychology.org/headlines.rss
title: socialpsychology.org
limit: 3
- url: https://youarenotsosmart.com/feed/
title: youarenotsosmart.com
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: https://web.dooplex.hu/static/white-icons/radarr.png
- title: RadarrKids
url: https://radarrkids.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/radarrkids.png
- title: Prowlarr (Indexers)
url: https://prowlarr.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/prowlarr.png
- title: Seerr (Requests)
url: https://seerr.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/seerr.png
- 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: psychology
show-thumbnails: true
- type: reddit
subreddit: psychologystudents
show-thumbnails: true
- type: reddit
subreddit: psychologytalk
show-thumbnails: true
- type: reddit
subreddit: psychologists
show-thumbnails: true
- type: reddit
subreddit: psychologyresearch
show-thumbnails: true
- type: reddit
subreddit: academicpsychology
show-thumbnails: true
- type: reddit
subreddit: social_psychology
show-thumbnails: true
- size: small
widgets:
- type: bookmarks
title: Other Apps
groups:
- links:
- title: AdventureLog
url: https://adventures.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/adventurelog.png
- title: Wanderer
url: https://wanderer.dooplex.hu
icon: sh:wanderer
- title: Plant-it
url: https://plantit.dooplex.hu
icon: si:leaflet
- title: Workout (wger)
url: https://workout.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/wger.png
- title: Fileshare
url: https://fileshare.dooplex.hu
icon: si:files
- title: Privatebin
url: https://privatebin.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/privatebin.png
- title: Pastes (OpenGist)
url: https://paste.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/opengist.png
- title: Zipline
url: https://zipline.dooplex.hu
icon: https://web.dooplex.hu/static/white-icons/zipline.png
# ==================== 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: |
/* Custom CSS for Orsi's Glance Dashboard */
/* Purple theme with background image matching Homepage */
/* ===== Wallpaper visible ===== */
html, body { height: 100%; }
html {
background: url("https://web.dooplex.hu/static/wallpaper-orsi.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; }
/* ===== Glassy widgets like Homepage ===== */
.widget {
background: rgba(45, 31, 61, 0.55) !important;
border: 1px solid rgba(255,255,255,0.08) !important;
border-radius: 10px !important;
backdrop-filter: blur(6px) !important;
-webkit-backdrop-filter: blur(6px) !important;
}
/* ===== Header + bigger logo ===== */
.header-container {
background: rgba(45, 31, 61, 0.55) !important;
backdrop-filter: blur(10px) !important;
-webkit-backdrop-filter: blur(10px) !important;
border-bottom: 1px solid rgba(255,255,255,0.08) !important;
}
.header {
min-height: 150px !important;
align-items: flex-end !important;
padding: 16px 18px !important;
}
/* This matches your DOM: <div class="logo"> <img ...> */
.logo img {
max-height: 170px !important;
height: auto !important;
width: auto !important;
object-fit: contain !important;
}
/* ===== iFrame purple tint + visible overlay ===== */
.widget.widget-type-iframe {
position: relative !important;
overflow: hidden !important;
border-radius: 12px !important;
}
.widget.widget-type-iframe iframe {
border-radius: 12px !important;
width: 100% !important;
border: 0 !important;
filter: sepia(0.25) saturate(3) hue-rotate(250deg) brightness(1.02) !important;
position: relative !important;
z-index: 1 !important;
}
/* Overlay ON TOP of iframe (you cant style inside cross-origin iframes) */
.widget.widget-type-iframe::after {
content: "";
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
border-radius: 12px;
background: rgba(226, 146, 255, 0.16);
}
/* Widget content area */
.widget-content {
background-color: transparent !important;
}
/* Header fully transparent */
.header-container,
.header,
.page-header,
.nav,
.navigation {
background-color: transparent !important;
background: transparent !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
box-shadow: none !important;
border: 0 !important;
}
/* --- Header: align tabs to bottom + larger font --- */
.header {
display: flex !important;
align-items: flex-end !important; /* bottom-align children */
gap: 18px !important;
}
/* Push the nav to the bottom edge */
.header .nav {
align-self: flex-end !important;
padding-bottom: 10px !important; /* tweak this value if you want it lower/higher */
}
/* Bigger, cleaner tab text */
.header .nav .nav-item {
font-size: 18px !important; /* increase */
line-height: 1.1 !important;
padding: 10px 14px !important; /* makes it feel less “floaty” */
letter-spacing: 0.2px !important;
}
/* Optional: make current tab underline sit nicely at the bottom */
.header .nav .nav-item-current::after,
.header .nav .nav-item[aria-current="page"]::after {
bottom: -6px !important;
}
.content-bounds,
.body-content,
.page,
#page-content {
background: transparent !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;
}
.widget-type-calendar,
.widget-type-weather,
.widget-type-to-do {
background-color: rgba(45, 31, 61, 0.55) !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;
}
/* 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);
}
/* Fix "Show more" bar background in RSS widget */
.widget-type-rss .expand-toggle-button {
background: transparent !important;
box-shadow: none !important;
border: 0 !important;
}
/* Glance often draws that ugly bar via a pseudo-element */
.widget-type-rss .expand-toggle-button::before,
.widget-type-rss .expand-toggle-button::after,
.widget-type-rss .expand-toggle-button-icon::before,
.widget-type-rss .expand-toggle-button-icon::after {
background: transparent !important;
box-shadow: none !important;
border: 0 !important;
}
/* Optional: make it feel "intentional" instead of floating */
.widget-type-rss .expand-toggle-button {
margin-top: 8px !important;
padding: 10px 12px !important;
border-top: 1px solid rgba(255,255,255,0.08) !important;
color: rgba(255,255,255,0.75) !important;
}
.widget-type-rss .expand-toggle-button:hover {
color: rgba(255,255,255,0.95) !important;
}
/* --- Force header nav to sit at the bottom (override utility classes) --- */
.header.flex {
align-items: flex-end !important;
}
/* Make the nav fill the header height and align its items to the bottom */
.header.flex > .nav.flex {
height: 100% !important;
align-items: flex-end !important;
padding-bottom: 14px !important; /* increase/decrease to taste */
}
/* Bigger tab text */
.header.flex > .nav.flex > .nav-item {
font-size: 20px !important;
line-height: 1.1 !important;
padding: 10px 14px !important;
}
/* Tabs: bottom-align text inside full-height .nav-item */
.header.flex > .nav.flex > .nav-item {
display: flex !important;
align-items: flex-end !important;
/* keep them full-height, but move the text down */
height: 100% !important;
padding: 0 14px 18px 14px !important; /* bottom padding controls “how low” */
/* kill Glance's vertical centering */
line-height: 1 !important;
font-size: 20px !important;
}
/* Expand buttons: force transparent everywhere (RSS, Reddit, etc) */
.expand-toggle-button,
.expand-toggle-button.container-expanded {
background: transparent !important;
background-color: transparent !important;
box-shadow: none !important;
border: 0 !important;
}
/* Some themes draw the bar via pseudo elements */
.expand-toggle-button::before,
.expand-toggle-button::after,
.expand-toggle-button-icon::before,
.expand-toggle-button-icon::after {
background: transparent !important;
background-color: transparent !important;
box-shadow: none !important;
}
/* If the purple comes from a wrapper around the button, kill that too */
.widget-content > button.expand-toggle-button,
.widget-content > .expand-toggle-button,
.widget-content .expand-toggle-button {
background: transparent !important;
background-color: transparent !important;
}
/* If its "sticking" to bottom and picking up background from parent */
.expand-toggle-button.container-expanded {
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
.widget.iframe-no-tint iframe {
filter: none !important;
}
.widget.iframe-no-tint::after {
content: none !important;
display: none !important;
}
---
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-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;
nginx.ingress.kubernetes.io/configuration-snippet: |
set $geo_allowed 0;
if ($remote_addr ~ "^192\.168\.") { set $geo_allowed 1; }
if ($remote_addr ~ "^10\.") { set $geo_allowed 1; }
if ($geoip2_country_code = "HU") { set $geo_allowed 1; }
if ($geo_allowed = 0) {
return 403 "Access restricted to Hungary";
}
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