Replace hajimari with gethomepage (#75)

## 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
This commit is contained in:
Erich Blume 2026-01-30 13:21:12 -08:00
commit 38538ad5f0
14 changed files with 180 additions and 188 deletions

View file

@ -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

30
argocd/apps/homepage.yaml Normal file
View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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: