From cba86b80cf0d0c92626b874e86581d2b3538361f Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Thu, 27 Jul 2023 20:23:31 +0300 Subject: [PATCH] NAS-123063 / 23.10 / Add `homepage` to `community` train (#1378) * add `homepage` to `community` train * add templates and UI * update icon * remove unused values * fix metadata * also fix readme's --- library/ix-dev/community/homepage/Chart.lock | 6 + library/ix-dev/community/homepage/Chart.yaml | 25 +++ library/ix-dev/community/homepage/README.md | 8 + .../ix-dev/community/homepage/app-readme.md | 8 + .../homepage/charts/common-1.0.12.tgz | Bin 0 -> 56723 bytes .../community/homepage/ci/basic-values.yaml | 7 + .../community/homepage/ci/extra-values.yaml | 21 ++ .../community/homepage/ci/hostNet-values.yaml | 8 + library/ix-dev/community/homepage/item.yaml | 12 + .../ix-dev/community/homepage/metadata.yaml | 8 + .../ix-dev/community/homepage/questions.yaml | 208 ++++++++++++++++++ .../community/homepage/templates/NOTES.txt | 1 + .../homepage/templates/_homepage.tpl | 51 +++++ .../homepage/templates/_persistence.tpl | 34 +++ .../community/homepage/templates/_portal.tpl | 12 + .../community/homepage/templates/_rbac.tpl | 49 +++++ .../community/homepage/templates/_service.tpl | 15 ++ .../community/homepage/templates/common.yaml | 15 ++ .../community/homepage/upgrade_info.json | 1 + .../community/homepage/upgrade_strategy | 31 +++ library/ix-dev/community/homepage/values.yaml | 22 ++ 21 files changed, 542 insertions(+) create mode 100644 library/ix-dev/community/homepage/Chart.lock create mode 100644 library/ix-dev/community/homepage/Chart.yaml create mode 100644 library/ix-dev/community/homepage/README.md create mode 100644 library/ix-dev/community/homepage/app-readme.md create mode 100644 library/ix-dev/community/homepage/charts/common-1.0.12.tgz create mode 100644 library/ix-dev/community/homepage/ci/basic-values.yaml create mode 100644 library/ix-dev/community/homepage/ci/extra-values.yaml create mode 100644 library/ix-dev/community/homepage/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/homepage/item.yaml create mode 100644 library/ix-dev/community/homepage/metadata.yaml create mode 100644 library/ix-dev/community/homepage/questions.yaml create mode 100644 library/ix-dev/community/homepage/templates/NOTES.txt create mode 100644 library/ix-dev/community/homepage/templates/_homepage.tpl create mode 100644 library/ix-dev/community/homepage/templates/_persistence.tpl create mode 100644 library/ix-dev/community/homepage/templates/_portal.tpl create mode 100644 library/ix-dev/community/homepage/templates/_rbac.tpl create mode 100644 library/ix-dev/community/homepage/templates/_service.tpl create mode 100644 library/ix-dev/community/homepage/templates/common.yaml create mode 100644 library/ix-dev/community/homepage/upgrade_info.json create mode 100755 library/ix-dev/community/homepage/upgrade_strategy create mode 100644 library/ix-dev/community/homepage/values.yaml diff --git a/library/ix-dev/community/homepage/Chart.lock b/library/ix-dev/community/homepage/Chart.lock new file mode 100644 index 0000000000..f129f62d7e --- /dev/null +++ b/library/ix-dev/community/homepage/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.12 +digest: sha256:debd30721d09ae8293b1cbdd9d0115981d40b47908be3035fc3cf657c9d5eedb +generated: "2023-07-17T18:24:32.256341435+03:00" diff --git a/library/ix-dev/community/homepage/Chart.yaml b/library/ix-dev/community/homepage/Chart.yaml new file mode 100644 index 0000000000..b8107e6853 --- /dev/null +++ b/library/ix-dev/community/homepage/Chart.yaml @@ -0,0 +1,25 @@ +name: homepage +description: Homepage is a modern, secure, highly customizable application dashboard. +annotations: + title: Homepage +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 0.6.21 +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.12 +home: https://gethomepage.dev/ +icon: https://gethomepage.dev/favicon.svg +sources: + - https://gethomepage.dev/ + - https://github.com/truenas/charts/tree/master/community/homepage + - https://github.com/benphelps/homepage +keywords: + - dashboard diff --git a/library/ix-dev/community/homepage/README.md b/library/ix-dev/community/homepage/README.md new file mode 100644 index 0000000000..a2237c4ecd --- /dev/null +++ b/library/ix-dev/community/homepage/README.md @@ -0,0 +1,8 @@ +# Homepage + +[Homepage](https://github.com/benphelps/homepage) is a modern, secure, highly customizable application dashboard. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Homepage` directories. +> Afterward, the `Homepage` container will run as a **non**-root user (`1000`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/homepage/app-readme.md b/library/ix-dev/community/homepage/app-readme.md new file mode 100644 index 0000000000..a2237c4ecd --- /dev/null +++ b/library/ix-dev/community/homepage/app-readme.md @@ -0,0 +1,8 @@ +# Homepage + +[Homepage](https://github.com/benphelps/homepage) is a modern, secure, highly customizable application dashboard. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Homepage` directories. +> Afterward, the `Homepage` container will run as a **non**-root user (`1000`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/homepage/charts/common-1.0.12.tgz b/library/ix-dev/community/homepage/charts/common-1.0.12.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e2f3f00b87271810224d65edc4ae9b6eacb6aa1d GIT binary patch literal 56723 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/homepage/ci/basic-values.yaml b/library/ix-dev/community/homepage/ci/basic-values.yaml new file mode 100644 index 0000000000..129b0d45fc --- /dev/null +++ b/library/ix-dev/community/homepage/ci/basic-values.yaml @@ -0,0 +1,7 @@ +homepageNetwork: + webPort: 31000 + +homepageStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/homepage/ci/extra-values.yaml b/library/ix-dev/community/homepage/ci/extra-values.yaml new file mode 100644 index 0000000000..9c1442600e --- /dev/null +++ b/library/ix-dev/community/homepage/ci/extra-values.yaml @@ -0,0 +1,21 @@ +homepageConfig: + additionalEnvs: + - name: HOMEPAGE_VAR_SOMETHING + value: some-value + - name: HOMEPAGE_FILE_SOMETHING + value: /some/path + +homepageNetwork: + webPort: 31000 + +homepageStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + additionalStorages: + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data1 + mountPath: /data1 + - type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data2 + mountPath: /data2 diff --git a/library/ix-dev/community/homepage/ci/hostNet-values.yaml b/library/ix-dev/community/homepage/ci/hostNet-values.yaml new file mode 100644 index 0000000000..f0c4e669b5 --- /dev/null +++ b/library/ix-dev/community/homepage/ci/hostNet-values.yaml @@ -0,0 +1,8 @@ +homepageNetwork: + webPort: 30000 + hostNetwork: true + +homepageStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/homepage/item.yaml b/library/ix-dev/community/homepage/item.yaml new file mode 100644 index 0000000000..7debf072f7 --- /dev/null +++ b/library/ix-dev/community/homepage/item.yaml @@ -0,0 +1,12 @@ +icon_url: https://gethomepage.dev/favicon.svg +categories: + - productivity +screenshots: + - https://github.com/benphelps/homepage/blob/main/images/1.png + - https://github.com/benphelps/homepage/blob/main/images/2.png + - https://github.com/benphelps/homepage/blob/main/images/3.png + - https://github.com/benphelps/homepage/blob/main/images/4.png + - https://github.com/benphelps/homepage/blob/main/images/5.png + - https://github.com/benphelps/homepage/blob/main/images/6.png +tags: + - dashboard diff --git a/library/ix-dev/community/homepage/metadata.yaml b/library/ix-dev/community/homepage/metadata.yaml new file mode 100644 index 0000000000..d5c45c1ec5 --- /dev/null +++ b/library/ix-dev/community/homepage/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: homepage + groupName: homepage + gid: 1000 + uid: 1000 + description: Homepage runs as a non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/homepage/questions.yaml b/library/ix-dev/community/homepage/questions.yaml new file mode 100644 index 0000000000..a7e811e718 --- /dev/null +++ b/library/ix-dev/community/homepage/questions.yaml @@ -0,0 +1,208 @@ +groups: + - name: Homepage Configuration + description: Configure Homepage + - name: Network Configuration + description: Configure Network for Homepage + - name: Storage Configuration + description: Configure Storage for Homepage + - name: Resources Configuration + description: Configure Resources for Homepage + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: homepageConfig + label: "" + group: Homepage Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Homepage. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: homepageNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Homepage Web UI. + schema: + type: int + default: 30054 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: homepageStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Homepage Config Storage + description: The path to store Homepage Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "config" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Homepage. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Homepage. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Homepage. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/library/ix-dev/community/homepage/templates/NOTES.txt b/library/ix-dev/community/homepage/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/homepage/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/homepage/templates/_homepage.tpl b/library/ix-dev/community/homepage/templates/_homepage.tpl new file mode 100644 index 0000000000..68ddaa7139 --- /dev/null +++ b/library/ix-dev/community/homepage/templates/_homepage.tpl @@ -0,0 +1,51 @@ +{{- define "homepage.workload" -}} +workload: + homepage: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.homepageNetwork.hostNetwork }} + containers: + homepage: + enabled: true + primary: true + imageSelector: image + # While it seems that any uid/gid can be used + # There was permission errors when trying to cache things. + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + readOnlyRootFilesystem: false + env: + PORT: {{ .Values.homepageNetwork.webPort }} + {{ with .Values.homepageConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: "{{ .Values.homepageNetwork.webPort }}" + path: /api/healthcheck + readiness: + enabled: true + type: http + port: "{{ .Values.homepageNetwork.webPort }}" + path: /api/healthcheck + startup: + enabled: true + type: http + port: "{{ .Values.homepageNetwork.webPort }}" + path: /api/healthcheck + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 1000 + "GID" 1000 + "mode" "check" + "type" "init") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/homepage/templates/_persistence.tpl b/library/ix-dev/community/homepage/templates/_persistence.tpl new file mode 100644 index 0000000000..b228e30015 --- /dev/null +++ b/library/ix-dev/community/homepage/templates/_persistence.tpl @@ -0,0 +1,34 @@ +{{- define "homepage.persistence" -}} +persistence: + config: + enabled: true + type: {{ .Values.homepageStorage.config.type }} + datasetName: {{ .Values.homepageStorage.config.datasetName | default "" }} + hostPath: {{ .Values.homepageStorage.config.hostPath | default "" }} + targetSelector: + homepage: + homepage: + mountPath: /app/config + 01-permissions: + mountPath: /mnt/directories/config + tmp: + enabled: true + type: emptyDir + targetSelector: + homepage: + homepage: + mountPath: /tmp + {{- range $idx, $storage := .Values.homepageStorage.additionalStorages }} + {{ printf "homepage-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + homepage: + homepage: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/homepage/templates/_portal.tpl b/library/ix-dev/community/homepage/templates/_portal.tpl new file mode 100644 index 0000000000..4ac167b297 --- /dev/null +++ b/library/ix-dev/community/homepage/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "homepage.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.homepageNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/homepage/templates/_rbac.tpl b/library/ix-dev/community/homepage/templates/_rbac.tpl new file mode 100644 index 0000000000..2dca724f52 --- /dev/null +++ b/library/ix-dev/community/homepage/templates/_rbac.tpl @@ -0,0 +1,49 @@ +{{- define "homepage.rbac" -}} +serviceAccount: + homepage: + enabled: true + primary: true + targetSelector: + - homapage + +rbac: + homepage: + enabled: true + primary: true + clusterWide: true + serviceAccounts: + - homepage + rules: + - apiGroups: + - "" + resources: + - namespaces + - pods + - nodes + verbs: + - get + - list + - apiGroups: + - extensions + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - apiGroups: + - traefik.containo.us + resources: + - ingressroutes + verbs: + - get + - list + - apiGroups: + - metrics.k8s.io + resources: + - nodes + - pods + verbs: + - get + - list +{{- end -}} diff --git a/library/ix-dev/community/homepage/templates/_service.tpl b/library/ix-dev/community/homepage/templates/_service.tpl new file mode 100644 index 0000000000..af55663596 --- /dev/null +++ b/library/ix-dev/community/homepage/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "homepage.service" -}} +service: + homepage: + enabled: true + primary: true + type: NodePort + targetSelector: homepage + ports: + webui: + enabled: true + primary: true + port: {{ .Values.homepageNetwork.webPort }} + nodePort: {{ .Values.homepageNetwork.webPort }} + targetSelector: homepage +{{- end -}} diff --git a/library/ix-dev/community/homepage/templates/common.yaml b/library/ix-dev/community/homepage/templates/common.yaml new file mode 100644 index 0000000000..0036c0031e --- /dev/null +++ b/library/ix-dev/community/homepage/templates/common.yaml @@ -0,0 +1,15 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "homepage.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "homepage.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "homepage.service" $ | fromYaml) -}} +{{/* FIXME: https://github.com/benphelps/homepage/pull/1627 +Currently it fills logs with errors failing to retrieve ingresses / traefik ingresses +{{- $_ := mustMergeOverwrite .Values (include "homepage.rbac" $ | fromYaml) -}} +*/}} + +{{/* Create the configmap for portal manually*/}} +{{- include "homepage.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/homepage/upgrade_info.json b/library/ix-dev/community/homepage/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/homepage/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/homepage/upgrade_strategy b/library/ix-dev/community/homepage/upgrade_strategy new file mode 100755 index 0000000000..5718e19a44 --- /dev/null +++ b/library/ix-dev/community/homepage/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'v\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip('v'): t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/homepage/values.yaml b/library/ix-dev/community/homepage/values.yaml new file mode 100644 index 0000000000..6958a216cc --- /dev/null +++ b/library/ix-dev/community/homepage/values.yaml @@ -0,0 +1,22 @@ +image: + repository: ghcr.io/benphelps/homepage + pullPolicy: IfNotPresent + tag: v0.6.21 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +homepageConfig: + additionalEnvs: [] + +homepageNetwork: + webPort: 30054 + hostNetwork: false + +homepageStorage: + config: + type: ixVolume + datasetName: config + additionalStorages: []