apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: homepage name: homepage namespace: default spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: homepage strategy: type: Recreate template: metadata: labels: app.kubernetes.io/name: homepage spec: automountServiceAccountToken: true containers: - env: - name: POD_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP - name: HOMEPAGE_ALLOWED_HOSTS value: '*' image: ghcr.io/gethomepage/homepage:latest imagePullPolicy: Always livenessProbe: failureThreshold: 3 httpGet: path: / port: 3000 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 name: homepage ports: - containerPort: 3000 name: http protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: / port: 3000 scheme: HTTP initialDelaySeconds: 5 periodSeconds: 5 successThreshold: 1 timeoutSeconds: 1 resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /app/config/logs name: logs - mountPath: /app/config name: homepage-config - mountPath: /app/public/images name: homepage-config subPath: images dnsPolicy: ClusterFirst enableServiceLinks: true restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: homepage serviceAccountName: homepage terminationGracePeriodSeconds: 30 volumes: - name: homepage-config persistentVolumeClaim: claimName: homepage-config - emptyDir: {} name: logs status: availableReplicas: 1 conditions: - lastTransitionTime: '2026-05-19T01:51:47Z' lastUpdateTime: '2026-08-17T09:07:50Z' message: ReplicaSet "homepage-7b47bf67fb" has successfully progressed. reason: NewReplicaSetAvailable status: 'True' type: Progressing - lastTransitionTime: '2026-08-28T06:04:23Z' lastUpdateTime: '2026-08-28T06:04:23Z' message: Deployment has minimum availability. reason: MinimumReplicasAvailable status: 'True' type: Available observedGeneration: 96 readyReplicas: 1 replicas: 1 terminatingReplicas: 0 updatedReplicas: 1 --- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/name: homepage name: homepage namespace: default spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 3000 protocol: TCP targetPort: http selector: app.kubernetes.io/name: homepage sessionAffinity: None type: ClusterIP status: loadBalancer: {} --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: labels: app.kubernetes.io/name: homepage name: homepage namespace: default spec: ingressClassName: nginx rules: - host: homepage.haven http: paths: - backend: service: name: homepage port: number: 3000 path: / pathType: Prefix status: loadBalancer: ingress: - ip: 192.168.20.204 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: homepage-config namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: nfs-client volumeMode: Filesystem status: accessModes: - ReadWriteMany capacity: storage: 1Gi phase: Bound --- apiVersion: v1 data: bookmarks.yaml: "- Developer:\n - Github:\n - abbr: GH\n href:\ \ https://github.com/\n" custom.css: '' custom.js: '' docker.yaml: '' kubernetes.yaml: 'mode: cluster ' services.yaml: "- Essentials:\n - AdGuard Home:\n href: http://adguard.haven/\n\ \ icon: adguard-home\n widget:\n type: adguard\n \ \ url: http://adguard.haven/\n username: ivanch\n password:\ \ ESVEPnull\n - AdGuard Home 2:\n href: http://adguard2.haven/\n \ \ icon: adguard-home\n widget:\n type: adguard\n \ \ url: http://adguard2.haven/\n username: ivanch\n password:\ \ ESVEPnull\n - Home Assistant:\n href: http://homeassistant.haven/\n\ \ - Traefik:\n href: http://traefik.haven/\n - Dockge:\n href:\ \ http://dockge.haven/\n - Proxmox:\n href: https://proxmox.haven:8006/\n\ \ widget:\n type: proxmox\n url: https://proxmox.haven:8006/\n\ \ token: homepage@pam!token\n secret: 7cadfc2d-560a-4bb4-8d5f-a29f394bc9a0\n\ \n- Media:\n - Jellyfin:\n href: http://tv.haven/\n icon: jellyfin.png\n\ \ widget:\n type: jellyfin\n url: http://tv.haven/\n\ \ key: c933070d9c8341bf8c64e7a792aaa6b9\n enableBlocks: true\n\ \ enableNowPlaying: true\n - Sonarr:\n href: http://sonarr.haven/\n\ \ - Radarr:\n href: http://radarr.haven/\n - Prowlarr:\n href:\ \ http://prowlarr.haven/\n\n- Storage:\n - Transmission:\n href: http://transmission.haven/\n\ \ - qBitTorrent:\n href: http://qbittorrent.haven/\n - OpenMediaVault:\n\ \ href: http://omv.haven/\n - ArchiveBox:\n href: http://archive.haven/\n\ \ - FileBrowser:\n href: http://files.haven/\n - Paperless:\n \ \ href: http://paperless.haven/\n\n- Other:\n - Uptime Kuma:\n href:\ \ http://uptimekuma.haven/\n - WireGuard:\n href: http://vpn.haven/\n\ \ - Beszel:\n href: http://beszel.haven/\n\n- Zephyr:\n - Gitea:\n\ \ href: http://gitea.ivanch.me/\n - Portainer:\n href: http://portainer.ivanch.me/\n\ \ - Nginx Proxy Manager:\n href: http://manager.ivanch.me/\n - Homepage:\n\ \ href: http://ivanch.me/\n" settings.yaml: '' widgets.yaml: "- kubernetes:\n cluster:\n show: true\n cpu: true\n\ \ memory: true\n # network: true\n showLabel: true\n label:\ \ \"Haven\"\n nodes:\n show: true\n cpu: true\n memory: true\n\ \ showLabel: true\n- resources:\n backend: resources\n expanded: true\n\ \ cpu: true\n memory: true\n network: default\n- search:\n provider:\ \ duckduckgo\n target: _blank\n" kind: ConfigMap metadata: labels: app.kubernetes.io/name: homepage name: homepage namespace: default