From 4a360ed4be1bdd36bec03a5d4df9c97b3ce2019f Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 27 Jun 2023 21:44:56 +0300 Subject: [PATCH] NAS-122621 / 23.10 / Add `navidrome` to `community` train (#1291) * navidrome initial commit * update questions * fix func name * fix UI and some typos --- library/ix-dev/community/navidrome/Chart.lock | 6 + library/ix-dev/community/navidrome/Chart.yaml | 26 ++ library/ix-dev/community/navidrome/README.md | 11 + .../ix-dev/community/navidrome/app-readme.md | 11 + .../navidrome/charts/common-1.0.8.tgz | Bin 0 -> 55444 bytes .../community/navidrome/ci/basic-values.yaml | 10 + .../navidrome/ci/other-user-values.yaml | 11 + library/ix-dev/community/navidrome/item.yaml | 7 + .../ix-dev/community/navidrome/metadata.yaml | 8 + .../ix-dev/community/navidrome/questions.yaml | 262 ++++++++++++++++++ .../community/navidrome/templates/NOTES.txt | 1 + .../navidrome/templates/_navidrome.tpl | 51 ++++ .../navidrome/templates/_persistence.tpl | 38 +++ .../community/navidrome/templates/_portal.tpl | 12 + .../navidrome/templates/_service.tpl | 15 + .../community/navidrome/templates/common.yaml | 11 + .../community/navidrome/upgrade_info.json | 1 + .../community/navidrome/upgrade_strategy | 31 +++ .../ix-dev/community/navidrome/values.yaml | 30 ++ 19 files changed, 542 insertions(+) create mode 100644 library/ix-dev/community/navidrome/Chart.lock create mode 100644 library/ix-dev/community/navidrome/Chart.yaml create mode 100644 library/ix-dev/community/navidrome/README.md create mode 100644 library/ix-dev/community/navidrome/app-readme.md create mode 100644 library/ix-dev/community/navidrome/charts/common-1.0.8.tgz create mode 100644 library/ix-dev/community/navidrome/ci/basic-values.yaml create mode 100644 library/ix-dev/community/navidrome/ci/other-user-values.yaml create mode 100644 library/ix-dev/community/navidrome/item.yaml create mode 100644 library/ix-dev/community/navidrome/metadata.yaml create mode 100644 library/ix-dev/community/navidrome/questions.yaml create mode 100644 library/ix-dev/community/navidrome/templates/NOTES.txt create mode 100644 library/ix-dev/community/navidrome/templates/_navidrome.tpl create mode 100644 library/ix-dev/community/navidrome/templates/_persistence.tpl create mode 100644 library/ix-dev/community/navidrome/templates/_portal.tpl create mode 100644 library/ix-dev/community/navidrome/templates/_service.tpl create mode 100644 library/ix-dev/community/navidrome/templates/common.yaml create mode 100644 library/ix-dev/community/navidrome/upgrade_info.json create mode 100755 library/ix-dev/community/navidrome/upgrade_strategy create mode 100644 library/ix-dev/community/navidrome/values.yaml diff --git a/library/ix-dev/community/navidrome/Chart.lock b/library/ix-dev/community/navidrome/Chart.lock new file mode 100644 index 0000000000..5b29c2142e --- /dev/null +++ b/library/ix-dev/community/navidrome/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.8 +digest: sha256:254efaa1285f634b7a80b7baadeadbd20a680f7fee49d1d9d3c4618aa0d657ad +generated: "2023-06-23T20:43:05.276871905+03:00" diff --git a/library/ix-dev/community/navidrome/Chart.yaml b/library/ix-dev/community/navidrome/Chart.yaml new file mode 100644 index 0000000000..958a8a1262 --- /dev/null +++ b/library/ix-dev/community/navidrome/Chart.yaml @@ -0,0 +1,26 @@ +name: navidrome +description: Navidrome is a personal streaming service +annotations: + title: Navidrome +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '0.49.3' +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.8 +home: https://www.navidrome.org/ +icon: https://github.com/navidrome/navidrome/raw/master/resources/logo-192x192.png +sources: + - https://hub.docker.com/r/deluan/navidrome + - https://github.com/truenas/charts/tree/master/community/navidrome + - https://github.com/navidrome/navidrome/ +keywords: + - media + - music diff --git a/library/ix-dev/community/navidrome/README.md b/library/ix-dev/community/navidrome/README.md new file mode 100644 index 0000000000..00338e154d --- /dev/null +++ b/library/ix-dev/community/navidrome/README.md @@ -0,0 +1,11 @@ +# Navidrome + +[Navidrome](https://www.navidrome.org/) is a personal streaming service + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Navidrome` directories. +> Afterward, the `Navidrome` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. + +Additional configuration options can be defined via environment variables. +See more information on the [Navidrome Documentation](https://www.navidrome.org/docs/usage/configuration-options) diff --git a/library/ix-dev/community/navidrome/app-readme.md b/library/ix-dev/community/navidrome/app-readme.md new file mode 100644 index 0000000000..00338e154d --- /dev/null +++ b/library/ix-dev/community/navidrome/app-readme.md @@ -0,0 +1,11 @@ +# Navidrome + +[Navidrome](https://www.navidrome.org/) is a personal streaming service + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Navidrome` directories. +> Afterward, the `Navidrome` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. + +Additional configuration options can be defined via environment variables. +See more information on the [Navidrome Documentation](https://www.navidrome.org/docs/usage/configuration-options) diff --git a/library/ix-dev/community/navidrome/charts/common-1.0.8.tgz b/library/ix-dev/community/navidrome/charts/common-1.0.8.tgz new file mode 100644 index 0000000000000000000000000000000000000000..aa83a827835ce759ccb2443c6c813ce385d921ac GIT binary patch literal 55444 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 P00960o?&2o03HVb_A>~i literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/navidrome/ci/basic-values.yaml b/library/ix-dev/community/navidrome/ci/basic-values.yaml new file mode 100644 index 0000000000..af21d50315 --- /dev/null +++ b/library/ix-dev/community/navidrome/ci/basic-values.yaml @@ -0,0 +1,10 @@ +navidromeStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + music: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/music + +navidromeConfig: + uiWelcomeMessage: 'Welcome to Navidrome!' diff --git a/library/ix-dev/community/navidrome/ci/other-user-values.yaml b/library/ix-dev/community/navidrome/ci/other-user-values.yaml new file mode 100644 index 0000000000..8b95c42cd7 --- /dev/null +++ b/library/ix-dev/community/navidrome/ci/other-user-values.yaml @@ -0,0 +1,11 @@ +navidromeStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/data + music: + type: hostPath + hostPath: /mnt/{{ .Release.Name }}/music + +navidromeRunAs: + user: 1000 + group: 1000 diff --git a/library/ix-dev/community/navidrome/item.yaml b/library/ix-dev/community/navidrome/item.yaml new file mode 100644 index 0000000000..d5b234bad6 --- /dev/null +++ b/library/ix-dev/community/navidrome/item.yaml @@ -0,0 +1,7 @@ +icon_url: https://github.com/navidrome/navidrome/raw/master/resources/logo-192x192.png +categories: + - media +screenshots: + - https://noted.lol/content/images/size/w1000/2022/05/navidrome-self-hosted-main-1.png +tags: + - music diff --git a/library/ix-dev/community/navidrome/metadata.yaml b/library/ix-dev/community/navidrome/metadata.yaml new file mode 100644 index 0000000000..51d3433303 --- /dev/null +++ b/library/ix-dev/community/navidrome/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: navidrome + groupName: navidrome + gid: 568 + uid: 568 + description: Navidrome can run as any non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/navidrome/questions.yaml b/library/ix-dev/community/navidrome/questions.yaml new file mode 100644 index 0000000000..0d97c51ca5 --- /dev/null +++ b/library/ix-dev/community/navidrome/questions.yaml @@ -0,0 +1,262 @@ +groups: + - name: Navidrome Configuration + description: Configure Navidrome + - name: User and Group Configuration + description: Configure User and Group for Navidrome + - name: Network Configuration + description: Configure Network for Navidrome + - name: Storage Configuration + description: Configure Storage for Navidrome + - name: Resources Configuration + description: Configure Resources for Navidrome + +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: navidromeConfig + label: "" + group: Navidrome Configuration + schema: + type: dict + attrs: + - variable: uiWelcomeMessage + label: Login Screen Welcome Message + description: The welcome message to display on the Navidrome Login Screen. + schema: + type: string + default: "" + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Navidrome. + 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: navidromeRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Navidrome will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Navidrome will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: navidromeNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Navidrome Web UI. + schema: + type: int + default: 30043 + 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: navidromeStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: Navidrome Data Storage + description: The path to store Navidrome Data. + 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: "data" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: music + label: Navidrome Music Storage + description: The path to store Navidrome Music. + 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: "music" + $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 Navidrome. + 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 Navidrome. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Navidrome. + schema: + type: string + default: "8Gi" + required: true diff --git a/library/ix-dev/community/navidrome/templates/NOTES.txt b/library/ix-dev/community/navidrome/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/navidrome/templates/_navidrome.tpl b/library/ix-dev/community/navidrome/templates/_navidrome.tpl new file mode 100644 index 0000000000..18b3b836ea --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/_navidrome.tpl @@ -0,0 +1,51 @@ +{{- define "navidrome.workload" -}} +workload: + navidrome: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.navidromeNetwork.hostNetwork }} + containers: + navidrome: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.navidromeRunAs.user }} + runAsGroup: {{ .Values.navidromeRunAs.group }} + env: + ND_MUSICFOLDER: /music + ND_DATAFOLDER: /data + ND_PORT: {{ .Values.navidromeNetwork.webPort | quote }} + ND_UIWELCOMEMESSAGE: {{ .Values.navidromeConfig.uiWelcomeMessage }} + {{ with .Values.navidromeConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: "{{ .Values.navidromeNetwork.webPort }}" + path: /ping + readiness: + enabled: true + type: http + port: "{{ .Values.navidromeNetwork.webPort }}" + path: /ping + startup: + enabled: true + type: http + port: "{{ .Values.navidromeNetwork.webPort }}" + path: /ping + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.navidromeRunAs.user + "GID" .Values.navidromeRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/navidrome/templates/_persistence.tpl b/library/ix-dev/community/navidrome/templates/_persistence.tpl new file mode 100644 index 0000000000..4f000a2e1b --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/_persistence.tpl @@ -0,0 +1,38 @@ +{{- define "navidrome.persistence" -}} +persistence: + data: + enabled: true + type: {{ .Values.navidromeStorage.data.type }} + datasetName: {{ .Values.navidromeStorage.data.datasetName | default "" }} + hostPath: {{ .Values.navidromeStorage.data.hostPath | default "" }} + targetSelector: + navidrome: + navidrome: + mountPath: /data + 01-permissions: + mountPath: /mnt/directories/data + music: + enabled: true + type: {{ .Values.navidromeStorage.music.type }} + datasetName: {{ .Values.navidromeStorage.music.datasetName | default "" }} + hostPath: {{ .Values.navidromeStorage.music.hostPath | default "" }} + targetSelector: + navidrome: + navidrome: + mountPath: /music + 01-permissions: + mountPath: /mnt/directories/music + {{- range $idx, $storage := .Values.navidromeStorage.additionalStorages }} + {{ printf "navidrome-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + navidrome: + navidrome: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/navidrome/templates/_portal.tpl b/library/ix-dev/community/navidrome/templates/_portal.tpl new file mode 100644 index 0000000000..1b3a317dfb --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "navidrome.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.navidromeNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/navidrome/templates/_service.tpl b/library/ix-dev/community/navidrome/templates/_service.tpl new file mode 100644 index 0000000000..06b239d97b --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "navidrome.service" -}} +service: + navidrome: + enabled: true + primary: true + type: NodePort + targetSelector: navidrome + ports: + webui: + enabled: true + primary: true + port: {{ .Values.navidromeNetwork.webPort }} + nodePort: {{ .Values.navidromeNetwork.webPort }} + targetSelector: navidrome +{{- end -}} diff --git a/library/ix-dev/community/navidrome/templates/common.yaml b/library/ix-dev/community/navidrome/templates/common.yaml new file mode 100644 index 0000000000..f8b1cc2b79 --- /dev/null +++ b/library/ix-dev/community/navidrome/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "navidrome.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "navidrome.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "navidrome.service" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "navidrome.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/navidrome/upgrade_info.json b/library/ix-dev/community/navidrome/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/navidrome/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/navidrome/upgrade_strategy b/library/ix-dev/community/navidrome/upgrade_strategy new file mode 100755 index 0000000000..af685230a1 --- /dev/null +++ b/library/ix-dev/community/navidrome/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'\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: 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/navidrome/values.yaml b/library/ix-dev/community/navidrome/values.yaml new file mode 100644 index 0000000000..ff520c8065 --- /dev/null +++ b/library/ix-dev/community/navidrome/values.yaml @@ -0,0 +1,30 @@ +image: + repository: deluan/navidrome + pullPolicy: IfNotPresent + tag: '0.49.3' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +navidromeConfig: + uiWelcomeMessage: '' + additionalEnvs: [] + +navidromeNetwork: + webPort: 30043 + hostNetwork: false + +navidromeRunAs: + user: 568 + group: 568 + +navidromeStorage: + data: + type: ixVolume + datasetName: data + music: + type: ixVolume + datasetName: music + additionalStorages: []