From d291a3c194726851eda1b0051806d261d9bcac04 Mon Sep 17 00:00:00 2001 From: Ryan S <1808452+swensorm@users.noreply.github.com> Date: Tue, 26 Mar 2024 07:53:04 -0500 Subject: [PATCH] add `audiobookshelf` to `community` train (#2303) --- .../community/audiobookshelf/Chart.lock | 6 + .../community/audiobookshelf/Chart.yaml | 26 + .../ix-dev/community/audiobookshelf/README.md | 9 + .../community/audiobookshelf/app-readme.md | 9 + .../audiobookshelf/charts/common-1.2.9.tgz | Bin 0 -> 63532 bytes .../audiobookshelf/ci/basic-values.yaml | 12 + .../audiobookshelf/ci/extra-values.yaml | 13 + .../ix-dev/community/audiobookshelf/item.yaml | 10 + .../community/audiobookshelf/metadata.yaml | 8 + .../community/audiobookshelf/questions.yaml | 456 ++++++++++++++++++ .../audiobookshelf/templates/NOTES.txt | 1 + .../templates/_audiobookshelf.tpl | 50 ++ .../audiobookshelf/templates/_persistence.tpl | 40 ++ .../audiobookshelf/templates/_portal.tpl | 12 + .../audiobookshelf/templates/_service.tpl | 15 + .../audiobookshelf/templates/common.yaml | 11 + .../audiobookshelf/upgrade_info.json | 1 + .../community/audiobookshelf/upgrade_strategy | 31 ++ .../community/audiobookshelf/values.yaml | 28 ++ 19 files changed, 738 insertions(+) create mode 100644 library/ix-dev/community/audiobookshelf/Chart.lock create mode 100644 library/ix-dev/community/audiobookshelf/Chart.yaml create mode 100644 library/ix-dev/community/audiobookshelf/README.md create mode 100644 library/ix-dev/community/audiobookshelf/app-readme.md create mode 100644 library/ix-dev/community/audiobookshelf/charts/common-1.2.9.tgz create mode 100644 library/ix-dev/community/audiobookshelf/ci/basic-values.yaml create mode 100644 library/ix-dev/community/audiobookshelf/ci/extra-values.yaml create mode 100644 library/ix-dev/community/audiobookshelf/item.yaml create mode 100644 library/ix-dev/community/audiobookshelf/metadata.yaml create mode 100644 library/ix-dev/community/audiobookshelf/questions.yaml create mode 100644 library/ix-dev/community/audiobookshelf/templates/NOTES.txt create mode 100644 library/ix-dev/community/audiobookshelf/templates/_audiobookshelf.tpl create mode 100644 library/ix-dev/community/audiobookshelf/templates/_persistence.tpl create mode 100644 library/ix-dev/community/audiobookshelf/templates/_portal.tpl create mode 100644 library/ix-dev/community/audiobookshelf/templates/_service.tpl create mode 100644 library/ix-dev/community/audiobookshelf/templates/common.yaml create mode 100644 library/ix-dev/community/audiobookshelf/upgrade_info.json create mode 100644 library/ix-dev/community/audiobookshelf/upgrade_strategy create mode 100644 library/ix-dev/community/audiobookshelf/values.yaml diff --git a/library/ix-dev/community/audiobookshelf/Chart.lock b/library/ix-dev/community/audiobookshelf/Chart.lock new file mode 100644 index 0000000000..28eedade4a --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.2.9 +digest: sha256:af1a9a1f87e3e48453c9f25f909f5ebcd7fa6e25162b7b425448ba752bcdbc5c +generated: "2024-03-25T09:44:39.2606429-05:00" diff --git a/library/ix-dev/community/audiobookshelf/Chart.yaml b/library/ix-dev/community/audiobookshelf/Chart.yaml new file mode 100644 index 0000000000..64b2fa94a9 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/Chart.yaml @@ -0,0 +1,26 @@ +name: audiobookshelf +description: Audiobookshelf is a self-hosted audiobook and podcast server +annotations: + title: Audiobookshelf +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 2.8.1 +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.2.9 +home: https://www.audiobookshelf.org/ +icon: https://media.sys.truenas.net/apps/audiobookshelf/icons/icon.svg +sources: + - https://ghcr.io/advplyr/audiobookshelf + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/audiobookshelf + - https://github.com/advplyr/audiobookshelf +keywords: + - media + - audiobook diff --git a/library/ix-dev/community/audiobookshelf/README.md b/library/ix-dev/community/audiobookshelf/README.md new file mode 100644 index 0000000000..7108a0a0bf --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/README.md @@ -0,0 +1,9 @@ +# Audiobookshelf + +[Audiobookshelf](https://www.audiobookshelf.org/) is a self-hosted audiobook and podcast server. + +> The following applies only when the storage type is set to **ixVolume** +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Audiobookshelf` directories. +> Afterward, the `Audiobookshelf` 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/audiobookshelf/app-readme.md b/library/ix-dev/community/audiobookshelf/app-readme.md new file mode 100644 index 0000000000..7108a0a0bf --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/app-readme.md @@ -0,0 +1,9 @@ +# Audiobookshelf + +[Audiobookshelf](https://www.audiobookshelf.org/) is a self-hosted audiobook and podcast server. + +> The following applies only when the storage type is set to **ixVolume** +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Audiobookshelf` directories. +> Afterward, the `Audiobookshelf` 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/audiobookshelf/charts/common-1.2.9.tgz b/library/ix-dev/community/audiobookshelf/charts/common-1.2.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..50067b29c22ce64177fe0be9b19cf004da53cc11 GIT binary patch literal 63532 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 N|Nq|V{%in52mtpc)@}d* literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/audiobookshelf/ci/basic-values.yaml b/library/ix-dev/community/audiobookshelf/ci/basic-values.yaml new file mode 100644 index 0000000000..ac5bfa27c3 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/ci/basic-values.yaml @@ -0,0 +1,12 @@ +audiobookshelfNetwork: + webPort: 31000 + +audiobookshelfRunAs: + user: 1000 + group: 1000 + +audiobookshelfStorage: + config: + type: pvc + metadata: + type: pvc diff --git a/library/ix-dev/community/audiobookshelf/ci/extra-values.yaml b/library/ix-dev/community/audiobookshelf/ci/extra-values.yaml new file mode 100644 index 0000000000..8aff8de742 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/ci/extra-values.yaml @@ -0,0 +1,13 @@ +audiobookshelfNetwork: + webPort: 31000 + +audiobookshelfStorage: + config: + type: pvc + metadata: + type: pvc + additionalStorages: + - type: pvc + mountPath: /data1 + - type: pvc + mountPath: /data2 diff --git a/library/ix-dev/community/audiobookshelf/item.yaml b/library/ix-dev/community/audiobookshelf/item.yaml new file mode 100644 index 0000000000..e82236c1d0 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/item.yaml @@ -0,0 +1,10 @@ +icon_url: https://media.sys.truenas.net/apps/audiobookshelf/icons/icon.svg +screenshots: + - https://media.sys.truenas.net/apps/audiobookshelf/screenshots/screenshot1.png + - https://media.sys.truenas.net/apps/audiobookshelf/screenshots/screenshot2.png + - https://media.sys.truenas.net/apps/audiobookshelf/screenshots/screenshot3.png + - https://media.sys.truenas.net/apps/audiobookshelf/screenshots/screenshot4.jpg +categories: + - media +tags: + - audiobook diff --git a/library/ix-dev/community/audiobookshelf/metadata.yaml b/library/ix-dev/community/audiobookshelf/metadata.yaml new file mode 100644 index 0000000000..4f26836b34 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: audiobookshelf + groupName: audiobookshelf + gid: 568 + uid: 568 + description: Audiobookshelf can run as any non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/audiobookshelf/questions.yaml b/library/ix-dev/community/audiobookshelf/questions.yaml new file mode 100644 index 0000000000..9abcb074ce --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/questions.yaml @@ -0,0 +1,456 @@ +groups: + - name: Audiobookshelf Configuration + description: Configure Audiobookshelf + - name: User and Group Configuration + description: Configure User and Group for Audiobookshelf + - name: Network Configuration + description: Configure Network for Audiobookshelf + - name: Storage Configuration + description: Configure Storage for Audiobookshelf + - name: Resources Configuration + description: Configure Resources for Audiobookshelf + +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: TZ + group: Audiobookshelf Configuration + label: Timezone + schema: + type: string + default: Etc/UTC + required: true + $ref: + - definitions/timezone + + - variable: audiobookshelfConfig + label: "" + group: Audiobookshelf Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Audiobookshelf. + 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: audiobookshelfRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Audiobookshelf will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Audiobookshelf will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: audiobookshelfNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Audiobookshelf Web UI. + schema: + type: int + default: 30067 + 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: audiobookshelfStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Audiobookshelf Config Storage + description: The path to store Audiobookshelf Configuration and Database. + 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 + immutable: 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: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "config" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: metadata + label: Audiobookshelf Metadata Storage + description: The path to store Audiobookshelf cache, streams, covers, downloads, backups and logs. + 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 + immutable: 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: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "metadata" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Audiobookshelf. + 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.
+ SMB Share: Is a SMB share that is mounted to a persistent volume claim. + schema: + type: string + required: true + default: "ixVolume" + immutable: true + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - value: "smb-pv-pvc" + description: SMB Share (Mounts a persistent volume claim to a SMB share) + - variable: readOnly + label: Read Only + description: Mount the volume as read only. + schema: + type: boolean + default: false + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + default: "storage_entry" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: smbConfig + label: SMB Share Configuration + description: The configuration for the SMB Share. + schema: + type: dict + show_if: [["type", "=", "smb-pv-pvc"]] + attrs: + - variable: server + label: Server + description: The server for the SMB share. + schema: + type: string + required: true + - variable: share + label: Share + description: The share name for the SMB share. + schema: + type: string + required: true + - variable: domain + label: Domain (Optional) + description: The domain for the SMB share. + schema: + type: string + - variable: username + label: Username + description: The username for the SMB share. + schema: + type: string + required: true + - variable: password + label: Password + description: The password for the SMB share. + schema: + type: string + required: true + private: true + - variable: size + label: Size (in Gi) + description: The size of the volume quota. + schema: + type: int + required: true + min: 1 + default: 1 + + - 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 Audiobookshelf. + 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 Audiobookshelf. + 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/audiobookshelf/templates/NOTES.txt b/library/ix-dev/community/audiobookshelf/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/audiobookshelf/templates/_audiobookshelf.tpl b/library/ix-dev/community/audiobookshelf/templates/_audiobookshelf.tpl new file mode 100644 index 0000000000..7ceef729b5 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/_audiobookshelf.tpl @@ -0,0 +1,50 @@ +{{- define "audiobookshelf.workload" -}} +workload: + audiobookshelf: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.audiobookshelfNetwork.hostNetwork }} + containers: + audiobookshelf: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.audiobookshelfRunAs.user }} + runAsGroup: {{ .Values.audiobookshelfRunAs.group }} + env: + PORT: {{ .Values.audiobookshelfNetwork.webPort }} + CONFIG_PATH: /config + METADATA_PATH: /metadata + {{ with .Values.audiobookshelfConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: "{{ .Values.audiobookshelfNetwork.webPort }}" + path: /healthcheck + readiness: + enabled: true + type: http + port: "{{ .Values.audiobookshelfNetwork.webPort }}" + path: /healthcheck + startup: + enabled: true + type: http + port: "{{ .Values.audiobookshelfNetwork.webPort }}" + path: /healthcheck + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.audiobookshelfRunAs.user + "GID" .Values.audiobookshelfRunAs.group + "mode" "check" + "type" "install") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/audiobookshelf/templates/_persistence.tpl b/library/ix-dev/community/audiobookshelf/templates/_persistence.tpl new file mode 100644 index 0000000000..1d3f5c1b99 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/_persistence.tpl @@ -0,0 +1,40 @@ +{{- define "audiobookshelf.persistence" -}} +persistence: + config: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.audiobookshelfStorage.config) | nindent 4 }} + targetSelector: + audiobookshelf: + audiobookshelf: + mountPath: /config + {{- if and (eq .Values.audiobookshelfStorage.config.type "ixVolume") + (not (.Values.audiobookshelfStorage.config.ixVolumeConfig | default dict).aclEnable) }} + 01-permissions: + mountPath: /mnt/directories/config + {{- end }} + metadata: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.audiobookshelfStorage.metadata) | nindent 4 }} + targetSelector: + audiobookshelf: + audiobookshelf: + mountPath: /metadata + {{- if and (eq .Values.audiobookshelfStorage.metadata.type "ixVolume") + (not (.Values.audiobookshelfStorage.metadata.ixVolumeConfig | default dict).aclEnable) }} + 01-permissions: + mountPath: /mnt/directories/metadata + {{- end }} + {{- range $idx, $storage := .Values.audiobookshelfStorage.additionalStorages }} + {{ printf "audiobookshelf-%v:" (int $idx) }} + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" $storage) | nindent 4 }} + targetSelector: + audiobookshelf: + audiobookshelf: + mountPath: {{ $storage.mountPath }} + {{- if and (eq $storage.type "ixVolume") (not ($storage.ixVolumeConfig | default dict).aclEnable) }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/audiobookshelf/templates/_portal.tpl b/library/ix-dev/community/audiobookshelf/templates/_portal.tpl new file mode 100644 index 0000000000..15a203ed5b --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "audiobookshelf.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.audiobookshelfNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/audiobookshelf/templates/_service.tpl b/library/ix-dev/community/audiobookshelf/templates/_service.tpl new file mode 100644 index 0000000000..a36a1fd023 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "audiobookshelf.service" -}} +service: + audiobookshelf: + enabled: true + primary: true + type: NodePort + targetSelector: audiobookshelf + ports: + webui: + enabled: true + primary: true + port: {{ .Values.audiobookshelfNetwork.webPort }} + nodePort: {{ .Values.audiobookshelfNetwork.webPort }} + targetSelector: audiobookshelf +{{- end -}} diff --git a/library/ix-dev/community/audiobookshelf/templates/common.yaml b/library/ix-dev/community/audiobookshelf/templates/common.yaml new file mode 100644 index 0000000000..43e4110a0d --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "audiobookshelf.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "audiobookshelf.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "audiobookshelf.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "audiobookshelf.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/audiobookshelf/upgrade_info.json b/library/ix-dev/community/audiobookshelf/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/audiobookshelf/upgrade_strategy b/library/ix-dev/community/audiobookshelf/upgrade_strategy new file mode 100644 index 0000000000..41e9448b21 --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/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/audiobookshelf/values.yaml b/library/ix-dev/community/audiobookshelf/values.yaml new file mode 100644 index 0000000000..ed8eb7e63d --- /dev/null +++ b/library/ix-dev/community/audiobookshelf/values.yaml @@ -0,0 +1,28 @@ +image: + repository: ghcr.io/advplyr/audiobookshelf + pullPolicy: IfNotPresent + tag: 2.8.1 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +audiobookshelfConfig: + additionalEnvs: [] +audiobookshelfNetwork: + webPort: 30067 + hostNetwork: false +audiobookshelfRunAs: + user: 568 + group: 568 +audiobookshelfStorage: + config: + type: ixVolume + ixVolumeConfig: + datasetName: config + metadata: + type: ixVolume + ixVolumeConfig: + datasetName: metadata + additionalStorages: []