--- apiVersion: v1 kind: ConfigMap metadata: name: homepage-orsi-config namespace: homepage-system labels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi data: # Kubernetes connection configuration kubernetes.yaml: | mode: cluster ingress: false # Global settings settings.yaml: | title: Orsi's Home favicon: https://web.dooplex.hu/static/dooplex_favicon_orsi.png background: https://web.dooplex.hu/static/wallpaper-orsi.jpg cardBlur: sm useEqualHeights: true disableIndexing: true headerStyle: clean quicklaunch: searchDescriptions: true hideInternetSearch: true showSearchSuggestions: false hideVisitURL: true provider: google layout: Entertainment: tab: Applications style: row columns: 3 Scheduling: header: false tab: Productivity style: row columns: 2 Notes: header: false tab: Productivity style: row columns: 1 Productivity: header: false tab: Productivity style: row columns: 3 Other: tab: Applications style: row columns: 3 providers: longhorn: url: http://192.168.0.209 # Services configuration - customize as needed services.yaml: | - Entertainment: - Arcade: icon: romm.png href: https://arcade.dooplex.hu description: Retro Games widget: type: romm url: http://romm.arcade-system.svc.cluster.local:8080 - AudioBookshelf: icon: audiobookshelf.png href: https://audiobookshelf.dooplex.hu description: AudioBooks widget: type: audiobookshelf url: http://audiobookshelf.audiobookshelf-system.svc.cluster.local key: "{{HOMEPAGE_VAR_AUDIOBOOKSHELF_API_KEY}}" - Calibre-Web: icon: calibre-web.png href: https://books.dooplex.hu description: eBooks widget: type: calibreweb url: http://calibre-web.calibre-system.svc.cluster.local:8083 username: "{{HOMEPAGE_VAR_CALIBREWEB_USER}}" password: "{{HOMEPAGE_VAR_CALIBREWEB_PASS}}" - Immich: icon: immich.png href: https://photos.dooplex.hu description: Photos widget: type: immich url: http://immich-server.immich-system.svc.cluster.local:2283 key: "{{HOMEPAGE_VAR_IMMICH_API_KEY}}" version: 2 - Sonarr: icon: sonarr.png href: https://sonarr.dooplex.hu description: TV Shows widget: type: sonarr url: http://sonarr.servarr-system.svc.cluster.local:8989 key: "{{HOMEPAGE_VAR_SONARR_API_KEY}}" - Radarr: icon: radarr.png href: https://radarr.dooplex.hu description: Movies widget: type: radarr url: http://radarr.servarr-system.svc.cluster.local:7878 key: "{{HOMEPAGE_VAR_RADARR_API_KEY}}" - RadarrKids: icon: https://nextcloud.dooplex.hu/s/E3LB8dJTTpyDSge/download href: https://radarrkids.dooplex.hu description: Kids Movies widget: type: radarr url: http://radarrkids.servarr-system.svc.cluster.local:7879 key: "{{HOMEPAGE_VAR_RADARRKIDS_API_KEY}}" - Prowlarr: icon: prowlarr.png href: https://prowlarr.dooplex.hu description: Indexer Manager widget: type: prowlarr url: http://prowlarr.servarr-system.svc.cluster.local:9696 key: "{{HOMEPAGE_VAR_PROWLARR_API_KEY}}" - Seerr: icon: overseerr.png href: https://seerr.dooplex.hu description: Movie, TV Show Request widget: type: overseerr url: http://seerr.servarr-system.svc.cluster.local:5055 key: "{{HOMEPAGE_VAR_SEERR_API_KEY}}" - Plex: icon: plex.png href: https://plex.dooplex.hu description: Media Server - Scheduling: - "": widget: type: iframe src: https://booking.dooplex.hu/bookings/upcoming classes: calcom-iframe - "": widget: type: iframe src: https://calendar.google.com/calendar/embed?src=b2884faf3db792ac082a6206057552c79080716efd5f966e169a41fc500e1c1c%40group.calendar.google.com&ctz=Europe%2FBudapest classes: calendar-iframe - Notes: - "": widget: type: iframe src: https://outline.dooplex.hu/collection/notes-VVby8kTDMn/recent classes: outline-iframe - Productivity: - ActialBudget: icon: actual-budget.png href: https://actualbudget.dooplex.hu description: Finance Manager - Bookstack: icon: bookstack.png href: https://bookstack.dooplex.hu description: Documentation, Wiki - Nextcloud: icon: nextcloud.png href: https://nextcloud.dooplex.hu description: Cloud Storage - Outline: icon: outline.png href: https://outline.dooplex.hu description: Team Wiki, Documentation - Paperless: icon: paperless-ngx.png href: https://paperless.dooplex.hu description: Document Management - Tandoor: icon: tandoor-recipes.png href: https://tandoor.dooplex.hu description: Recipe Manager widget: type: tandoor url: http://tandoor.tandoor-system.svc.cluster.local:8080 key: "{{HOMEPAGE_VAR_TANDOOR_API_KEY}}" - Vaultwarden: icon: bitwarden.png href: https://vaultwarden.dooplex.hu description: Password Manager - Other: - Adventurelog: icon: adventure-log.png href: https://adventures.dooplex.hu description: Documenting Travels - Fileshare: icon: https://nextcloud.dooplex.hu/s/89PfscLdHoykWrZ/download href: https://fileshare.dooplex.hu description: Drag&Drop Fileshare - Pastes: icon: opengist.png href: https://paste.dooplex.hu description: Pastes (opengist) - Privatebin: icon: privatebin.png href: https://privatebin.dooplex.hu description: Pastebin (secure) - Plantit: icon: plant-it.png href: https://plantit.dooplex.hu description: Gardening companion - Wanderer: icon: wanderer.png href: https://wanderer.dooplex.hu description: Trail database - Workout: icon: wger.png href: https://workout.dooplex.hu description: Workout and fitness manager - Zipline: icon: zipline-diced.png href: https://zipline.dooplex.hu description: Image and file sharing # Widgets configuration widgets.yaml: | - logo: icon: "https://web.dooplex.hu/static/dooplex_logo_orsi_3.png" - openmeteo: label: Budapest latitude: 47.503012 longitude: 19.088314 timezone: Europe/Budapest units: metric cache: 5 - datetime: text_size: l format: dateStyle: long timeStyle: short hour12: false # Bookmarks bookmarks.yaml: | - Developer: - GitHub: - abbr: GH href: https://github.com icon: github.png - Gitea: - abbr: GT href: https://gitea.dooplex.hu icon: gitea.png - Documentation: - Kubernetes: - abbr: K8s href: https://kubernetes.io/docs icon: kubernetes.png - ArgoCD: - abbr: Argo href: https://argo-cd.readthedocs.io icon: argo-cd.png # Docker settings (not used in k8s mode) docker.yaml: "" # Custom CSS custom.css: | /* Reduce top padding on the information widgets bar */ #information-widgets { padding-top: 0.25rem !important; margin-top: 0 !important; } /* Make the logo widget container bigger */ #information-widgets .information-widget-logo { min-height: 185px !important; display: flex !important; align-items: center !important; } /* Make the image fill it */ #information-widgets .information-widget-logo img { max-height: 185px !important; height: 185px !important; width: auto !important; object-fit: contain !important; } /* Iframe container sizing */ .calcom-iframe, .calendar-iframe { height: 600px !important; } .outline-iframe { height: 1000px !important; } /* Purple filter on iframes */ iframe[src*="calendar.google.com"], iframe[src*="outline.dooplex.hu"], iframe[src*="booking.dooplex.hu"] { filter: sepia(0.25) saturate(3) hue-rotate(250deg) brightness(1.02) !important; border-radius: 8px !important; } # Custom JS custom.js: | // Wait for page to fully load, then add purple overlay to calendar iframes function addCalendarOverlays() { document.querySelectorAll('iframe[src*="calendar.google.com"], iframe[src*="booking.dooplex.hu"], iframe[src*="outline.dooplex.hu"]').forEach(function(iframe) { // Skip if overlay already exists if (iframe.parentElement.querySelector('.calendar-overlay')) return; // Create overlay div var overlay = document.createElement('div'); overlay.className = 'calendar-overlay'; overlay.style.cssText = 'position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(226,146,255,0.18);pointer-events:none;z-index:10;border-radius:8px;'; // Ensure parent is positioned iframe.parentElement.style.position = 'relative'; // Add overlay iframe.parentElement.appendChild(overlay); }); } // Run on load and periodically (in case of dynamic content) if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', addCalendarOverlays); } else { addCalendarOverlays(); } // Also run after a short delay to catch late-loading iframes setTimeout(addCalendarOverlays, 1000); setTimeout(addCalendarOverlays, 3000); --- apiVersion: apps/v1 kind: Deployment metadata: annotations: reloader.stakater.com/auto: "true" name: homepage-orsi namespace: homepage-system labels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi app.kubernetes.io/version: "v1.10.1" spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi template: metadata: labels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi app.kubernetes.io/version: "v1.10.1" spec: serviceAccountName: homepage automountServiceAccountToken: true dnsPolicy: ClusterFirst enableServiceLinks: true containers: - name: homepage image: ghcr.io/gethomepage/homepage:v1.10.1 imagePullPolicy: IfNotPresent env: # Required for external access - name: HOMEPAGE_ALLOWED_HOSTS value: "*" # Timezone - name: TZ value: "Europe/Budapest" # Optional: Widget API keys (create secret with these if needed) - name: HOMEPAGE_VAR_TANDOOR_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: tandoor-api-key - name: HOMEPAGE_VAR_PROWLARR_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: prowlarr-api-key - name: HOMEPAGE_VAR_SONARR_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: sonarr-api-key - name: HOMEPAGE_VAR_RADARR_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: radarr-api-key - name: HOMEPAGE_VAR_RADARRKIDS_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: radarrkids-api-key - name: HOMEPAGE_VAR_SEERR_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: seerr-api-key - name: HOMEPAGE_VAR_IMMICH_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: immich-api-key - name: HOMEPAGE_VAR_AUDIOBOOKSHELF_API_KEY valueFrom: secretKeyRef: name: homepage-secrets key: audiobookshelf-api-key - name: HOMEPAGE_VAR_CALIBREWEB_USER valueFrom: secretKeyRef: name: homepage-secrets key: calibreweb-user - name: HOMEPAGE_VAR_CALIBREWEB_PASS valueFrom: secretKeyRef: name: homepage-secrets key: calibreweb-pass ports: - name: http containerPort: 3000 protocol: TCP livenessProbe: httpGet: path: /api/healthcheck port: http initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: /api/healthcheck port: http initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 resources: requests: cpu: 50m memory: 128Mi limits: cpu: 500m memory: 512Mi volumeMounts: - name: config mountPath: /app/config/kubernetes.yaml subPath: kubernetes.yaml - name: config mountPath: /app/config/settings.yaml subPath: settings.yaml - name: config mountPath: /app/config/services.yaml subPath: services.yaml - name: config mountPath: /app/config/widgets.yaml subPath: widgets.yaml - name: config mountPath: /app/config/bookmarks.yaml subPath: bookmarks.yaml - name: config mountPath: /app/config/docker.yaml subPath: docker.yaml - name: config mountPath: /app/config/custom.css subPath: custom.css - name: config mountPath: /app/config/custom.js subPath: custom.js volumes: - name: config configMap: name: homepage-orsi-config --- apiVersion: v1 kind: Service metadata: name: homepage-orsi namespace: homepage-system labels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi spec: type: ClusterIP ports: - name: http port: 3000 targetPort: http protocol: TCP selector: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: homepage-orsi namespace: homepage-system labels: app.kubernetes.io/name: homepage-orsi app.kubernetes.io/instance: homepage-orsi annotations: cert-manager.io/cluster-issuer: letsencrypt-prod external-dns.alpha.kubernetes.io/hostname: orsihome.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 # Update 'homepage-outpost' with your actual outpost name nginx.ingress.kubernetes.io/auth-url: http://ak-outpost-homepage-orsi-outpost.auth-system.svc.cluster.local:9000/outpost.goauthentik.io/auth/nginx nginx.ingress.kubernetes.io/auth-signin: https://orsihome.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; # Homepage auto-discovery annotation gethomepage.dev/enabled: "true" gethomepage.dev/name: "Homepage" gethomepage.dev/description: "Application Dashboard" gethomepage.dev/group: "Infrastructure" gethomepage.dev/icon: "homepage.png" spec: ingressClassName: nginx-internal rules: - host: orsihome.dooplex.hu http: paths: - path: / pathType: Prefix backend: service: name: homepage-orsi port: number: 3000 tls: - hosts: - orsihome.dooplex.hu secretName: homepage-orsi-tls ---