688 lines
21 KiB
YAML
688 lines
21 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: full
|
|
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
|
|
|
|
- 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 */
|
|
|
|
/* --- Force wallpaper to actually show --- */
|
|
html, body {
|
|
height: 100%;
|
|
}
|
|
|
|
html {
|
|
background: url("https://web.dooplex.hu/static/wallpaper-orsi.jpg") center / cover no-repeat fixed !important;
|
|
}
|
|
|
|
/* Kill any opaque backgrounds that sit above <body> */
|
|
body,
|
|
#app,
|
|
.app,
|
|
.page,
|
|
main,
|
|
.page-content,
|
|
.layout,
|
|
.container {
|
|
background: transparent !important;
|
|
}
|
|
|
|
/* Optional: add a subtle dark veil so text stays readable */
|
|
body::before {
|
|
content: "";
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(20, 10, 30, 0.25);
|
|
pointer-events: none;
|
|
z-index: 0;
|
|
}
|
|
|
|
/* Make sure actual UI sits above the veil */
|
|
#app, .app, .page { position: relative; z-index: 1; }
|
|
|
|
|
|
/* 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 widget: rounded corners + overlay + tint --- */
|
|
.widget-type-iframe {
|
|
position: relative !important;
|
|
overflow: hidden !important;
|
|
border-radius: 12px !important;
|
|
}
|
|
|
|
/* Ensure iframe sits under the overlay */
|
|
.widget-type-iframe iframe {
|
|
position: relative !important;
|
|
z-index: 1 !important;
|
|
width: 100% !important;
|
|
border: 0 !important;
|
|
border-radius: 12px !important;
|
|
|
|
/* Stronger purple tint (closer to Homepage settings) */
|
|
filter: sepia(0.25) saturate(3) hue-rotate(250deg) brightness(1.02) !important;
|
|
}
|
|
|
|
/* The actual overlay on top of the iframe */
|
|
.widget-type-iframe::after {
|
|
content: "";
|
|
position: absolute;
|
|
inset: 0;
|
|
z-index: 2;
|
|
pointer-events: none;
|
|
border-radius: 12px;
|
|
background: rgba(226, 146, 255, 0.18);
|
|
}
|
|
|
|
/* 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;
|
|
}
|
|
|
|
/* --- Bigger header area like Homepage --- */
|
|
header, .header, .page-header, .app-header {
|
|
min-height: 140px !important;
|
|
align-items: center !important;
|
|
padding-top: 18px !important;
|
|
padding-bottom: 18px !important;
|
|
}
|
|
|
|
/* --- Bigger logo --- */
|
|
header img,
|
|
.page-header img,
|
|
.app-header img,
|
|
.branding img,
|
|
.branding-logo img,
|
|
.logo img {
|
|
max-height: 160px !important;
|
|
height: auto !important;
|
|
width: auto !important;
|
|
object-fit: contain !important;
|
|
}
|
|
|
|
header, .page-header, .app-header {
|
|
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;
|
|
}
|
|
|
|
/* 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-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 |