From 9d3c56e7208c4ea080219f29e14a6b95cabc0d18 Mon Sep 17 00:00:00 2001
From: Sheogorath <sheogorath@shivering-isles.com>
Date: Sun, 3 Sep 2023 19:43:02 +0200
Subject: [PATCH] feat(findmydevice): Add helm chart for find my device

This patch adds a helm chart for find my device along with an
installation that should provide a first iteration of the service.
Currently a public release of the chart is still waiting for upstream
and it will require some minor tweaks if it's supposed to work with CRI
rather than just docker.
---
 apps/base/findmydevice/kustomization.yaml     |  14 ++
 apps/base/findmydevice/namespace.yaml         |  31 ++++
 apps/base/findmydevice/networkpolicy.yaml     |  18 +++
 apps/base/findmydevice/release.yaml           |  38 +++++
 apps/k8s01/findmydevice/certificate.yaml      |  64 ++++++++
 apps/k8s01/findmydevice/kustomization.yaml    |   9 ++
 apps/k8s01/findmydevice/release-values.yaml   |  60 ++++++++
 apps/k8s01/findmydevice/slo.yaml              |  41 +++++
 charts/findmydevice/.helmignore               |  23 +++
 charts/findmydevice/Chart.yaml                |  16 ++
 charts/findmydevice/README.md                 |  54 +++++++
 charts/findmydevice/deploy.yaml               | 141 ++++++++++++++++++
 charts/findmydevice/templates/NOTES.txt       |  22 +++
 charts/findmydevice/templates/_helpers.tpl    |  62 ++++++++
 charts/findmydevice/templates/deployment.yaml |  68 +++++++++
 charts/findmydevice/templates/ingress.yaml    |  61 ++++++++
 .../templates/persistentvolumeclaim.yaml      |  17 +++
 charts/findmydevice/templates/service.yaml    |  15 ++
 .../templates/serviceaccount.yaml             |  12 ++
 .../templates/tests/test-connection.yaml      |  15 ++
 charts/findmydevice/values.yaml               |  77 ++++++++++
 21 files changed, 858 insertions(+)
 create mode 100644 apps/base/findmydevice/kustomization.yaml
 create mode 100644 apps/base/findmydevice/namespace.yaml
 create mode 100644 apps/base/findmydevice/networkpolicy.yaml
 create mode 100644 apps/base/findmydevice/release.yaml
 create mode 100644 apps/k8s01/findmydevice/certificate.yaml
 create mode 100644 apps/k8s01/findmydevice/kustomization.yaml
 create mode 100644 apps/k8s01/findmydevice/release-values.yaml
 create mode 100644 apps/k8s01/findmydevice/slo.yaml
 create mode 100644 charts/findmydevice/.helmignore
 create mode 100644 charts/findmydevice/Chart.yaml
 create mode 100644 charts/findmydevice/README.md
 create mode 100644 charts/findmydevice/deploy.yaml
 create mode 100644 charts/findmydevice/templates/NOTES.txt
 create mode 100644 charts/findmydevice/templates/_helpers.tpl
 create mode 100644 charts/findmydevice/templates/deployment.yaml
 create mode 100644 charts/findmydevice/templates/ingress.yaml
 create mode 100644 charts/findmydevice/templates/persistentvolumeclaim.yaml
 create mode 100644 charts/findmydevice/templates/service.yaml
 create mode 100644 charts/findmydevice/templates/serviceaccount.yaml
 create mode 100644 charts/findmydevice/templates/tests/test-connection.yaml
 create mode 100644 charts/findmydevice/values.yaml

diff --git a/apps/base/findmydevice/kustomization.yaml b/apps/base/findmydevice/kustomization.yaml
new file mode 100644
index 000000000..ae6924aff
--- /dev/null
+++ b/apps/base/findmydevice/kustomization.yaml
@@ -0,0 +1,14 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+namespace: mastodon
+resources:
+  - namespace.yaml
+  - ca.yaml
+  - release.yaml
+  - database.yaml
+  - ../../../shared/networkpolicies/allow-from-same-namespace.yaml
+  - ../../../shared/networkpolicies/allow-from-ingress.yaml
+  - ../../../shared/networkpolicies/allow-from-database.yaml
+  - ../../../shared/networkpolicies/allow-from-monitoring.yaml
+patchesStrategicMerge:
+  - networkpolicy.yaml
diff --git a/apps/base/findmydevice/namespace.yaml b/apps/base/findmydevice/namespace.yaml
new file mode 100644
index 000000000..0ccfe62ed
--- /dev/null
+++ b/apps/base/findmydevice/namespace.yaml
@@ -0,0 +1,31 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: findmydevice
+  labels:
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+    pod-security.kubernetes.io/audit-version: v1.26
+    pod-security.kubernetes.io/enforce-version: v1.23
+    pod-security.kubernetes.io/warn-version: v1.26
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: flux-reconciler
+  namespace: findmydevice
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: flux-reconciler
+  namespace: findmydevice
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: admin
+subjects:
+  - kind: ServiceAccount
+    name: flux-reconciler
+    namespace: findmydevice
diff --git a/apps/base/findmydevice/networkpolicy.yaml b/apps/base/findmydevice/networkpolicy.yaml
new file mode 100644
index 000000000..abebf0d7c
--- /dev/null
+++ b/apps/base/findmydevice/networkpolicy.yaml
@@ -0,0 +1,18 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: allow-from-ingress
+spec:
+  podSelector:
+    matchLabels:
+      app.kubernetes.io/name: findmydevice
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: allow-from-monitoring
+spec:
+  podSelector:
+    matchLabels:
+      app.kubernetes.io/name: findmydevice
diff --git a/apps/base/findmydevice/release.yaml b/apps/base/findmydevice/release.yaml
new file mode 100644
index 000000000..71ce37942
--- /dev/null
+++ b/apps/base/findmydevice/release.yaml
@@ -0,0 +1,38 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: findmydevice
+  namespace: findmydevice
+spec:
+  serviceAccountName: flux-reconciler
+  timeout: 15m
+  releaseName: findmydevice
+  chart:
+    spec:
+      chart: ./charts/findmydevice
+      sourceRef:
+        kind: GitRepository
+        name: flux-system
+        namespace: flux-system
+  install:
+    remediation:
+      retries: -1
+  upgrade:
+    remediation:
+      retries: -1
+  interval: 15m
+  valuesFrom:
+    - kind: ConfigMap
+      name: findmydevice-base-values
+      valuesKey: values.yaml
+    - kind: Secret
+      name: findmydevice-override-values
+      valuesKey: values-overrides.yaml
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: findmydevice-base-values
+  namespace: findmydevice
+data:
+  values.yaml: |
diff --git a/apps/k8s01/findmydevice/certificate.yaml b/apps/k8s01/findmydevice/certificate.yaml
new file mode 100644
index 000000000..7945937dd
--- /dev/null
+++ b/apps/k8s01/findmydevice/certificate.yaml
@@ -0,0 +1,64 @@
+apiVersion: cert-manager.io/v1
+kind: Certificate
+metadata:
+    name: findmydevice-tls
+    namespace: findmydevice
+spec:
+    dnsNames:
+        - ENC[AES256_GCM,data:B1CzVFGN22Xpt1atpwwWNPGY5Yox148=,iv:XNcSxX/LUNurjwcoXM4IrtDoPWaclptdFZfYnwSBIJE=,tag:IJkYnNVH5qBveRZKiRiOMw==,type:str]
+    issuerRef:
+        name: letsencrypt
+        kind: ClusterIssuer
+    secretName: ingress-findmydevice-tls
+sops:
+    kms: []
+    gcp_kms: []
+    azure_kv: []
+    hc_vault: []
+    age: []
+    lastmodified: "2023-09-03T17:30:06Z"
+    mac: ENC[AES256_GCM,data:ZKrBvAf0CYiFrQSvfFLtyPAsFOWXsjO0ec/IIBdxLaA9A0OKoeE/N9v4DoiPe1jH/53nH2K/xpfFjGWVhCwXWUZQJPGEeIVgs4mgQh6VszCyYzYB5to7zp1tKYvaimI1pHdItqb/zCFLi3AL9an3Wzaj+guosFI4krDXK2digcs=,iv:UmlIobjKDN517BF+72Xa8yrD3hRxj1qmBBuOxqyEO9c=,tag:Erz1lad7xi54vGcdXCXlog==,type:str]
+    pgp:
+        - created_at: "2022-01-21T18:13:48Z"
+          enc: |-
+            -----BEGIN PGP MESSAGE-----
+
+            wcFMA7kpg2bgzVHcARAAHhDshl1OJqNRUolNvbIXzOuDzssJnvyi6cIZuMmVMsxf
+            a6wAWAtYOehvtn1ODL7/h4fIpBtfp7d8VuwfJSrh3ghUeiOl3zRzQbmaFA2L5/iG
+            Jd94tFAVwIl30qjcYqGVB2RF27VF1RElzgDLQh3hiXn1hDC+WmNSnBF5hwnwCFOL
+            wM4BHuE2AB4TX3PlYSo1n71VSzcCqRzbIxelZasYLnJQVL0VE6AjEd/fHS468R8N
+            aZ3mhmHW3sWzuLHNREMD2Q3ghkguLhau0VoETlYRI9103I4k7/khFrhAj5l2/PUr
+            2SWgpXyRqXVaKPeTiQs3QR8B5jNq3BlZj6Celw5Ig/wx3LY0EhI9e9WFgtSlZxM+
+            2yk65HQGvTIgsbys/z/0skA9vqik9csFRsH9iK42E/+XLvoAT6yxyl0cv1kBEyAS
+            ggPmKOq8+CT+voHzuh8kZHq9Sa8kH5xL1DQLzX2yIruV3OhTPSK+VlDpjUbycmI2
+            qR1oCo/snOJwwwvfl9vu0B8FCwhrz8554ZQBErFfJl6GFiUV8LElRlZh5S9Jiysr
+            nYJS5gxrcvjF/0Y6EHEfWDRDxvCHoWQpWhl2hRkh5UlQKH0ab+QWLYpISyNJxjfl
+            orQJdaVX3BQwhqMLwiMLGoaNGrSpmxXveLOZmsdK0obXC67lyE6ZM/Wy6gx2dFnS
+            5gFdXCLzQmmjYK8gIlsejQdnxZI2qWavZIN9T70OZQGaDE/S+U1uxKjuGBM7HTcP
+            7f1nUa6z96A9ydWs1xHjtm7k172V16PMSrvjQ8KLhFJd9eJDq3ksAA==
+            =XgF6
+            -----END PGP MESSAGE-----
+          fp: 286791FB6648539775DB31B8FCB98C2A3EC6F601
+        - created_at: "2022-01-21T18:13:48Z"
+          enc: |
+            -----BEGIN PGP MESSAGE-----
+
+            hQIMA4oYbIHZIrAPAQ//S/9rOkbd3beNH20dxgZ7VuZxgnjiV3Hd3om717njcMm2
+            kCfTJ3AmpLtQsT2s1W221tIyCwtHOobj82ANP9KzNi4e6v3LlNTIVHTQiHXk9KJP
+            AX6JoCOLu3bAI0xcdApNBU2wAlHBVC+T4BUfhPqD5AdHpW++e1qUIsM/6TViunHj
+            BWoIA0bpXqyOhTm1GbkJrHMgczJn2qgR5lBf8wgGmASd8jlNyfA7SxoKHj8sl/Ji
+            nucP/90dmyD2eBIJYdYS3anJYa2uP96oioG5xxIyfppnL5dwozDAit3Z5vvnBZNb
+            1rrpUnN8H0cCcaj7tmDEmjGfjGwxLKegQRZX7Pg5hwaaOOPGheXf8Ip/DpDf6T0n
+            Sq24X6DC5gD1RBU+YY6ZayMt/OKpVVVwRlY4BTDIUe4M+ecK/fve5vpDW2M+KWMc
+            pOkO1B09/prsX0w5XjFh8hb/6HlDDhomiB+BszcRCUDzocRzSEIFwMf7/iTaExe8
+            2fKCCHB4kHo6GHpydlQOpnGMOvDmiNKopXxTkFQUFQjyRmHGXf/u79JNXBjHkniv
+            ZiokjTEarwMp68dyiaL4L/5Uk+4NG3MetobqSaeW2TbeBwif3G2eFleYscz7QPIR
+            5ZBBhU/CoUEz2Xge6t8rlp8PNcQ1yq/R+tZjaeqIIT4++ZxCErhA0lsxyFrgLefU
+            aAEJAhD7hR3IMDGN2zOZSiw1IBz9P8Jss/oERQiuVpe/eTv5Vqj9vuL+koKftwnF
+            vSVkNo0fLwNLtnU659Mkoj9utoUL9tAhcCMpP3NehKkBG5RjF9crnIP6zT3lvVU0
+            GYyW4Lsfrt/a
+            =FfV+
+            -----END PGP MESSAGE-----
+          fp: B137EE1549DFAF960DD1E2B15147025FB9F09E07
+    encrypted_regex: ^(data|stringData|email|dnsZones?|dnsNames?|hosts?|tang|externalURL)$
+    version: 3.7.3
diff --git a/apps/k8s01/findmydevice/kustomization.yaml b/apps/k8s01/findmydevice/kustomization.yaml
new file mode 100644
index 000000000..098f30fbd
--- /dev/null
+++ b/apps/k8s01/findmydevice/kustomization.yaml
@@ -0,0 +1,9 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+namespace: findmydevice
+resources:
+  - ../../base/findmydevice
+  - certificate.yaml
+  - release-values.yaml
+  - slo.yaml
+  - ../../../shared/resourcequotas/default.yaml
diff --git a/apps/k8s01/findmydevice/release-values.yaml b/apps/k8s01/findmydevice/release-values.yaml
new file mode 100644
index 000000000..029a4e5d8
--- /dev/null
+++ b/apps/k8s01/findmydevice/release-values.yaml
@@ -0,0 +1,60 @@
+apiVersion: v1
+kind: Secret
+metadata:
+    name: findmydevice-override-values
+    namespace: findmydevice
+type: Opaque
+stringData:
+    values-overrides.yaml: ENC[AES256_GCM,data:3AIdCGUO/33pbv21q+tQIcIP1A9Q/kPGLMdsbKDd9d1WE1ynYVtsvD4uxGkVGtUKUbDjVWX+4GRGEQYZShomdbVDHXy2nuNwZHEhb+KEJXoX/1Ij9sBv4kS6ZwwJ6A9AK/8Mz/45vyLaJfBZKVLiHz8V6IQamwRMdQ1exYmEv7QameADS4GLppQ9b1lPAli28JUJLo9VSXAInX3QIU+SrZ5+mYFdUG5XoVeG7+dT1jDpE8+t6v673+1GrrqBYOPZ61+/S4uiytzry6xXov7nyFSDj4IgSBEmpdcwiV6VNuap/RlnOjLFR4744LX8cJsm6RZgRIwCh/JaJ2ZGfDW8ShsHtqIvUAflFxyQP0DZoF08TYSr+DYyMGUBqd8M3vJ+q7nr3KMDT2jO/Vj7gSmH6AiWwLJlrmlH+ofpbW3D+7C39EIuZv1YEIqMGF63obRPxEfck2mbNEji+6hPP9Rk4a0X/uE/CZc3JhLYlpkFhw4zT0jQ033ITl8M5y4eV5y+qzLv3ch6zQ==,iv:/NbaPtlSu/8aQ94TvhLd76GtI5VLPRuroYpHP8Q1XT8=,tag:3qi8SF/ZRGenVBkcZlXs/A==,type:str]
+sops:
+    kms: []
+    gcp_kms: []
+    azure_kv: []
+    hc_vault: []
+    age: []
+    lastmodified: "2023-09-03T17:28:58Z"
+    mac: ENC[AES256_GCM,data:YaTDaWGKJD3SkNx8ZMSX8qbnU/d8VwCBgb9sZ3HqLhI/W00KHanBb3ghXQGfn9Egl5XIG3BMBZUGX4Wt7Wnqrw/Zn2ukG0vklmyO6hDQBDuxZ5kbBvx6tKjlLpsam4HYyByp/qBn7l1yr3E8FWtEhrFqAU8f+/r4WChOxi4p8as=,iv:52VrHPpVDCKPdDaQIzwsVdkWRmzR18D33fL8ti9lzlQ=,tag:xulg9GpPlG1Im7shyoFSfA==,type:str]
+    pgp:
+        - created_at: "2022-03-22T22:26:35Z"
+          enc: |-
+            -----BEGIN PGP MESSAGE-----
+
+            wcFMA7kpg2bgzVHcARAApcdDAfEgx93xGtkm4f7xTuRhvUyl8lw85rIHbWcAveYU
+            ayU88OLaoQyeZDZkOXbtxMHpry8GbId6vPAJ7KflT2eMP0A4uQGSSCQO6+5QcaYg
+            sbO/zT4vdprN7icLbvmmoK2Dh+hOo5Z7/7YGmdJfaaATzT2BGL/cVS1bonI83vXR
+            lzlW/DglIe7oNEKGVT5vWR5uGvq/dJwSRe/34eutEnJuV30imxHOcpxy3uXJFFXJ
+            3eKTk8dNLz3UE3IeUjbFdPFZYU+grOAOOCZRK0IOYFn+SF7E3dewgiwEdaXzz3gK
+            /6aEMEmf5vyVqn9jOaqZhKRqE7tW5HnhwIIlxcMPhkLVZvYf4F2EDA5f12C2hdp0
+            s7fFhU7v5GgFaHMJuaWVPxDnWTrNIst9bgeJv/N4RVfrLifrZJcqa9lE8ou0iCr5
+            dLi9d6UjsgWAREIViz+Uz7dJQ9QeJ6PGYgg/xgf0ihJFG7sx+TBG58DKb3G3tyUV
+            8hfK8Ou9m+zYnd13mJ2mV3rY0rmXusT+NcqTG2G4bBG5NimGpJS3rO7tAjjp/8sN
+            hMM46ay0vVTUXx1FwmjUFDG1e4sc7fKxTaCBizMjeUfZpAOiy/10YQmrFHBsftpo
+            K5j0nFMoG9NeO+2ffEmLhRtxvMe3WpINk7du3F624rYIGCB0aNUP69FCeJKuUQHS
+            5gH5AwnxOAtQakDksfLxJhUG1NlaS0iAFkZkTTibvOJwsY9L/scDDQlseb5zBKaZ
+            sOPwmn6hL4KavxF9BPG33ILkZKbkcvlaTlAMMY3iBs+MZeIB4+i/AA==
+            =SQqg
+            -----END PGP MESSAGE-----
+          fp: 286791FB6648539775DB31B8FCB98C2A3EC6F601
+        - created_at: "2022-03-22T22:26:35Z"
+          enc: |
+            -----BEGIN PGP MESSAGE-----
+
+            hQIMA4oYbIHZIrAPAQ//fGGoDT5KfsG/o6r5xhDHSc0IFH6zT2TFIB6TuA5SwHfV
+            8t3IeKD0bE//4f8AxGAVocw+AetolwrQL/Tl+n0UV9P44Jeh5VlCAGltHcowR53o
+            zdjS3+i9K3OOvQFhF+aYrPcnc+aTn9KbptHCam0w+Lr2UkYSAPAZHsBcoMp24mHX
+            6A+5kP1kaRzFzEn4TCNeTt13W1AsJIoSagkBWfYRBkRPk1OzGOuYqX6yeqj7a0kM
+            8uiloTQgWOiBSOyRtxUJi87CTrMXyb0F2E9HMyhgRnzF0YX0ZU0UVG8MNdRL8eFD
+            WYY68OK7DQw3zlJubscYQ2jltxKcq5g9qUCw/sXaNurtohIx9UeaHtfp036EMb22
+            5StgGEnBirUzfSrQGT3kuj20lcMtQAr/d1UsmQNjB36eOZSrx0m80pO8JVYL62/O
+            HLYnAHU52aAPtE7brNEVg4yRLCbWyVY3Z3H9OaTVXwNIMFoMEgkHHnNlsb+1ZnhV
+            cStKMO3H6W8eXQi3VGIVNhuC1ltsxHQL1I22Kr41JEnuaB9Jy5bsEbrO4XGyDdte
+            hMI8Gx+0KZAMlKuZKLS6sMa4oVnQTy8w20PtVrrS0zDrQRPpxBrOgzjrNeMj9FpS
+            q/efiCAOBc8eVd8N/7j66UItwrysfmIfsHWfoPotS7F6WmUHeAyoWjfcvTZyd4bU
+            ZgEJAhAtdCnHNvUSl5O9XZuSu51pRwj+O72kZXRSJWv7GTT9dsRfuM5Dy9A/tuVI
+            BuZraI4JyAWb2KbkM6onp3Rh9IcLuzqEYm/ETktxTtO1HlcVPJ2NMcFgTCzaIGX9
+            +rtkG7tPbA==
+            =tvBa
+            -----END PGP MESSAGE-----
+          fp: B137EE1549DFAF960DD1E2B15147025FB9F09E07
+    encrypted_regex: ^(data|stringData|email|dnsZones?|dnsNames?|hosts?|tang|externalURL|.*-secret|.*-url|.*Secrets?|.*-domain|password|subjects|node|apiURL|.*(S|s)erverNames?|.*SecretKey)$
+    version: 3.7.3
diff --git a/apps/k8s01/findmydevice/slo.yaml b/apps/k8s01/findmydevice/slo.yaml
new file mode 100644
index 000000000..eafc519fb
--- /dev/null
+++ b/apps/k8s01/findmydevice/slo.yaml
@@ -0,0 +1,41 @@
+apiVersion: sloth.slok.dev/v1
+kind: PrometheusServiceLevel
+metadata:
+  name: requests-findmydevice
+  namespace: findmydevice
+spec:
+  service: "FMD"
+  slos:
+    - name: "requests-availability"
+      objective: 99
+      description: "Find My Device: SLO based on availability for HTTP request responses."
+      sli:
+        events:
+          errorQuery: sum(rate(nginx_ingress_controller_requests{exported_namespace="findmydevice",ingress="blog",status=~"(5..|429)"}[{{.window}}]))
+          totalQuery: sum(rate(nginx_ingress_controller_requests{exported_namespace="findmydevice",ingress="blog"}[{{.window}}])) > 0 OR vector(1)
+      alerting:
+        name: FMDHighErrorRate
+        labels:
+          category: "availability"
+        annotations:
+          summary: "High error rate on 'Find My Device' requests responses"
+    - name: "requests-latency"
+      objective: 99
+      description: "Find My Device: SLO based on latency for HTTP request responses. Warns if requests take longer than 250ms. When responses are slower than 200ms they become noticable slow."
+      labels:
+        category: latency
+      sli:
+        events:
+          errorQuery: |
+            (
+              sum(rate(nginx_ingress_controller_request_duration_seconds_count{exported_namespace="findmydevice",ingress="blog",method!="WATCH"}[{{.window}}]))
+              -
+              sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{exported_namespace="findmydevice",ingress="blog",le="0.25",verb!="WATCH"}[{{.window}}]))
+            )
+          totalQuery: sum(rate(nginx_ingress_controller_request_duration_seconds_count{exported_namespace="findmydevice",ingress="blog",method!="WATCH"}[{{.window}}])) > 0 OR vector(1)
+      alerting:
+        name: FMDLatencyAlert
+        labels:
+          category: "latency"
+        annotations:
+          summary: "Slow responses on 'Find My Device' requests responses. More than 1% take more than 250ms."
diff --git a/charts/findmydevice/.helmignore b/charts/findmydevice/.helmignore
new file mode 100644
index 000000000..0e8a0eb36
--- /dev/null
+++ b/charts/findmydevice/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/charts/findmydevice/Chart.yaml b/charts/findmydevice/Chart.yaml
new file mode 100644
index 000000000..beb15bcb6
--- /dev/null
+++ b/charts/findmydevice/Chart.yaml
@@ -0,0 +1,16 @@
+apiVersion: v2
+name: findmydevice
+description: A Helm chart for the findmydevice (FMD) server. A project for Android and linux that allows "Find my Phone"-functionality as known from Apple and Google, without handing data over to them.
+home: https://gitlab.com/Nulide/findmydeviceserver
+icon: https://gitlab.com/uploads/-/system/project/avatar/24557720/favicon.ico
+keywords:
+    - android
+    - findmydevice
+sources:
+    - https://gitlab.com/Nulide/findmydeviceserver
+    - https://git.shivering-isles.com/shivering-isles/infrastructure-gitops/-/tree/main/charts/findmydevice
+
+
+type: application
+version: 0.1.0
+appVersion: "0.4.1-deploy"
diff --git a/charts/findmydevice/README.md b/charts/findmydevice/README.md
new file mode 100644
index 000000000..188d2c113
--- /dev/null
+++ b/charts/findmydevice/README.md
@@ -0,0 +1,54 @@
+# findmydevice
+
+![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.4.1-deploy](https://img.shields.io/badge/AppVersion-0.4.1--deploy-informational?style=flat-square)
+
+A Helm chart for the findmydevice (FMD) server. A project for Android and linux that allows "Find my Phone"-functionality as known from Apple and Google, without handing data over to them.
+
+**Homepage:** <https://gitlab.com/Nulide/findmydeviceserver>
+
+## Source Code
+
+* <https://gitlab.com/Nulide/findmydeviceserver>
+* <https://git.shivering-isles.com/shivering-isles/infrastructure-gitops/-/tree/main/charts/findmydevice>
+
+## Values
+
+| Key | Type | Default | Description |
+|-----|------|---------|-------------|
+| affinity | object | `{}` |  |
+| fullnameOverride | string | `""` |  |
+| image.pullPolicy | string | `"IfNotPresent"` | Pull policy allows to configure whether an image should be used if already on the host or pulled freshly regardless. |
+| image.repository | string | `"registry.shivering-isles.com/sheogorath/findmydevice-server"` | Container registry image to use |
+| image.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
+| imagePullSecrets | list | `[]` |  |
+| ingress.annotations | object | `{}` |  |
+| ingress.className | string | `""` |  |
+| ingress.enabled | bool | `false` |  |
+| ingress.hosts[0].host | string | `"chart-example.local"` |  |
+| ingress.hosts[0].paths[0].path | string | `"/"` |  |
+| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` |  |
+| ingress.tls | list | `[]` |  |
+| nameOverride | string | `""` |  |
+| nodeSelector | object | `{}` |  |
+| persistentVolumeClaim.accessMode | string | `"ReadWriteOnce"` | Volume Access mode, ReadWriteOnce is recommended |
+| persistentVolumeClaim.size | string | `"20Gi"` | Requested Volume size of the PVC |
+| persistentVolumeClaim.storageClass | string | `nil` | Storage class used for objectbox database |
+| podAnnotations | object | `{}` |  |
+| podSecurityContext.fsGroup | int | `1000` | Sets the filesystem permissions. Since the application requires the data directory to be owned by uid 1000 |
+| resources.limits.cpu | string | `"1"` |  |
+| resources.limits.memory | string | `"512Mi"` |  |
+| resources.requests.cpu | string | `"200m"` |  |
+| resources.requests.memory | string | `"256Mi"` |  |
+| securityContext.capabilities.add | list | `["NET_BIND_SERVICE"]` | needs to add CAP_NET_BIND_SERVICE due to port < 1024 |
+| securityContext.capabilities.drop[0] | string | `"ALL"` |  |
+| securityContext.runAsNonRoot | bool | `true` | Enforces that the application can't run as root |
+| securityContext.runAsUser | int | `1000` | Starts the application as uid 1000 |
+| service.port | int | `80` |  |
+| service.type | string | `"ClusterIP"` |  |
+| serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
+| serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
+| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
+| tolerations | list | `[]` |  |
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0)
diff --git a/charts/findmydevice/deploy.yaml b/charts/findmydevice/deploy.yaml
new file mode 100644
index 000000000..3e788dc06
--- /dev/null
+++ b/charts/findmydevice/deploy.yaml
@@ -0,0 +1,141 @@
+---
+# Source: findmydevice/templates/serviceaccount.yaml
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: fmd-findmydevice
+  labels:
+    helm.sh/chart: findmydevice-0.1.0
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+    app.kubernetes.io/version: "0.4.1-deploy"
+    app.kubernetes.io/managed-by: Helm
+---
+# Source: findmydevice/templates/persistentvolumeclaim.yaml
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: fmd-findmydevice
+  labels:
+    helm.sh/chart: findmydevice-0.1.0
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+    app.kubernetes.io/version: "0.4.1-deploy"
+    app.kubernetes.io/managed-by: Helm
+spec:
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  resources:
+    requests:
+      storage: 20Gi
+---
+# Source: findmydevice/templates/service.yaml
+apiVersion: v1
+kind: Service
+metadata:
+  name: fmd-findmydevice
+  labels:
+    helm.sh/chart: findmydevice-0.1.0
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+    app.kubernetes.io/version: "0.4.1-deploy"
+    app.kubernetes.io/managed-by: Helm
+spec:
+  type: ClusterIP
+  ports:
+    - port: 80
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+---
+# Source: findmydevice/templates/deployment.yaml
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: fmd-findmydevice
+  labels:
+    helm.sh/chart: findmydevice-0.1.0
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+    app.kubernetes.io/version: "0.4.1-deploy"
+    app.kubernetes.io/managed-by: Helm
+spec:
+  strategy:
+    type: Recreate
+  replicas: 1
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: findmydevice
+      app.kubernetes.io/instance: fmd
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: findmydevice
+        app.kubernetes.io/instance: fmd
+    spec:
+      serviceAccountName: fmd-findmydevice
+      securityContext:
+        fsGroup: 1000
+      containers:
+        - name: findmydevice
+          securityContext:
+            capabilities:
+              add:
+              - NET_BIND_SERVICE
+              drop:
+              - ALL
+            runAsNonRoot: true
+            runAsUser: 1000
+          image: "registry.shivering-isles.com/sheogorath/findmydevice-server:0.4.1-deploy"
+          imagePullPolicy: IfNotPresent
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+          livenessProbe:
+            httpGet:
+              path: /
+              port: http
+          readinessProbe:
+            httpGet:
+              path: /
+              port: http
+          resources:
+            limits:
+              cpu: "1"
+              memory: 512Mi
+            requests:
+              cpu: 200m
+              memory: 256Mi
+          volumeMounts:
+          - name: data
+            mountPath: /fmd/objectbox/
+      volumes:
+        - name: data
+          persistentVolumeClaim:
+            claimName: fmd-findmydevice
+---
+# Source: findmydevice/templates/tests/test-connection.yaml
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "fmd-findmydevice-test-connection"
+  labels:
+    helm.sh/chart: findmydevice-0.1.0
+    app.kubernetes.io/name: findmydevice
+    app.kubernetes.io/instance: fmd
+    app.kubernetes.io/version: "0.4.1-deploy"
+    app.kubernetes.io/managed-by: Helm
+  annotations:
+    "helm.sh/hook": test
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args: ['fmd-findmydevice:80']
+  restartPolicy: Never
diff --git a/charts/findmydevice/templates/NOTES.txt b/charts/findmydevice/templates/NOTES.txt
new file mode 100644
index 000000000..caa9f7bf4
--- /dev/null
+++ b/charts/findmydevice/templates/NOTES.txt
@@ -0,0 +1,22 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "findmydevice.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "findmydevice.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "findmydevice.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "findmydevice.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
+{{- end }}
diff --git a/charts/findmydevice/templates/_helpers.tpl b/charts/findmydevice/templates/_helpers.tpl
new file mode 100644
index 000000000..602ce2af1
--- /dev/null
+++ b/charts/findmydevice/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "findmydevice.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "findmydevice.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "findmydevice.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "findmydevice.labels" -}}
+helm.sh/chart: {{ include "findmydevice.chart" . }}
+{{ include "findmydevice.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "findmydevice.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "findmydevice.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "findmydevice.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "findmydevice.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/charts/findmydevice/templates/deployment.yaml b/charts/findmydevice/templates/deployment.yaml
new file mode 100644
index 000000000..5e71a3dc0
--- /dev/null
+++ b/charts/findmydevice/templates/deployment.yaml
@@ -0,0 +1,68 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "findmydevice.fullname" . }}
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+spec:
+  strategy:
+    type: Recreate
+  replicas: 1
+  selector:
+    matchLabels:
+      {{- include "findmydevice.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+      {{- with .Values.podAnnotations }}
+      annotations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      labels:
+        {{- include "findmydevice.selectorLabels" . | nindent 8 }}
+    spec:
+      {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      serviceAccountName: {{ include "findmydevice.serviceAccountName" . }}
+      securityContext:
+        {{- toYaml .Values.podSecurityContext | nindent 8 }}
+      containers:
+        - name: {{ .Chart.Name }}
+          securityContext:
+            {{- toYaml .Values.securityContext | nindent 12 }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+          livenessProbe:
+            httpGet:
+              path: /
+              port: http
+          readinessProbe:
+            httpGet:
+              path: /
+              port: http
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          volumeMounts:
+          - name: data
+            mountPath: /fmd/objectbox/
+      volumes:
+        - name: data
+          persistentVolumeClaim:
+            claimName: {{ include "findmydevice.fullname" . }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.affinity }}
+      affinity:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
diff --git a/charts/findmydevice/templates/ingress.yaml b/charts/findmydevice/templates/ingress.yaml
new file mode 100644
index 000000000..280ede052
--- /dev/null
+++ b/charts/findmydevice/templates/ingress.yaml
@@ -0,0 +1,61 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "findmydevice.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
+  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
+  {{- end }}
+{{- end }}
+{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1
+{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+  {{- with .Values.ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.ingress.className }}
+  {{- end }}
+  {{- if .Values.ingress.tls }}
+  tls:
+    {{- range .Values.ingress.tls }}
+    - hosts:
+        {{- range .hosts }}
+        - {{ . | quote }}
+        {{- end }}
+      secretName: {{ .secretName }}
+    {{- end }}
+  {{- end }}
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - host: {{ .host | quote }}
+      http:
+        paths:
+          {{- range .paths }}
+          - path: {{ .path }}
+            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+            pathType: {{ .pathType }}
+            {{- end }}
+            backend:
+              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $svcPort }}
+              {{- else }}
+              serviceName: {{ $fullName }}
+              servicePort: {{ $svcPort }}
+              {{- end }}
+          {{- end }}
+    {{- end }}
+{{- end }}
diff --git a/charts/findmydevice/templates/persistentvolumeclaim.yaml b/charts/findmydevice/templates/persistentvolumeclaim.yaml
new file mode 100644
index 000000000..c68e197de
--- /dev/null
+++ b/charts/findmydevice/templates/persistentvolumeclaim.yaml
@@ -0,0 +1,17 @@
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: {{ include "findmydevice.fullname" . }}
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+spec:
+  accessModes:
+    - {{ .Values.persistentVolumeClaim.accessMode }}
+  volumeMode: Filesystem
+  resources:
+    requests:
+      storage: {{ .Values.persistentVolumeClaim.size }}
+  {{- with .Values.persistentVolumeClaim.storageClass }}
+  storageClassName: {{ . }}
+  {{- end }}
\ No newline at end of file
diff --git a/charts/findmydevice/templates/service.yaml b/charts/findmydevice/templates/service.yaml
new file mode 100644
index 000000000..51c89ab45
--- /dev/null
+++ b/charts/findmydevice/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "findmydevice.fullname" . }}
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    {{- include "findmydevice.selectorLabels" . | nindent 4 }}
diff --git a/charts/findmydevice/templates/serviceaccount.yaml b/charts/findmydevice/templates/serviceaccount.yaml
new file mode 100644
index 000000000..33d40b3ce
--- /dev/null
+++ b/charts/findmydevice/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "findmydevice.serviceAccountName" . }}
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+  {{- with .Values.serviceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+{{- end }}
diff --git a/charts/findmydevice/templates/tests/test-connection.yaml b/charts/findmydevice/templates/tests/test-connection.yaml
new file mode 100644
index 000000000..910a09778
--- /dev/null
+++ b/charts/findmydevice/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "findmydevice.fullname" . }}-test-connection"
+  labels:
+    {{- include "findmydevice.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/hook": test
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args: ['{{ include "findmydevice.fullname" . }}:{{ .Values.service.port }}']
+  restartPolicy: Never
diff --git a/charts/findmydevice/values.yaml b/charts/findmydevice/values.yaml
new file mode 100644
index 000000000..cdafac4ea
--- /dev/null
+++ b/charts/findmydevice/values.yaml
@@ -0,0 +1,77 @@
+---
+image:
+  # -- Container registry image to use
+  repository: registry.shivering-isles.com/sheogorath/findmydevice-server
+  # -- Pull policy allows to configure whether an image should be used if already on the host or pulled freshly regardless.
+  pullPolicy: IfNotPresent
+  # -- Overrides the image tag whose default is the chart appVersion.
+  tag: ""
+
+persistentVolumeClaim:
+  # -- Volume Access mode, ReadWriteOnce is recommended
+  accessMode: ReadWriteOnce
+  # -- Requested Volume size of the PVC
+  size: 20Gi
+  # -- Storage class used for objectbox database
+  storageClass: null
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+  # -- Specifies whether a service account should be created
+  create: true
+  # -- Annotations to add to the service account
+  annotations: {}
+  # -- The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: ""
+
+podAnnotations: {}
+
+podSecurityContext:
+  # -- Sets the filesystem permissions. Since the application requires the data directory to be owned by uid 1000
+  fsGroup: 1000
+
+securityContext:
+  capabilities:
+    # -- needs to add CAP_NET_BIND_SERVICE due to port < 1024
+    add:
+      - NET_BIND_SERVICE
+    drop:
+      - ALL
+  # readOnlyRootFilesystem: true
+  # -- Enforces that the application can't run as root
+  runAsNonRoot: true
+  # -- Starts the application as uid 1000
+  runAsUser: 1000
+
+service:
+  type: ClusterIP
+  port: 80
+
+ingress:
+  enabled: false
+  className: ""
+  annotations: {}
+  hosts:
+    - host: chart-example.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  tls: []
+
+resources: 
+  requests:
+    cpu: "200m"
+    memory: 256Mi
+  limits:
+    cpu: "1"
+    memory: "512Mi"
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
-- 
GitLab