From fccf8800abf66a08e612026d08f70fe63e170063 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 4 Apr 2023 09:52:41 +0300 Subject: [PATCH] NAS-120567 / None / Add qBittorrent Community App (#1012) * Add qbittorrent to community train * add item.yaml * dummy commit * Add update strategy and update readme(s) * update common * switch to differnt permission logic --- .../ix-dev/community/qbittorrent/Chart.lock | 6 + .../ix-dev/community/qbittorrent/Chart.yaml | 26 +++ .../ix-dev/community/qbittorrent/README.md | 7 + .../community/qbittorrent/app-readme.md | 7 + .../qbittorrent/charts/common-1.0.1.tgz | Bin 0 -> 53839 bytes .../qbittorrent/ci/basic-values.yaml | 17 ++ .../qbittorrent/ci/extra-env-values.yaml | 20 ++ .../qbittorrent/ci/hostNet-values.yaml | 14 ++ .../ix-dev/community/qbittorrent/item.yaml | 5 + .../community/qbittorrent/questions.yaml | 209 ++++++++++++++++++ .../community/qbittorrent/templates/NOTES.txt | 1 + .../qbittorrent/templates/_configuration.tpl | 11 + .../qbittorrent/templates/_portal.tpl | 12 + .../qbittorrent/templates/_qbittorrent.tpl | 138 ++++++++++++ .../qbittorrent/templates/common.yaml | 10 + .../community/qbittorrent/upgrade_strategy | 31 +++ .../ix-dev/community/qbittorrent/values.yaml | 34 +++ 17 files changed, 548 insertions(+) create mode 100644 library/ix-dev/community/qbittorrent/Chart.lock create mode 100644 library/ix-dev/community/qbittorrent/Chart.yaml create mode 100644 library/ix-dev/community/qbittorrent/README.md create mode 100644 library/ix-dev/community/qbittorrent/app-readme.md create mode 100644 library/ix-dev/community/qbittorrent/charts/common-1.0.1.tgz create mode 100644 library/ix-dev/community/qbittorrent/ci/basic-values.yaml create mode 100644 library/ix-dev/community/qbittorrent/ci/extra-env-values.yaml create mode 100644 library/ix-dev/community/qbittorrent/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/qbittorrent/item.yaml create mode 100644 library/ix-dev/community/qbittorrent/questions.yaml create mode 100644 library/ix-dev/community/qbittorrent/templates/NOTES.txt create mode 100644 library/ix-dev/community/qbittorrent/templates/_configuration.tpl create mode 100644 library/ix-dev/community/qbittorrent/templates/_portal.tpl create mode 100644 library/ix-dev/community/qbittorrent/templates/_qbittorrent.tpl create mode 100644 library/ix-dev/community/qbittorrent/templates/common.yaml create mode 100755 library/ix-dev/community/qbittorrent/upgrade_strategy create mode 100644 library/ix-dev/community/qbittorrent/values.yaml diff --git a/library/ix-dev/community/qbittorrent/Chart.lock b/library/ix-dev/community/qbittorrent/Chart.lock new file mode 100644 index 0000000000..ad10850747 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.1 +digest: sha256:ec8784f128039af68613a8268208bde360d5b178f811c4a16c79a1650ca8be92 +generated: "2023-04-03T17:54:32.688255209+03:00" diff --git a/library/ix-dev/community/qbittorrent/Chart.yaml b/library/ix-dev/community/qbittorrent/Chart.yaml new file mode 100644 index 0000000000..359cf235e4 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/Chart.yaml @@ -0,0 +1,26 @@ +name: qbittorrent +description: The qBittorrent project aims to provide an open-source software alternative to µTorrent. +annotations: + title: qBittorrent +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '4.5.2' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.1 +home: https://www.qbittorrent.org/ +icon: https://upload.wikimedia.org/wikipedia/commons/9/9e/Qbittorrent_logo.png +sources: +- https://github.com/onedr0p/containers/tree/main/apps/qbittorrent +- https://github.com/truenas/charts/tree/master/community/qbittorrent +- https://www.qbittorrent.org/ +keywords: +- media +- torrent +- download diff --git a/library/ix-dev/community/qbittorrent/README.md b/library/ix-dev/community/qbittorrent/README.md new file mode 100644 index 0000000000..a5cbcbd098 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/README.md @@ -0,0 +1,7 @@ +# qBittorrent + +The [qBittorrent](https://www.qbittorrent.org/) project aims to provide an open-source software alternative to µTorrent. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the qBittorrent directories. +> Afterward, the `qBittorrent` container will run as a **non**-root user (Default: `568`). diff --git a/library/ix-dev/community/qbittorrent/app-readme.md b/library/ix-dev/community/qbittorrent/app-readme.md new file mode 100644 index 0000000000..a5cbcbd098 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/app-readme.md @@ -0,0 +1,7 @@ +# qBittorrent + +The [qBittorrent](https://www.qbittorrent.org/) project aims to provide an open-source software alternative to µTorrent. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the qBittorrent directories. +> Afterward, the `qBittorrent` container will run as a **non**-root user (Default: `568`). diff --git a/library/ix-dev/community/qbittorrent/charts/common-1.0.1.tgz b/library/ix-dev/community/qbittorrent/charts/common-1.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..60818764b0ddafdbe8c741c2d9d51988b2a7f1d1 GIT binary patch literal 53839 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/qbittorrent/ci/basic-values.yaml b/library/ix-dev/community/qbittorrent/ci/basic-values.yaml new file mode 100644 index 0000000000..abb2549d2e --- /dev/null +++ b/library/ix-dev/community/qbittorrent/ci/basic-values.yaml @@ -0,0 +1,17 @@ +qbitNetwork: + webPort: 31000 + btPort: 32444 + +qbitRunAs: + user: 1000 + group: 1000 + +qbitStorage: + downloads: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/downloads + datasetName: "" + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + datasetName: "" diff --git a/library/ix-dev/community/qbittorrent/ci/extra-env-values.yaml b/library/ix-dev/community/qbittorrent/ci/extra-env-values.yaml new file mode 100644 index 0000000000..aafc675a72 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/ci/extra-env-values.yaml @@ -0,0 +1,20 @@ +qbitConfig: + additionalEnvs: + - name: "TESTVAR" + value: "SOMEVALUE" + - name: "TESTVAR2" + value: "SOMEVALUE2" + +qbitNetwork: + webPort: 31000 + btPort: 32444 + +qbitStorage: + downloads: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/downloads + datasetName: "" + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + datasetName: "" diff --git a/library/ix-dev/community/qbittorrent/ci/hostNet-values.yaml b/library/ix-dev/community/qbittorrent/ci/hostNet-values.yaml new file mode 100644 index 0000000000..0a6906efbb --- /dev/null +++ b/library/ix-dev/community/qbittorrent/ci/hostNet-values.yaml @@ -0,0 +1,14 @@ +qbitNetwork: + webPort: 30000 + btPort: 32555 + hostNetwork: true + +qbitStorage: + downloads: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/downloads + datasetName: "" + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config + datasetName: "" diff --git a/library/ix-dev/community/qbittorrent/item.yaml b/library/ix-dev/community/qbittorrent/item.yaml new file mode 100644 index 0000000000..d2f9c8f26b --- /dev/null +++ b/library/ix-dev/community/qbittorrent/item.yaml @@ -0,0 +1,5 @@ +icon_url: https://upload.wikimedia.org/wikipedia/commons/9/9e/Qbittorrent_logo.png +categories: + - media + - torrent + - download diff --git a/library/ix-dev/community/qbittorrent/questions.yaml b/library/ix-dev/community/qbittorrent/questions.yaml new file mode 100644 index 0000000000..3b4aee8ad4 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/questions.yaml @@ -0,0 +1,209 @@ +groups: + - name: qBittorrent Configuration + description: Configure qBittorrent + - name: User and Group Configuration + description: Configure User and Group for qBittorrent + - name: Network Configuration + description: Configure Network for qBittorrent + - name: Storage Configuration + description: Configure Storage for qBittorrent + - name: Resources Configuration + description: Configure Resources for qBittorrent + +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: qbitConfig + label: "" + group: qBittorrent Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for qBittorrent. + 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: qbitRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that qBittorrent will run as. + schema: + type: int + min: 1 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that qBittorrent will run as. + schema: + type: int + min: 1 + default: 568 + required: true + + - variable: qbitNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the qBittorrent Web UI. + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: btPort + label: BT Port + description: The port for the qBittorrent BitTorrent protocol. Both TCP and UDP + schema: + type: int + default: 50413 + 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: qbitStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: downloads + label: qBittorrent Downloads Storage + description: The path to store qBittorrent Downloads. + schema: + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path + - value: ixVolume + description: ixVolume + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: downloads + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: config + label: qBittorrent Config Storage + description: The path to store qBittorrent Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path + - value: ixVolume + description: ixVolume + - 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: resources + label: Resources Configuration + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for qBittorrent. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for qBittorrent. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/qbittorrent/templates/NOTES.txt b/library/ix-dev/community/qbittorrent/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/qbittorrent/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/qbittorrent/templates/_configuration.tpl b/library/ix-dev/community/qbittorrent/templates/_configuration.tpl new file mode 100644 index 0000000000..5be4e79e3e --- /dev/null +++ b/library/ix-dev/community/qbittorrent/templates/_configuration.tpl @@ -0,0 +1,11 @@ +{{- define "qbittorrent.configuration" -}} + +{{/* Configmaps */}} +configmap: + qbit-config: + enabled: true + data: + QBITTORRENT__BT_PORT: {{ .Values.qbitNetwork.btPort | quote }} + QBITTORRENT__PORT: {{ .Values.qbitNetwork.webPort | quote }} + +{{- end -}} diff --git a/library/ix-dev/community/qbittorrent/templates/_portal.tpl b/library/ix-dev/community/qbittorrent/templates/_portal.tpl new file mode 100644 index 0000000000..a9c110e08c --- /dev/null +++ b/library/ix-dev/community/qbittorrent/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "qbittorrent.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.qbitNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/qbittorrent/templates/_qbittorrent.tpl b/library/ix-dev/community/qbittorrent/templates/_qbittorrent.tpl new file mode 100644 index 0000000000..712ef63cdd --- /dev/null +++ b/library/ix-dev/community/qbittorrent/templates/_qbittorrent.tpl @@ -0,0 +1,138 @@ +{{- define "qbittorrent.workload" -}} +workload: + qbittorrent: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.qbitNetwork.hostNetwork }} + containers: + qbittorrent: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.qbitRunAs.user }} + runAsGroup: {{ .Values.qbitRunAs.group }} + {{ with .Values.qbitConfig.additionalEnvs }} + env: + {{ range $env := . }} + {{ $env.name }}: {{ $env.value }} + {{ end }} + {{ end }} + envFrom: + - configMapRef: + name: qbit-config + probes: + liveness: + enabled: true + type: http + port: "{{ .Values.qbitNetwork.webPort }}" + path: / + readiness: + enabled: true + type: http + port: "{{ .Values.qbitNetwork.webPort }}" + path: / + startup: + enabled: true + type: http + port: "{{ .Values.qbitNetwork.webPort }}" + path: / + initContainers: + check-permissions: + enabled: true + type: init + imageSelector: bashImage + resources: + limits: + cpu: 1000m + memory: 512Mi + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + capabilities: + add: + - CHOWN + command: bash + args: + - -c + - | + for dir in /mnt/directories/*; do + if [ ! -d "$dir" ]; then + echo "[$dir] is not a directory, skipping" + continue + fi + + if [ $(stat -c %u "$dir") -eq {{ .Values.qbitRunAs.user }} ] && [ $(stat -c %g "$dir") -eq {{ .Values.qbitRunAs.group }} ]; then + echo "Permissions on ["$dir"] are correct" + else + echo "Permissions on ["$dir"] are incorrect" + echo "Changing ownership to {{ .Values.qbitRunAs.user }}:{{ .Values.qbitRunAs.group }} on the following directories: ["$dir"]" + chown -R {{ .Values.qbitRunAs.user }}:{{ .Values.qbitRunAs.group }} "$dir" + echo "Finished changing ownership" + echo "Permissions after changing ownership:" + stat -c "%u %g" "$dir" + fi + done + +{{/* Service */}} +service: + qbittorrent: + enabled: true + primary: true + type: NodePort + targetSelector: qbittorrent + ports: + webui: + enabled: true + primary: true + port: {{ .Values.qbitNetwork.webPort }} + nodePort: {{ .Values.qbitNetwork.webPort }} + targetSelector: qbittorrent + qbittorrent-bt: + enabled: true + type: NodePort + targetSelector: qbittorrent + ports: + bt-tcp: + enabled: true + primary: true + port: {{ .Values.qbitNetwork.btPort }} + nodePort: {{ .Values.qbitNetwork.btPort }} + targetSelector: qbittorrent + bt-upd: + enabled: true + primary: true + port: {{ .Values.qbitNetwork.btPort }} + nodePort: {{ .Values.qbitNetwork.btPort }} + protocol: udp + targetSelector: qbittorrent + +{{/* Persistence */}} +persistence: + config: + enabled: true + type: {{ .Values.qbitStorage.config.type }} + datasetName: {{ .Values.qbitStorage.config.datasetName | default "" }} + hostPath: {{ .Values.qbitStorage.config.hostPath | default "" }} + targetSelector: + qbittorrent: + qbittorrent: + mountPath: /config + check-permissions: + mountPath: /mnt/directories/config + downloads: + enabled: true + type: {{ .Values.qbitStorage.downloads.type }} + datasetName: {{ .Values.qbitStorage.downloads.datasetName | default "" }} + hostPath: {{ .Values.qbitStorage.downloads.hostPath | default "" }} + targetSelector: + qbittorrent: + qbittorrent: + mountPath: /downloads + check-permissions: + mountPath: /mnt/directories/downloads +{{- end -}} diff --git a/library/ix-dev/community/qbittorrent/templates/common.yaml b/library/ix-dev/community/qbittorrent/templates/common.yaml new file mode 100644 index 0000000000..b8ef1222cc --- /dev/null +++ b/library/ix-dev/community/qbittorrent/templates/common.yaml @@ -0,0 +1,10 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "qbittorrent.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "qbittorrent.configuration" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "qbittorrent.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/qbittorrent/upgrade_strategy b/library/ix-dev/community/qbittorrent/upgrade_strategy new file mode 100755 index 0000000000..a17d0d1fb3 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/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/qbittorrent/values.yaml b/library/ix-dev/community/qbittorrent/values.yaml new file mode 100644 index 0000000000..e8d0c68727 --- /dev/null +++ b/library/ix-dev/community/qbittorrent/values.yaml @@ -0,0 +1,34 @@ +image: + repository: ghcr.io/onedr0p/qbittorrent + pullPolicy: IfNotPresent + tag: "4.5.2" + +resources: + limits: + cpu: 4000m + memory: 8Gi + +qbitConfig: + additionalEnvs: [] +qbitNetwork: + webPort: 30000 + btPort: 50413 + hostNetwork: false +qbitRunAs: + user: 568 + group: 568 +qbitStorage: + downloads: + type: ixVolume + hostPath: "" + datasetName: downloads + config: + type: ixVolume + hostPath: "" + datasetName: config + +notes: + custom: | + Default credentials: + - username: admin + - password: adminadmin