From a4fe0a7fe48ba3253bb27f6825c2476dac1ebff8 Mon Sep 17 00:00:00 2001
From: Remy Moll <me@moll.re>
Date: Tue, 16 Apr 2024 12:43:20 +0200
Subject: [PATCH] add homepage as a deployment

---
 apps/homepage/configmap.yaml                  | 98 +++++++++++++++++++
 apps/homepage/deployment.yaml                 | 64 ++++++++++++
 apps/homepage/ingress.yaml                    | 16 +++
 apps/homepage/kustomization.yaml              | 17 ++++
 apps/homepage/namespace.yaml                  |  4 +
 apps/homepage/service.yaml                    | 15 +++
 apps/rss/namespace.yaml                       |  2 +-
 kluster-deployments/homepage/application.yaml | 19 ++++
 kluster-deployments/kustomization.yaml        |  1 +
 kluster-deployments/pg-ha/application.yaml    |  4 +-
 10 files changed, 237 insertions(+), 3 deletions(-)
 create mode 100644 apps/homepage/configmap.yaml
 create mode 100644 apps/homepage/deployment.yaml
 create mode 100644 apps/homepage/ingress.yaml
 create mode 100644 apps/homepage/kustomization.yaml
 create mode 100644 apps/homepage/namespace.yaml
 create mode 100644 apps/homepage/service.yaml
 create mode 100644 kluster-deployments/homepage/application.yaml

diff --git a/apps/homepage/configmap.yaml b/apps/homepage/configmap.yaml
new file mode 100644
index 0000000..e267db2
--- /dev/null
+++ b/apps/homepage/configmap.yaml
@@ -0,0 +1,98 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: config
+  labels:
+    app.kubernetes.io/name: homepage
+data:
+  kubernetes.yaml: "" #|
+  #  mode: cluster
+  settings.yaml: |
+    title: "Homepage"
+    background: https://images.unsplash.com/photo-1547327132-5d20850c62b5?q=80&w=3870&auto=format&fit=crop
+    cardBlur: sm
+  #settings.yaml: |
+  #  providers:
+  #    longhorn:
+  #      url: https://longhorn.my.network
+  custom.css: ""
+  custom.js: ""
+  bookmarks.yaml: |
+    - Developer:
+        - Github:
+            - abbr: GH
+              href: https://github.com/moll-re
+  services.yaml: |
+    - Media:
+        - Jellyfin backend:
+            href: https://media-backend.kluster.moll.re
+            ping: media-backend.kluster.moll.re
+        - Jellyfin vue:
+            href: https://media.kluster.moll.re
+            ping: media.kluster.moll.re
+        - Immich:
+            href: https://immich.kluster.moll.re
+            ping: immich.kluster.moll.re
+
+    - Productivity:
+        - OwnCloud:
+            href: https://ocis.kluster.moll.re
+            ping: ocis.kluster.moll.re
+        - ToDo:
+            href: https://todos.kluster.moll.re
+            ping: todos.kluster.moll.re
+        - Finance:
+            href: https://finance.kluster.moll.re
+            ping: finance.kluster.moll.re
+
+    - Home:
+        - Home Assistant:
+            href: https://home.kluster.moll.re
+            ping: home.kluster.moll.re
+        - Grafana:
+            href: https://grafana.kluster.moll.re
+            ping: grafana.kluster.moll.re
+        - Recipes:
+            href: https://recipes.kluster.moll.re
+            ping: recipes.kluster.moll.re
+    
+    - Infra:
+        - Gitea:
+            href: https://git.kluster.moll.re
+            ping: git.kluster.moll.re
+        - ArgoCD:
+            href: https://argocd.kluster.moll.re
+            ping: argocd.kluster.moll.re
+
+  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: duckduckgo
+    - openmeteo:
+        label: Zürich # optional
+        latitude: 47.24236
+        longitude: 8.30439
+        units: metric # or imperial
+        cache: 30 # Time in minutes to cache API responses, to stay within limits
+        format: # optional, Intl.NumberFormat options
+            maximumFractionDigits: 1
+    - datetime:
+        locale: de
+        format:
+          dateStyle: long
+          timeStyle: short
+    - adguard:
+        url: http://adguard-home-web.adguard-home:3000
+
+  docker.yaml: ""
\ No newline at end of file
diff --git a/apps/homepage/deployment.yaml b/apps/homepage/deployment.yaml
new file mode 100644
index 0000000..3506dad
--- /dev/null
+++ b/apps/homepage/deployment.yaml
@@ -0,0 +1,64 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: homepage
+  labels:
+    app.kubernetes.io/name: homepage
+spec:
+  revisionHistoryLimit: 3
+  replicas: 1
+  strategy:
+    type: RollingUpdate
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: homepage
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: homepage
+    spec:
+      # serviceAccountName: homepage
+      # automountServiceAccountToken: true
+      dnsPolicy: ClusterFirst
+      # enableServiceLinks: true
+      containers:
+        - name: homepage
+          image: homepage
+          imagePullPolicy: Always
+          ports:
+            - name: http
+              containerPort: 3000
+              protocol: TCP
+          volumeMounts:
+            - mountPath: /app/config/custom.js
+              name: config
+              subPath: custom.js
+            - mountPath: /app/config/custom.css
+              name: config
+              subPath: custom.css
+            - mountPath: /app/config/bookmarks.yaml
+              name: config
+              subPath: bookmarks.yaml
+            - mountPath: /app/config/docker.yaml
+              name: config
+              subPath: docker.yaml
+            - mountPath: /app/config/kubernetes.yaml
+              name: config
+              subPath: kubernetes.yaml
+            - mountPath: /app/config/services.yaml
+              name: config
+              subPath: services.yaml
+            - mountPath: /app/config/settings.yaml
+              name: config
+              subPath: settings.yaml
+            - mountPath: /app/config/widgets.yaml
+              name: config
+              subPath: widgets.yaml
+            - mountPath: /app/config/logs
+              name: logs
+      volumes:
+        - name: config
+          configMap:
+            name: config
+        - name: logs
+          emptyDir: {}
\ No newline at end of file
diff --git a/apps/homepage/ingress.yaml b/apps/homepage/ingress.yaml
new file mode 100644
index 0000000..6e3c543
--- /dev/null
+++ b/apps/homepage/ingress.yaml
@@ -0,0 +1,16 @@
+apiVersion: traefik.io/v1alpha1
+kind: IngressRoute
+metadata:
+  name: homepage-ingressroute
+
+spec:
+  entryPoints:
+    - websecure
+  routes:
+    - match: Host(`start.kluster.moll.re`)
+      kind: Rule
+      services:
+        - name: homepage-web
+          port: 3000
+  tls:
+    certResolver: default-tls
diff --git a/apps/homepage/kustomization.yaml b/apps/homepage/kustomization.yaml
new file mode 100644
index 0000000..a38ace0
--- /dev/null
+++ b/apps/homepage/kustomization.yaml
@@ -0,0 +1,17 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+namespace: homepage
+
+resources:
+  - namespace.yaml
+  - deployment.yaml
+  - service.yaml
+  - configmap.yaml
+  - ingress.yaml
+
+
+images:
+  - name: homepage
+    newName: ghcr.io/gethomepage/homepage
+    newTag: v0.8.11
diff --git a/apps/homepage/namespace.yaml b/apps/homepage/namespace.yaml
new file mode 100644
index 0000000..0a074bd
--- /dev/null
+++ b/apps/homepage/namespace.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: placeholder
diff --git a/apps/homepage/service.yaml b/apps/homepage/service.yaml
new file mode 100644
index 0000000..0d65595
--- /dev/null
+++ b/apps/homepage/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: homepage-web
+  labels:
+    app.kubernetes.io/name: homepage
+spec:
+  type: ClusterIP
+  ports:
+    - port: 3000
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    app.kubernetes.io/name: homepage
\ No newline at end of file
diff --git a/apps/rss/namespace.yaml b/apps/rss/namespace.yaml
index 3900a62..0a074bd 100644
--- a/apps/rss/namespace.yaml
+++ b/apps/rss/namespace.yaml
@@ -1,4 +1,4 @@
 apiVersion: v1
 kind: Namespace
 metadata:
-  name: placeholder
\ No newline at end of file
+  name: placeholder
diff --git a/kluster-deployments/homepage/application.yaml b/kluster-deployments/homepage/application.yaml
new file mode 100644
index 0000000..1cc6d7f
--- /dev/null
+++ b/kluster-deployments/homepage/application.yaml
@@ -0,0 +1,19 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: homepage-application
+  namespace: argocd
+
+spec:
+  project: apps
+  source:
+    repoURL: ssh://git@git.kluster.moll.re:2222/remoll/k3s-infra.git
+    targetRevision: main
+    path: apps/homepage
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: homepage
+  syncPolicy:
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/kluster-deployments/kustomization.yaml b/kluster-deployments/kustomization.yaml
index ec1135c..49af0f4 100644
--- a/kluster-deployments/kustomization.yaml
+++ b/kluster-deployments/kustomization.yaml
@@ -28,6 +28,7 @@ resources:
   - files/
   - finance/
   - homeassistant/
+  - homepage/application.yaml
   - immich/
   - journal/
   - media/
diff --git a/kluster-deployments/pg-ha/application.yaml b/kluster-deployments/pg-ha/application.yaml
index 5f33a69..46862cf 100644
--- a/kluster-deployments/pg-ha/application.yaml
+++ b/kluster-deployments/pg-ha/application.yaml
@@ -18,5 +18,5 @@ spec:
       prune: true
       selfHeal: true
     syncOptions:
-    - Replace=true
-    # because the crds exceed the default 256Ki limit
\ No newline at end of file
+      - Replace=true
+    # because the crd annotations exceed the default 256Ki limit
\ No newline at end of file