From d692d8dffc4d2df7267174b0026e39f7b234d302 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 2 May 2023 18:24:16 +0300 Subject: [PATCH] NAS-121408 / 23.10 / Add Jellyfin to `community` train (#1104) * initial commit * run tests * add todo * add gpu + transcode * correct datasetname * fix update strategy * bump common * bump * set min runas to 568 * bump contaienr version * change min runas * add email attr * add metadata --- library/ix-dev/community/jellyfin/Chart.lock | 6 + library/ix-dev/community/jellyfin/Chart.yaml | 26 ++ library/ix-dev/community/jellyfin/README.md | 8 + .../ix-dev/community/jellyfin/app-readme.md | 8 + .../jellyfin/charts/common-1.0.6.tgz | Bin 0 -> 54958 bytes .../community/jellyfin/ci/basic-values.yaml | 22 ++ .../community/jellyfin/ci/extra-values.yaml | 22 ++ .../community/jellyfin/ci/hostNet-values.yaml | 13 + library/ix-dev/community/jellyfin/item.yaml | 4 + .../ix-dev/community/jellyfin/metadata.yaml | 8 + .../ix-dev/community/jellyfin/questions.yaml | 337 ++++++++++++++++++ .../community/jellyfin/templates/NOTES.txt | 1 + .../jellyfin/templates/_jellyfin.tpl | 136 +++++++ .../community/jellyfin/templates/_portal.tpl | 12 + .../community/jellyfin/templates/common.yaml | 9 + .../community/jellyfin/upgrade_info.json | 1 + .../community/jellyfin/upgrade_strategy | 31 ++ library/ix-dev/community/jellyfin/values.yaml | 36 ++ 18 files changed, 680 insertions(+) create mode 100644 library/ix-dev/community/jellyfin/Chart.lock create mode 100644 library/ix-dev/community/jellyfin/Chart.yaml create mode 100644 library/ix-dev/community/jellyfin/README.md create mode 100644 library/ix-dev/community/jellyfin/app-readme.md create mode 100644 library/ix-dev/community/jellyfin/charts/common-1.0.6.tgz create mode 100644 library/ix-dev/community/jellyfin/ci/basic-values.yaml create mode 100644 library/ix-dev/community/jellyfin/ci/extra-values.yaml create mode 100644 library/ix-dev/community/jellyfin/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/jellyfin/item.yaml create mode 100644 library/ix-dev/community/jellyfin/metadata.yaml create mode 100644 library/ix-dev/community/jellyfin/questions.yaml create mode 100644 library/ix-dev/community/jellyfin/templates/NOTES.txt create mode 100644 library/ix-dev/community/jellyfin/templates/_jellyfin.tpl create mode 100644 library/ix-dev/community/jellyfin/templates/_portal.tpl create mode 100644 library/ix-dev/community/jellyfin/templates/common.yaml create mode 100644 library/ix-dev/community/jellyfin/upgrade_info.json create mode 100755 library/ix-dev/community/jellyfin/upgrade_strategy create mode 100644 library/ix-dev/community/jellyfin/values.yaml diff --git a/library/ix-dev/community/jellyfin/Chart.lock b/library/ix-dev/community/jellyfin/Chart.lock new file mode 100644 index 0000000000..126ed7af98 --- /dev/null +++ b/library/ix-dev/community/jellyfin/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.6 +digest: sha256:2f1f31c15fb7f92db141a66adbb8d23a8598727730050a3883a211763a4e5472 +generated: "2023-04-20T01:44:20.846268287+03:00" diff --git a/library/ix-dev/community/jellyfin/Chart.yaml b/library/ix-dev/community/jellyfin/Chart.yaml new file mode 100644 index 0000000000..2ca1311019 --- /dev/null +++ b/library/ix-dev/community/jellyfin/Chart.yaml @@ -0,0 +1,26 @@ +name: jellyfin +description: Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. +annotations: + title: Jellyfin +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '10.8.10' +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.6 +home: https://jellyfin.org/ +icon: https://jellyfin.org/images/logo.svg +sources: + - https://hub.docker.com/r/jellyfin/jellyfin + - https://github.com/truenas/charts/tree/master/community/jellyfin + - https://jellyfin.org/ +keywords: + - media + - streaming diff --git a/library/ix-dev/community/jellyfin/README.md b/library/ix-dev/community/jellyfin/README.md new file mode 100644 index 0000000000..e6cc2f8b26 --- /dev/null +++ b/library/ix-dev/community/jellyfin/README.md @@ -0,0 +1,8 @@ +# Jellyfin + +[Jellyfin](https://jellyfin.org/) is a Free Software Media System that puts you in control of managing and streaming your media. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Jellyfin` directories. +> Afterward, the `Jellyfin` 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. diff --git a/library/ix-dev/community/jellyfin/app-readme.md b/library/ix-dev/community/jellyfin/app-readme.md new file mode 100644 index 0000000000..e6cc2f8b26 --- /dev/null +++ b/library/ix-dev/community/jellyfin/app-readme.md @@ -0,0 +1,8 @@ +# Jellyfin + +[Jellyfin](https://jellyfin.org/) is a Free Software Media System that puts you in control of managing and streaming your media. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Jellyfin` directories. +> Afterward, the `Jellyfin` 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. diff --git a/library/ix-dev/community/jellyfin/charts/common-1.0.6.tgz b/library/ix-dev/community/jellyfin/charts/common-1.0.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..701fac6117abc690a81078e5bf7078f26bf31ca6 GIT binary patch literal 54958 zcmV)@K!Lv>iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvFcic9zFb>b(`V@FM$}{R*snyzV^u(T{$d1Q1UUa-<-g|xh z_&_AO8zVMBlW55rTi^Y6uo4@WUeu1A<~fPgBv7crQm85vs$w#kkZkvS3=7)7g_HCz z%YO!g!QlAtkpDXv4BUSQ2Zu+0**iSk9}JF94hF}68SL#J9v}S$4DJCJ@0peq7JnHm z+?Gq+H}b$NBNS3hvhs8T0E%gfPQf{!72p}ZEMRd9`0Ut#IsP3LB_`P^xZdA@d0ze8 z+elCu7dWT<_ZdiK)tFTULs9_z{|7IJLmXq6f^$e=N=6$Kh%*XthKllZV+Uk#f=&S~ zrYM8u1_09{Jq2S*^YV0e_vYrNFF*BTGTGe_rNso^ptm_XRjqDZE5!EtgZ}Zx*Y4y$ z@FUm%HB6_dye9_Gvi?u@_YU3lf3m+`|0{X^3U+qDRzl)(_toRGN6#PkCrNK(l#)xB zGKP@COO%$U;Pc%E04B2#Zzec>zp)_F-$raq!cPH!LK0{j)c zdHLw&DR>TVFA*ro1ko|hMgXNH`nzr$PY{_3WB^FbZcjlJv5gImqZ=ESupB=PL0}&=jKlt6fB&EvQcg-bDo`1Orao$jdq@5KW_V$0OB7EF zOmELgM$sqA+KGwWPsJczynXuU6dWD@C;#>K`Pu8=PC+yn@a6z0rrBBff@H4^y zUcW6-QB~!yo)l!78}ATIUS{bntNklZQF&WZG%?`7G$l6|1-`~98llH!3{xoNgCR^y zQ6^WP6Z36};+RbGi-HVsiqwP?d;F_u#wL+uB>Ynhb9jkUOfk}n1t!TUc=ulZN(!Rq zEdV>)t~m$Q<>G-aFC=g*)oG_W??Ck z*zB0U@`@TlinZLT*HW1JD=5dXK%6K26{sbs7^4N#=p=7#KS9^! zcyezjBC=p&VhCd-dG553d-1#X_uU3#yX8_EI!6V?LmWf8B!It@bgGau*DMz# zFQ#ew8pQ>oWhGr!FTF}JCwc;NURwVO@D5g8iEtcJn7hbL$>c8bl~<#TJpVA9W-*sBc0c4y0xC-(aOCqDhg$4EM|*q6w*6;+aD2GGw*Rc+`TTkJNAL>K zX_1v&%*rsWv`9e5kb)upgi2t{1n}eT-Q5PSdJfZ62yJQ#oo;;o3~&~w(*%JCf9hZF z^~Egf!#wXBU?Q-U;FyBw?bAmQQ@ud+ME}Kh&j>^epQs1!?l!oI7iUHf+NFr+TKa2{HD`Qq!)+wwg``38=M819^Uz?yy z_GK%@r2#RD$0)vvdIk(U1R0@VYcehAKVT`*5)f25QE~`z3byhBXLJan3!~f5^$gqr z?^w?_We-WI4Xd6VT0TUCHB_DnluiNQiC#55YU|{{uS-h&B^kMBx4Z1$2xuT>t_s0X`;vSP+}#1b?>!v?{vMZrf7urQfE@DXSwHc8!|IaF zE!F4`Q`ue*?4XZ)E;2@ZcL&~s|MP$Bq9d>96IryTS54Ysfj~?O)~$W;TJ~wb-#5E; zh(B>TuY3^kSyX*PYECtQ$C+;6SNy3FJX?TKVD$JZW=gfy>nw*tx%fI3bmt&L&k;Ov6FKi9ikfI_`>(s1Pvowrx6MrNmLmMX7|Ju^*`kD1< z)&JyS)!fQotNypQKRDTQ^}oG?gSGy*ipSRf^w}iHNdj lHu469R^u%bRM_2IMyU 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

nE2=#c3J$Dn;7fZ$x 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 + It's required for autodiscovery to work. + schema: + type: boolean + default: false + + - variable: jellyfinStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Jellyfin Config Storage + description: The path to store Jellyfin 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: cache + label: Jellyfin Cache Storage + description: The path to store Jellyfin Cache. + 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: "cache" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: transcodes + label: Jellyfin Transcodes Storage + description: The path to store Jellyfin Transcodes. + 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.
+ emptyDir: Is a temporary directory that will be created on the disk or in memory. + 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) + - value: "emptyDir" + description: emptyDir (Temporary directory created on the disk or in memory) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "transcodes" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: medium + label: emptyDir Medium + description: | + Disk: Creates a temporary directory on the disk.
+ Memory: Creates a temporary directory in memory. + schema: + type: string + show_if: [["type", "=", "emptyDir"]] + default: "" + enum: + - value: "" + description: Disk (Temporary directory created on the disk) + - value: "Memory" + description: Memory (Temporary directory created in memory) + - variable: size + label: emptyDir Size Limit + description: | + The maximum size of the temporary directory.
+ For example: 2Gi + schema: + type: string + show_if: [["type", "=", "emptyDir"]] + default: "2Gi" + + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Jellyfin. + 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 Jellyfin. + schema: + type: string + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Jellyfin. + schema: + type: string + default: "8Gi" + required: true + + - variable: jellyfinGPU + group: Resources Configuration + label: GPU Configuration + schema: + type: dict + $ref: + - "definitions/gpuConfiguration" + attrs: [] diff --git a/library/ix-dev/community/jellyfin/templates/NOTES.txt b/library/ix-dev/community/jellyfin/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/jellyfin/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/jellyfin/templates/_jellyfin.tpl b/library/ix-dev/community/jellyfin/templates/_jellyfin.tpl new file mode 100644 index 0000000000..b16526e79b --- /dev/null +++ b/library/ix-dev/community/jellyfin/templates/_jellyfin.tpl @@ -0,0 +1,136 @@ +{{- define "jellyfin.workload" -}} +workload: + jellyfin: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.jellyfinNetwork.hostNetwork }} + containers: + jellyfin: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.jellyfinRunAs.user }} + runAsGroup: {{ .Values.jellyfinRunAs.group }} + env: + {{ with .Values.jellyfinConfig.publishedServerUrl }} + JELLYFIN_PublishedServerUrl: {{ . | quote }} + {{ end }} + {{ with .Values.jellyfinConfig.additionalEnvs }} + {{ range $env := . }} + {{ $env.name }}: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: 8096 + path: /health + readiness: + enabled: true + type: http + port: 8096 + path: /health + startup: + enabled: true + type: http + port: 8096 + path: /health + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.jellyfinRunAs.user + "GID" .Values.jellyfinRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} + +{{/* Service */}} +service: + jellyfin: + enabled: true + primary: true + type: NodePort + targetSelector: jellyfin + ports: + webui: + enabled: true + primary: true + port: {{ .Values.jellyfinNetwork.webPort }} + nodePort: {{ .Values.jellyfinNetwork.webPort }} + targetPort: 8096 + targetSelector: jellyfin + +{{/* Persistence */}} +persistence: + config: + enabled: true + type: {{ .Values.jellyfinStorage.config.type }} + datasetName: {{ .Values.jellyfinStorage.config.datasetName | default "" }} + hostPath: {{ .Values.jellyfinStorage.config.hostPath | default "" }} + targetSelector: + jellyfin: + jellyfin: + mountPath: /config + 01-permissions: + mountPath: /mnt/directories/config + cache: + enabled: true + type: {{ .Values.jellyfinStorage.cache.type }} + datasetName: {{ .Values.jellyfinStorage.cache.datasetName | default "" }} + hostPath: {{ .Values.jellyfinStorage.cache.hostPath | default "" }} + targetSelector: + jellyfin: + jellyfin: + mountPath: /cache + 01-permissions: + mountPath: /mnt/directories/cache + transcode: + enabled: true + type: {{ .Values.jellyfinStorage.transcodes.type }} + datasetName: {{ .Values.jellyfinStorage.transcodes.datasetName | default "" }} + hostPath: {{ .Values.jellyfinStorage.transcodes.hostPath | default "" }} + medium: {{ .Values.jellyfinStorage.transcodes.medium | default "" }} + {{/* Size of the emptyDir */}} + size: {{ .Values.jellyfinStorage.transcodes.size | default "" }} + targetSelector: + jellyfin: + jellyfin: + mountPath: /config/transcodes + {{ if ne .Values.jellyfinStorage.transcodes.type "emptyDir" }} + 01-permissions: + mountPath: /mnt/directories/transcodes + {{ end }} + tmp: + enabled: true + type: emptyDir + targetSelector: + jellyfin: + jellyfin: + mountPath: /tmp + {{- range $idx, $storage := .Values.jellyfinStorage.additionalStorages }} + {{ printf "jellyfin-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + jellyfin: + jellyfin: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} +{{ with .Values.jellyfinGPU }} + {{ if gt (. | len) 1 }} + {{- fail "Jellyfin - Max [1] GPUs allowed" -}} + {{ end }} +scaleGPU: + - gpu: + {{ . | keys | first }}: {{ . | values | first }} + targetSelector: + jellyfin: + - jellyfin +{{ end }} +{{- end -}} diff --git a/library/ix-dev/community/jellyfin/templates/_portal.tpl b/library/ix-dev/community/jellyfin/templates/_portal.tpl new file mode 100644 index 0000000000..73e6083a7b --- /dev/null +++ b/library/ix-dev/community/jellyfin/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "jellyfin.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.jellyfinNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/jellyfin/templates/common.yaml b/library/ix-dev/community/jellyfin/templates/common.yaml new file mode 100644 index 0000000000..ee3c3a7796 --- /dev/null +++ b/library/ix-dev/community/jellyfin/templates/common.yaml @@ -0,0 +1,9 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "jellyfin.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "jellyfin.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/jellyfin/upgrade_info.json b/library/ix-dev/community/jellyfin/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/jellyfin/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/jellyfin/upgrade_strategy b/library/ix-dev/community/jellyfin/upgrade_strategy new file mode 100755 index 0000000000..41e9448b21 --- /dev/null +++ b/library/ix-dev/community/jellyfin/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'[0-9]+\.[0-9]+\.[0-9]+') + + +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/jellyfin/values.yaml b/library/ix-dev/community/jellyfin/values.yaml new file mode 100644 index 0000000000..7ddfbd3257 --- /dev/null +++ b/library/ix-dev/community/jellyfin/values.yaml @@ -0,0 +1,36 @@ +image: + repository: jellyfin/jellyfin + pullPolicy: IfNotPresent + tag: '10.8.10' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +jellyfinConfig: + publishedServerUrl: '' + additionalEnvs: [] +jellyfinGPU: {} +jellyfinNetwork: + webPort: 30000 + hostNetwork: false +jellyfinRunAs: + user: 568 + group: 568 +jellyfinStorage: + config: + type: ixVolume + hostPath: '' + datasetName: config + cache: + type: ixVolume + hostPath: '' + datasetName: cache + transcodes: + type: ixVolume + hostPath: '' + datasetName: transcodes + medium: '' + size: '' + additionalStorages: []