Skip to content

Add homepage (gethomepage.dev) on picon - #105

Open
max06 wants to merge 1 commit into
mainfrom
add-homepage
Open

max06 wants to merge 1 commit into
mainfrom
add-homepage

Conversation

@max06

@max06 max06 commented Sep 27, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces the unfinished in-repo apps/homepage chart with an ATLAS app template built on M0NsTeRRR/homepage (oci://ghcr.io/m0nsterrr/helm-charts, chart 5.4.0 / homepage v2.4.0). It follows upstream releases within hours and ships the ClusterRole the kubernetes integration needs. The previously used jameswynn chart hasn't been updated since May 2025 and is stuck on homepage v1.2.0.
  • Config: homepage's config files are rendered from the homepageConfig values key into a ConfigMap by a bedag/raw companion release. homepageConfig can be overridden at any ATLAS level. The ConfigMap is mounted as a directory and homepage points at it via HOMEPAGE_CONFIG_DIR, so edits go live within the kubelet sync period without a restart.
  • Deployment on picon: serves h.<primary_domain> on traefik's webinternal entrypoint (LAN-only, same pattern as dsh) with the kubernetes info widget. It also has pod-linked tiles for Home Assistant, n8n, dsh and Pi-hole, whose hosts come from the SOPS primary_domain.

Testing

Rendered via the repo entry (ATLAS@main), then applied by hand to a homepage namespace on picon and removed afterwards:

  • https://h.max06.net returned 200 through the internal LB, and external-dns published the record.
  • /api/widgets/kubernetes returned cluster totals plus all 4 nodes, so RBAC and metrics-server work.
  • /api/kubernetes/{status,stats} reported running with CPU/memory for all four seeded services.
  • A ConfigMap edit showed up in /api/services after about 50s, with no pod restart.

Notes

  • autoSync: false, matching the other picon deployments, so the first sync is manual in ArgoCD.
  • Out of band while testing: removed the stale cert-manager-webhook-inwx helm release from picon. Its expired serving cert broke API discovery and blocked every namespace deletion. The Cloudflare letsencrypt ClusterIssuer and the wildcard cert are unaffected.

🤖 Generated with Claude Code

Replace the unfinished in-repo homepage chart with an ATLAS app template
built on the maintained M0NsTeRRR/homepage chart (OCI, tracks upstream
releases). Config files are rendered from the `homepageConfig` values key
into a ConfigMap (bedag/raw) and mounted as a directory via
HOMEPAGE_CONFIG_DIR, so edits go live without a pod restart.

Deploy to picon on h.<primary_domain>, internal-only via traefik's
webinternal entrypoint, with the kubernetes info widget and pod-linked
tiles for Home Assistant, n8n, dsh and Pi-hole.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ATLAS Review

Changes detected in 8 resource(s) across 2 release(s).
Please review before merging.

Affected releases

cyrannus/picon / homepage / homepage (new) (7 resources)
ClusterRole/homepage (new) (63 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/rbac.yaml
+ apiVersion: rbac.authorization.k8s.io/v1
+ kind: ClusterRole
+ metadata:
+   name: homepage
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+ rules:
+   - apiGroups:
+       - ""
+     resources:
+       - namespaces
+       - pods
+       - nodes
+     verbs:
+       - get
+       - list
+   - apiGroups:
+       - extensions
+       - networking.k8s.io
+     resources:
+       - ingresses
+     verbs:
+       - get
+       - list
+   - apiGroups:
+       - gateway.networking.k8s.io
+     resources:
+       - httproutes
+       - gateways
+     verbs:
+       - get
+       - list
+   - apiGroups:
+       - traefik.containo.us
+       - traefik.io
+     resources:
+       - ingressroutes
+     verbs:
+       - get
+       - list
+   - apiGroups:
+       - metrics.k8s.io
+     resources:
+       - nodes
+       - pods
+     verbs:
+       - get
+       - list
+   - apiGroups:
+       - apiextensions.k8s.io
+     resources:
+       - customresourcedefinitions/status
+     verbs:
+       - get
ClusterRoleBinding/homepage (new) (22 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/rbac.yaml
+ apiVersion: rbac.authorization.k8s.io/v1
+ kind: ClusterRoleBinding
+ metadata:
+   name: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+ roleRef:
+   apiGroup: rbac.authorization.k8s.io
+   kind: ClusterRole
+   name: homepage
+ subjects:
+   - kind: ServiceAccount
+     name: homepage
+     namespace: "homepage"
Deployment/homepage (new) (98 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/deployment.yaml
+ apiVersion: apps/v1
+ kind: Deployment
+ metadata:
+   name: homepage
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+ spec:
+   replicas: 1
+   selector:
+     matchLabels:
+       app.kubernetes.io/name: homepage
+       app.kubernetes.io/instance: homepage
+   template:
+     metadata:
+       labels:
+         helm.sh/chart: homepage-5.4.0
+         app.kubernetes.io/name: homepage
+         app.kubernetes.io/instance: homepage
+         app.kubernetes.io/version: "v2.4.0"
+         app.kubernetes.io/part-of: homepage
+         app.kubernetes.io/managed-by: Helm
+     spec:
+       serviceAccountName: homepage
+       securityContext:
+         fsGroup: 1000
+         fsGroupChangePolicy: OnRootMismatch
+       containers:
+         - name: homepage
+           securityContext:
+             allowPrivilegeEscalation: false
+             capabilities:
+               drop:
+                 - ALL
+             privileged: false
+             readOnlyRootFilesystem: false
+             runAsGroup: 1000
+             runAsNonRoot: true
+             runAsUser: 1000
+             seccompProfile:
+               type: RuntimeDefault
+           image: "ghcr.io/gethomepage/homepage:v2.4.0"
+           imagePullPolicy: IfNotPresent
+           ports:
+             - name: http
+               containerPort: 3000
+               protocol: TCP
+           livenessProbe:
+             httpGet:
+               path: /api/healthcheck
+               port: http
+           readinessProbe:
+             httpGet:
+               path: /api/healthcheck
+               port: http
+           resources:
+             limits:
+               memory: 512Mi
+             requests:
+               cpu: 50m
+               memory: 128Mi
+           env:
+             - name: PUID
+               value: "1000"
+             - name: PGID
+               value: "1000"
+             - name: POD_IP
+               valueFrom:
+                 fieldRef:
+                   fieldPath: status.podIP
+             - name: HOMEPAGE_ALLOWED_HOSTS
+               value: h.max06.net,homepage,homepage.homepage,homepage.homepage.svc,homepage.homepage.svc.cluster,homepage.homepage.svc.cluster.local,$(POD_IP):3000
+             - name: HOMEPAGE_CONFIG_DIR
+               value: /app/config-managed
+           volumeMounts:
+             - name: config
+               mountPath: /app/config
+             - name: logs
+               mountPath: /app/config/logs
+             - mountPath: /app/config-managed
+               name: config-managed
+               readOnly: true
+       volumes:
+         - name: config
+           emptyDir: {}
+         - name: logs
+           emptyDir: {}
+         - configMap:
+             name: homepage-config
+           name: config-managed
Ingress/homepage (new) (30 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/ingress.yaml
+ apiVersion: networking.k8s.io/v1
+ kind: Ingress
+ metadata:
+   name: homepage
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+   annotations:
+     external-dns.alpha.kubernetes.io/target: 192.168.30.241
+     traefik.ingress.kubernetes.io/router.entrypoints: webinternal
+ spec:
+   rules:
+     - host: "h.REDAC.RED"
+       http:
+         paths:
+           - path: /
+             pathType: Prefix
+             backend:
+               service:
+                 name: homepage
+                 port:
+                   number: 80
Service/homepage (new) (26 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/service.yaml
+ apiVersion: v1
+ kind: Service
+ metadata:
+   name: homepage
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+ spec:
+   type: ClusterIP
+   ports:
+     - port: 80
+       targetPort: http
+       protocol: TCP
+       name: http
+   selector:
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+   ipFamilyPolicy: PreferDualStack
ServiceAccount/homepage (new) (16 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/serviceaccount.yaml
+ apiVersion: v1
+ kind: ServiceAccount
+ metadata:
+   name: homepage
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+ automountServiceAccountToken: true
Pod/"homepage-test-connection" (new) (24 lines)
! + entire resource added:
+ ---
+ # Source: homepage/templates/tests/test-connection.yaml
+ apiVersion: v1
+ kind: Pod
+ metadata:
+   name: "homepage-test-connection"
+   namespace: homepage
+   labels:
+     helm.sh/chart: homepage-5.4.0
+     app.kubernetes.io/name: homepage
+     app.kubernetes.io/instance: homepage
+     app.kubernetes.io/version: "v2.4.0"
+     app.kubernetes.io/part-of: homepage
+     app.kubernetes.io/managed-by: Helm
+   annotations:
+     "helm.sh/hook": test
+ spec:
+   containers:
+     - name: wget
+       image: busybox
+       command: ['wget']
+       args: ['homepage:80']
+   restartPolicy: Never
cyrannus/picon / homepage / homepage-extras (new) (1 resources)
ConfigMap/homepage-config (new) (65 lines)
! + entire resource added:
+ ---
+ # Source: raw/templates/resources.yaml
+ apiVersion: v1
+ kind: ConfigMap
+ metadata:
+   name: homepage-config
+ data:
+   settings.yaml: |
+     headerStyle: clean
+     logpath: /app/config
+     title: picon
+   kubernetes.yaml: |
+     gateway: true
+     ingress: true
+     mode: cluster
+     traefik: true
+   widgets.yaml: |
+     - kubernetes:
+         cluster:
+           cpu: true
+           label: cluster
+           memory: true
+           show: true
+           showLabel: true
+         nodes:
+           cpu: true
+           memory: true
+           show: true
+           showLabel: true
+     - search:
+         provider: duckduckgo
+         target: _blank
+   services.yaml: |
+     - Home:
+       - Home Assistant:
+           app: home-assistant
+           href: https://home.max06.net
+           icon: home-assistant.png
+           namespace: home-assistant
+     - Automation & AI:
+       - n8n:
+           app: n8n
+           href: https://n8n.max06.net
+           icon: n8n.png
+           namespace: n8n
+       - DeepSeek Harness:
+           app: deepseek-harness
+           href: https://dsh.max06.net
+           icon: mdi-robot-outline
+           namespace: dsh
+     - Network:
+       - Pi-hole:
+           app: pihole
+           href: https://pihole.max06.net/admin
+           icon: pi-hole.png
+           namespace: pihole
+   bookmarks.yaml: |
+     []
+   docker.yaml: |
+     {}
+   proxmox.yaml: |
+     {}
+   custom.css: ""
+   custom.js: ""

Generated by ATLAS Review — Re-run

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant