From af74aa297d615d1e4baa84227542b599744046cf Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sat, 7 Mar 2026 16:41:36 +0000 Subject: [PATCH] [ci skip] add Homepage gethomepage.dev annotations to all services Add Kubernetes ingress annotations for Homepage auto-discovery across ~88 services organized into 11 groups. Enable serviceAccount for RBAC, configure group layouts, and add Grafana/Frigate/Speedtest widgets. --- stacks/actualbudget/factory/main.tf | 5 + stacks/actualbudget/main.tf | 24 ++++ stacks/affine/main.tf | 8 ++ stacks/audiobookshelf/main.tf | 8 ++ stacks/blog/main.tf | 8 ++ stacks/calibre/main.tf | 5 +- stacks/changedetection/main.tf | 8 ++ stacks/city-guesser/main.tf | 8 ++ stacks/cyberchef/main.tf | 8 ++ stacks/dawarich/main.tf | 8 ++ stacks/ebook2audiobook/main.tf | 16 +++ stacks/excalidraw/main.tf | 8 ++ stacks/f1-stream/main.tf | 8 ++ stacks/forgejo/main.tf | 8 ++ stacks/freedify/factory/main.tf | 15 ++- stacks/freedify/main.tf | 16 +++ stacks/freshrss/main.tf | 8 ++ stacks/frigate/main.tf | 13 ++ stacks/grampsweb/main.tf | 8 ++ stacks/hackmd/main.tf | 8 ++ stacks/health/main.tf | 8 ++ stacks/homepage/values.yaml | 111 ++++++------------ stacks/immich/main.tf | 1 + stacks/jsoncrack/main.tf | 8 ++ stacks/k8s-dashboard/main.tf | 8 ++ stacks/kms/main.tf | 8 ++ stacks/linkwarden/main.tf | 8 ++ stacks/matrix/main.tf | 8 ++ stacks/meshcentral/main.tf | 8 ++ stacks/n8n/main.tf | 8 ++ stacks/navidrome/main.tf | 8 ++ stacks/netbox/main.tf | 8 ++ stacks/networking-toolbox/main.tf | 8 ++ stacks/nextcloud/main.tf | 8 ++ stacks/ntfy/main.tf | 8 ++ stacks/ollama/main.tf | 12 ++ stacks/onlyoffice/main.tf | 8 ++ stacks/openclaw/main.tf | 8 ++ stacks/owntracks/main.tf | 6 + stacks/paperless-ngx/main.tf | 2 +- stacks/platform/modules/authentik/main.tf | 8 ++ stacks/platform/modules/crowdsec/values.yaml | 1 + stacks/platform/modules/headscale/main.tf | 8 ++ stacks/platform/modules/k8s-portal/main.tf | 8 ++ .../modules/mailserver/roundcubemail.tf | 8 ++ .../monitoring/grafana_chart_values.yaml | 10 ++ .../monitoring/prometheus_chart_values.tpl | 7 ++ stacks/platform/modules/reverse_proxy/main.tf | 66 ++++++++++- stacks/platform/modules/technitium/main.tf | 2 +- stacks/platform/modules/traefik/main.tf | 8 ++ stacks/platform/modules/uptime-kuma/main.tf | 2 +- stacks/platform/modules/vaultwarden/main.tf | 8 ++ stacks/platform/modules/vpa/main.tf | 8 ++ stacks/plotting-book/main.tf | 8 ++ stacks/poison-fountain/main.tf | 8 ++ stacks/privatebin/main.tf | 8 ++ stacks/real-estate-crawler/main.tf | 11 ++ stacks/resume/main.tf | 8 ++ stacks/rybbit/main.tf | 11 ++ stacks/send/main.tf | 8 ++ stacks/servarr/aiostreams/main.tf | 8 ++ stacks/servarr/flaresolverr/main.tf | 12 +- stacks/servarr/listenarr/main.tf | 8 ++ stacks/servarr/prowlarr/main.tf | 8 ++ stacks/servarr/qbittorrent/main.tf | 8 ++ stacks/speedtest/main.tf | 10 ++ stacks/stirling-pdf/main.tf | 8 ++ stacks/tandoor/main.tf | 8 ++ stacks/trading-bot/main.tf | 8 ++ stacks/travel_blog/main.tf | 8 ++ stacks/tuya-bridge/main.tf | 8 ++ stacks/url/main.tf | 27 ++++- stacks/wealthfolio/main.tf | 8 ++ stacks/webhook_handler/main.tf | 8 ++ stacks/woodpecker/main.tf | 8 ++ stacks/ytdlp/main.tf | 16 +++ 76 files changed, 722 insertions(+), 95 deletions(-) diff --git a/stacks/actualbudget/factory/main.tf b/stacks/actualbudget/factory/main.tf index 6caff933..554a780f 100644 --- a/stacks/actualbudget/factory/main.tf +++ b/stacks/actualbudget/factory/main.tf @@ -14,6 +14,10 @@ variable "budget_encryption_password" { sensitive = true } variable "nfs_server" { type = string } +variable "homepage_annotations" { + type = map(string) + default = {} +} module "nfs_data" { source = "../../../modules/kubernetes/nfs_volume" @@ -103,6 +107,7 @@ module "ingress" { name = "budget-${var.name}" tls_secret_name = var.tls_secret_name rybbit_site_id = "3e6b6b68088a" + extra_annotations = var.homepage_annotations } diff --git a/stacks/actualbudget/main.tf b/stacks/actualbudget/main.tf index b7989ee8..6883b31a 100644 --- a/stacks/actualbudget/main.tf +++ b/stacks/actualbudget/main.tf @@ -44,6 +44,14 @@ module "viktor" { tier = local.tiers.edge budget_encryption_password = lookup(var.actualbudget_credentials["viktor"], "password", null) sync_id = lookup(var.actualbudget_credentials["viktor"], "sync_id", null) + homepage_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Budget Viktor" + "gethomepage.dev/description" = "Personal budget" + "gethomepage.dev/icon" = "actual-budget.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } # https://budget-anca.viktorbarzin.me/ @@ -57,6 +65,14 @@ module "anca" { tier = local.tiers.edge budget_encryption_password = lookup(var.actualbudget_credentials["anca"], "password", null) sync_id = lookup(var.actualbudget_credentials["anca"], "sync_id", null) + homepage_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Budget Anca" + "gethomepage.dev/description" = "Personal budget" + "gethomepage.dev/icon" = "actual-budget.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } # https://budget-emo.viktorbarzin.me/ @@ -70,4 +86,12 @@ module "emo" { tier = local.tiers.edge budget_encryption_password = lookup(var.actualbudget_credentials["emo"], "password", null) sync_id = lookup(var.actualbudget_credentials["emo"], "sync_id", null) + homepage_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Budget Emo" + "gethomepage.dev/description" = "Personal budget" + "gethomepage.dev/icon" = "actual-budget.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/affine/main.tf b/stacks/affine/main.tf index a855f9ee..1d488557 100644 --- a/stacks/affine/main.tf +++ b/stacks/affine/main.tf @@ -231,4 +231,12 @@ module "ingress" { name = "affine" tls_secret_name = var.tls_secret_name max_body_size = "500m" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Affine" + "gethomepage.dev/description" = "Knowledge base" + "gethomepage.dev/icon" = "affine.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/audiobookshelf/main.tf b/stacks/audiobookshelf/main.tf index 9e2f00ac..3f361430 100644 --- a/stacks/audiobookshelf/main.tf +++ b/stacks/audiobookshelf/main.tf @@ -193,4 +193,12 @@ module "ingress" { name = "audiobookshelf" tls_secret_name = var.tls_secret_name rybbit_site_id = "b38fda4285df" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Audiobookshelf" + "gethomepage.dev/description" = "Audiobook library" + "gethomepage.dev/icon" = "audiobookshelf.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/blog/main.tf b/stacks/blog/main.tf index bfaf22ab..8f4c6e55 100644 --- a/stacks/blog/main.tf +++ b/stacks/blog/main.tf @@ -113,6 +113,14 @@ module "ingress" { full_host = "viktorbarzin.me" tls_secret_name = var.tls_secret_name rybbit_site_id = "da853a2438d0" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Blog" + "gethomepage.dev/description" = "Personal blog" + "gethomepage.dev/icon" = "hugo.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } module "ingress-www" { diff --git a/stacks/calibre/main.tf b/stacks/calibre/main.tf index c6d217c8..cb08e351 100644 --- a/stacks/calibre/main.tf +++ b/stacks/calibre/main.tf @@ -270,7 +270,7 @@ module "ingress" { extra_annotations = { "gethomepage.dev/enabled" = "true" "gethomepage.dev/description" = "Book library" - # gethomepage.dev/group: Media + "gethomepage.dev/group" = "Media & Entertainment" "gethomepage.dev/icon" : "calibre-web.png" "gethomepage.dev/name" = "Calibre" "gethomepage.dev/widget.type" = "calibreweb" @@ -371,4 +371,7 @@ module "stacks-ingress" { tls_secret_name = var.tls_secret_name protected = true rybbit_site_id = "ce5f8aed6bbb" + extra_annotations = { + "gethomepage.dev/enabled" = "false" + } } diff --git a/stacks/changedetection/main.tf b/stacks/changedetection/main.tf index 88272411..a2630443 100644 --- a/stacks/changedetection/main.tf +++ b/stacks/changedetection/main.tf @@ -160,4 +160,12 @@ module "ingress" { name = "changedetection" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Changedetection" + "gethomepage.dev/description" = "Website change monitor" + "gethomepage.dev/icon" = "changedetection-io.png" + "gethomepage.dev/group" = "Automation" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/city-guesser/main.tf b/stacks/city-guesser/main.tf index c7bdea73..58d54428 100644 --- a/stacks/city-guesser/main.tf +++ b/stacks/city-guesser/main.tf @@ -92,4 +92,12 @@ module "ingress" { name = "city-guesser" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "City Guesser" + "gethomepage.dev/description" = "Geography game" + "gethomepage.dev/icon" = "globe.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/cyberchef/main.tf b/stacks/cyberchef/main.tf index 8979bf38..a77a04c2 100644 --- a/stacks/cyberchef/main.tf +++ b/stacks/cyberchef/main.tf @@ -99,4 +99,12 @@ module "ingress" { name = "cc" tls_secret_name = var.tls_secret_name rybbit_site_id = "7c460afc68c4" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "CyberChef" + "gethomepage.dev/description" = "Data transformation toolkit" + "gethomepage.dev/icon" = "cyberchef.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/dawarich/main.tf b/stacks/dawarich/main.tf index 63b83096..53fef277 100644 --- a/stacks/dawarich/main.tf +++ b/stacks/dawarich/main.tf @@ -345,4 +345,12 @@ module "ingress" { name = "dawarich" tls_secret_name = var.tls_secret_name rybbit_site_id = "0abfd409f2fb" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Dawarich" + "gethomepage.dev/description" = "Location history" + "gethomepage.dev/icon" = "dawarich.png" + "gethomepage.dev/group" = "Smart Home" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/ebook2audiobook/main.tf b/stacks/ebook2audiobook/main.tf index 568d0f53..d3aa7937 100644 --- a/stacks/ebook2audiobook/main.tf +++ b/stacks/ebook2audiobook/main.tf @@ -246,6 +246,14 @@ module "ingress" { name = "ebook2audiobook" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Ebook2Audiobook" + "gethomepage.dev/description" = "Book to audio converter" + "gethomepage.dev/icon" = "audiobookshelf.png" + "gethomepage.dev/group" = "AI & Data" + "gethomepage.dev/pod-selector" = "" + } } @@ -421,4 +429,12 @@ module "audiblez-web-ingress" { tls_secret_name = var.tls_secret_name protected = true max_body_size = "500m" # Allow large EPUB uploads + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Audiblez" + "gethomepage.dev/description" = "Book to audio converter" + "gethomepage.dev/icon" = "audiobookshelf.png" + "gethomepage.dev/group" = "AI & Data" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/excalidraw/main.tf b/stacks/excalidraw/main.tf index 30b357b0..825371f1 100644 --- a/stacks/excalidraw/main.tf +++ b/stacks/excalidraw/main.tf @@ -125,4 +125,12 @@ module "ingress" { name = "draw" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Excalidraw" + "gethomepage.dev/description" = "Collaborative whiteboard" + "gethomepage.dev/icon" = "excalidraw.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/f1-stream/main.tf b/stacks/f1-stream/main.tf index 55bd604e..65166579 100644 --- a/stacks/f1-stream/main.tf +++ b/stacks/f1-stream/main.tf @@ -128,4 +128,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name rybbit_site_id = "7e69786f66d5" exclude_crowdsec = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "F1 Stream" + "gethomepage.dev/description" = "Formula 1 live streams" + "gethomepage.dev/icon" = "f1.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/forgejo/main.tf b/stacks/forgejo/main.tf index 9b5bd6d4..ffc04e18 100644 --- a/stacks/forgejo/main.tf +++ b/stacks/forgejo/main.tf @@ -121,4 +121,12 @@ module "ingress" { namespace = kubernetes_namespace.forgejo.metadata[0].name name = "forgejo" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Forgejo" + "gethomepage.dev/description" = "Git hosting" + "gethomepage.dev/icon" = "forgejo.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/freedify/factory/main.tf b/stacks/freedify/factory/main.tf index d9055b27..10e6f0c7 100755 --- a/stacks/freedify/factory/main.tf +++ b/stacks/freedify/factory/main.tf @@ -47,6 +47,10 @@ variable "memory_request" { type = string default = "64Mi" } +variable "extra_annotations" { + type = map(string) + default = {} +} resource "kubernetes_deployment" "freedify" { @@ -144,9 +148,10 @@ resource "kubernetes_service" "freedify" { } module "ingress" { - source = "../../../modules/kubernetes/ingress_factory" - namespace = "freedify" - name = "music-${var.name}" - tls_secret_name = var.tls_secret_name - protected = var.protected + source = "../../../modules/kubernetes/ingress_factory" + namespace = "freedify" + name = "music-${var.name}" + tls_secret_name = var.tls_secret_name + protected = var.protected + extra_annotations = var.extra_annotations } diff --git a/stacks/freedify/main.tf b/stacks/freedify/main.tf index 3d8e0401..844b3b4c 100644 --- a/stacks/freedify/main.tf +++ b/stacks/freedify/main.tf @@ -45,6 +45,14 @@ module "viktor" { dab_session = lookup(var.freedify_credentials["viktor"], "dab_session", null) dab_visitor_id = lookup(var.freedify_credentials["viktor"], "dab_visitor_id", null) gemini_api_key = lookup(var.freedify_credentials["viktor"], "gemini_api_key", null) + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Freedify (Viktor)" + "gethomepage.dev/description" = "Music streaming" + "gethomepage.dev/icon" = "navidrome.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } # https://music-emo.viktorbarzin.me/ @@ -58,4 +66,12 @@ module "emo" { protected = true genius_token = lookup(var.freedify_credentials["emo"], "genius_token", null) gemini_api_key = lookup(var.freedify_credentials["emo"], "gemini_api_key", null) + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Freedify (Emo)" + "gethomepage.dev/description" = "Music streaming" + "gethomepage.dev/icon" = "navidrome.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/freshrss/main.tf b/stacks/freshrss/main.tf index 03906575..e793fa8e 100644 --- a/stacks/freshrss/main.tf +++ b/stacks/freshrss/main.tf @@ -147,4 +147,12 @@ module "ingress" { name = "rss" service_name = "freshrss" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "FreshRSS" + "gethomepage.dev/description" = "RSS feed reader" + "gethomepage.dev/icon" = "freshrss.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/frigate/main.tf b/stacks/frigate/main.tf index c323722b..0112cbf4 100644 --- a/stacks/frigate/main.tf +++ b/stacks/frigate/main.tf @@ -243,6 +243,16 @@ module "ingress" { tls_secret_name = var.tls_secret_name protected = true rybbit_site_id = "0d4044069ff5" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Frigate" + "gethomepage.dev/description" = "NVR & object detection" + "gethomepage.dev/icon" = "frigate.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + "gethomepage.dev/widget.type" = "frigate" + "gethomepage.dev/widget.url" = "http://frigate.frigate.svc.cluster.local:5000" + } } module "ingress-internal" { @@ -255,4 +265,7 @@ module "ingress-internal" { tls_secret_name = var.tls_secret_name allow_local_access_only = true ssl_redirect = false + extra_annotations = { + "gethomepage.dev/enabled" = "false" + } } diff --git a/stacks/grampsweb/main.tf b/stacks/grampsweb/main.tf index d54beb04..24554a7c 100644 --- a/stacks/grampsweb/main.tf +++ b/stacks/grampsweb/main.tf @@ -304,4 +304,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name max_body_size = "500m" protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "GrampsWeb" + "gethomepage.dev/description" = "Family tree" + "gethomepage.dev/icon" = "grampsweb.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/hackmd/main.tf b/stacks/hackmd/main.tf index d6eef4ac..2e630068 100644 --- a/stacks/hackmd/main.tf +++ b/stacks/hackmd/main.tf @@ -168,4 +168,12 @@ module "ingress" { namespace = kubernetes_namespace.hackmd.metadata[0].name name = "hackmd" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "HackMD" + "gethomepage.dev/description" = "Collaborative markdown" + "gethomepage.dev/icon" = "hedgedoc.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/health/main.tf b/stacks/health/main.tf index 34ad6403..141c1312 100644 --- a/stacks/health/main.tf +++ b/stacks/health/main.tf @@ -147,4 +147,12 @@ module "ingress" { name = "health" tls_secret_name = var.tls_secret_name max_body_size = "100m" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Health" + "gethomepage.dev/description" = "Health dashboard" + "gethomepage.dev/icon" = "healthchecks.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/homepage/values.yaml b/stacks/homepage/values.yaml index 121ee4ea..41b75166 100644 --- a/stacks/homepage/values.yaml +++ b/stacks/homepage/values.yaml @@ -5,20 +5,10 @@ image: # Enable RBAC. RBAC is necessary to use Kubernetes integration enableRbac: true -extraClusterRoles: - # - apiGroups: - # - some-group - # resources: - # - some-resource - # verbs: - # - get - serviceAccount: - # Specify a different service account name. When blank it will default to the release - # name if *create* is enabled, otherwise it will refer to the default service account. name: "" - # Create service account. Needed when RBAC is enabled. - create: false + # Create service account. Needed when RBAC is enabled for K8s annotation auto-discovery. + create: true service: main: @@ -37,13 +27,11 @@ ingress: main: enabled: true labels: - # This label will enable discover of this deployment in Homepage gethomepage.dev/enabled: "true" annotations: - # These annotations will configure how this deployment is shown in Homepage gethomepage.dev/name: "Homepage" - gethomepage.dev/description: "A modern, secure, highly customizable application dashboard." - gethomepage.dev/group: "A New Group" + gethomepage.dev/description: "Service dashboard" + gethomepage.dev/group: "Core Platform" gethomepage.dev/icon: "homepage.png" ingressClassName: "traefik" hosts: @@ -58,32 +46,14 @@ ingress: # All the config files for Homepage can be specified under their relevant config block. config: - # To use an existing ConfigMap uncomment this line and specify the name - # useExistingConfigMap: existing-homepage-configmap bookmarks: - Developer: - Github: - abbr: Viktor Barzin href: https://github.com/viktorbarzin - services: - # - My First Group: - # - My First Service: - # href: http://localhost/ - # description: Homepage is awesome - - # - My Second Group: - # - My Second Service: - # href: http://localhost/ - # description: Homepage is the best - - # - My Third Group: - # - My Third Service: - # href: http://localhost/ - # description: Homepage is 😎 + services: [] # All services via K8s annotation auto-discovery widgets: - resources: - # change backend to 'kubernetes' to use Kubernetes integration. Requires RBAC. - # backend: resources backend: kubernetes expanded: true cpu: true @@ -91,7 +61,6 @@ config: - search: provider: duckduckgo target: _blank - ## Uncomment to enable Kubernetes integration - kubernetes: cluster: show: true @@ -105,51 +74,49 @@ config: memory: true showLabel: true kubernetes: - # change mode to 'cluster' to use RBAC service account - # mode: disable mode: cluster docker: settings: + layout: + Core Platform: + style: row + columns: 4 + Identity & Security: + style: row + columns: 3 + Infrastructure: + style: row + columns: 4 + Development & CI: + style: row + columns: 4 + Automation: + style: row + columns: 3 + Productivity: + style: row + columns: 4 + Media & Entertainment: + style: row + columns: 4 + Smart Home: + style: row + columns: 3 + AI & Data: + style: row + columns: 3 + Finance & Personal: + style: row + columns: 3 + Other: + style: row + columns: 4 -# -- Main environment variables. Template enabled. -# Syntax options: -# A) TZ: UTC -# B) PASSWD: '{{ .Release.Name }}' -# C) PASSWD: -# configMapKeyRef: -# name: config-map-name -# key: key-name -# D) PASSWD: -# valueFrom: -# secretKeyRef: -# name: secret-name -# key: key-name -# ... -# E) - name: TZ -# value: UTC -# F) - name: TZ -# value: '{{ .Release.Name }}' env: HOMEPAGE_ALLOWED_HOSTS: home.viktorbarzin.me - -# To include environment variables from other configs or other secrets for use in -# Homepage's variable substitutions. Refer to them here. -# envFrom: -# - secretRef: -# name: my-secret -# - configMapRef: -# name: my-configmap - persistence: logs: enabled: true type: emptyDir mountPath: /app/config/logs -# resources: -# requests: -# memory: 10Mi -# cpu: 10m -# limits: -# memory: 200Mi -# cpu: 500m diff --git a/stacks/immich/main.tf b/stacks/immich/main.tf index 90b3e521..0732738f 100644 --- a/stacks/immich/main.tf +++ b/stacks/immich/main.tf @@ -593,6 +593,7 @@ module "ingress-immich" { "gethomepage.dev/description" = "Photos library" "gethomepage.dev/icon" = "immich.png" "gethomepage.dev/name" = "Immich" + "gethomepage.dev/group" = "Media & Entertainment" "gethomepage.dev/widget.type" = "immich" "gethomepage.dev/widget.url" = "https://immich.viktorbarzin.me" "gethomepage.dev/pod-selector" = "" diff --git a/stacks/jsoncrack/main.tf b/stacks/jsoncrack/main.tf index b4607caa..4f991c07 100644 --- a/stacks/jsoncrack/main.tf +++ b/stacks/jsoncrack/main.tf @@ -81,4 +81,12 @@ module "ingress" { namespace = kubernetes_namespace.jsoncrack.metadata[0].name name = "json" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "JSON Crack" + "gethomepage.dev/description" = "JSON visualizer" + "gethomepage.dev/icon" = "json.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/k8s-dashboard/main.tf b/stacks/k8s-dashboard/main.tf index 09f29c4a..52f1c38b 100644 --- a/stacks/k8s-dashboard/main.tf +++ b/stacks/k8s-dashboard/main.tf @@ -94,6 +94,14 @@ module "ingress" { protected = true backend_protocol = "HTTPS" port = 443 + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Kubernetes Dashboard" + "gethomepage.dev/description" = "Cluster dashboard" + "gethomepage.dev/icon" = "kubernetes-dashboard.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } } # create token with diff --git a/stacks/kms/main.tf b/stacks/kms/main.tf index 0c47313d..adbb909b 100644 --- a/stacks/kms/main.tf +++ b/stacks/kms/main.tf @@ -120,6 +120,14 @@ module "ingress" { namespace = kubernetes_namespace.kms.metadata[0].name name = "kms" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "KMS" + "gethomepage.dev/description" = "License activation server" + "gethomepage.dev/icon" = "microsoft.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } resource "kubernetes_deployment" "windows_kms" { diff --git a/stacks/linkwarden/main.tf b/stacks/linkwarden/main.tf index 67e7d41c..4a9bda0a 100644 --- a/stacks/linkwarden/main.tf +++ b/stacks/linkwarden/main.tf @@ -141,4 +141,12 @@ module "ingress" { namespace = kubernetes_namespace.linkwarden.metadata[0].name name = "linkwarden" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Linkwarden" + "gethomepage.dev/description" = "Bookmark manager" + "gethomepage.dev/icon" = "linkwarden.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/matrix/main.tf b/stacks/matrix/main.tf index cde87f76..8f8ff58b 100644 --- a/stacks/matrix/main.tf +++ b/stacks/matrix/main.tf @@ -108,4 +108,12 @@ module "ingress" { namespace = kubernetes_namespace.matrix.metadata[0].name name = "matrix" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Matrix" + "gethomepage.dev/description" = "Secure messaging" + "gethomepage.dev/icon" = "matrix.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/meshcentral/main.tf b/stacks/meshcentral/main.tf index fda1c717..9d95bc02 100644 --- a/stacks/meshcentral/main.tf +++ b/stacks/meshcentral/main.tf @@ -183,4 +183,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name port = 443 protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "MeshCentral" + "gethomepage.dev/description" = "Remote management" + "gethomepage.dev/icon" = "meshcentral.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/n8n/main.tf b/stacks/n8n/main.tf index a061b12c..47fcfe56 100644 --- a/stacks/n8n/main.tf +++ b/stacks/n8n/main.tf @@ -162,4 +162,12 @@ module "ingress" { namespace = kubernetes_namespace.n8n.metadata[0].name name = "n8n" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "n8n" + "gethomepage.dev/description" = "Workflow automation" + "gethomepage.dev/icon" = "n8n.png" + "gethomepage.dev/group" = "Automation" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/navidrome/main.tf b/stacks/navidrome/main.tf index 4a1e9e35..a52b04a5 100644 --- a/stacks/navidrome/main.tf +++ b/stacks/navidrome/main.tf @@ -152,4 +152,12 @@ module "ingress" { name = "navidrome" tls_secret_name = var.tls_secret_name rybbit_site_id = "8a3844ff75ba" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Navidrome" + "gethomepage.dev/description" = "Music streaming" + "gethomepage.dev/icon" = "navidrome.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/netbox/main.tf b/stacks/netbox/main.tf index 3e4aee6e..b079d2f4 100644 --- a/stacks/netbox/main.tf +++ b/stacks/netbox/main.tf @@ -196,4 +196,12 @@ module "ingress" { name = "netbox" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Netbox" + "gethomepage.dev/description" = "Network documentation" + "gethomepage.dev/icon" = "netbox.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/networking-toolbox/main.tf b/stacks/networking-toolbox/main.tf index bf35ca70..dffc1f5e 100644 --- a/stacks/networking-toolbox/main.tf +++ b/stacks/networking-toolbox/main.tf @@ -93,4 +93,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name protected = true rybbit_site_id = "50e38577e41c" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Networking Toolbox" + "gethomepage.dev/description" = "Network diagnostic tools" + "gethomepage.dev/icon" = "networking.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/nextcloud/main.tf b/stacks/nextcloud/main.tf index 57b108e6..17bdb586 100644 --- a/stacks/nextcloud/main.tf +++ b/stacks/nextcloud/main.tf @@ -190,6 +190,14 @@ module "ingress" { tls_secret_name = var.tls_secret_name port = 8080 rybbit_site_id = "5a3bfe59a3fe" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Nextcloud" + "gethomepage.dev/description" = "Cloud productivity suite" + "gethomepage.dev/icon" = "nextcloud.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } module "whiteboard_ingress" { diff --git a/stacks/ntfy/main.tf b/stacks/ntfy/main.tf index c143cd64..9975be2f 100644 --- a/stacks/ntfy/main.tf +++ b/stacks/ntfy/main.tf @@ -171,4 +171,12 @@ module "ingress" { namespace = kubernetes_namespace.ntfy.metadata[0].name name = "ntfy" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "ntfy" + "gethomepage.dev/description" = "Push notifications" + "gethomepage.dev/icon" = "ntfy.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/ollama/main.tf b/stacks/ollama/main.tf index c446e4c2..b7f7f281 100644 --- a/stacks/ollama/main.tf +++ b/stacks/ollama/main.tf @@ -160,6 +160,9 @@ module "ollama-ingress" { allow_local_access_only = true ssl_redirect = false port = 11434 + extra_annotations = { + "gethomepage.dev/enabled" = "false" + } } # Ollama API ingress for external access (basicAuth protected) @@ -212,6 +215,7 @@ module "ollama-api-ingress" { port = 11434 extra_annotations = { "traefik.ingress.kubernetes.io/router.middlewares" = "ollama-ollama-api-basic-auth@kubernetescrd,traefik-rate-limit@kubernetescrd,traefik-crowdsec@kubernetescrd" + "gethomepage.dev/enabled" = "false" } } @@ -306,4 +310,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name port = 80 rybbit_site_id = "e73bebea399f" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Ollama" + "gethomepage.dev/description" = "Local LLM inference" + "gethomepage.dev/icon" = "ollama.png" + "gethomepage.dev/group" = "AI & Data" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/onlyoffice/main.tf b/stacks/onlyoffice/main.tf index bc621012..7e2f40c6 100644 --- a/stacks/onlyoffice/main.tf +++ b/stacks/onlyoffice/main.tf @@ -199,4 +199,12 @@ module "ingress" { name = "onlyoffice" service_name = "onlyoffice-document-server" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "OnlyOffice" + "gethomepage.dev/description" = "Document editor" + "gethomepage.dev/icon" = "onlyoffice.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/openclaw/main.tf b/stacks/openclaw/main.tf index 55c8b59b..a6e50a46 100644 --- a/stacks/openclaw/main.tf +++ b/stacks/openclaw/main.tf @@ -650,6 +650,14 @@ module "ingress" { tls_secret_name = var.tls_secret_name port = 80 protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "OpenClaw" + "gethomepage.dev/description" = "AI assistant" + "gethomepage.dev/icon" = "openai.png" + "gethomepage.dev/group" = "AI & Data" + "gethomepage.dev/pod-selector" = "" + } } # --- CronJob: Scheduled cluster health check --- diff --git a/stacks/owntracks/main.tf b/stacks/owntracks/main.tf index 2b657e69..f4e28707 100644 --- a/stacks/owntracks/main.tf +++ b/stacks/owntracks/main.tf @@ -161,6 +161,12 @@ module "ingress" { port = 443 extra_annotations = { "traefik.ingress.kubernetes.io/router.middlewares" = "owntracks-basic-auth@kubernetescrd,traefik-rate-limit@kubernetescrd,traefik-csp-headers@kubernetescrd,traefik-crowdsec@kubernetescrd" + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "OwnTracks" + "gethomepage.dev/description" = "Location tracking" + "gethomepage.dev/icon" = "owntracks.png" + "gethomepage.dev/group" = "Smart Home" + "gethomepage.dev/pod-selector" = "" } } diff --git a/stacks/paperless-ngx/main.tf b/stacks/paperless-ngx/main.tf index b1a996ae..fd56d58a 100644 --- a/stacks/paperless-ngx/main.tf +++ b/stacks/paperless-ngx/main.tf @@ -186,7 +186,7 @@ module "ingress" { extra_annotations = { "gethomepage.dev/enabled" = "true" "gethomepage.dev/description" = "Document library" - # gethomepage.dev/group: Media + "gethomepage.dev/group" = "Productivity" "gethomepage.dev/icon" : "paperless-ngx.png" "gethomepage.dev/name" = "Paperless-ngx" "gethomepage.dev/widget.type" = "paperlessngx" diff --git a/stacks/platform/modules/authentik/main.tf b/stacks/platform/modules/authentik/main.tf index a52cde34..bff70dde 100644 --- a/stacks/platform/modules/authentik/main.tf +++ b/stacks/platform/modules/authentik/main.tf @@ -59,6 +59,14 @@ module "ingress" { name = "authentik" service_name = "goauthentik-server" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Authentik" + "gethomepage.dev/description" = "Identity provider" + "gethomepage.dev/icon" = "authentik.png" + "gethomepage.dev/group" = "Identity & Security" + "gethomepage.dev/pod-selector" = "" + } } module "ingress-outpost" { diff --git a/stacks/platform/modules/crowdsec/values.yaml b/stacks/platform/modules/crowdsec/values.yaml index 0029993e..1ea93235 100644 --- a/stacks/platform/modules/crowdsec/values.yaml +++ b/stacks/platform/modules/crowdsec/values.yaml @@ -109,6 +109,7 @@ lapi: gethomepage.dev/description: "Web Application Firewall" gethomepage.dev/icon: "crowdsec.png" gethomepage.dev/name: "CrowdSec" + gethomepage.dev/group: "Identity & Security" gethomepage.dev/widget.type: "crowdsec" gethomepage.dev/widget.url: "http://crowdsec-service.crowdsec.svc.cluster.local:8080" gethomepage.dev/widget.username: "${homepage_username}" diff --git a/stacks/platform/modules/headscale/main.tf b/stacks/platform/modules/headscale/main.tf index c41cff65..a48e60af 100644 --- a/stacks/platform/modules/headscale/main.tf +++ b/stacks/platform/modules/headscale/main.tf @@ -251,6 +251,14 @@ module "ingress" { name = "headscale" port = 8080 tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Headscale" + "gethomepage.dev/description" = "VPN mesh network" + "gethomepage.dev/icon" = "headscale.png" + "gethomepage.dev/group" = "Identity & Security" + "gethomepage.dev/pod-selector" = "" + } } module "ingress-ui" { diff --git a/stacks/platform/modules/k8s-portal/main.tf b/stacks/platform/modules/k8s-portal/main.tf index bab83dab..6271c194 100644 --- a/stacks/platform/modules/k8s-portal/main.tf +++ b/stacks/platform/modules/k8s-portal/main.tf @@ -121,6 +121,14 @@ module "ingress" { name = "k8s-portal" tls_secret_name = var.tls_secret_name protected = true # Require Authentik login + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "K8s Portal" + "gethomepage.dev/description" = "Kubernetes portal" + "gethomepage.dev/icon" = "kubernetes.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } } # Unprotected ingress for the setup script (needs to be curl-able without auth) diff --git a/stacks/platform/modules/mailserver/roundcubemail.tf b/stacks/platform/modules/mailserver/roundcubemail.tf index 09ef5fb0..9cbe1a52 100644 --- a/stacks/platform/modules/mailserver/roundcubemail.tf +++ b/stacks/platform/modules/mailserver/roundcubemail.tf @@ -217,4 +217,12 @@ module "ingress" { service_name = "roundcubemail" tls_secret_name = var.tls_secret_name rybbit_site_id = "082f164faa7d" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Roundcube Mail" + "gethomepage.dev/description" = "Webmail client" + "gethomepage.dev/icon" = "roundcube.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/platform/modules/monitoring/grafana_chart_values.yaml b/stacks/platform/modules/monitoring/grafana_chart_values.yaml index d7d8b2f2..8ebcaf98 100644 --- a/stacks/platform/modules/monitoring/grafana_chart_values.yaml +++ b/stacks/platform/modules/monitoring/grafana_chart_values.yaml @@ -18,6 +18,16 @@ ingress: annotations: traefik.ingress.kubernetes.io/router.middlewares: "traefik-rate-limit@kubernetescrd,traefik-csp-headers@kubernetescrd,traefik-crowdsec@kubernetescrd" traefik.ingress.kubernetes.io/router.entrypoints: "websecure" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Grafana" + gethomepage.dev/description: "Dashboards & observability" + gethomepage.dev/icon: "grafana.png" + gethomepage.dev/group: "Core Platform" + gethomepage.dev/pod-selector: "" + gethomepage.dev/widget.type: "grafana" + gethomepage.dev/widget.url: "http://monitoring-grafana.monitoring.svc.cluster.local" + gethomepage.dev/widget.username: "admin" + gethomepage.dev/widget.password: "${grafana_admin_password}" tls: - secretName: "tls-secret" hosts: diff --git a/stacks/platform/modules/monitoring/prometheus_chart_values.tpl b/stacks/platform/modules/monitoring/prometheus_chart_values.tpl index 4d6d7057..3c362b8d 100755 --- a/stacks/platform/modules/monitoring/prometheus_chart_values.tpl +++ b/stacks/platform/modules/monitoring/prometheus_chart_values.tpl @@ -15,6 +15,12 @@ alertmanager: annotations: traefik.ingress.kubernetes.io/router.middlewares: "traefik-rate-limit@kubernetescrd,traefik-csp-headers@kubernetescrd,traefik-crowdsec@kubernetescrd,traefik-authentik-forward-auth@kubernetescrd" traefik.ingress.kubernetes.io/router.entrypoints: "websecure" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Alertmanager" + gethomepage.dev/description: "Alert routing" + gethomepage.dev/icon: "alertmanager.png" + gethomepage.dev/group: "Core Platform" + gethomepage.dev/pod-selector: "" tls: - secretName: "tls-secret" hosts: @@ -151,6 +157,7 @@ server: gethomepage.dev/description: "Prometheus" gethomepage.dev/icon: "prometheus.png" gethomepage.dev/name: "Prometheus" + gethomepage.dev/group: "Core Platform" gethomepage.dev/widget.type: "prometheus" gethomepage.dev/widget.url: "http://prometheus-server.monitoring.svc.cluster.local:80" gethomepage.dev/pod-selector: "" diff --git a/stacks/platform/modules/reverse_proxy/main.tf b/stacks/platform/modules/reverse_proxy/main.tf index e00cdf98..3667fbc9 100644 --- a/stacks/platform/modules/reverse_proxy/main.tf +++ b/stacks/platform/modules/reverse_proxy/main.tf @@ -30,7 +30,7 @@ module "pfsense" { extra_annotations = { "gethomepage.dev/enabled" : "true" "gethomepage.dev/description" : "Cluster Firewall" - # gethomepage.dev/group: Media + "gethomepage.dev/group" : "Identity & Security" "gethomepage.dev/icon" : "pfsense.png" "gethomepage.dev/name" : "pFsense" "gethomepage.dev/widget.type" : "pfsense" @@ -58,6 +58,14 @@ module "nas" { max_body_size = "0m" depends_on = [kubernetes_namespace.reverse-proxy] rybbit_site_id = "1e11f8449f7d" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Synology NAS" + "gethomepage.dev/description" = "Network storage" + "gethomepage.dev/icon" = "synology.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } } # https://files.viktorbarzin.me/ @@ -72,6 +80,7 @@ module "nas-files" { ingress_path = ["/sharing", "/scripts", "/webman", "/wfmlogindialog.js", "/fsdownload"] max_body_size = "0m" depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { "gethomepage.dev/enabled" = "false" } } # https://idrac.viktorbarzin.me/ @@ -83,7 +92,14 @@ module "idrac" { tls_secret_name = var.tls_secret_name backend_protocol = "HTTPS" strip_auth_headers = true - extra_annotations = {} + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "iDRAC" + "gethomepage.dev/description" = "Server management" + "gethomepage.dev/icon" = "dell.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } depends_on = [kubernetes_namespace.reverse-proxy] } @@ -99,7 +115,7 @@ module "tp-link-gateway" { depends_on = [kubernetes_namespace.reverse-proxy] protected = true strip_auth_headers = true - extra_annotations = {} + extra_annotations = { "gethomepage.dev/enabled" = "false" } } # https://truenas.viktorbarzin.me/ @@ -114,7 +130,7 @@ module "truenas" { extra_annotations = { "gethomepage.dev/enabled" : "true" "gethomepage.dev/description" : "TrueNAS" - # gethomepage.dev/group: Media + "gethomepage.dev/group" : "Infrastructure" "gethomepage.dev/icon" : "truenas.png" "gethomepage.dev/name" : "TrueNAS" "gethomepage.dev/widget.type" : "truenas" @@ -136,6 +152,14 @@ module "r730" { tls_secret_name = var.tls_secret_name backend_protocol = "HTTPS" depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "R730" + "gethomepage.dev/description" = "Dell PowerEdge server" + "gethomepage.dev/icon" = "dell.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } } # https://proxmox.viktorbarzin.me/ @@ -149,6 +173,14 @@ module "proxmox" { max_body_size = "0" # unlimited depends_on = [kubernetes_namespace.reverse-proxy] rybbit_site_id = "190a7ad3e1c7" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Proxmox" + "gethomepage.dev/description" = "Hypervisor" + "gethomepage.dev/icon" = "proxmox.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" + } } # https://registry.viktorbarzin.me/ @@ -162,6 +194,12 @@ module "docker-registry-ui" { extra_annotations = { # Override middleware chain to remove rate-limit; the UI fires many API calls to list repos/tags "traefik.ingress.kubernetes.io/router.middlewares" = "traefik-csp-headers@kubernetescrd,traefik-crowdsec@kubernetescrd,traefik-authentik-forward-auth@kubernetescrd" + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Docker Registry" + "gethomepage.dev/description" = "Container registry" + "gethomepage.dev/icon" = "docker.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/pod-selector" = "" } } @@ -174,6 +212,7 @@ module "valchedrym" { port = 80 backend_protocol = "HTTP" depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { "gethomepage.dev/enabled" = "false" } } # https://ip150.viktorbarzin.me/ @@ -199,6 +238,7 @@ module "mladost3" { port = 8080 tls_secret_name = var.tls_secret_name depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { "gethomepage.dev/enabled" = "false" } } # # https://server-switch.viktorbarzin.me/ @@ -221,6 +261,14 @@ module "ha-sofia" { depends_on = [kubernetes_namespace.reverse-proxy] protected = false rybbit_site_id = "590fc392690a" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Home Assistant Sofia" + "gethomepage.dev/description" = "Smart home hub" + "gethomepage.dev/icon" = "home-assistant.png" + "gethomepage.dev/group" = "Smart Home" + "gethomepage.dev/pod-selector" = "" + } } # https://ha-london.viktorbarzin.me/ @@ -232,6 +280,14 @@ module "ha-london" { tls_secret_name = var.tls_secret_name depends_on = [kubernetes_namespace.reverse-proxy] protected = false + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Home Assistant London" + "gethomepage.dev/description" = "Smart home hub" + "gethomepage.dev/icon" = "home-assistant.png" + "gethomepage.dev/group" = "Smart Home" + "gethomepage.dev/pod-selector" = "" + } } # https://london.viktorbarzin.me/ @@ -266,6 +322,7 @@ module "pi-lights" { tls_secret_name = var.tls_secret_name protected = true depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { "gethomepage.dev/enabled" = "false" } } # module "ups" { # .NET app doesn't work well behind host @@ -292,4 +349,5 @@ module "mbp14" { tls_secret_name = var.tls_secret_name protected = true depends_on = [kubernetes_namespace.reverse-proxy] + extra_annotations = { "gethomepage.dev/enabled" = "false" } } diff --git a/stacks/platform/modules/technitium/main.tf b/stacks/platform/modules/technitium/main.tf index 9d6c7a9b..1501acc7 100644 --- a/stacks/platform/modules/technitium/main.tf +++ b/stacks/platform/modules/technitium/main.tf @@ -291,7 +291,7 @@ module "ingress" { extra_annotations = { "gethomepage.dev/enabled" = "true" "gethomepage.dev/description" = "Internal DNS Server and Recursive Resolver" - # gethomepage.dev/group: Media + "gethomepage.dev/group" = "Infrastructure" "gethomepage.dev/icon" : "technitium.png" "gethomepage.dev/name" = "Technitium" "gethomepage.dev/widget.type" = "technitium" diff --git a/stacks/platform/modules/traefik/main.tf b/stacks/platform/modules/traefik/main.tf index d7cf1c9c..bd4bd1dd 100644 --- a/stacks/platform/modules/traefik/main.tf +++ b/stacks/platform/modules/traefik/main.tf @@ -267,6 +267,14 @@ module "ingress" { port = 8080 tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Traefik" + "gethomepage.dev/description" = "Reverse proxy & ingress" + "gethomepage.dev/icon" = "traefik.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } } # Bot-block resilience proxy: nginx reverse proxy in front of Poison Fountain diff --git a/stacks/platform/modules/uptime-kuma/main.tf b/stacks/platform/modules/uptime-kuma/main.tf index 6e69b850..5bb54561 100644 --- a/stacks/platform/modules/uptime-kuma/main.tf +++ b/stacks/platform/modules/uptime-kuma/main.tf @@ -148,7 +148,7 @@ module "ingress" { extra_annotations = { "gethomepage.dev/enabled" = "true" "gethomepage.dev/description" = "Uptime monitor" - # gethomepage.dev/group: Media + "gethomepage.dev/group" = "Core Platform" "gethomepage.dev/icon" : "uptime-kuma.png" "gethomepage.dev/name" = "Uptime Kuma" "gethomepage.dev/widget.type" = "uptimekuma" diff --git a/stacks/platform/modules/vaultwarden/main.tf b/stacks/platform/modules/vaultwarden/main.tf index f1560228..21b14d5e 100644 --- a/stacks/platform/modules/vaultwarden/main.tf +++ b/stacks/platform/modules/vaultwarden/main.tf @@ -178,4 +178,12 @@ module "ingress" { name = "vaultwarden" tls_secret_name = var.tls_secret_name rybbit_site_id = "b8fc85e18683" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Vaultwarden" + "gethomepage.dev/description" = "Password manager" + "gethomepage.dev/icon" = "vaultwarden.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/platform/modules/vpa/main.tf b/stacks/platform/modules/vpa/main.tf index 11d04a6c..cea29b57 100644 --- a/stacks/platform/modules/vpa/main.tf +++ b/stacks/platform/modules/vpa/main.tf @@ -84,6 +84,14 @@ module "ingress" { port = 80 tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Goldilocks" + "gethomepage.dev/description" = "Resource recommendations" + "gethomepage.dev/icon" = "goldilocks.png" + "gethomepage.dev/group" = "Core Platform" + "gethomepage.dev/pod-selector" = "" + } depends_on = [helm_release.goldilocks] } diff --git a/stacks/plotting-book/main.tf b/stacks/plotting-book/main.tf index 64d8e7e8..2def6198 100644 --- a/stacks/plotting-book/main.tf +++ b/stacks/plotting-book/main.tf @@ -108,4 +108,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name custom_content_security_policy = "default-src 'self' blob: data:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; connect-src 'self' blob:; frame-ancestors 'self' *.viktorbarzin.me viktorbarzin.me" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Plotting Book" + "gethomepage.dev/description" = "Interactive fiction" + "gethomepage.dev/icon" = "book.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/poison-fountain/main.tf b/stacks/poison-fountain/main.tf index 83813f50..1849e4c9 100644 --- a/stacks/poison-fountain/main.tf +++ b/stacks/poison-fountain/main.tf @@ -211,6 +211,14 @@ module "ingress" { skip_default_rate_limit = true exclude_crowdsec = true anti_ai_scraping = false + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Poison Fountain" + "gethomepage.dev/description" = "AI bot trap" + "gethomepage.dev/icon" = "shield.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } # CronJob to fetch and cache poisoned content from Poison Fountain diff --git a/stacks/privatebin/main.tf b/stacks/privatebin/main.tf index 4bbac650..84dd5feb 100644 --- a/stacks/privatebin/main.tf +++ b/stacks/privatebin/main.tf @@ -118,4 +118,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name rybbit_site_id = "3ae810b0476d" custom_content_security_policy = "script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval' https://rybbit.viktorbarzin.me" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "PrivateBin" + "gethomepage.dev/description" = "Encrypted pastebin" + "gethomepage.dev/icon" = "privatebin.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/real-estate-crawler/main.tf b/stacks/real-estate-crawler/main.tf index bfb91352..05b7dc4e 100644 --- a/stacks/real-estate-crawler/main.tf +++ b/stacks/real-estate-crawler/main.tf @@ -261,6 +261,14 @@ module "ingress" { service_name = "realestate-crawler-ui" tls_secret_name = var.tls_secret_name rybbit_site_id = "edee05de453d" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Wrongmove" + "gethomepage.dev/description" = "Property search" + "gethomepage.dev/icon" = "home-assistant.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } module "ingress-api" { @@ -271,6 +279,9 @@ module "ingress-api" { service_name = "realestate-crawler-api" ingress_path = ["/api"] tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "false" + } } diff --git a/stacks/resume/main.tf b/stacks/resume/main.tf index 4b3d67b1..1738d278 100644 --- a/stacks/resume/main.tf +++ b/stacks/resume/main.tf @@ -295,4 +295,12 @@ module "ingress" { namespace = kubernetes_namespace.resume.metadata[0].name name = "resume" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Resume" + "gethomepage.dev/description" = "Online resume" + "gethomepage.dev/icon" = "resume.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/rybbit/main.tf b/stacks/rybbit/main.tf index 97fa1f4d..9477f65f 100644 --- a/stacks/rybbit/main.tf +++ b/stacks/rybbit/main.tf @@ -444,6 +444,14 @@ module "ingress" { service_name = "rybbit-client" tls_secret_name = var.tls_secret_name rybbit_site_id = "3c476801a777" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Rybbit" + "gethomepage.dev/description" = "Web analytics" + "gethomepage.dev/icon" = "rybbit.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } module "ingress-api" { @@ -454,4 +462,7 @@ module "ingress-api" { service_name = "rybbit" ingress_path = ["/api"] tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "false" + } } diff --git a/stacks/send/main.tf b/stacks/send/main.tf index fe9f3e32..1991476b 100644 --- a/stacks/send/main.tf +++ b/stacks/send/main.tf @@ -138,4 +138,12 @@ module "ingress" { tls_secret_name = var.tls_secret_name port = 1443 rybbit_site_id = "c1b8f8aa831b" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Send" + "gethomepage.dev/description" = "Encrypted file sharing" + "gethomepage.dev/icon" = "firefox-send.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/servarr/aiostreams/main.tf b/stacks/servarr/aiostreams/main.tf index 73f1d72f..dc2574d3 100644 --- a/stacks/servarr/aiostreams/main.tf +++ b/stacks/servarr/aiostreams/main.tf @@ -118,4 +118,12 @@ module "ingress" { name = "aiostreams" tls_secret_name = var.tls_secret_name # protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "AIOStreams" + "gethomepage.dev/description" = "Streaming addon manager" + "gethomepage.dev/icon" = "stremio.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/servarr/flaresolverr/main.tf b/stacks/servarr/flaresolverr/main.tf index 6fa648ab..c1d6db15 100644 --- a/stacks/servarr/flaresolverr/main.tf +++ b/stacks/servarr/flaresolverr/main.tf @@ -67,8 +67,12 @@ module "ingress" { name = "flaresolverr" tls_secret_name = var.tls_secret_name protected = true - # extra_annotations = { - # "nginx.ingress.kubernetes.io/proxy-body-size" : "1G" // allow uploading .torrent files - # } - + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "FlareSolverr" + "gethomepage.dev/description" = "Captcha solver proxy" + "gethomepage.dev/icon" = "flaresolverr.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/servarr/listenarr/main.tf b/stacks/servarr/listenarr/main.tf index adade2d1..cc51a874 100644 --- a/stacks/servarr/listenarr/main.tf +++ b/stacks/servarr/listenarr/main.tf @@ -112,4 +112,12 @@ module "ingress" { name = "listenarr" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Listenarr" + "gethomepage.dev/description" = "Podcast manager" + "gethomepage.dev/icon" = "podcast.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/servarr/prowlarr/main.tf b/stacks/servarr/prowlarr/main.tf index 042efda5..28e52e47 100644 --- a/stacks/servarr/prowlarr/main.tf +++ b/stacks/servarr/prowlarr/main.tf @@ -122,4 +122,12 @@ module "ingress" { name = "prowlarr" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Prowlarr" + "gethomepage.dev/description" = "Indexer manager" + "gethomepage.dev/icon" = "prowlarr.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/servarr/qbittorrent/main.tf b/stacks/servarr/qbittorrent/main.tf index 316fb70f..7767a985 100644 --- a/stacks/servarr/qbittorrent/main.tf +++ b/stacks/servarr/qbittorrent/main.tf @@ -155,4 +155,12 @@ module "ingress" { name = "qbittorrent" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "qBittorrent" + "gethomepage.dev/description" = "BitTorrent client" + "gethomepage.dev/icon" = "qbittorrent.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/speedtest/main.tf b/stacks/speedtest/main.tf index 8c636154..220aa39a 100644 --- a/stacks/speedtest/main.tf +++ b/stacks/speedtest/main.tf @@ -173,4 +173,14 @@ module "ingress" { name = "speedtest" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Speedtest" + "gethomepage.dev/description" = "Internet speed tracker" + "gethomepage.dev/icon" = "speedtest-tracker.png" + "gethomepage.dev/group" = "Infrastructure" + "gethomepage.dev/widget.type" = "speedtest" + "gethomepage.dev/widget.url" = "https://speedtest.viktorbarzin.me" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/stirling-pdf/main.tf b/stacks/stirling-pdf/main.tf index 6769a2c5..ae3b8bab 100644 --- a/stacks/stirling-pdf/main.tf +++ b/stacks/stirling-pdf/main.tf @@ -112,4 +112,12 @@ module "ingress" { name = "stirling-pdf" tls_secret_name = var.tls_secret_name rybbit_site_id = "a55ac54ec749" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Stirling PDF" + "gethomepage.dev/description" = "PDF toolkit" + "gethomepage.dev/icon" = "stirling-pdf.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/tandoor/main.tf b/stacks/tandoor/main.tf index 5e4b4de7..a9200c30 100644 --- a/stacks/tandoor/main.tf +++ b/stacks/tandoor/main.tf @@ -199,4 +199,12 @@ module "ingress" { namespace = kubernetes_namespace.tandoor.metadata[0].name name = "tandoor" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Tandoor" + "gethomepage.dev/description" = "Recipe manager" + "gethomepage.dev/icon" = "tandoor.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/trading-bot/main.tf b/stacks/trading-bot/main.tf index c0232067..811812c1 100644 --- a/stacks/trading-bot/main.tf +++ b/stacks/trading-bot/main.tf @@ -484,4 +484,12 @@ module "ingress" { service_name = "trading-bot-frontend" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Trading Bot" + "gethomepage.dev/description" = "Automated trading" + "gethomepage.dev/icon" = "alpaca.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/travel_blog/main.tf b/stacks/travel_blog/main.tf index 1823b621..bb247382 100644 --- a/stacks/travel_blog/main.tf +++ b/stacks/travel_blog/main.tf @@ -101,4 +101,12 @@ module "ingress" { name = "travel" tls_secret_name = var.tls_secret_name service_name = "travel-blog" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Travel Blog" + "gethomepage.dev/description" = "Travel stories" + "gethomepage.dev/icon" = "ghost.png" + "gethomepage.dev/group" = "Other" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/tuya-bridge/main.tf b/stacks/tuya-bridge/main.tf index 7ba1cdac..c69d19bf 100644 --- a/stacks/tuya-bridge/main.tf +++ b/stacks/tuya-bridge/main.tf @@ -120,4 +120,12 @@ module "ingress" { namespace = kubernetes_namespace.tuya-bridge.metadata[0].name name = "tuya-bridge" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Tuya Bridge" + "gethomepage.dev/description" = "Smart device bridge" + "gethomepage.dev/icon" = "tuya-smart.png" + "gethomepage.dev/group" = "Smart Home" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/url/main.tf b/stacks/url/main.tf index 3c157216..a9609ef5 100644 --- a/stacks/url/main.tf +++ b/stacks/url/main.tf @@ -204,12 +204,19 @@ resource "kubernetes_service" "shlink" { } module "ingress" { - source = "../../modules/kubernetes/ingress_factory" - namespace = kubernetes_namespace.shlink.metadata[0].name - name = "url" - service_name = "shlink" - tls_secret_name = var.tls_secret_name - extra_annotations = {} + source = "../../modules/kubernetes/ingress_factory" + namespace = kubernetes_namespace.shlink.metadata[0].name + name = "url" + service_name = "shlink" + tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Shlink" + "gethomepage.dev/description" = "URL shortener" + "gethomepage.dev/icon" = "shlink.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } @@ -341,4 +348,12 @@ module "ingress-web" { service_name = "shlink-web" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "false" + "gethomepage.dev/name" = "Shlink Web" + "gethomepage.dev/description" = "URL shortener web client" + "gethomepage.dev/icon" = "shlink.png" + "gethomepage.dev/group" = "Productivity" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/wealthfolio/main.tf b/stacks/wealthfolio/main.tf index 5db6574c..62ed616b 100644 --- a/stacks/wealthfolio/main.tf +++ b/stacks/wealthfolio/main.tf @@ -151,4 +151,12 @@ module "ingress" { name = "wealthfolio" tls_secret_name = var.tls_secret_name protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Wealthfolio" + "gethomepage.dev/description" = "Investment portfolio tracker" + "gethomepage.dev/icon" = "wealthfolio.png" + "gethomepage.dev/group" = "Finance & Personal" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/webhook_handler/main.tf b/stacks/webhook_handler/main.tf index aede18e5..c8bb6656 100644 --- a/stacks/webhook_handler/main.tf +++ b/stacks/webhook_handler/main.tf @@ -218,4 +218,12 @@ module "ingress" { name = "webhook-handler" host = "webhook" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Webhook Handler" + "gethomepage.dev/description" = "Webhook relay" + "gethomepage.dev/icon" = "webhook.png" + "gethomepage.dev/group" = "Automation" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/woodpecker/main.tf b/stacks/woodpecker/main.tf index 3ab435d1..f083480c 100644 --- a/stacks/woodpecker/main.tf +++ b/stacks/woodpecker/main.tf @@ -205,4 +205,12 @@ module "ingress" { name = "ci" service_name = "woodpecker-server" tls_secret_name = var.tls_secret_name + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "Woodpecker CI" + "gethomepage.dev/description" = "CI/CD pipelines" + "gethomepage.dev/icon" = "woodpecker-ci.png" + "gethomepage.dev/group" = "Development & CI" + "gethomepage.dev/pod-selector" = "" + } } diff --git a/stacks/ytdlp/main.tf b/stacks/ytdlp/main.tf index baab8535..a42b2210 100644 --- a/stacks/ytdlp/main.tf +++ b/stacks/ytdlp/main.tf @@ -154,6 +154,14 @@ module "ingress" { name = "ytdlp" tls_secret_name = var.tls_secret_name host = "yt" + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "yt-dlp" + "gethomepage.dev/description" = "Video downloader" + "gethomepage.dev/icon" = "youtube-dl.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } } # ---------------------- @@ -349,4 +357,12 @@ module "highlights_ingress" { tls_secret_name = var.tls_secret_name host = "yt-highlights" protected = true + extra_annotations = { + "gethomepage.dev/enabled" = "true" + "gethomepage.dev/name" = "YT Highlights" + "gethomepage.dev/description" = "AI video highlights" + "gethomepage.dev/icon" = "youtube.png" + "gethomepage.dev/group" = "Media & Entertainment" + "gethomepage.dev/pod-selector" = "" + } }