From 38538ad5f021ebaf52427c18d9d4dace35e5c1e0 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Fri, 30 Jan 2026 13:21:12 -0800 Subject: [PATCH] Replace hajimari with gethomepage (#75) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Remove hajimari (unmaintained since Oct 2022, broken helm deps) - Add gethomepage (28k stars, actively maintained, monthly releases) - Migrate custom apps, bookmarks, and search config - Enable k8s RBAC for service autodiscovery - Configure Tailscale ingress at go.tail8d86e.ts.net ## Why the switch Hajimari hasn't released since October 2022. The helm chart has a broken dependency (bjw-s/common URL is 404), and unreleased code on main has bugs. gethomepage has similar k8s autodiscovery via ingress annotations and is very actively maintained. ## Deployment and Testing - [ ] Delete hajimari app from ArgoCD - [ ] Delete hajimari namespace - [ ] Sync apps to pick up new homepage app - [ ] Sync homepage app - [ ] Verify go.ops.eblu.me loads 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: https://forge.ops.eblu.me/eblume/blumeops/pulls/75 --- argocd/apps/hajimari.yaml | 33 ------- argocd/apps/homepage.yaml | 30 ++++++ .../manifests/argocd/service-tailscale.yaml | 13 +-- argocd/manifests/devpi/ingress-tailscale.yaml | 13 +-- .../grafana-config/ingress-tailscale.yaml | 13 +-- argocd/manifests/hajimari/values.yaml | 95 ------------------- argocd/manifests/homepage/values.yaml | 86 +++++++++++++++++ .../manifests/immich/ingress-tailscale.yaml | 13 +-- argocd/manifests/kiwix/ingress-tailscale.yaml | 13 +-- argocd/manifests/loki/ingress-tailscale.yaml | 7 +- .../manifests/miniflux/ingress-tailscale.yaml | 13 +-- .../prometheus/ingress-tailscale.yaml | 13 +-- .../teslamate/ingress-tailscale.yaml | 13 +-- .../manifests/torrent/ingress-tailscale.yaml | 13 +-- 14 files changed, 180 insertions(+), 188 deletions(-) delete mode 100644 argocd/apps/hajimari.yaml create mode 100644 argocd/apps/homepage.yaml delete mode 100644 argocd/manifests/hajimari/values.yaml create mode 100644 argocd/manifests/homepage/values.yaml diff --git a/argocd/apps/hajimari.yaml b/argocd/apps/hajimari.yaml deleted file mode 100644 index f43e42e..0000000 --- a/argocd/apps/hajimari.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# Hajimari - Service Dashboard / Start Page -# -# Using custom fork from forge.ops.eblu.me/eblume/hajimari -# Fork enables custom builds with search auto-focus, weather widget, etc. -# -# Auto-discovers k8s services via ingress annotations and displays -# custom apps for non-k8s services (Forge, Registry, NAS). -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: hajimari - namespace: argocd -spec: - project: default - sources: - # Helm chart from our fork - - repoURL: ssh://forgejo@forge.ops.eblu.me:2222/eblume/hajimari.git - targetRevision: v0.3.1-blumeops.1 - path: charts/hajimari - helm: - releaseName: hajimari - valueFiles: - - $values/argocd/manifests/hajimari/values.yaml - # Values from blumeops repo - - repoURL: ssh://forgejo@forge.ops.eblu.me:2222/eblume/blumeops.git - targetRevision: main - ref: values - destination: - server: https://kubernetes.default.svc - namespace: hajimari - syncPolicy: - syncOptions: - - CreateNamespace=true diff --git a/argocd/apps/homepage.yaml b/argocd/apps/homepage.yaml new file mode 100644 index 0000000..4521eaf --- /dev/null +++ b/argocd/apps/homepage.yaml @@ -0,0 +1,30 @@ +# Homepage - Service Dashboard / Start Page +# +# Replaced hajimari with gethomepage for active maintenance and better features. +# Auto-discovers k8s services via ingress annotations. +# +# Helm chart: https://github.com/jameswynn/helm-charts/tree/main/charts/homepage +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: homepage + namespace: argocd +spec: + project: default + sources: + - repoURL: https://jameswynn.github.io/helm-charts + chart: homepage + targetRevision: 2.1.0 + helm: + releaseName: homepage + valueFiles: + - $values/argocd/manifests/homepage/values.yaml + - repoURL: ssh://forgejo@forge.ops.eblu.me:2222/eblume/blumeops.git + targetRevision: main + ref: values + destination: + server: https://kubernetes.default.svc + namespace: homepage + syncPolicy: + syncOptions: + - CreateNamespace=true diff --git a/argocd/manifests/argocd/service-tailscale.yaml b/argocd/manifests/argocd/service-tailscale.yaml index 33377c0..d75b326 100644 --- a/argocd/manifests/argocd/service-tailscale.yaml +++ b/argocd/manifests/argocd/service-tailscale.yaml @@ -11,12 +11,13 @@ metadata: namespace: argocd annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://argocd.ops.eblu.me" - hajimari.io/icon: "simple-icons:argo" - hajimari.io/appName: "ArgoCD" - hajimari.io/group: "Infrastructure" - hajimari.io/info: "GitOps CD" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "ArgoCD" + gethomepage.dev/group: "Infrastructure" + gethomepage.dev/icon: "argocd.png" + gethomepage.dev/description: "GitOps CD" + gethomepage.dev/href: "https://argocd.ops.eblu.me" + gethomepage.dev/pod-selector: "app.kubernetes.io/name=argocd-server" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/devpi/ingress-tailscale.yaml b/argocd/manifests/devpi/ingress-tailscale.yaml index 8ab7c0f..08a13ed 100644 --- a/argocd/manifests/devpi/ingress-tailscale.yaml +++ b/argocd/manifests/devpi/ingress-tailscale.yaml @@ -5,12 +5,13 @@ metadata: namespace: devpi annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://pypi.ops.eblu.me" - hajimari.io/icon: "simple-icons:pypi" - hajimari.io/appName: "PyPI" - hajimari.io/group: "Infrastructure" - hajimari.io/info: "PyPI cache" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "PyPI" + gethomepage.dev/group: "Infrastructure" + gethomepage.dev/icon: "pypi.png" + gethomepage.dev/description: "PyPI cache" + gethomepage.dev/href: "https://pypi.ops.eblu.me" + gethomepage.dev/pod-selector: "app=devpi" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/grafana-config/ingress-tailscale.yaml b/argocd/manifests/grafana-config/ingress-tailscale.yaml index 2c84ab9..23603ba 100644 --- a/argocd/manifests/grafana-config/ingress-tailscale.yaml +++ b/argocd/manifests/grafana-config/ingress-tailscale.yaml @@ -9,12 +9,13 @@ metadata: namespace: monitoring annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://grafana.ops.eblu.me" - hajimari.io/icon: "simple-icons:grafana" - hajimari.io/appName: "Grafana" - hajimari.io/group: "Observability" - hajimari.io/info: "Metrics dashboards" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Grafana" + gethomepage.dev/group: "Observability" + gethomepage.dev/icon: "grafana.png" + gethomepage.dev/description: "Metrics dashboards" + gethomepage.dev/href: "https://grafana.ops.eblu.me" + gethomepage.dev/pod-selector: "app.kubernetes.io/name=grafana" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/hajimari/values.yaml b/argocd/manifests/hajimari/values.yaml deleted file mode 100644 index ebafe6c..0000000 --- a/argocd/manifests/hajimari/values.yaml +++ /dev/null @@ -1,95 +0,0 @@ -# Hajimari values for blumeops -# Service dashboard at go.ops.eblu.me - -# Use custom image from our fork -image: - repository: registry.ops.eblu.me/blumeops/hajimari - tag: v0.3.1-blumeops.1 - -# Page settings -hajimari: - title: BlumeOps - name: Erich - defaultEnable: true - - # Display settings - showAppGroups: true - showAppUrls: false - showAppInfo: true - - # Search - default to Kagi - defaultSearchProvider: Kagi - searchProviders: - - name: Kagi - token: k - icon: simple-icons:kagi - searchUrl: https://kagi.com/search?q={query} - url: https://kagi.com - - name: Google - token: g - icon: simple-icons:google - searchUrl: https://www.google.com/search?q={query} - url: https://www.google.com - - name: DuckDuckGo - token: d - icon: simple-icons:duckduckgo - searchUrl: https://duckduckgo.com/?q={query} - url: https://duckduckgo.com - - # Discover ingresses from all namespaces - namespaceSelector: - any: true - - # Non-k8s services (hosted on indri or LAN) - customApps: - - group: Host Services - apps: - - name: Forgejo - url: https://forge.ops.eblu.me - icon: simple-icons:forgejo - info: Git forge - - name: Registry - url: https://registry.ops.eblu.me - icon: mdi:docker - info: Container registry - - name: Sifaka NAS - url: https://nas.ops.eblu.me - icon: simple-icons:synology - info: NAS dashboard - - # Useful external bookmarks - globalBookmarks: - - group: Admin - bookmarks: - - name: Tailscale Admin - url: https://login.tailscale.com/admin - - name: 1Password - url: https://my.1password.com - - name: Pulumi - url: https://app.pulumi.com/eblume/blumeops-tailnet - -# Service account for reading ingresses across namespaces -serviceAccount: - create: true - -# Tailscale Ingress - exposes at go.tail8d86e.ts.net -# Caddy will proxy go.ops.eblu.me to this -ingress: - main: - enabled: true - ingressClassName: tailscale - annotations: - hajimari.io/enable: "false" - hosts: - - host: go - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - go - -# No persistence needed - config is in values.yaml -persistence: - data: - enabled: false diff --git a/argocd/manifests/homepage/values.yaml b/argocd/manifests/homepage/values.yaml new file mode 100644 index 0000000..4c07899 --- /dev/null +++ b/argocd/manifests/homepage/values.yaml @@ -0,0 +1,86 @@ +# Homepage values for blumeops +# Service dashboard at go.ops.eblu.me + +# Enable RBAC for Kubernetes service autodiscovery +enableRbac: true + +serviceAccount: + create: true + +# Tailscale Ingress - exposes at go.tail8d86e.ts.net +# Caddy proxies go.ops.eblu.me to this +ingress: + main: + enabled: true + ingressClassName: tailscale + annotations: + gethomepage.dev/enabled: "false" + hosts: + - host: go + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - go + +env: + - name: HOMEPAGE_ALLOWED_HOSTS + value: "go.tail8d86e.ts.net,go.ops.eblu.me" + +config: + # Host services (non-k8s, on indri or LAN) + services: + - Host Services: + - Forgejo: + href: https://forge.ops.eblu.me + icon: forgejo + description: Git forge + - Registry: + href: https://registry.ops.eblu.me + icon: docker + description: Container registry + - Sifaka NAS: + href: https://nas.ops.eblu.me + icon: synology + description: NAS dashboard + + # External bookmarks + bookmarks: + - Admin: + - Tailscale Admin: + - href: https://login.tailscale.com/admin + icon: tailscale + - 1Password: + - href: https://my.1password.com + icon: 1password + - Pulumi: + - href: https://app.pulumi.com/eblume/blumeops-tailnet + icon: pulumi + + # Widgets on the page + # Note: Kubernetes widget disabled - requires metrics-server + widgets: + - search: + provider: custom + url: https://kagi.com/search?q= + target: _blank + suggestionUrl: https://kagisuggest.com/api/autosuggest?q= + + # Kubernetes autodiscovery + kubernetes: + mode: cluster + + # Layout and styling + settingsString: | + title: BlumeOps + headerStyle: boxed + layout: + Host Services: + style: column + Apps: + style: column + Observability: + style: column + Infrastructure: + style: column diff --git a/argocd/manifests/immich/ingress-tailscale.yaml b/argocd/manifests/immich/ingress-tailscale.yaml index e7aca59..31c7858 100644 --- a/argocd/manifests/immich/ingress-tailscale.yaml +++ b/argocd/manifests/immich/ingress-tailscale.yaml @@ -8,12 +8,13 @@ metadata: namespace: immich annotations: tailscale.com/funnel: "false" - hajimari.io/enable: "true" - hajimari.io/url: "https://photos.ops.eblu.me" - hajimari.io/icon: "simple-icons:immich" - hajimari.io/appName: "Immich" - hajimari.io/group: "Apps" - hajimari.io/info: "Photo management" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Immich" + gethomepage.dev/group: "Apps" + gethomepage.dev/icon: "immich.png" + gethomepage.dev/description: "Photo management" + gethomepage.dev/href: "https://photos.ops.eblu.me" + gethomepage.dev/pod-selector: "app.kubernetes.io/name=server" spec: ingressClassName: tailscale rules: diff --git a/argocd/manifests/kiwix/ingress-tailscale.yaml b/argocd/manifests/kiwix/ingress-tailscale.yaml index 661cb83..c3aeb4c 100644 --- a/argocd/manifests/kiwix/ingress-tailscale.yaml +++ b/argocd/manifests/kiwix/ingress-tailscale.yaml @@ -6,12 +6,13 @@ metadata: namespace: kiwix annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://kiwix.ops.eblu.me" - hajimari.io/icon: "mdi:wikipedia" - hajimari.io/appName: "Kiwix" - hajimari.io/group: "Apps" - hajimari.io/info: "Offline Wikipedia" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Kiwix" + gethomepage.dev/group: "Apps" + gethomepage.dev/icon: "kiwix.png" + gethomepage.dev/description: "Offline Wikipedia" + gethomepage.dev/href: "https://kiwix.ops.eblu.me" + gethomepage.dev/pod-selector: "app=kiwix" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/loki/ingress-tailscale.yaml b/argocd/manifests/loki/ingress-tailscale.yaml index 252e52e..ed18781 100644 --- a/argocd/manifests/loki/ingress-tailscale.yaml +++ b/argocd/manifests/loki/ingress-tailscale.yaml @@ -7,12 +7,7 @@ metadata: namespace: monitoring annotations: tailscale.com/funnel: "false" - hajimari.io/enable: "false" - hajimari.io/url: "https://loki.ops.eblu.me" - hajimari.io/icon: "mdi:text-box-search" - hajimari.io/appName: "Loki" - hajimari.io/group: "Observability" - hajimari.io/info: "Log aggregation" + gethomepage.dev/enabled: "false" spec: ingressClassName: tailscale rules: diff --git a/argocd/manifests/miniflux/ingress-tailscale.yaml b/argocd/manifests/miniflux/ingress-tailscale.yaml index 9ec90e5..ad7de3f 100644 --- a/argocd/manifests/miniflux/ingress-tailscale.yaml +++ b/argocd/manifests/miniflux/ingress-tailscale.yaml @@ -5,12 +5,13 @@ metadata: namespace: miniflux annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://feed.ops.eblu.me" - hajimari.io/icon: "mdi:rss" - hajimari.io/appName: "Miniflux" - hajimari.io/group: "Apps" - hajimari.io/info: "RSS reader" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Miniflux" + gethomepage.dev/group: "Apps" + gethomepage.dev/icon: "miniflux.png" + gethomepage.dev/description: "RSS reader" + gethomepage.dev/href: "https://feed.ops.eblu.me" + gethomepage.dev/pod-selector: "app=miniflux" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/prometheus/ingress-tailscale.yaml b/argocd/manifests/prometheus/ingress-tailscale.yaml index 941cf92..45b88a7 100644 --- a/argocd/manifests/prometheus/ingress-tailscale.yaml +++ b/argocd/manifests/prometheus/ingress-tailscale.yaml @@ -7,12 +7,13 @@ metadata: namespace: monitoring annotations: tailscale.com/funnel: "false" - hajimari.io/enable: "true" - hajimari.io/url: "https://prometheus.ops.eblu.me" - hajimari.io/icon: "simple-icons:prometheus" - hajimari.io/appName: "Prometheus" - hajimari.io/group: "Observability" - hajimari.io/info: "Metrics storage" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Prometheus" + gethomepage.dev/group: "Observability" + gethomepage.dev/icon: "prometheus.png" + gethomepage.dev/description: "Metrics storage" + gethomepage.dev/href: "https://prometheus.ops.eblu.me" + gethomepage.dev/pod-selector: "app=prometheus" spec: ingressClassName: tailscale rules: diff --git a/argocd/manifests/teslamate/ingress-tailscale.yaml b/argocd/manifests/teslamate/ingress-tailscale.yaml index 8ccfcf1..2f10f2d 100644 --- a/argocd/manifests/teslamate/ingress-tailscale.yaml +++ b/argocd/manifests/teslamate/ingress-tailscale.yaml @@ -5,12 +5,13 @@ metadata: namespace: teslamate annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://tesla.ops.eblu.me" - hajimari.io/icon: "simple-icons:tesla" - hajimari.io/appName: "TeslaMate" - hajimari.io/group: "Apps" - hajimari.io/info: "Tesla data logger" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "TeslaMate" + gethomepage.dev/group: "Apps" + gethomepage.dev/icon: "teslamate.png" + gethomepage.dev/description: "Tesla data logger" + gethomepage.dev/href: "https://tesla.ops.eblu.me" + gethomepage.dev/pod-selector: "app=teslamate" spec: ingressClassName: tailscale defaultBackend: diff --git a/argocd/manifests/torrent/ingress-tailscale.yaml b/argocd/manifests/torrent/ingress-tailscale.yaml index 82039ee..ac77e9c 100644 --- a/argocd/manifests/torrent/ingress-tailscale.yaml +++ b/argocd/manifests/torrent/ingress-tailscale.yaml @@ -6,12 +6,13 @@ metadata: namespace: torrent annotations: tailscale.com/proxy-class: "default" - hajimari.io/enable: "true" - hajimari.io/url: "https://torrent.ops.eblu.me" - hajimari.io/icon: "mdi:download" - hajimari.io/appName: "Transmission" - hajimari.io/group: "Apps" - hajimari.io/info: "Torrent client" + gethomepage.dev/enabled: "true" + gethomepage.dev/name: "Transmission" + gethomepage.dev/group: "Apps" + gethomepage.dev/icon: "transmission.png" + gethomepage.dev/description: "Torrent client" + gethomepage.dev/href: "https://torrent.ops.eblu.me" + gethomepage.dev/pod-selector: "app=transmission" spec: ingressClassName: tailscale defaultBackend: