first commit

This commit is contained in:
2025-07-04 19:51:51 +05:30
commit 42895beb8c
72 changed files with 2584 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
apiVersion: v2
name: homepage
description: A Helm chart for Homepage
type: application
version: 0.1.0
appVersion: "1.3.2"

View File

@@ -0,0 +1,18 @@
name: homepage
namespace: prod
image:
repository: ghcr.io/gethomepage/homepage
tag: v1.3.2
secrets:
api-secrets: homepage-secrets
customImagesDirectory:
enabled: true
existingClaim: true
claimName: longhorn-homepage
service:
type: LoadBalancer
port: 30001

View File

@@ -0,0 +1,62 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ .Values.name }}
labels:
app.kubernetes.io/name: {{ .Values.name }}
rules:
- apiGroups:
- ""
resources:
- namespaces
- pods
- nodes
verbs:
- get
- list
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- apiGroups:
- traefik.io
resources:
- ingressroutes
verbs:
- get
- list
- apiGroups:
- gateway.networking.k8s.io
resources:
- httproutes
- gateways
verbs:
- get
- list
- apiGroups:
- metrics.k8s.io
resources:
- nodes
- pods
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ .Values.name }}
labels:
app.kubernetes.io/name: {{ .Values.name }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ .Values.name }}
subjects:
- kind: ServiceAccount
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}

View File

@@ -0,0 +1,315 @@
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: "{{ .Values.name }}-config"
data:
docker.yaml: ""
bookmarks.yaml: ""
kubernetes.yaml: |
mode: cluster
widgets.yaml: |
- kubernetes:
cluster:
show: true
cpu: true
memory: true
showLabel: true
label: "cluster"
nodes:
show: true
cpu: true
memory: true
showLabel: true
- search:
provider: google
target: _blank
settings.yaml: |
layout:
Proxmox (NVIDIA GPU):
style: row
columns: 5
tab: Stats
Proxmox (AMD GPU):
style: row
columns: 5
tab: Stats
Proxmox (Asus):
style: row
columns: 5
tab: Stats
Apps:
style: row
columns: 4
tab: Apps
Bookmarks:
style: row
columns: 5
tab: Bookmarks
useEqualHeights: true
hideErrors: true
background: /images/background.png
services.yaml: |
- Apps:
- Sonarr:
href: https://sonarr.akshun-lab.uk
description: series
icon: sonarr.png
widget:
type: sonarr
url: http://10.0.0.14:8989
key: "${SONARR_API_KEY}"
- Radarr:
href: https://radarr.akshun-lab.uk
description: movies
icon: radarr.png
widget:
type: radarr
url: http://10.0.0.14:7878
key: "${RADARR_API_KEY}"
- Bazarr:
href: https://bazarr.akshun-lab.uk
description: subtitles
icon: bazarr.png
widget:
type: bazarr
url: http://10.0.0.14:6767
key: "${BAZARR_API_KEY}"
- Jellyfin:
href: https://jellyfin.akshun-lab.uk
description: streaming
icon: jellyfin.png
widget:
type: jellyfin
url: http://10.0.0.14:8096
key: "${JELLYFIN_API_KEY}"
- qBittorrent:
href: https://qbittorrent.akshun-lab.uk
description: torrent client
icon: qbittorrent.png
widget:
type: qbittorrent
username: admin
password: "${QBITTORRENT_PASSWORD}"
url: http://10.0.0.14:8080
- Jellyseerr:
href: https://jellyseerr.akshun-lab.uk
description: request movies and shows
icon: jellyseerr.png
widget:
type: jellyseerr
url: http://10.0.0.14:5055
key: "${JELLYSEERR_API_KEY}"
- Prowlarr:
href: https://prowlarr.akshun-lab.uk
description: indexers
icon: prowlarr.png
widget:
type: prowlarr
url: http://10.0.0.14:9696
key: "${PROWLARR_API_KEY}"
- Speedtest:
href: https://speedtest.akshun-lab.uk
description: speedtest
icon: si-speedtest.svg
widget:
type: speedtest
url: http://10.0.0.14:8181
- Immich:
href: https://immich.akshun-lab.uk
description: photos
icon: immich.png
widget:
type: immich
url: http://10.0.0.14:2283
key: "${IMMICH_API_KEY}"
version: 2
- Proxmox:
href: https://proxmox.akshun-lab.uk
description: VMs
icon: proxmox.png
widget:
type: proxmox
url: https://10.0.0.100:8006
username: api@pam!homepage
password: "${PROXMOX_PASSWORD}"
- Gitea:
href: https://gitea.akshun-lab.uk
description: Git Server
icon: gitea.png
widget:
type: gitea
url: http://10.0.0.14:3011
key: "${GITEA_API_KEY}"
fields: ["repositories", "issues", "pulls"]
- Crafty:
href: https://minecraft.akshun-lab.uk
description: crafty controller
icon: crafty-controller.png
widget:
type: minecraft
url: udp://192.168.1.3:25565
- Invidious:
href: https://invidious.akshun-lab.uk
description: youtube frontend
icon: invidious.png
- Nextcloud:
href: https://nextcloud.akshun-lab.uk
description: files
icon: nextcloud.png
- VS Code:
href: https://vs.akshun-lab.uk
description: VS code server
icon: vscode.png
- Semaphore:
href: https://semaphore.akshun-lab.uk
description: ansible gui
icon: semaphore.png
- Open Media Vault:
href: https://omv.akshun-lab.uk
description: NAS
icon: openmediavault.png
- Ersatztv:
icon: ersatztv.png
description: live tv for jellyfin
href: https://ersatztv.akshun-lab.uk
- Jellystat:
icon: jellystat.png
description: jellyfin stats
href: https://jellystat.akshun-lab.uk
- Paperless NGX:
icon: paperless.png
description: documents OCR
href: https://ngx.akshun-lab.uk
- Longhorn:
icon: longhorn.png
description: kubernetes storage
href: https://longhorn.akshun-lab.uk
- Portainer:
icon: portainer.png
description: container management
href: https://portainer.akshun-lab.uk
- Rancher:
icon: rancher.png
description: kubernetes management
href: https://rancher.akshun-lab.uk
- Open-WebUI:
icon: ollama.png
description: ollama Frontend
href: https://ollama.akshun-lab.uk
- Ghostfolio:
icon: ghostfolio.png
description: portfolio analyzer
href: https://ghost.akshun-lab.uk
- AdGuardHome:
icon: adguard-home.png
description: ad blocker
href: https://adguard.akshun-lab.uk
- Drone:
icon: drone.png
description: CI/CD
href: https://drone.akshun-lab.uk
- Bookmarks:
- Disney:
href: https://www.hotstar.com
- Prime Video:
href: https://primevideo.com
- AngelOne:
href: https://www.angelone.in/trade/watchlist/chart
- MoneyControl:
href: https://moneycontrol.com
- SBI Netbanking:
href: https://retail.onlinesbi.sbi/retail/login.htm
- GW2 Wiki:
href: https://wiki.guildwars2.com/wiki/Event_timers
- GW2 Efficiency:
href: https://gw2efficiency.com
- Youtube:
href: https://youtube.com
- Reddit:
href: https://reddit.com
- Github:
href: https://github.com
- Twitch:
href: https://twitch.tv
- Proxmox (AMD GPU):
- CPU Usage:
widget:
type: glances
url: http://192.168.1.113:61208
metric: cpu
- Memory Usage:
widget:
type: glances
url: http://192.168.1.113:61208
metric: memory
- Processes:
widget:
type: glances
url: http://192.168.1.113:61208
metric: process
- Sensor:
widget:
type: glances
url: http://192.168.1.113:61208
metric: sensor:Tctl
- Disk Usage:
widget:
type: glances
url: http://192.168.1.113:61208
metric: disk:sdb
- Proxmox (NVIDIA GPU):
- CPU Usage:
widget:
type: glances
url: http://192.168.1.126:61208
metric: cpu
- Memory Usage:
widget:
type: glances
url: http://192.168.1.126:61208
metric: memory
- Processes:
widget:
type: glances
url: http://192.168.1.126:61208
metric: process
- Sensor:
widget:
type: glances
url: http://192.168.1.126:61208
metric: sensor:Package id 0
- Disk Usage:
widget:
type: glances
url: http://192.168.1.126:61208
metric: disk:nvme0n1
- Proxmox (Asus):
- CPU Usage:
widget:
type: glances
url: http://192.168.1.199:61208
metric: cpu
- Memory Usage:
widget:
type: glances
url: http://192.168.1.199:61208
metric: memory
- Processes:
widget:
type: glances
url: http://192.168.1.199:61208
metric: process
- Sensor:
widget:
type: glances
url: http://192.168.1.199:61208
metric: sensor:Sensor 1
- Disk Usage:
widget:
type: glances
url: http://192.168.1.199:61208
metric: disk:nvme0n1

View File

@@ -0,0 +1,17 @@
---
{{- if .Values.persistence.enabled }}
{{- if not .Values.customImagesDirectory.existingClaim }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "longhorn-{{ .Values.name }}-images"
namespace: {{ .Values.namespace }}
spec:
accessModes:
- ReadWriteMany
storageClassName: longhorn
resources:
requests:
storage: {{ .Values.persistence.size }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,11 @@
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: {{ .Values.name }}
annotations:
kubernetes.io/service-account.name: {{ .Values.name }}

View File

@@ -0,0 +1,10 @@
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: {{ .Values.name }}
secrets:
- name: {{ .Values.name }}

View File

@@ -0,0 +1,21 @@
---
apiVersion: v1
kind: Service
metadata:
name: "{{ .Values.name }}-service"
namespace: {{ .Values.namespace }}
spec:
{{- if eq .Values.service.type "LoadBalancer" }}
type: LoadBalancer
{{- else if eq .Values.service.type "NodePort" }}
type: NodePort
{{- end }}
selector:
app.kubernetes.io/name: {{ .Values.name }}
ports:
- targetPort: 3000
{{- if eq .Values.service.type "LoadBalancer" }}
port: {{ .Values.service.port }}
{{- else if eq .Values.service.type "NodePort" }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}

View File

@@ -0,0 +1,98 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: {{ .Values.name }}
spec:
revisionHistoryLimit: 3
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app.kubernetes.io/name: {{ .Values.name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Values.name }}
spec:
serviceAccountName: {{ .Values.name }}
automountServiceAccountToken: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
initContainers:
- name: substitute-config
image: alpine
envFrom:
- secretRef:
name: {{ .Values.secrets.api-secrets }}
command:
- "sh"
- "-c"
- apk add gettext && envsubst < /mnt/init/services.yaml > /mnt/services.yaml
volumeMounts:
- name: homepage-config
mountPath: /mnt/init/services.yaml
subPath: services.yaml
- name: tmp
mountPath: /mnt
subPath: services.yaml
containers:
- name: {{ .Values.name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: IfNotPresent
env:
- name: HOMEPAGE_ALLOWED_HOSTS
value: "{{ .Values.env.HOMEPAGE_ALLOWED_HOSTS }}"
volumeMounts:
- mountPath: /app/config/custom.js
name: homepage-config
subPath: custom.js
- mountPath: /app/config/custom.css
name: homepage-config
subPath: custom.css
- mountPath: /app/config/bookmarks.yaml
name: homepage-config
subPath: bookmarks.yaml
- mountPath: /app/config/docker.yaml
name: homepage-config
subPath: docker.yaml
- mountPath: /app/config/kubernetes.yaml
name: homepage-config
subPath: kubernetes.yaml
- mountPath: /app/config
name: tmp
subPath: services.yaml
- mountPath: /app/config/settings.yaml
name: homepage-config
subPath: settings.yaml
- mountPath: /app/config/widgets.yaml
name: homepage-config
subPath: widgets.yaml
- mountPath: /app/config/logs
name: logs
- mountPath: /app/public/images
name: images
volumes:
- name: homepage-config
configMap:
name: {{ .Values.name }}-config
- name: logs
emptyDir: {}
- name: tmp
emptyDir: {}
{{- if and .Values.customImagesDirectory.enabled .Values.customImagesDirectory.existingClaim }}
- name: images
persistentVolumeClaim:
claimName: {{ .Values.customImagesDirectory.claimName }}
{{- else if .Values.customImagesDirectory.enabled }}
- name: images
persistentVolumeClaim:
claimName: longhorn-{{ .Values.name }}-images
{{- else }}
- name: images
emptyDir: {}
{{- end }}