From 928ad4de59979287853ba46917508893917e1c01 Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 20:14:28 +0200 Subject: [PATCH 1/9] Add new workflow to serve chart via the repo --- .github/workflows/release.yaml | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..4f15f1e --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,35 @@ +name: Release Charts + +on: + push: + branches: + - main + +jobs: + release: + # depending on default permission settings for your org (contents being read-only or read-write for workloads), you will have to add permissions + # see: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token + permissions: + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Configure Git + run: | + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + + - name: Install Helm + uses: azure/setup-helm@v3 + + - name: Run chart-releaser + uses: helm/chart-releaser-action@v1.6.0 + with: + charts_dir: servarr + pages_branch: charts + env: + CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" From f30be07b764fc59caeca4ded312d58aaf6f3bd13 Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 20:22:04 +0200 Subject: [PATCH 2/9] Test workflow on dev pull request --- .github/workflows/release.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4f15f1e..096f23a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,6 +4,9 @@ on: push: branches: - main + pull_request: + branches: + - dev jobs: release: From 4ec28c3ca85a736c409cdbf875e43db6bc104fad Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 20:27:27 +0200 Subject: [PATCH 3/9] Use root as scanning folder --- servarr/.helmignore | 28 - servarr/Chart.yaml | 44 - servarr/README.md | 118 --- servarr/README.md.gotmpl | 32 - servarr/templates/configmaps.yaml | 48 -- servarr/templates/init-jellyfin.yaml | 59 -- servarr/templates/init-jellyseerr.yaml | 72 -- servarr/templates/init-prowlarr.yaml | 67 -- servarr/templates/init-radarr.yaml | 59 -- servarr/templates/init-sonarr.yaml | 59 -- servarr/templates/issuer.yaml | 22 - servarr/templates/pre-deployment-job.yaml | 51 -- servarr/templates/pvc.yaml | 60 -- servarr/templates/secret.yaml | 29 - servarr/values.yaml | 956 ---------------------- 15 files changed, 1704 deletions(-) delete mode 100644 servarr/.helmignore delete mode 100644 servarr/Chart.yaml delete mode 100644 servarr/README.md delete mode 100644 servarr/README.md.gotmpl delete mode 100644 servarr/templates/configmaps.yaml delete mode 100644 servarr/templates/init-jellyfin.yaml delete mode 100644 servarr/templates/init-jellyseerr.yaml delete mode 100644 servarr/templates/init-prowlarr.yaml delete mode 100644 servarr/templates/init-radarr.yaml delete mode 100644 servarr/templates/init-sonarr.yaml delete mode 100644 servarr/templates/issuer.yaml delete mode 100644 servarr/templates/pre-deployment-job.yaml delete mode 100644 servarr/templates/pvc.yaml delete mode 100644 servarr/templates/secret.yaml delete mode 100644 servarr/values.yaml diff --git a/servarr/.helmignore b/servarr/.helmignore deleted file mode 100644 index b991d40..0000000 --- a/servarr/.helmignore +++ /dev/null @@ -1,28 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ - -my-values.yaml -docs/* -.pre-commit-config.yaml -README.md.gotmpl diff --git a/servarr/Chart.yaml b/servarr/Chart.yaml deleted file mode 100644 index 966d5bc..0000000 --- a/servarr/Chart.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: v2 -name: servarr -description: Servarr complete Helm Chart for Kubernetes -type: application -version: 1.0.0 -appVersion: "1.0.0" -keywords: - - servarr - - prowlarr - - radarr - - sonarr - - qbittorrent - - jellyseerr - - jellyfin - - flaresolverr -home: https://github.com/fonzdm/servarr -sources: - - https://github.com/fonzdm/servarr -dependencies: - - name: sonarr - version: "21.2.1" - repository: "https://charts.truecharts.org" - - name: radarr - version: "21.2.1" - repository: "https://charts.truecharts.org" - - name: prowlarr - version: "16.2.1" - repository: "https://charts.truecharts.org" - - name: qbittorrent - version: "19.4.1" - repository: "https://charts.truecharts.org" - - name: jellyseerr - version: "9.5.2" - repository: "https://charts.truecharts.org" - - name: jellyfin - version: "18.7.7" - repository: "https://charts.truecharts.org" - - name: flaresolverr - version: "13.4.1" - repository: "https://charts.truecharts.org" - -maintainers: - - name: Alfonso De Masi - email: adm220297@proton.me diff --git a/servarr/README.md b/servarr/README.md deleted file mode 100644 index f812908..0000000 --- a/servarr/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# servarr - - - -![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square) - -Servarr complete Helm Chart for Kubernetes - -**Homepage:** - -## Maintainers - -| Name | Email | Url | -| ---- | ------ | --- | -| Alfonso De Masi | | | - -## Source Code - -* - -## Requirements - -| Repository | Name | Version | -|------------|------|---------| -| https://charts.truecharts.org | flaresolverr | 13.4.1 | -| https://charts.truecharts.org | jellyfin | 18.7.7 | -| https://charts.truecharts.org | jellyseerr | 9.5.2 | -| https://charts.truecharts.org | prowlarr | 16.2.1 | -| https://charts.truecharts.org | qbittorrent | 19.4.1 | -| https://charts.truecharts.org | radarr | 21.2.1 | -| https://charts.truecharts.org | sonarr | 21.2.1 | - ---- - -> [!IMPORTANT] -> Please consider that this chart is a collection of several public helm charts. -> These are included as sub-charts of the Servarr chart and, due to some Helm limitation, some configuration are only possible via values file. -> For this reason, the servarr default [values.yaml](#./values.yaml) included in the chart is quite huge and it used to model the configuration of the subcharts. -> But don't you worry! I provided some handy values, using [yaml anchors](https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd), to defined top-level fields. -> Follow the table below and forget everything else. - -> [!CAUTION] -> Please, do not remove Anchors when you see them (the strage syntax with the `&`) - ---- - -## Values - -### Jellyfin - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| dash.countryCode | string | US | Insert the Jellyfin country code | -| dash.mail | string | No default value | Insert Jellyfin login mail (will be used also for Jellyseerr integration) | -| dash.password | string | No default value | Insert Jellyfin password (will be used also for Jellyseerr) | -| dash.preferredLanguage | string | en | Insert the Jellyfin preferred language | -| dash.username | string | No default value | Insert the Jellyfin username (will be used also for Jellyseerr) | - -### Global - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| global.apikey | string | No default value is configured for security reasons | Insert your Prowlarr, Sonarr, Radarr API key here (one to rule them all!). Do not remove the `&apikey` anchor! | -| global.certManagerClusterIssuer | string | No default value, leave empty if not required | Insert your cert manager cluster issuer, e.g.: letsencrypt-cloudflare. Do not remove the `&issuer` anchor! | -| global.storageClassName | string | `"network-block"` | Insert your storage class here, e.g.: &storageClassName network-block. Do not remove the `&storageClassName` anchor! | - -### Prowlarr - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| indexers | list | The body of the 1337x index is provided as default | The indexers list. Each element of the list is the yaml-formatted body of the [Prowlarr API request](https://prowlarr.com/docs/api/#/Indexer/post_api_v1_indexer) to add that index. | - -### Issuer - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| issuer | object | See the sub fields | For tracking purpose, not used - replaced with pre-existing cluster issuer | -| issuer.cloudFlareKey | string | `nil` | Insert your CloudFlare key | -| issuer.email | string | `nil` | Insert your email address | - -### Metrics - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| metrics.enabled | bool | `false` | Anchor to set wether to deploy the export sidecar pods or not. Requires the Prometheus stack. Do not remove the `&metricsEnabled` anchor! | - -### Jellyseerr - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| notifications.telegram.bot_apitoken | string | No default value | Insert your Telegram Bot API token | -| notifications.telegram.chat_id | string | No default value | Insert the Telegram Chat id, check @get_id_bot for this | -| notifications.telegram.enabled | bool | `true` | Enable the Telegram notifications | - -### Torrent - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| torrent.password | string | No default value | password of the qBitTorrent admin user. Must be at least of 8 characters. | -| torrent.username | string | No default value | username of the qBitTorrent admin user | - -### Storage - -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| volumes.downloads | object | See the sub fields | configuration of the volume used for torrent downloads | -| volumes.downloads.name | string | `"downloads-volume"` | Name of the download pvc. Do not remove the `&downloads-volume` anchor! | -| volumes.downloads.size | string | `"100Gi"` | Size of the downloads volume, in Kubernets format | -| volumes.media | object | See the sub fields | configuration of the volume used for media storage (i.e.: where movies and tv shows file will be permanently stored) | -| volumes.media.name | string | `"media-volume"` | Name of the media pvc. Do not remove the `&media-volume` anchor! | -| volumes.media.size | string | `"250Gi"` | Size of the media volume, in Kubernets format | -| volumes.torrentConfig | object | See the sub fields | configuration of the volume used for qBitTorrent internal configuration | -| volumes.torrentConfig.name | string | `"torrent-config"` | Name of the torrent configuration pvc. Do not remove the `&torrentConfig` anchor! | -| volumes.torrentConfig.size | string | `"250Mi"` | Size of the torrent configuration volume, in Kubernets format | - - ----------------------------------------------- -Autogenerated from chart metadata using [helm-docs v1.13.1](https://github.com/norwoodj/helm-docs/releases/v1.13.1) diff --git a/servarr/README.md.gotmpl b/servarr/README.md.gotmpl deleted file mode 100644 index 1c589b3..0000000 --- a/servarr/README.md.gotmpl +++ /dev/null @@ -1,32 +0,0 @@ -{{ template "chart.header" . }} -{{ template "chart.deprecationWarning" . }} - -{{ template "chart.badgesSection" . }} - -{{ template "chart.description" . }} - -{{ template "chart.homepageLine" . }} - -{{ template "chart.maintainersSection" . }} - -{{ template "chart.sourcesSection" . }} - -{{ template "chart.requirementsSection" . }} - ---- - -> [!IMPORTANT] -> Please consider that this chart is a collection of several public helm charts. -> These are included as sub-charts of the Servarr chart and, due to some Helm limitation, some configuration are only possible via values file. -> For this reason, the servarr default [values.yaml](#./values.yaml) included in the chart is quite huge and it used to model the configuration of the subcharts. -> But don't you worry! I provided some handy values, using [yaml anchors](https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd), to defined top-level fields. -> Follow the table below and forget everything else. - -> [!CAUTION] -> Please, do not remove Anchors when you see them (the strage syntax with the `&`) - ---- - -{{ template "chart.valuesSection" . }} - -{{ template "helm-docs.versionFooter" . }} diff --git a/servarr/templates/configmaps.yaml b/servarr/templates/configmaps.yaml deleted file mode 100644 index 0835665..0000000 --- a/servarr/templates/configmaps.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: init-jellyseerr-python-scripts -data: -{{ ( tpl (.Files.Glob "config/scripts/init-jellyseerr.py" ).AsConfig . ) | indent 2 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: init-radarr-script -data: -{{ ( tpl (.Files.Glob "config/scripts/init-radarr.py" ).AsConfig . ) | indent 2 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: init-sonarr-script -data: -{{ ( tpl (.Files.Glob "config/scripts/init-sonarr.py" ).AsConfig . ) | indent 2 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: init-prowlarr-script -data: -{{ ( tpl (.Files.Glob "config/scripts/init-prowlarr.py" ).AsConfig . ) | indent 2 }} -{{ if .Values.indexers }} - indexers.json: {{ $.Values.indexers | toJson | quote}} -{{ end }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: init-jellyfin-script -data: -{{ ( tpl (.Files.Glob "config/scripts/init-jellyfin.py" ).AsConfig . ) | indent 2 }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-5" - helm.sh/hook-delete-policy: hook-failed, before-hook-creation - name: init-qbittorrent-python-script -data: -{{ ( tpl (.Files.Glob "config/scripts/init-qbittorrent.py" ).AsConfig . ) | indent 2 }} diff --git a/servarr/templates/init-jellyfin.yaml b/servarr/templates/init-jellyfin.yaml deleted file mode 100644 index b740db8..0000000 --- a/servarr/templates/init-jellyfin.yaml +++ /dev/null @@ -1,59 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: jellyfin-init - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": post-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "30" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-jellyfin-finalizer" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - initContainers: - - name: wait-for-jellyfin - image: rapidfort/curl:8.7.1 - imagePullPolicy: IfNotPresent - command: - [ - "sh", - "-c", - "until curl \"http://{{ .Release.Namespace }}-jellyfin.{{ .Release.Namespace }}.svc.cluster.local:8096\"; do echo waiting for servarr-jellyfin; sleep 5; done;sleep 10;", - ] - containers: - - name: initialize-jellyfin - image: "nyurik/alpine-python3-requests" - imagePullPolicy: IfNotPresent - env: - - name: PYTHONUNBUFFERED - value: "1" - - name: JELLYFIN_HOST - value: "{{ .Release.Namespace }}-jellyfin.{{ .Release.Namespace }}.svc.cluster.local:8096" - - name: JELLYFIN_USERNAME - value: "{{ $.Values.dash.username }}" - - name: JELLYFIN_PASSWORD - value: "{{ $.Values.dash.password }}" - - name: COUNTRY_CODE - value: "{{ $.Values.dash.countryCode }}" - - name: PREFERRED_LANGUAGE - value: "{{ $.Values.dash.preferredLanguage }}" - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /mnt/init-jellyfin.py 2>&1;" - volumeMounts: - - mountPath: "/mnt" - name: python-script - volumes: - - name: python-script - configMap: - name: init-jellyfin-script \ No newline at end of file diff --git a/servarr/templates/init-jellyseerr.yaml b/servarr/templates/init-jellyseerr.yaml deleted file mode 100644 index 4d3cf44..0000000 --- a/servarr/templates/init-jellyseerr.yaml +++ /dev/null @@ -1,72 +0,0 @@ -{{- if .Values.initJellyseerr -}} -apiVersion: batch/v1 -kind: Job -metadata: - name: jellyseer-init - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": post-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "40" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-jellyseer-finalizer" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - initContainers: - - name: wait-for-jellyseerr - image: rapidfort/curl:8.7.1 - imagePullPolicy: IfNotPresent - command: - - "sh" - - "-c" - - "until curl \"http://{{ .Release.Namespace }}-jellyseerr.{{ .Release.Namespace }}.svc.cluster.local:10241\"; do echo waiting for servarr-jellyseerr; sleep 5; done;sleep 10;" - containers: - - name: initialize-jellyseer - image: "nyurik/alpine-python3-requests" - imagePullPolicy: IfNotPresent - env: - - name: PYTHONUNBUFFERED - value: "1" - - name: JELLYSEERR_HOST - value: "{{ .Release.Namespace }}-jellyseerr.{{ .Release.Namespace }}.svc.cluster.local" - - name: JELLYSEERR_PORT - value: "10241" - - name: JELLYFIN_HOST - value: "{{ .Release.Namespace }}-jellyfin" - - name: JELLYFIN_PORT - value: "8096" - - name: JELLYFIN_USERNAME - value: "{{ $.Values.dash.username }}" - - name: JELLYFIN_PASSWORD - value: "{{ $.Values.dash.password }}" - - name: JELLYFIN_EMAIL - value: "{{ $.Values.dash.mail }}" - - name: API_KEY - value: "{{ $.Values.global.apikey }}" - - name: TELEGRAM_NOTIFICATION_ENABLED - value: "{{ $.Values.notifications.telegram.enabled }}" - - name: TELEGRAM_CHAT_ID - value: "{{ $.Values.notifications.telegram.chat_id}}" - - name: TELEGRAM_BOT_APITOKEN - value: "{{ $.Values.notifications.telegram.bot_apitoken }}" - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /mnt/init-jellyseerr.py 2>&1;" - volumeMounts: - - mountPath: "/mnt" - name: python-script - volumes: - - name: python-script - configMap: - name: init-jellyseerr-python-scripts - -{{- end }} diff --git a/servarr/templates/init-prowlarr.yaml b/servarr/templates/init-prowlarr.yaml deleted file mode 100644 index f4fb167..0000000 --- a/servarr/templates/init-prowlarr.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: prowlarr-init - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": post-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "20" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-prowlarr-finalizer" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - initContainers: - - name: wait-for-prowlarr - image: rapidfort/curl:8.7.1 - imagePullPolicy: IfNotPresent - command: - [ - "sh", - "-c", - "until curl \"http://{{ .Release.Namespace }}-prowlarr.{{ .Release.Namespace }}.svc.cluster.local:9696\"; do echo waiting for servarr-prowlarr; sleep 5; done;", - ] - containers: - - name: initialize-prowlarr - image: "nyurik/alpine-python3-requests" - imagePullPolicy: IfNotPresent - env: - - name: PYTHONUNBUFFERED - value: "1" - - name: PROWLARR_HOST - value: "{{ .Release.Namespace }}-prowlarr.{{ .Release.Namespace }}.svc.cluster.local:9696" - - name: API_KEY - value: "{{ $.Values.global.apikey }}" - - name: TORRENT_SERVICE - value: "{{ .Release.Namespace }}-qbittorrent" - - name: TORRENT_ADMIN - value: "{{ $.Values.torrent.username }}" - - name: TORRENT_PASSWORD - value: "{{ $.Values.torrent.password }}" - - name: PROWLARR_SERVICE - value: "{{ .Release.Namespace }}-prowlarr:9696" - - name: RADARR_SERVICE - value: "{{ .Release.Namespace }}-radarr:7878" - - name: FLARESOLVERR_SERVICE - value: "{{ .Release.Namespace }}-flaresolverr:8191" - - name: SONARR_SERVICE - value: "{{ .Release.Namespace }}-sonarr:8989" - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /mnt/init-prowlarr.py 2>&1;" - volumeMounts: - - mountPath: "/mnt" - name: python-script-and-indexers - volumes: - - name: python-script-and-indexers - configMap: - name: init-prowlarr-script \ No newline at end of file diff --git a/servarr/templates/init-radarr.yaml b/servarr/templates/init-radarr.yaml deleted file mode 100644 index 1e608ed..0000000 --- a/servarr/templates/init-radarr.yaml +++ /dev/null @@ -1,59 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: radarr-init - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": post-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "10" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-radarr-finalizer" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - initContainers: - - name: wait-for-radarr - image: rapidfort/curl:8.7.1 - imagePullPolicy: IfNotPresent - command: - [ - "sh", - "-c", - "until curl \"http://{{ .Release.Namespace }}-radarr.{{ .Release.Namespace }}.svc.cluster.local:7878\"; do echo waiting for servarr-radarr; sleep 5; done;", - ] - containers: - - name: initialize-radarr - image: "nyurik/alpine-python3-requests" - imagePullPolicy: IfNotPresent - env: - - name: PYTHONUNBUFFERED - value: "1" - - name: RADARR_HOST - value: "{{ .Release.Namespace }}-radarr.{{ .Release.Namespace }}.svc.cluster.local:7878" - - name: API_KEY - value: "{{ $.Values.global.apikey }}" - - name: TORRENT_SERVICE - value: "{{ .Release.Namespace }}-qbittorrent" - - name: TORRENT_ADMIN - value: "{{ $.Values.torrent.username }}" - - name: TORRENT_PASSWORD - value: "{{ $.Values.torrent.password }}" - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /mnt/init-radarr.py 2>&1;" - volumeMounts: - - mountPath: "/mnt" - name: python-script - volumes: - - name: python-script - configMap: - name: init-radarr-script \ No newline at end of file diff --git a/servarr/templates/init-sonarr.yaml b/servarr/templates/init-sonarr.yaml deleted file mode 100644 index 8edb86f..0000000 --- a/servarr/templates/init-sonarr.yaml +++ /dev/null @@ -1,59 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: sonarr-init - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": post-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "10" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-sonarr-finalizer" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - initContainers: - - name: wait-for-sonarr - image: rapidfort/curl:8.7.1 - imagePullPolicy: IfNotPresent - command: - [ - "sh", - "-c", - "until curl \"http://{{ .Release.Namespace }}-sonarr.{{ .Release.Namespace }}.svc.cluster.local:8989\"; do echo waiting for servarr-sonarr; sleep 5; done;", - ] - containers: - - name: initialize-sonarr - image: "nyurik/alpine-python3-requests" - imagePullPolicy: IfNotPresent - env: - - name: PYTHONUNBUFFERED - value: "1" - - name: SONARR_HOST - value: "{{ .Release.Namespace }}-sonarr.{{ .Release.Namespace }}.svc.cluster.local:8989" - - name: API_KEY - value: "{{ $.Values.global.apikey }}" - - name: TORRENT_SERVICE - value: "{{ .Release.Namespace }}-qbittorrent" - - name: TORRENT_ADMIN - value: "{{ $.Values.torrent.username }}" - - name: TORRENT_PASSWORD - value: "{{ $.Values.torrent.password }}" - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /mnt/init-sonarr.py 2>&1;" - volumeMounts: - - mountPath: "/mnt" - name: python-script - volumes: - - name: python-script - configMap: - name: init-sonarr-script \ No newline at end of file diff --git a/servarr/templates/issuer.yaml b/servarr/templates/issuer.yaml deleted file mode 100644 index 5999dd2..0000000 --- a/servarr/templates/issuer.yaml +++ /dev/null @@ -1,22 +0,0 @@ -# --- - -# apiVersion: cert-manager.io/v1 -# kind: Issuer -# metadata: -# name: letsencrypt-cloudflare -# spec: -# acme: -# # The ACME server URL -# server: {{ .Values.issuer.server }} -# # Email address used for ACME registration -# email: {{ .Values.issuer.email }} -# # Name of a secret used to store the ACME account private key -# privateKeySecretRef: -# name: {{ .Values.issuer.secretName }} -# # Enable the HTTP-01 challenge provider -# solvers: -# - dns01: -# cloudflare: -# apiTokenSecretRef: -# name: cloudflare-api-token-secret -# key: api-token diff --git a/servarr/templates/pre-deployment-job.yaml b/servarr/templates/pre-deployment-job.yaml deleted file mode 100644 index 8fae063..0000000 --- a/servarr/templates/pre-deployment-job.yaml +++ /dev/null @@ -1,51 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: pre-install-job - labels: - release: "{{ .Release.Name }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - annotations: - "helm.sh/hook": pre-install - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook-weight": "-3" -spec: - backoffLimit: 1 - template: - metadata: - name: "{{.Release.Name}}-config-prepare" - labels: - app: "{{ .Release.Name }}" - spec: - restartPolicy: Never - containers: - - name: qbt-config-injector - image: dinutac/jinja2docker:2.1.8 - imagePullPolicy: IfNotPresent - env: - - name: TORRENT_USERNAME - value: {{ .Values.torrent.username }} - - name: TORRENT_PASSWORD - value: {{ .Values.torrent.password }} - command: - - "/bin/sh" - - "-ec" - args: - - "python3 -u /tmp/init-qbittorrent.py 2>&1;" - volumeMounts: - - name: torrent-config-volume - mountPath: /mnt - - name: init-script - mountPath: /tmp/init-qbittorrent.py - subPath: init-qbittorrent.py - volumes: - - name: torrent-config-volume - persistentVolumeClaim: - claimName: {{ .Values.volumes.torrentConfig.name }} - - name: init-script - configMap: - name: init-qbittorrent-python-script - defaultMode: 0644 - # items: - # - key: qBittorrent.conf - # path: qBittorrent.conf diff --git a/servarr/templates/pvc.yaml b/servarr/templates/pvc.yaml deleted file mode 100644 index cb1ecbb..0000000 --- a/servarr/templates/pvc.yaml +++ /dev/null @@ -1,60 +0,0 @@ -{{- $is_downloads_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.downloads.name) }} -{{- if not $is_downloads_pvc_present }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.volumes.downloads.name }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-5" - helm.sh/hook-delete-policy: hook-failed -spec: - storageClassName: {{ .Values.volumes.storageClass }} - accessModes: - - ReadWriteMany - resources: - requests: - storage: {{ .Values.volumes.downloads.size }} -{{- end }} - ---- - -{{- $is_media_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.media.name) }} -{{- if not $is_media_pvc_present }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.volumes.media.name }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-5" - helm.sh/hook-delete-policy: hook-failed -spec: - storageClassName: {{ .Values.volumes.storageClass }} - accessModes: - - ReadWriteMany - resources: - requests: - storage: {{ .Values.volumes.media.size }} -{{- end }} - ---- - -{{- $is_torrentconfig_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.torrentConfig.name) }} -{{- if not $is_torrentconfig_pvc_present }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.volumes.torrentConfig.name }} - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-weight: "-5" - helm.sh/hook-delete-policy: hook-failed -spec: - storageClassName: {{ .Values.volumes.storageClass }} - accessModes: - - ReadWriteMany - resources: - requests: - storage: {{ .Values.volumes.torrentConfig.size }} -{{- end }} \ No newline at end of file diff --git a/servarr/templates/secret.yaml b/servarr/templates/secret.yaml deleted file mode 100644 index 98d2c11..0000000 --- a/servarr/templates/secret.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# apiVersion: v1 -# kind: Secret -# metadata: -# name: cloudflare-api-token-secret -# type: Opaque -# stringData: -# api-token: {{ .Values.issuer.cloudFlareKey }} - ---- - -apiVersion: v1 -kind: Secret -metadata: - name: servarr-api-key -type: Opaque -stringData: - apikey: {{ .Values.global.apikey }} - - ---- - -apiVersion: v1 -kind: Secret -metadata: - name: qbittorrent-creds -type: Opaque -stringData: - username: {{ .Values.torrent.username }} - password: {{ .Values.torrent.password }} diff --git a/servarr/values.yaml b/servarr/values.yaml deleted file mode 100644 index 518f8ae..0000000 --- a/servarr/values.yaml +++ /dev/null @@ -1,956 +0,0 @@ -global: - # -- (string) Insert your Prowlarr, Sonarr, Radarr API key here (one to rule them all!). Do not remove the `&apikey` anchor! - # @default -- No default value is configured for security reasons - # @section -- Global - apikey: &apikey - # -- (string) Insert your storage class here, e.g.: &storageClassName network-block. Do not remove the `&storageClassName` anchor! - # @section -- Global - storageClassName: &storageClassName "network-block" - # -- (string) Insert your cert manager cluster issuer, e.g.: letsencrypt-cloudflare. Do not remove the `&issuer` anchor! - # @default -- No default value, leave empty if not required - # @section -- Global - certManagerClusterIssuer: &issuer - -metrics: - # -- Anchor to set wether to deploy the export sidecar pods or not. Requires the Prometheus stack. Do not remove the `&metricsEnabled` anchor! - # @section -- Metrics - enabled: &metricsEnabled false - -# @ignore -initJellyseerr: true - -notifications: - telegram: - # -- Enable the Telegram notifications - # @section -- Jellyseerr - enabled: true - # -- (string) Insert the Telegram Chat id, check @get_id_bot for this - # @section -- Jellyseerr - # @default -- No default value - chat_id: - # -- (string) Insert your Telegram Bot API token - # @section -- Jellyseerr - # @default -- No default value - bot_apitoken: - -dash: - # -- (string) Insert the Jellyfin username (will be used also for Jellyseerr) - # @section -- Jellyfin - # @default -- No default value - username: - # -- (string) Insert Jellyfin password (will be used also for Jellyseerr) - # @section -- Jellyfin - # @default -- No default value - password: - # -- (string) Insert Jellyfin login mail (will be used also for Jellyseerr integration) - # @section -- Jellyfin - # @default -- No default value - mail: - # -- (string) Insert the Jellyfin country code - # @section -- Jellyfin - # @default -- US - countryCode: "US" - # -- (string) Insert the Jellyfin preferred language - # @section -- Jellyfin - # @default -- en - preferredLanguage: "en" - -torrent: - # -- (string) username of the qBitTorrent admin user - # @section -- Torrent - # @default -- No default value - username: - # -- (string) password of the qBitTorrent admin user. Must be at least of 8 characters. - # @section -- Torrent - # @default -- No default value - password: - -# -- The indexers list. Each element of the list is the yaml-formatted body of the [Prowlarr API request](https://prowlarr.com/docs/api/#/Indexer/post_api_v1_indexer) to add that index. -# @default -- The body of the 1337x index is provided as default -# @section -- Prowlarr -indexers: - # @ignored - - name: 1337x - body: - added: "0001-01-01T00:00:00Z" - appProfileId: 1 - capabilities: - bookSearchParams: - - q - categories: - - id: 5000 - name: TV - subCategories: - - id: 5070 - name: TV/Anime - subCategories: [] - - id: 5040 - name: TV/HD - subCategories: [] - - id: 5030 - name: TV/SD - subCategories: [] - - id: 5080 - name: TV/Documentary - subCategories: [] - - id: 3000 - name: Audio - subCategories: - - id: 3010 - name: Audio/MP3 - subCategories: [] - - id: 3040 - name: Audio/Lossless - subCategories: [] - - id: 3020 - name: Audio/Video - subCategories: [] - - id: 3050 - name: Audio/Other - subCategories: [] - - id: 3030 - name: Audio/Audiobook - subCategories: [] - - id: 2000 - name: Movies - subCategories: - - id: 2070 - name: Movies/DVD - subCategories: [] - - id: 2030 - name: Movies/SD - subCategories: [] - - id: 2010 - name: Movies/Foreign - subCategories: [] - - id: 2040 - name: Movies/HD - subCategories: [] - - id: 2060 - name: Movies/3D - subCategories: [] - - id: 2045 - name: Movies/UHD - subCategories: [] - - id: 4000 - name: PC - subCategories: - - id: 4030 - name: PC/Mac - subCategories: [] - - id: 4070 - name: PC/Mobile-Android - subCategories: [] - - id: 4060 - name: PC/Mobile-iOS - subCategories: [] - - id: 4050 - name: PC/Games - subCategories: [] - - id: 4040 - name: PC/Mobile-Other - subCategories: [] - - id: 1000 - name: Console - subCategories: - - id: 1080 - name: Console/PS3 - subCategories: [] - - id: 1020 - name: Console/PSP - subCategories: [] - - id: 1040 - name: Console/XBox - subCategories: [] - - id: 1050 - name: Console/XBox 360 - subCategories: [] - - id: 1090 - name: Console/Other - subCategories: [] - - id: 1030 - name: Console/Wii - subCategories: [] - - id: 1010 - name: Console/NDS - subCategories: [] - - id: 1110 - name: Console/3DS - subCategories: [] - - id: 1180 - name: Console/PS4 - subCategories: [] - - id: 6000 - name: XXX - subCategories: - - id: 6010 - name: XXX/DVD - subCategories: [] - - id: 6060 - name: XXX/ImageSet - subCategories: [] - - id: 8000 - name: Other - subCategories: - - id: 8010 - name: Other/Misc - subCategories: [] - - id: 7000 - name: Books - subCategories: - - id: 7020 - name: Books/EBook - subCategories: [] - - id: 7030 - name: Books/Comics - subCategories: [] - limitsDefault: 100 - limitsMax: 100 - movieSearchParams: - - q - musicSearchParams: - - q - - album - - artist - searchParams: - - q - - q - supportsRawSearch: true - tvSearchParams: - - q - - season - - ep - configContract: CardigannSettings - definitionName: 1337x - description: 1337X is a Public torrent site that offers verified torrent downloads - downloadClientId: 0 - enable: true - fields: - - name: definitionFile - value: 1337x - - name: baseUrl - value: https://1337x.proxyninja.org/ - - name: baseSettings.queryLimit - - name: baseSettings.grabLimit - - name: baseSettings.limitsUnit - value: 0 - - name: torrentBaseSettings.appMinimumSeeders - - name: torrentBaseSettings.seedRatio - - name: torrentBaseSettings.seedTime - - name: torrentBaseSettings.packSeedTime - - name: downloadlink - value: 1 - - name: downloadlink2 - value: 0 - - name: sort - value: 0 - - name: type - value: 1 - implementation: Cardigann - implementationName: Cardigann - indexerUrls: - - https://1337x.to/ - - https://1337x.st/ - - https://x1337x.ws/ - - https://x1337x.eu/ - - https://x1337x.se/ - - https://1337x.so/ - - https://1337x.unblockit.africa/ - - https://1337x.unblockninja.com/ - - https://1337x.ninjaproxy1.com/ - - https://1337x.proxyninja.org/ - - https://1337x.torrentbay.st/ - infoLink: https://wiki.servarr.com/prowlarr/supported-indexers#1337x - language: en-US - legacyUrls: - - https://1337x.is/ - - https://1337x.gd/ - - https://1337x.nocensor.lol/ - - https://1337x.unblockit.ink/ - - https://1337x.nocensor.art/ - - https://1337x.unblockit.bio/ - - https://1337x.unblockit.boo/ - - https://1337x.mrunblock.guru/ - - https://1337x.mrunblock.life/ - - https://1337x.unblockit.click/ - - https://1337x.unblockit.asia/ - - https://1337x.unblockit.mov/ - - https://1337x.unblockit.rsvp/ - - https://1337x.unblockit.vegas/ - - https://1337x.unblockit.esq/ - - https://1337x.unblockit.zip/ - - https://1337x.unblockit.foo/ - - https://1337x.unblockit.ing/ - - https://1337x.mrunblock.bond/ - - https://1337x.unblockit.date/ - - https://1337x.unblockit.dad/ - name: 1337x - priority: 25 - privacy: public - protocol: torrent - redirect: false - sortName: 1337x - supportsPagination: false - supportsRedirect: false - supportsRss: true - supportsSearch: true - tags: - - 1 - - name: ilcorsaroblu - body: - appProfileId: 1 - capabilities: - bookSearchParams: - - q - categories: - - id: 6000 - name: XXX - subCategories: [] - - id: 4000 - name: PC - subCategories: - - id: 4070 - name: PC/Mobile-Android - subCategories: [] - - id: 4060 - name: PC/Mobile-iOS - subCategories: [] - - id: 4010 - name: PC/0day - subCategories: [] - - id: 4030 - name: PC/Mac - subCategories: [] - - id: 4050 - name: PC/Games - subCategories: [] - - id: 7000 - name: Books - subCategories: - - id: 7020 - name: Books/EBook - subCategories: [] - - id: 7030 - name: Books/Comics - subCategories: [] - - id: 7010 - name: Books/Mags - subCategories: [] - - id: 1000 - name: Console - subCategories: - - id: 1040 - name: Console/XBox - subCategories: [] - - id: 1010 - name: Console/NDS - subCategories: [] - - id: 3000 - name: Audio - subCategories: - - id: 3010 - name: Audio/MP3 - subCategories: [] - - id: 2000 - name: Movies - subCategories: - - id: 2040 - name: Movies/HD - subCategories: [] - - id: 2020 - name: Movies/Other - subCategories: [] - - id: 2070 - name: Movies/DVD - subCategories: [] - - id: 2060 - name: Movies/3D - subCategories: [] - - id: 2045 - name: Movies/UHD - subCategories: [] - - id: 5000 - name: TV - subCategories: - - id: 5030 - name: TV/SD - subCategories: [] - - id: 5040 - name: TV/HD - subCategories: [] - - id: 5070 - name: TV/Anime - subCategories: [] - - id: 5060 - name: TV/Sport - subCategories: [] - - id: 5080 - name: TV/Documentary - subCategories: [] - - id: 8000 - name: Other - subCategories: [] - limitsDefault: 100 - limitsMax: 100 - movieSearchParams: - - q - musicSearchParams: - - q - searchParams: - - q - - q - supportsRawSearch: false - tvSearchParams: - - q - - season - - ep - configContract: CardigannSettings - definitionName: ilcorsaroblu - description: il CorSaRo Blu is an ITALIAN Semi-Private site for TV / MOVIES / GENERAL - downloadClientId: 0 - enable: true - fields: - - name: definitionFile - value: ilcorsaroblu - - name: baseUrl - value: "https://ilcorsaroblu.org/" - - name: baseSettings.queryLimit - - name: baseSettings.grabLimit - - name: baseSettings.limitsUnit - value: 0 - - name: torrentBaseSettings.appMinimumSeeders - - name: torrentBaseSettings.seedRatio - - name: torrentBaseSettings.seedTime - - name: torrentBaseSettings.packSeedTime - - name: username - value: "" - - name: password - value: "" - - name: freeleech - value: false - - name: sort - value: 1 - - name: type - value: 1 - implementation: Cardigann - implementationName: Cardigann - indexerUrls: - - "https://ilcorsaroblu.org/" - infoLink: "https://wiki.servarr.com/prowlarr/supported-indexers#ilcorsaroblu" - language: it-IT - legacyUrls: - - "http://ilcorsaroblu.org/" - - "https://www.ilcorsaroblu.info/" - - "https://www.ilcorsaroblu.org/" - - "https://ilcorsaroblu.online/" - name: Il Corsaro Blu - priority: 25 - privacy: semiPrivate - protocol: torrent - redirect: false - sortName: il corsaro blu - supportsPagination: false - supportsRedirect: false - supportsRss: true - supportsSearch: true - tags: [] - -# -- For tracking purpose, not used - replaced with pre-existing cluster issuer -# @section -- Issuer -# @default -- See the sub fields -issuer: - # @section -- Issuer - server: https://acme-v02.api.letsencrypt.org/directory - # -- Insert your email address - # @section -- Issuer - email: - # @section -- Issuer - secretName: letsencrypt-prod - # @section -- Issuer - ingressClassName: nginx - # -- Insert your CloudFlare key - # @section -- Issuer - cloudFlareKey: - -volumes: - # @ignore - storageClass: *storageClassName - # -- configuration of the volume used for torrent downloads - # @section -- Storage - # @default -- See the sub fields - downloads: - # -- Name of the download pvc. Do not remove the `&downloads-volume` anchor! - # @section -- Storage - name: &downloads-volume downloads-volume - # -- Size of the downloads volume, in Kubernets format - # @section -- Storage - size: 100Gi - # -- configuration of the volume used for media storage (i.e.: where movies and tv shows file will be permanently stored) - # @section -- Storage - # @default -- See the sub fields - media: - # -- Name of the media pvc. Do not remove the `&media-volume` anchor! - # @section -- Storage - name: &media-volume media-volume - # -- Size of the media volume, in Kubernets format - # @section -- Storage - size: 250Gi - # -- configuration of the volume used for qBitTorrent internal configuration - # @section -- Storage - # @default -- See the sub fields - torrentConfig: - # -- Name of the torrent configuration pvc. Do not remove the `&torrentConfig` anchor! - # @section -- Storage - name: &torrentConfig torrent-config - # -- Size of the torrent configuration volume, in Kubernets format - # @section -- Storage - size: 250Mi - -# @ignore -sonarr: - # @ignore - metrics: - main: - enabled: *metricsEnabled - # @ignore - workload: - main: - podSpec: - containers: - main: - env: - SONARR__API_KEY: *apikey - # @ignore - ingress: - # @ignore - sonarr-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: sonarr.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - sonarr.local - secretName: sonarr-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - # @ignore - persistence: - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true - # @ignore - media: - enabled: true - type: pvc - existingClaim: *media-volume - targetSelector: - main: - main: - mountPath: /mnt/media - # @ignore - downloads: - enabled: true - type: pvc - existingClaim: *downloads-volume - targetSelector: - main: - main: - mountPath: /mnt/downloads - -# @ignore -radarr: - # @ignore - metrics: - main: - enabled: *metricsEnabled - # @ignore - workload: - main: - podSpec: - containers: - main: - env: - RADARR__API_KEY: *apikey - # @ignore - ingress: - # @ignore - radarr-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: radarr.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - radarr.local - secretName: radarr-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - persistence: - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true - media: - enabled: true - type: pvc - existingClaim: *media-volume - targetSelector: - main: - main: - mountPath: /mnt/media - downloads: - enabled: true - type: pvc - existingClaim: *downloads-volume - targetSelector: - main: - main: - mountPath: /mnt/downloads - -# @ignore -jellyfin: - metrics: - main: - enabled: *metricsEnabled - # @ignore - fallbackDefaults: - storageClass: - probeType: http - serviceProtocol: tcp - serviceType: ClusterIP - persistenceType: pvc - pvcRetain: false - pvcSize: 100Gi - vctSize: 100Gi - accessModes: - - ReadWriteMany - vctAccessModes: - - ReadWriteMany - probeTimeouts: - liveness: - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - successThreshold: 1 - readiness: - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - successThreshold: 2 - startup: - initialDelaySeconds: 10 - periodSeconds: 5 - timeoutSeconds: 2 - failureThreshold: 60 - successThreshold: 1 - pgVersion: 16 - serviceProtocol: tcp - ingress: - jellyfin-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: jellyfin.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - jellyfin.local - secretName: jellyfin-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - persistence: - transcode: - enabled: false - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true - media: - enabled: true - type: pvc - existingClaim: *media-volume - targetSelector: - main: - main: - mountPath: /mnt/media - -# @ignore -jellyseerr: - metrics: - main: - enabled: *metricsEnabled - # @ignore - fallbackDefaults: - storageClass: - probeType: http - serviceProtocol: tcp - serviceType: ClusterIP - persistenceType: pvc - pvcRetain: false - pvcSize: 100Gi - vctSize: 100Gi - accessModes: - - ReadWriteMany - vctAccessModes: - - ReadWriteMany - probeTimeouts: - liveness: - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - successThreshold: 1 - readiness: - initialDelaySeconds: 10 - periodSeconds: 10 - timeoutSeconds: 5 - failureThreshold: 5 - successThreshold: 2 - startup: - initialDelaySeconds: 10 - periodSeconds: 5 - timeoutSeconds: 2 - failureThreshold: 60 - successThreshold: 1 - pgVersion: 16 - ingress: - jellyseerr-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: jellyseerr.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - jellyseerr.local - secretName: jellyseerr-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - persistence: - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /app/config - exportarr: - exportarr: - mountPath: /config - readOnly: true - media: - enabled: true - type: pvc - existingClaim: *media-volume - targetSelector: - main: - main: - mountPath: /mnt/media - -# @ignore -qbittorrent: - metrics: - main: - enabled: *metricsEnabled - workload: - main: - podSpec: - containers: - main: - env: - QBITTORRENT__USE_PROFILE: true - ingress: - qbittorrent-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: torrent.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - torrent.local - secretName: torrent-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - persistence: - config: - enabled: true - type: pvc - existingClaim: *torrentConfig - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true - downloads: - enabled: true - type: pvc - existingClaim: *downloads-volume - targetSelector: - main: - main: - mountPath: /downloads - -# @ignore -prowlarr: - metrics: - main: - enabled: *metricsEnabled - workload: - main: - podSpec: - containers: - main: - env: - PROWLARR__API_KEY: *apikey - ingress: - prowlarr-ing: - enabled: true - primary: true - required: true - expandObjectName: false - annotations: - cert-manager.io/cluster-issuer: *issuer - ingressClassName: "nginx" - hosts: - - host: prowlarr.local - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - prowlarr.local - secretName: prowlarr-tls - integrations: - certManager: - enabled: false - traefik: - enabled: false - persistence: - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true - -# @ignore -flaresolverr: - metrics: - main: - enabled: *metricsEnabled - persistence: - config: - enabled: true - type: pvc - size: 500Mi - accessModes: ReadWriteMany - storageClass: *storageClassName - targetSelector: - main: - main: - mountPath: /config - exportarr: - exportarr: - mountPath: /config - readOnly: true From cbe31dbc9fcc66d4e23472369d5c43f2ea5d7da9 Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 20:32:31 +0200 Subject: [PATCH 4/9] Use a different folder structure --- .github/ISSUE_TEMPLATE/bug.yaml | 7 +- .github/ISSUE_TEMPLATE/feature.yaml | 7 +- .github/pull_request_template.md | 19 +- .github/workflows/lint-build.yaml | 14 +- CONTRIBUTING.md | 14 +- README.md | 12 +- servarr/servarr-chart/.helmignore | 28 + servarr/servarr-chart/Chart.yaml | 44 + servarr/servarr-chart/README.md | 118 +++ servarr/servarr-chart/README.md.gotmpl | 32 + .../config/scripts/init-jellyfin.py | 0 .../config/scripts/init-jellyseerr.py | 0 .../config/scripts/init-prowlarr.py | 0 .../config/scripts/init-qbittorrent.py | 0 .../config/scripts/init-radarr.py | 0 .../config/scripts/init-sonarr.py | 0 .../servarr-chart/templates/configmaps.yaml | 48 + .../templates/init-jellyfin.yaml | 59 ++ .../templates/init-jellyseerr.yaml | 72 ++ .../templates/init-prowlarr.yaml | 67 ++ .../servarr-chart/templates/init-radarr.yaml | 59 ++ .../servarr-chart/templates/init-sonarr.yaml | 59 ++ servarr/servarr-chart/templates/issuer.yaml | 22 + .../templates/pre-deployment-job.yaml | 51 + servarr/servarr-chart/templates/pvc.yaml | 60 ++ servarr/servarr-chart/templates/secret.yaml | 29 + servarr/servarr-chart/values.yaml | 956 ++++++++++++++++++ 27 files changed, 1738 insertions(+), 39 deletions(-) create mode 100644 servarr/servarr-chart/.helmignore create mode 100644 servarr/servarr-chart/Chart.yaml create mode 100644 servarr/servarr-chart/README.md create mode 100644 servarr/servarr-chart/README.md.gotmpl rename servarr/{ => servarr-chart}/config/scripts/init-jellyfin.py (100%) rename servarr/{ => servarr-chart}/config/scripts/init-jellyseerr.py (100%) rename servarr/{ => servarr-chart}/config/scripts/init-prowlarr.py (100%) rename servarr/{ => servarr-chart}/config/scripts/init-qbittorrent.py (100%) rename servarr/{ => servarr-chart}/config/scripts/init-radarr.py (100%) rename servarr/{ => servarr-chart}/config/scripts/init-sonarr.py (100%) create mode 100644 servarr/servarr-chart/templates/configmaps.yaml create mode 100644 servarr/servarr-chart/templates/init-jellyfin.yaml create mode 100644 servarr/servarr-chart/templates/init-jellyseerr.yaml create mode 100644 servarr/servarr-chart/templates/init-prowlarr.yaml create mode 100644 servarr/servarr-chart/templates/init-radarr.yaml create mode 100644 servarr/servarr-chart/templates/init-sonarr.yaml create mode 100644 servarr/servarr-chart/templates/issuer.yaml create mode 100644 servarr/servarr-chart/templates/pre-deployment-job.yaml create mode 100644 servarr/servarr-chart/templates/pvc.yaml create mode 100644 servarr/servarr-chart/templates/secret.yaml create mode 100644 servarr/servarr-chart/values.yaml diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 438da10..7d16fa3 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -1,9 +1,6 @@ name: "🐛 Bug Report" description: Create a new ticket for a bug. -labels: [ - "bug", - "needs triage" -] +labels: ["bug", "needs triage"] body: - type: textarea @@ -58,7 +55,7 @@ body: id: terms attributes: label: Code of Conduct - description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/fonzdm/servarr/CONTRIBUTING.md) + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/fonzdm/servarr/servarr-chartCONTRIBUTING.md) options: - label: I agree to follow this project's Code of Conduct required: true diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 72883ca..5b9e3e5 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -1,9 +1,6 @@ name: "💡 Feature Request" description: Create a new ticket for a new feature request -labels: [ - "enhancement", - "needs triage" -] +labels: ["enhancement", "needs triage"] body: - type: textarea @@ -26,7 +23,7 @@ body: id: terms attributes: label: Code of Conduct - description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/fonzdm/servarr/CONTRIBUTING.md) + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/fonzdm/servarr/servarr-chartCONTRIBUTING.md) options: - label: I agree to follow this project's Code of Conduct required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b172b23..75387d4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,25 +1,26 @@ -* **Please check if the PR fulfills these requirements** -- [ ] The branch naming convention follows our guidelines -- [ ] Docs have been added / updated (for bug fixes / features) +- **Please check if the PR fulfills these requirements** -* **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...) +* [ ] The branch naming convention follows our guidelines +* [ ] Docs have been added / updated (for bug fixes / features) + +- **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...) -* **What is the current behavior?** (You can also link to an open issue here) +- **What is the current behavior?** (You can also link to an open issue here) -* **What is the new behavior (if this is a feature change)?** +- **What is the new behavior (if this is a feature change)?** -* **Does this PR introduce a breaking change?** (What changes might users need to make in their application due to this PR?) +- **Does this PR introduce a breaking change?** (What changes might users need to make in their application due to this PR?) -* **Other information**: +- **Other information**: - + diff --git a/.github/workflows/lint-build.yaml b/.github/workflows/lint-build.yaml index 188dbb5..f7b3a6a 100644 --- a/.github/workflows/lint-build.yaml +++ b/.github/workflows/lint-build.yaml @@ -3,11 +3,11 @@ name: Helm Chart Lint & Build on: push: branches: - - 'dev' + - "dev" pull_request: branches: - - 'dev' - - 'main' + - "dev" + - "main" jobs: lint: @@ -35,7 +35,7 @@ jobs: uses: helm/chart-testing-action@v2.6.1 - name: Run chart-testing (lint) - run: ct lint --chart-dirs=servarr/ --charts=servarr/ --validate-maintainers=false + run: ct lint --chart-dirs=servarr/servarr-chart --charts=servarr/servarr-chart --validate-maintainers=false build: name: build @@ -51,10 +51,10 @@ jobs: uses: azure/setup-helm@v4.1.0 - name: Helm Dependency update - run: helm dependency update servarr/ --debug + run: helm dependency update servarr/servarr-chart --debug - name: Helm Template - run: helm template servarr servarr/ --debug -f .github/ci/ci-values.yaml + run: helm template servarr servarr/servarr-chart --debug -f .github/ci/ci-values.yaml - name: Create Package - run: helm package servarr/ + run: helm package servarr/servarr-chart diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4b64bfc..1fcab64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,17 +1,17 @@ # Contributing -When contributing to this repository, please first discuss the change you wish to make via [issue](https://github.com/fonzdm/servarr/issues), email, or any other method with the owners of this repository before making a change. +When contributing to this repository, please first discuss the change you wish to make via [issue](https://github.com/fonzdm/servarr/servarr-chartissues), email, or any other method with the owners of this repository before making a change. Please note we have a code of conduct, please follow it in all your interactions with the project. ## Branch naming convention -| Instance | Branch Name | Description | -|----------|:-----------:|-------------| -| Stable | `main` | Accepts merges from Working and Hotfixes | -| Working | `dev` | Accepts merges from Features/Issues and Hotfixes | -| Feature/Issue | `feat/feature-name` or `fix/bug-name` | Always branch off HEAD of Working | -| Hotfix | `hotfix/hotfix-name` | Always branch off Stable | +| Instance | Branch Name | Description | +| ------------- | :-----------------------------------: | ------------------------------------------------ | +| Stable | `main` | Accepts merges from Working and Hotfixes | +| Working | `dev` | Accepts merges from Features/Issues and Hotfixes | +| Feature/Issue | `feat/feature-name` or `fix/bug-name` | Always branch off HEAD of Working | +| Hotfix | `hotfix/hotfix-name` | Always branch off Stable | ## Merge Request Process diff --git a/README.md b/README.md index 969e582..9fe2705 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,10 @@ $ git clone https://github.com/fonzdm/servarr.git && cd servarr ``` 2. Prepare your [`values.yaml`](#values) -3. Try it in your cluster to check that everything is fine (replace the `servarr/` with the chart folder if your workdir is different): +3. Try it in your cluster to check that everything is fine (replace the `servarr/servarr-chart` with the chart folder if your workdir is different): ```shell -$ helm install servarr-dev servarr/ \ +$ helm install servarr-dev servarr/servarr-chart \ --namespace servarr-dev \ --create-namespace \ --values values.yaml @@ -44,7 +44,7 @@ $ helm install \ ### Values -Please read [Helm Chart README.md](./servarr/README.md) for details on how to configure the values needed for this chart. +Please read [Helm Chart README.md](./servarr/servarr-chartREADME.md) for details on how to configure the values needed for this chart. ## Contributing @@ -52,15 +52,15 @@ Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for details on our code of cond ## Contributors - + -See the full list of [contributors](https://github.com/fonzdm/servarr/contributors) who participated in this project. +See the full list of [contributors](https://github.com/fonzdm/servarr/servarr-chartcontributors) who participated in this project. ## Versioning -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases on this repository](https://github.com/fonzdm/servarr/releases). +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [releases on this repository](https://github.com/fonzdm/servarr/servarr-chartreleases). ###### Keep in mind that each dependency has its own author and their contributors. Please, reach them out on their repositories. diff --git a/servarr/servarr-chart/.helmignore b/servarr/servarr-chart/.helmignore new file mode 100644 index 0000000..b991d40 --- /dev/null +++ b/servarr/servarr-chart/.helmignore @@ -0,0 +1,28 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +my-values.yaml +docs/* +.pre-commit-config.yaml +README.md.gotmpl diff --git a/servarr/servarr-chart/Chart.yaml b/servarr/servarr-chart/Chart.yaml new file mode 100644 index 0000000..966d5bc --- /dev/null +++ b/servarr/servarr-chart/Chart.yaml @@ -0,0 +1,44 @@ +apiVersion: v2 +name: servarr +description: Servarr complete Helm Chart for Kubernetes +type: application +version: 1.0.0 +appVersion: "1.0.0" +keywords: + - servarr + - prowlarr + - radarr + - sonarr + - qbittorrent + - jellyseerr + - jellyfin + - flaresolverr +home: https://github.com/fonzdm/servarr +sources: + - https://github.com/fonzdm/servarr +dependencies: + - name: sonarr + version: "21.2.1" + repository: "https://charts.truecharts.org" + - name: radarr + version: "21.2.1" + repository: "https://charts.truecharts.org" + - name: prowlarr + version: "16.2.1" + repository: "https://charts.truecharts.org" + - name: qbittorrent + version: "19.4.1" + repository: "https://charts.truecharts.org" + - name: jellyseerr + version: "9.5.2" + repository: "https://charts.truecharts.org" + - name: jellyfin + version: "18.7.7" + repository: "https://charts.truecharts.org" + - name: flaresolverr + version: "13.4.1" + repository: "https://charts.truecharts.org" + +maintainers: + - name: Alfonso De Masi + email: adm220297@proton.me diff --git a/servarr/servarr-chart/README.md b/servarr/servarr-chart/README.md new file mode 100644 index 0000000..f812908 --- /dev/null +++ b/servarr/servarr-chart/README.md @@ -0,0 +1,118 @@ +# servarr + + + +![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square) + +Servarr complete Helm Chart for Kubernetes + +**Homepage:** + +## Maintainers + +| Name | Email | Url | +| ---- | ------ | --- | +| Alfonso De Masi | | | + +## Source Code + +* + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.truecharts.org | flaresolverr | 13.4.1 | +| https://charts.truecharts.org | jellyfin | 18.7.7 | +| https://charts.truecharts.org | jellyseerr | 9.5.2 | +| https://charts.truecharts.org | prowlarr | 16.2.1 | +| https://charts.truecharts.org | qbittorrent | 19.4.1 | +| https://charts.truecharts.org | radarr | 21.2.1 | +| https://charts.truecharts.org | sonarr | 21.2.1 | + +--- + +> [!IMPORTANT] +> Please consider that this chart is a collection of several public helm charts. +> These are included as sub-charts of the Servarr chart and, due to some Helm limitation, some configuration are only possible via values file. +> For this reason, the servarr default [values.yaml](#./values.yaml) included in the chart is quite huge and it used to model the configuration of the subcharts. +> But don't you worry! I provided some handy values, using [yaml anchors](https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd), to defined top-level fields. +> Follow the table below and forget everything else. + +> [!CAUTION] +> Please, do not remove Anchors when you see them (the strage syntax with the `&`) + +--- + +## Values + +### Jellyfin + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| dash.countryCode | string | US | Insert the Jellyfin country code | +| dash.mail | string | No default value | Insert Jellyfin login mail (will be used also for Jellyseerr integration) | +| dash.password | string | No default value | Insert Jellyfin password (will be used also for Jellyseerr) | +| dash.preferredLanguage | string | en | Insert the Jellyfin preferred language | +| dash.username | string | No default value | Insert the Jellyfin username (will be used also for Jellyseerr) | + +### Global + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| global.apikey | string | No default value is configured for security reasons | Insert your Prowlarr, Sonarr, Radarr API key here (one to rule them all!). Do not remove the `&apikey` anchor! | +| global.certManagerClusterIssuer | string | No default value, leave empty if not required | Insert your cert manager cluster issuer, e.g.: letsencrypt-cloudflare. Do not remove the `&issuer` anchor! | +| global.storageClassName | string | `"network-block"` | Insert your storage class here, e.g.: &storageClassName network-block. Do not remove the `&storageClassName` anchor! | + +### Prowlarr + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| indexers | list | The body of the 1337x index is provided as default | The indexers list. Each element of the list is the yaml-formatted body of the [Prowlarr API request](https://prowlarr.com/docs/api/#/Indexer/post_api_v1_indexer) to add that index. | + +### Issuer + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| issuer | object | See the sub fields | For tracking purpose, not used - replaced with pre-existing cluster issuer | +| issuer.cloudFlareKey | string | `nil` | Insert your CloudFlare key | +| issuer.email | string | `nil` | Insert your email address | + +### Metrics + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| metrics.enabled | bool | `false` | Anchor to set wether to deploy the export sidecar pods or not. Requires the Prometheus stack. Do not remove the `&metricsEnabled` anchor! | + +### Jellyseerr + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| notifications.telegram.bot_apitoken | string | No default value | Insert your Telegram Bot API token | +| notifications.telegram.chat_id | string | No default value | Insert the Telegram Chat id, check @get_id_bot for this | +| notifications.telegram.enabled | bool | `true` | Enable the Telegram notifications | + +### Torrent + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| torrent.password | string | No default value | password of the qBitTorrent admin user. Must be at least of 8 characters. | +| torrent.username | string | No default value | username of the qBitTorrent admin user | + +### Storage + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| volumes.downloads | object | See the sub fields | configuration of the volume used for torrent downloads | +| volumes.downloads.name | string | `"downloads-volume"` | Name of the download pvc. Do not remove the `&downloads-volume` anchor! | +| volumes.downloads.size | string | `"100Gi"` | Size of the downloads volume, in Kubernets format | +| volumes.media | object | See the sub fields | configuration of the volume used for media storage (i.e.: where movies and tv shows file will be permanently stored) | +| volumes.media.name | string | `"media-volume"` | Name of the media pvc. Do not remove the `&media-volume` anchor! | +| volumes.media.size | string | `"250Gi"` | Size of the media volume, in Kubernets format | +| volumes.torrentConfig | object | See the sub fields | configuration of the volume used for qBitTorrent internal configuration | +| volumes.torrentConfig.name | string | `"torrent-config"` | Name of the torrent configuration pvc. Do not remove the `&torrentConfig` anchor! | +| volumes.torrentConfig.size | string | `"250Mi"` | Size of the torrent configuration volume, in Kubernets format | + + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.13.1](https://github.com/norwoodj/helm-docs/releases/v1.13.1) diff --git a/servarr/servarr-chart/README.md.gotmpl b/servarr/servarr-chart/README.md.gotmpl new file mode 100644 index 0000000..1c589b3 --- /dev/null +++ b/servarr/servarr-chart/README.md.gotmpl @@ -0,0 +1,32 @@ +{{ template "chart.header" . }} +{{ template "chart.deprecationWarning" . }} + +{{ template "chart.badgesSection" . }} + +{{ template "chart.description" . }} + +{{ template "chart.homepageLine" . }} + +{{ template "chart.maintainersSection" . }} + +{{ template "chart.sourcesSection" . }} + +{{ template "chart.requirementsSection" . }} + +--- + +> [!IMPORTANT] +> Please consider that this chart is a collection of several public helm charts. +> These are included as sub-charts of the Servarr chart and, due to some Helm limitation, some configuration are only possible via values file. +> For this reason, the servarr default [values.yaml](#./values.yaml) included in the chart is quite huge and it used to model the configuration of the subcharts. +> But don't you worry! I provided some handy values, using [yaml anchors](https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd), to defined top-level fields. +> Follow the table below and forget everything else. + +> [!CAUTION] +> Please, do not remove Anchors when you see them (the strage syntax with the `&`) + +--- + +{{ template "chart.valuesSection" . }} + +{{ template "helm-docs.versionFooter" . }} diff --git a/servarr/config/scripts/init-jellyfin.py b/servarr/servarr-chart/config/scripts/init-jellyfin.py similarity index 100% rename from servarr/config/scripts/init-jellyfin.py rename to servarr/servarr-chart/config/scripts/init-jellyfin.py diff --git a/servarr/config/scripts/init-jellyseerr.py b/servarr/servarr-chart/config/scripts/init-jellyseerr.py similarity index 100% rename from servarr/config/scripts/init-jellyseerr.py rename to servarr/servarr-chart/config/scripts/init-jellyseerr.py diff --git a/servarr/config/scripts/init-prowlarr.py b/servarr/servarr-chart/config/scripts/init-prowlarr.py similarity index 100% rename from servarr/config/scripts/init-prowlarr.py rename to servarr/servarr-chart/config/scripts/init-prowlarr.py diff --git a/servarr/config/scripts/init-qbittorrent.py b/servarr/servarr-chart/config/scripts/init-qbittorrent.py similarity index 100% rename from servarr/config/scripts/init-qbittorrent.py rename to servarr/servarr-chart/config/scripts/init-qbittorrent.py diff --git a/servarr/config/scripts/init-radarr.py b/servarr/servarr-chart/config/scripts/init-radarr.py similarity index 100% rename from servarr/config/scripts/init-radarr.py rename to servarr/servarr-chart/config/scripts/init-radarr.py diff --git a/servarr/config/scripts/init-sonarr.py b/servarr/servarr-chart/config/scripts/init-sonarr.py similarity index 100% rename from servarr/config/scripts/init-sonarr.py rename to servarr/servarr-chart/config/scripts/init-sonarr.py diff --git a/servarr/servarr-chart/templates/configmaps.yaml b/servarr/servarr-chart/templates/configmaps.yaml new file mode 100644 index 0000000..0835665 --- /dev/null +++ b/servarr/servarr-chart/templates/configmaps.yaml @@ -0,0 +1,48 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: init-jellyseerr-python-scripts +data: +{{ ( tpl (.Files.Glob "config/scripts/init-jellyseerr.py" ).AsConfig . ) | indent 2 }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: init-radarr-script +data: +{{ ( tpl (.Files.Glob "config/scripts/init-radarr.py" ).AsConfig . ) | indent 2 }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: init-sonarr-script +data: +{{ ( tpl (.Files.Glob "config/scripts/init-sonarr.py" ).AsConfig . ) | indent 2 }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: init-prowlarr-script +data: +{{ ( tpl (.Files.Glob "config/scripts/init-prowlarr.py" ).AsConfig . ) | indent 2 }} +{{ if .Values.indexers }} + indexers.json: {{ $.Values.indexers | toJson | quote}} +{{ end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: init-jellyfin-script +data: +{{ ( tpl (.Files.Glob "config/scripts/init-jellyfin.py" ).AsConfig . ) | indent 2 }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-5" + helm.sh/hook-delete-policy: hook-failed, before-hook-creation + name: init-qbittorrent-python-script +data: +{{ ( tpl (.Files.Glob "config/scripts/init-qbittorrent.py" ).AsConfig . ) | indent 2 }} diff --git a/servarr/servarr-chart/templates/init-jellyfin.yaml b/servarr/servarr-chart/templates/init-jellyfin.yaml new file mode 100644 index 0000000..b740db8 --- /dev/null +++ b/servarr/servarr-chart/templates/init-jellyfin.yaml @@ -0,0 +1,59 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: jellyfin-init + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "30" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-jellyfin-finalizer" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + initContainers: + - name: wait-for-jellyfin + image: rapidfort/curl:8.7.1 + imagePullPolicy: IfNotPresent + command: + [ + "sh", + "-c", + "until curl \"http://{{ .Release.Namespace }}-jellyfin.{{ .Release.Namespace }}.svc.cluster.local:8096\"; do echo waiting for servarr-jellyfin; sleep 5; done;sleep 10;", + ] + containers: + - name: initialize-jellyfin + image: "nyurik/alpine-python3-requests" + imagePullPolicy: IfNotPresent + env: + - name: PYTHONUNBUFFERED + value: "1" + - name: JELLYFIN_HOST + value: "{{ .Release.Namespace }}-jellyfin.{{ .Release.Namespace }}.svc.cluster.local:8096" + - name: JELLYFIN_USERNAME + value: "{{ $.Values.dash.username }}" + - name: JELLYFIN_PASSWORD + value: "{{ $.Values.dash.password }}" + - name: COUNTRY_CODE + value: "{{ $.Values.dash.countryCode }}" + - name: PREFERRED_LANGUAGE + value: "{{ $.Values.dash.preferredLanguage }}" + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /mnt/init-jellyfin.py 2>&1;" + volumeMounts: + - mountPath: "/mnt" + name: python-script + volumes: + - name: python-script + configMap: + name: init-jellyfin-script \ No newline at end of file diff --git a/servarr/servarr-chart/templates/init-jellyseerr.yaml b/servarr/servarr-chart/templates/init-jellyseerr.yaml new file mode 100644 index 0000000..4d3cf44 --- /dev/null +++ b/servarr/servarr-chart/templates/init-jellyseerr.yaml @@ -0,0 +1,72 @@ +{{- if .Values.initJellyseerr -}} +apiVersion: batch/v1 +kind: Job +metadata: + name: jellyseer-init + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "40" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-jellyseer-finalizer" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + initContainers: + - name: wait-for-jellyseerr + image: rapidfort/curl:8.7.1 + imagePullPolicy: IfNotPresent + command: + - "sh" + - "-c" + - "until curl \"http://{{ .Release.Namespace }}-jellyseerr.{{ .Release.Namespace }}.svc.cluster.local:10241\"; do echo waiting for servarr-jellyseerr; sleep 5; done;sleep 10;" + containers: + - name: initialize-jellyseer + image: "nyurik/alpine-python3-requests" + imagePullPolicy: IfNotPresent + env: + - name: PYTHONUNBUFFERED + value: "1" + - name: JELLYSEERR_HOST + value: "{{ .Release.Namespace }}-jellyseerr.{{ .Release.Namespace }}.svc.cluster.local" + - name: JELLYSEERR_PORT + value: "10241" + - name: JELLYFIN_HOST + value: "{{ .Release.Namespace }}-jellyfin" + - name: JELLYFIN_PORT + value: "8096" + - name: JELLYFIN_USERNAME + value: "{{ $.Values.dash.username }}" + - name: JELLYFIN_PASSWORD + value: "{{ $.Values.dash.password }}" + - name: JELLYFIN_EMAIL + value: "{{ $.Values.dash.mail }}" + - name: API_KEY + value: "{{ $.Values.global.apikey }}" + - name: TELEGRAM_NOTIFICATION_ENABLED + value: "{{ $.Values.notifications.telegram.enabled }}" + - name: TELEGRAM_CHAT_ID + value: "{{ $.Values.notifications.telegram.chat_id}}" + - name: TELEGRAM_BOT_APITOKEN + value: "{{ $.Values.notifications.telegram.bot_apitoken }}" + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /mnt/init-jellyseerr.py 2>&1;" + volumeMounts: + - mountPath: "/mnt" + name: python-script + volumes: + - name: python-script + configMap: + name: init-jellyseerr-python-scripts + +{{- end }} diff --git a/servarr/servarr-chart/templates/init-prowlarr.yaml b/servarr/servarr-chart/templates/init-prowlarr.yaml new file mode 100644 index 0000000..f4fb167 --- /dev/null +++ b/servarr/servarr-chart/templates/init-prowlarr.yaml @@ -0,0 +1,67 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: prowlarr-init + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "20" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-prowlarr-finalizer" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + initContainers: + - name: wait-for-prowlarr + image: rapidfort/curl:8.7.1 + imagePullPolicy: IfNotPresent + command: + [ + "sh", + "-c", + "until curl \"http://{{ .Release.Namespace }}-prowlarr.{{ .Release.Namespace }}.svc.cluster.local:9696\"; do echo waiting for servarr-prowlarr; sleep 5; done;", + ] + containers: + - name: initialize-prowlarr + image: "nyurik/alpine-python3-requests" + imagePullPolicy: IfNotPresent + env: + - name: PYTHONUNBUFFERED + value: "1" + - name: PROWLARR_HOST + value: "{{ .Release.Namespace }}-prowlarr.{{ .Release.Namespace }}.svc.cluster.local:9696" + - name: API_KEY + value: "{{ $.Values.global.apikey }}" + - name: TORRENT_SERVICE + value: "{{ .Release.Namespace }}-qbittorrent" + - name: TORRENT_ADMIN + value: "{{ $.Values.torrent.username }}" + - name: TORRENT_PASSWORD + value: "{{ $.Values.torrent.password }}" + - name: PROWLARR_SERVICE + value: "{{ .Release.Namespace }}-prowlarr:9696" + - name: RADARR_SERVICE + value: "{{ .Release.Namespace }}-radarr:7878" + - name: FLARESOLVERR_SERVICE + value: "{{ .Release.Namespace }}-flaresolverr:8191" + - name: SONARR_SERVICE + value: "{{ .Release.Namespace }}-sonarr:8989" + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /mnt/init-prowlarr.py 2>&1;" + volumeMounts: + - mountPath: "/mnt" + name: python-script-and-indexers + volumes: + - name: python-script-and-indexers + configMap: + name: init-prowlarr-script \ No newline at end of file diff --git a/servarr/servarr-chart/templates/init-radarr.yaml b/servarr/servarr-chart/templates/init-radarr.yaml new file mode 100644 index 0000000..1e608ed --- /dev/null +++ b/servarr/servarr-chart/templates/init-radarr.yaml @@ -0,0 +1,59 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: radarr-init + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "10" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-radarr-finalizer" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + initContainers: + - name: wait-for-radarr + image: rapidfort/curl:8.7.1 + imagePullPolicy: IfNotPresent + command: + [ + "sh", + "-c", + "until curl \"http://{{ .Release.Namespace }}-radarr.{{ .Release.Namespace }}.svc.cluster.local:7878\"; do echo waiting for servarr-radarr; sleep 5; done;", + ] + containers: + - name: initialize-radarr + image: "nyurik/alpine-python3-requests" + imagePullPolicy: IfNotPresent + env: + - name: PYTHONUNBUFFERED + value: "1" + - name: RADARR_HOST + value: "{{ .Release.Namespace }}-radarr.{{ .Release.Namespace }}.svc.cluster.local:7878" + - name: API_KEY + value: "{{ $.Values.global.apikey }}" + - name: TORRENT_SERVICE + value: "{{ .Release.Namespace }}-qbittorrent" + - name: TORRENT_ADMIN + value: "{{ $.Values.torrent.username }}" + - name: TORRENT_PASSWORD + value: "{{ $.Values.torrent.password }}" + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /mnt/init-radarr.py 2>&1;" + volumeMounts: + - mountPath: "/mnt" + name: python-script + volumes: + - name: python-script + configMap: + name: init-radarr-script \ No newline at end of file diff --git a/servarr/servarr-chart/templates/init-sonarr.yaml b/servarr/servarr-chart/templates/init-sonarr.yaml new file mode 100644 index 0000000..8edb86f --- /dev/null +++ b/servarr/servarr-chart/templates/init-sonarr.yaml @@ -0,0 +1,59 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: sonarr-init + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": post-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "10" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-sonarr-finalizer" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + initContainers: + - name: wait-for-sonarr + image: rapidfort/curl:8.7.1 + imagePullPolicy: IfNotPresent + command: + [ + "sh", + "-c", + "until curl \"http://{{ .Release.Namespace }}-sonarr.{{ .Release.Namespace }}.svc.cluster.local:8989\"; do echo waiting for servarr-sonarr; sleep 5; done;", + ] + containers: + - name: initialize-sonarr + image: "nyurik/alpine-python3-requests" + imagePullPolicy: IfNotPresent + env: + - name: PYTHONUNBUFFERED + value: "1" + - name: SONARR_HOST + value: "{{ .Release.Namespace }}-sonarr.{{ .Release.Namespace }}.svc.cluster.local:8989" + - name: API_KEY + value: "{{ $.Values.global.apikey }}" + - name: TORRENT_SERVICE + value: "{{ .Release.Namespace }}-qbittorrent" + - name: TORRENT_ADMIN + value: "{{ $.Values.torrent.username }}" + - name: TORRENT_PASSWORD + value: "{{ $.Values.torrent.password }}" + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /mnt/init-sonarr.py 2>&1;" + volumeMounts: + - mountPath: "/mnt" + name: python-script + volumes: + - name: python-script + configMap: + name: init-sonarr-script \ No newline at end of file diff --git a/servarr/servarr-chart/templates/issuer.yaml b/servarr/servarr-chart/templates/issuer.yaml new file mode 100644 index 0000000..5999dd2 --- /dev/null +++ b/servarr/servarr-chart/templates/issuer.yaml @@ -0,0 +1,22 @@ +# --- + +# apiVersion: cert-manager.io/v1 +# kind: Issuer +# metadata: +# name: letsencrypt-cloudflare +# spec: +# acme: +# # The ACME server URL +# server: {{ .Values.issuer.server }} +# # Email address used for ACME registration +# email: {{ .Values.issuer.email }} +# # Name of a secret used to store the ACME account private key +# privateKeySecretRef: +# name: {{ .Values.issuer.secretName }} +# # Enable the HTTP-01 challenge provider +# solvers: +# - dns01: +# cloudflare: +# apiTokenSecretRef: +# name: cloudflare-api-token-secret +# key: api-token diff --git a/servarr/servarr-chart/templates/pre-deployment-job.yaml b/servarr/servarr-chart/templates/pre-deployment-job.yaml new file mode 100644 index 0000000..8fae063 --- /dev/null +++ b/servarr/servarr-chart/templates/pre-deployment-job.yaml @@ -0,0 +1,51 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: pre-install-job + labels: + release: "{{ .Release.Name }}" + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + "helm.sh/hook": pre-install + "helm.sh/hook-delete-policy": before-hook-creation + "helm.sh/hook-weight": "-3" +spec: + backoffLimit: 1 + template: + metadata: + name: "{{.Release.Name}}-config-prepare" + labels: + app: "{{ .Release.Name }}" + spec: + restartPolicy: Never + containers: + - name: qbt-config-injector + image: dinutac/jinja2docker:2.1.8 + imagePullPolicy: IfNotPresent + env: + - name: TORRENT_USERNAME + value: {{ .Values.torrent.username }} + - name: TORRENT_PASSWORD + value: {{ .Values.torrent.password }} + command: + - "/bin/sh" + - "-ec" + args: + - "python3 -u /tmp/init-qbittorrent.py 2>&1;" + volumeMounts: + - name: torrent-config-volume + mountPath: /mnt + - name: init-script + mountPath: /tmp/init-qbittorrent.py + subPath: init-qbittorrent.py + volumes: + - name: torrent-config-volume + persistentVolumeClaim: + claimName: {{ .Values.volumes.torrentConfig.name }} + - name: init-script + configMap: + name: init-qbittorrent-python-script + defaultMode: 0644 + # items: + # - key: qBittorrent.conf + # path: qBittorrent.conf diff --git a/servarr/servarr-chart/templates/pvc.yaml b/servarr/servarr-chart/templates/pvc.yaml new file mode 100644 index 0000000..cb1ecbb --- /dev/null +++ b/servarr/servarr-chart/templates/pvc.yaml @@ -0,0 +1,60 @@ +{{- $is_downloads_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.downloads.name) }} +{{- if not $is_downloads_pvc_present }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.volumes.downloads.name }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-5" + helm.sh/hook-delete-policy: hook-failed +spec: + storageClassName: {{ .Values.volumes.storageClass }} + accessModes: + - ReadWriteMany + resources: + requests: + storage: {{ .Values.volumes.downloads.size }} +{{- end }} + +--- + +{{- $is_media_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.media.name) }} +{{- if not $is_media_pvc_present }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.volumes.media.name }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-5" + helm.sh/hook-delete-policy: hook-failed +spec: + storageClassName: {{ .Values.volumes.storageClass }} + accessModes: + - ReadWriteMany + resources: + requests: + storage: {{ .Values.volumes.media.size }} +{{- end }} + +--- + +{{- $is_torrentconfig_pvc_present := (lookup "v1" "PersistentVolumeClaim" .Release.Namespace .Values.volumes.torrentConfig.name) }} +{{- if not $is_torrentconfig_pvc_present }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ .Values.volumes.torrentConfig.name }} + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "-5" + helm.sh/hook-delete-policy: hook-failed +spec: + storageClassName: {{ .Values.volumes.storageClass }} + accessModes: + - ReadWriteMany + resources: + requests: + storage: {{ .Values.volumes.torrentConfig.size }} +{{- end }} \ No newline at end of file diff --git a/servarr/servarr-chart/templates/secret.yaml b/servarr/servarr-chart/templates/secret.yaml new file mode 100644 index 0000000..98d2c11 --- /dev/null +++ b/servarr/servarr-chart/templates/secret.yaml @@ -0,0 +1,29 @@ +# apiVersion: v1 +# kind: Secret +# metadata: +# name: cloudflare-api-token-secret +# type: Opaque +# stringData: +# api-token: {{ .Values.issuer.cloudFlareKey }} + +--- + +apiVersion: v1 +kind: Secret +metadata: + name: servarr-api-key +type: Opaque +stringData: + apikey: {{ .Values.global.apikey }} + + +--- + +apiVersion: v1 +kind: Secret +metadata: + name: qbittorrent-creds +type: Opaque +stringData: + username: {{ .Values.torrent.username }} + password: {{ .Values.torrent.password }} diff --git a/servarr/servarr-chart/values.yaml b/servarr/servarr-chart/values.yaml new file mode 100644 index 0000000..518f8ae --- /dev/null +++ b/servarr/servarr-chart/values.yaml @@ -0,0 +1,956 @@ +global: + # -- (string) Insert your Prowlarr, Sonarr, Radarr API key here (one to rule them all!). Do not remove the `&apikey` anchor! + # @default -- No default value is configured for security reasons + # @section -- Global + apikey: &apikey + # -- (string) Insert your storage class here, e.g.: &storageClassName network-block. Do not remove the `&storageClassName` anchor! + # @section -- Global + storageClassName: &storageClassName "network-block" + # -- (string) Insert your cert manager cluster issuer, e.g.: letsencrypt-cloudflare. Do not remove the `&issuer` anchor! + # @default -- No default value, leave empty if not required + # @section -- Global + certManagerClusterIssuer: &issuer + +metrics: + # -- Anchor to set wether to deploy the export sidecar pods or not. Requires the Prometheus stack. Do not remove the `&metricsEnabled` anchor! + # @section -- Metrics + enabled: &metricsEnabled false + +# @ignore +initJellyseerr: true + +notifications: + telegram: + # -- Enable the Telegram notifications + # @section -- Jellyseerr + enabled: true + # -- (string) Insert the Telegram Chat id, check @get_id_bot for this + # @section -- Jellyseerr + # @default -- No default value + chat_id: + # -- (string) Insert your Telegram Bot API token + # @section -- Jellyseerr + # @default -- No default value + bot_apitoken: + +dash: + # -- (string) Insert the Jellyfin username (will be used also for Jellyseerr) + # @section -- Jellyfin + # @default -- No default value + username: + # -- (string) Insert Jellyfin password (will be used also for Jellyseerr) + # @section -- Jellyfin + # @default -- No default value + password: + # -- (string) Insert Jellyfin login mail (will be used also for Jellyseerr integration) + # @section -- Jellyfin + # @default -- No default value + mail: + # -- (string) Insert the Jellyfin country code + # @section -- Jellyfin + # @default -- US + countryCode: "US" + # -- (string) Insert the Jellyfin preferred language + # @section -- Jellyfin + # @default -- en + preferredLanguage: "en" + +torrent: + # -- (string) username of the qBitTorrent admin user + # @section -- Torrent + # @default -- No default value + username: + # -- (string) password of the qBitTorrent admin user. Must be at least of 8 characters. + # @section -- Torrent + # @default -- No default value + password: + +# -- The indexers list. Each element of the list is the yaml-formatted body of the [Prowlarr API request](https://prowlarr.com/docs/api/#/Indexer/post_api_v1_indexer) to add that index. +# @default -- The body of the 1337x index is provided as default +# @section -- Prowlarr +indexers: + # @ignored + - name: 1337x + body: + added: "0001-01-01T00:00:00Z" + appProfileId: 1 + capabilities: + bookSearchParams: + - q + categories: + - id: 5000 + name: TV + subCategories: + - id: 5070 + name: TV/Anime + subCategories: [] + - id: 5040 + name: TV/HD + subCategories: [] + - id: 5030 + name: TV/SD + subCategories: [] + - id: 5080 + name: TV/Documentary + subCategories: [] + - id: 3000 + name: Audio + subCategories: + - id: 3010 + name: Audio/MP3 + subCategories: [] + - id: 3040 + name: Audio/Lossless + subCategories: [] + - id: 3020 + name: Audio/Video + subCategories: [] + - id: 3050 + name: Audio/Other + subCategories: [] + - id: 3030 + name: Audio/Audiobook + subCategories: [] + - id: 2000 + name: Movies + subCategories: + - id: 2070 + name: Movies/DVD + subCategories: [] + - id: 2030 + name: Movies/SD + subCategories: [] + - id: 2010 + name: Movies/Foreign + subCategories: [] + - id: 2040 + name: Movies/HD + subCategories: [] + - id: 2060 + name: Movies/3D + subCategories: [] + - id: 2045 + name: Movies/UHD + subCategories: [] + - id: 4000 + name: PC + subCategories: + - id: 4030 + name: PC/Mac + subCategories: [] + - id: 4070 + name: PC/Mobile-Android + subCategories: [] + - id: 4060 + name: PC/Mobile-iOS + subCategories: [] + - id: 4050 + name: PC/Games + subCategories: [] + - id: 4040 + name: PC/Mobile-Other + subCategories: [] + - id: 1000 + name: Console + subCategories: + - id: 1080 + name: Console/PS3 + subCategories: [] + - id: 1020 + name: Console/PSP + subCategories: [] + - id: 1040 + name: Console/XBox + subCategories: [] + - id: 1050 + name: Console/XBox 360 + subCategories: [] + - id: 1090 + name: Console/Other + subCategories: [] + - id: 1030 + name: Console/Wii + subCategories: [] + - id: 1010 + name: Console/NDS + subCategories: [] + - id: 1110 + name: Console/3DS + subCategories: [] + - id: 1180 + name: Console/PS4 + subCategories: [] + - id: 6000 + name: XXX + subCategories: + - id: 6010 + name: XXX/DVD + subCategories: [] + - id: 6060 + name: XXX/ImageSet + subCategories: [] + - id: 8000 + name: Other + subCategories: + - id: 8010 + name: Other/Misc + subCategories: [] + - id: 7000 + name: Books + subCategories: + - id: 7020 + name: Books/EBook + subCategories: [] + - id: 7030 + name: Books/Comics + subCategories: [] + limitsDefault: 100 + limitsMax: 100 + movieSearchParams: + - q + musicSearchParams: + - q + - album + - artist + searchParams: + - q + - q + supportsRawSearch: true + tvSearchParams: + - q + - season + - ep + configContract: CardigannSettings + definitionName: 1337x + description: 1337X is a Public torrent site that offers verified torrent downloads + downloadClientId: 0 + enable: true + fields: + - name: definitionFile + value: 1337x + - name: baseUrl + value: https://1337x.proxyninja.org/ + - name: baseSettings.queryLimit + - name: baseSettings.grabLimit + - name: baseSettings.limitsUnit + value: 0 + - name: torrentBaseSettings.appMinimumSeeders + - name: torrentBaseSettings.seedRatio + - name: torrentBaseSettings.seedTime + - name: torrentBaseSettings.packSeedTime + - name: downloadlink + value: 1 + - name: downloadlink2 + value: 0 + - name: sort + value: 0 + - name: type + value: 1 + implementation: Cardigann + implementationName: Cardigann + indexerUrls: + - https://1337x.to/ + - https://1337x.st/ + - https://x1337x.ws/ + - https://x1337x.eu/ + - https://x1337x.se/ + - https://1337x.so/ + - https://1337x.unblockit.africa/ + - https://1337x.unblockninja.com/ + - https://1337x.ninjaproxy1.com/ + - https://1337x.proxyninja.org/ + - https://1337x.torrentbay.st/ + infoLink: https://wiki.servarr.com/prowlarr/supported-indexers#1337x + language: en-US + legacyUrls: + - https://1337x.is/ + - https://1337x.gd/ + - https://1337x.nocensor.lol/ + - https://1337x.unblockit.ink/ + - https://1337x.nocensor.art/ + - https://1337x.unblockit.bio/ + - https://1337x.unblockit.boo/ + - https://1337x.mrunblock.guru/ + - https://1337x.mrunblock.life/ + - https://1337x.unblockit.click/ + - https://1337x.unblockit.asia/ + - https://1337x.unblockit.mov/ + - https://1337x.unblockit.rsvp/ + - https://1337x.unblockit.vegas/ + - https://1337x.unblockit.esq/ + - https://1337x.unblockit.zip/ + - https://1337x.unblockit.foo/ + - https://1337x.unblockit.ing/ + - https://1337x.mrunblock.bond/ + - https://1337x.unblockit.date/ + - https://1337x.unblockit.dad/ + name: 1337x + priority: 25 + privacy: public + protocol: torrent + redirect: false + sortName: 1337x + supportsPagination: false + supportsRedirect: false + supportsRss: true + supportsSearch: true + tags: + - 1 + - name: ilcorsaroblu + body: + appProfileId: 1 + capabilities: + bookSearchParams: + - q + categories: + - id: 6000 + name: XXX + subCategories: [] + - id: 4000 + name: PC + subCategories: + - id: 4070 + name: PC/Mobile-Android + subCategories: [] + - id: 4060 + name: PC/Mobile-iOS + subCategories: [] + - id: 4010 + name: PC/0day + subCategories: [] + - id: 4030 + name: PC/Mac + subCategories: [] + - id: 4050 + name: PC/Games + subCategories: [] + - id: 7000 + name: Books + subCategories: + - id: 7020 + name: Books/EBook + subCategories: [] + - id: 7030 + name: Books/Comics + subCategories: [] + - id: 7010 + name: Books/Mags + subCategories: [] + - id: 1000 + name: Console + subCategories: + - id: 1040 + name: Console/XBox + subCategories: [] + - id: 1010 + name: Console/NDS + subCategories: [] + - id: 3000 + name: Audio + subCategories: + - id: 3010 + name: Audio/MP3 + subCategories: [] + - id: 2000 + name: Movies + subCategories: + - id: 2040 + name: Movies/HD + subCategories: [] + - id: 2020 + name: Movies/Other + subCategories: [] + - id: 2070 + name: Movies/DVD + subCategories: [] + - id: 2060 + name: Movies/3D + subCategories: [] + - id: 2045 + name: Movies/UHD + subCategories: [] + - id: 5000 + name: TV + subCategories: + - id: 5030 + name: TV/SD + subCategories: [] + - id: 5040 + name: TV/HD + subCategories: [] + - id: 5070 + name: TV/Anime + subCategories: [] + - id: 5060 + name: TV/Sport + subCategories: [] + - id: 5080 + name: TV/Documentary + subCategories: [] + - id: 8000 + name: Other + subCategories: [] + limitsDefault: 100 + limitsMax: 100 + movieSearchParams: + - q + musicSearchParams: + - q + searchParams: + - q + - q + supportsRawSearch: false + tvSearchParams: + - q + - season + - ep + configContract: CardigannSettings + definitionName: ilcorsaroblu + description: il CorSaRo Blu is an ITALIAN Semi-Private site for TV / MOVIES / GENERAL + downloadClientId: 0 + enable: true + fields: + - name: definitionFile + value: ilcorsaroblu + - name: baseUrl + value: "https://ilcorsaroblu.org/" + - name: baseSettings.queryLimit + - name: baseSettings.grabLimit + - name: baseSettings.limitsUnit + value: 0 + - name: torrentBaseSettings.appMinimumSeeders + - name: torrentBaseSettings.seedRatio + - name: torrentBaseSettings.seedTime + - name: torrentBaseSettings.packSeedTime + - name: username + value: "" + - name: password + value: "" + - name: freeleech + value: false + - name: sort + value: 1 + - name: type + value: 1 + implementation: Cardigann + implementationName: Cardigann + indexerUrls: + - "https://ilcorsaroblu.org/" + infoLink: "https://wiki.servarr.com/prowlarr/supported-indexers#ilcorsaroblu" + language: it-IT + legacyUrls: + - "http://ilcorsaroblu.org/" + - "https://www.ilcorsaroblu.info/" + - "https://www.ilcorsaroblu.org/" + - "https://ilcorsaroblu.online/" + name: Il Corsaro Blu + priority: 25 + privacy: semiPrivate + protocol: torrent + redirect: false + sortName: il corsaro blu + supportsPagination: false + supportsRedirect: false + supportsRss: true + supportsSearch: true + tags: [] + +# -- For tracking purpose, not used - replaced with pre-existing cluster issuer +# @section -- Issuer +# @default -- See the sub fields +issuer: + # @section -- Issuer + server: https://acme-v02.api.letsencrypt.org/directory + # -- Insert your email address + # @section -- Issuer + email: + # @section -- Issuer + secretName: letsencrypt-prod + # @section -- Issuer + ingressClassName: nginx + # -- Insert your CloudFlare key + # @section -- Issuer + cloudFlareKey: + +volumes: + # @ignore + storageClass: *storageClassName + # -- configuration of the volume used for torrent downloads + # @section -- Storage + # @default -- See the sub fields + downloads: + # -- Name of the download pvc. Do not remove the `&downloads-volume` anchor! + # @section -- Storage + name: &downloads-volume downloads-volume + # -- Size of the downloads volume, in Kubernets format + # @section -- Storage + size: 100Gi + # -- configuration of the volume used for media storage (i.e.: where movies and tv shows file will be permanently stored) + # @section -- Storage + # @default -- See the sub fields + media: + # -- Name of the media pvc. Do not remove the `&media-volume` anchor! + # @section -- Storage + name: &media-volume media-volume + # -- Size of the media volume, in Kubernets format + # @section -- Storage + size: 250Gi + # -- configuration of the volume used for qBitTorrent internal configuration + # @section -- Storage + # @default -- See the sub fields + torrentConfig: + # -- Name of the torrent configuration pvc. Do not remove the `&torrentConfig` anchor! + # @section -- Storage + name: &torrentConfig torrent-config + # -- Size of the torrent configuration volume, in Kubernets format + # @section -- Storage + size: 250Mi + +# @ignore +sonarr: + # @ignore + metrics: + main: + enabled: *metricsEnabled + # @ignore + workload: + main: + podSpec: + containers: + main: + env: + SONARR__API_KEY: *apikey + # @ignore + ingress: + # @ignore + sonarr-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: sonarr.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - sonarr.local + secretName: sonarr-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + # @ignore + persistence: + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true + # @ignore + media: + enabled: true + type: pvc + existingClaim: *media-volume + targetSelector: + main: + main: + mountPath: /mnt/media + # @ignore + downloads: + enabled: true + type: pvc + existingClaim: *downloads-volume + targetSelector: + main: + main: + mountPath: /mnt/downloads + +# @ignore +radarr: + # @ignore + metrics: + main: + enabled: *metricsEnabled + # @ignore + workload: + main: + podSpec: + containers: + main: + env: + RADARR__API_KEY: *apikey + # @ignore + ingress: + # @ignore + radarr-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: radarr.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - radarr.local + secretName: radarr-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + persistence: + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true + media: + enabled: true + type: pvc + existingClaim: *media-volume + targetSelector: + main: + main: + mountPath: /mnt/media + downloads: + enabled: true + type: pvc + existingClaim: *downloads-volume + targetSelector: + main: + main: + mountPath: /mnt/downloads + +# @ignore +jellyfin: + metrics: + main: + enabled: *metricsEnabled + # @ignore + fallbackDefaults: + storageClass: + probeType: http + serviceProtocol: tcp + serviceType: ClusterIP + persistenceType: pvc + pvcRetain: false + pvcSize: 100Gi + vctSize: 100Gi + accessModes: + - ReadWriteMany + vctAccessModes: + - ReadWriteMany + probeTimeouts: + liveness: + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 1 + readiness: + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 2 + startup: + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 60 + successThreshold: 1 + pgVersion: 16 + serviceProtocol: tcp + ingress: + jellyfin-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: jellyfin.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - jellyfin.local + secretName: jellyfin-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + persistence: + transcode: + enabled: false + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true + media: + enabled: true + type: pvc + existingClaim: *media-volume + targetSelector: + main: + main: + mountPath: /mnt/media + +# @ignore +jellyseerr: + metrics: + main: + enabled: *metricsEnabled + # @ignore + fallbackDefaults: + storageClass: + probeType: http + serviceProtocol: tcp + serviceType: ClusterIP + persistenceType: pvc + pvcRetain: false + pvcSize: 100Gi + vctSize: 100Gi + accessModes: + - ReadWriteMany + vctAccessModes: + - ReadWriteMany + probeTimeouts: + liveness: + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 1 + readiness: + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 2 + startup: + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 60 + successThreshold: 1 + pgVersion: 16 + ingress: + jellyseerr-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: jellyseerr.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - jellyseerr.local + secretName: jellyseerr-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + persistence: + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /app/config + exportarr: + exportarr: + mountPath: /config + readOnly: true + media: + enabled: true + type: pvc + existingClaim: *media-volume + targetSelector: + main: + main: + mountPath: /mnt/media + +# @ignore +qbittorrent: + metrics: + main: + enabled: *metricsEnabled + workload: + main: + podSpec: + containers: + main: + env: + QBITTORRENT__USE_PROFILE: true + ingress: + qbittorrent-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: torrent.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - torrent.local + secretName: torrent-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + persistence: + config: + enabled: true + type: pvc + existingClaim: *torrentConfig + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true + downloads: + enabled: true + type: pvc + existingClaim: *downloads-volume + targetSelector: + main: + main: + mountPath: /downloads + +# @ignore +prowlarr: + metrics: + main: + enabled: *metricsEnabled + workload: + main: + podSpec: + containers: + main: + env: + PROWLARR__API_KEY: *apikey + ingress: + prowlarr-ing: + enabled: true + primary: true + required: true + expandObjectName: false + annotations: + cert-manager.io/cluster-issuer: *issuer + ingressClassName: "nginx" + hosts: + - host: prowlarr.local + paths: + - path: / + pathType: Prefix + tls: + - hosts: + - prowlarr.local + secretName: prowlarr-tls + integrations: + certManager: + enabled: false + traefik: + enabled: false + persistence: + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true + +# @ignore +flaresolverr: + metrics: + main: + enabled: *metricsEnabled + persistence: + config: + enabled: true + type: pvc + size: 500Mi + accessModes: ReadWriteMany + storageClass: *storageClassName + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true From b8e90bd33cd3bdd9722f076365f573c1accff35b Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 20:53:35 +0200 Subject: [PATCH 5/9] Change root folder --- .github/workflows/helm-docs.yaml | 35 ++++++++++++++++---------------- .pre-commit-config.yaml | 4 ++-- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/.github/workflows/helm-docs.yaml b/.github/workflows/helm-docs.yaml index 4a1b33a..7260379 100644 --- a/.github/workflows/helm-docs.yaml +++ b/.github/workflows/helm-docs.yaml @@ -1,30 +1,29 @@ -name: 'Helm Chart Doc Generator' +name: "Helm Chart Doc Generator" on: push: branches: - - 'dev' - - 'main' + - "dev" + - "main" pull_request: branches: - - 'dev' - - 'main' + - "dev" + - "main" jobs: helm-docs: runs-on: ubuntu-latest steps: + - name: Checkout to current commit + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 - - name: Checkout to current commit - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - fetch-depth: 0 - - - name: Run helm-docs and push to the same branch - uses: losisin/helm-docs-github-action@v1 - with: - git-push: true - git-push-user-name: "Servarr Bot 🤖" - git-push-user-email: "servarr-bot@fonzdm.xyz" - chart-search-root: ./servarr \ No newline at end of file + - name: Run helm-docs and push to the same branch + uses: losisin/helm-docs-github-action@v1 + with: + git-push: true + git-push-user-name: "Servarr Bot 🤖" + git-push-user-email: "servarr-bot@fonzdm.xyz" + chart-search-root: ./servarr/servarr-chart diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 352b501..4364a8b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,5 +5,5 @@ repos: - id: helm-docs-container args: # Use root folder as the main repo dir is the chart itself - - --chart-search-root=servarr - - --template-files=README.md.gotmpl \ No newline at end of file + - --chart-search-root=servarr/servarr-chart + - --template-files=README.md.gotmpl From 1226c4ff6e5df811c06150625e6c7a29fe954b23 Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 21:02:20 +0200 Subject: [PATCH 6/9] Add workflow to deploy static website via gh-pages --- .github/workflows/static.yaml | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/static.yaml diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml new file mode 100644 index 0000000..9f275ad --- /dev/null +++ b/.github/workflows/static.yaml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["charts"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: "." + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 0ef6a1c5ba7a0cb3b85e1da51fa935aeac8b4cbe Mon Sep 17 00:00:00 2001 From: Luca Amoriello Date: Wed, 24 Apr 2024 21:10:10 +0200 Subject: [PATCH 7/9] Remove test filter --- .github/workflows/release.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 096f23a..4f15f1e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,9 +4,6 @@ on: push: branches: - main - pull_request: - branches: - - dev jobs: release: From 1de58355040ee36f0868507cf17d7aafc95c8aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Servarr=20Bot=20=F0=9F=A4=96?= Date: Wed, 24 Apr 2024 19:10:37 +0000 Subject: [PATCH 8/9] update Helm documentation --- servarr/servarr-chart/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servarr/servarr-chart/README.md b/servarr/servarr-chart/README.md index f812908..afd51f6 100644 --- a/servarr/servarr-chart/README.md +++ b/servarr/servarr-chart/README.md @@ -2,7 +2,7 @@ -![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square) +![Version: 1.0.2](https://img.shields.io/badge/Version-1.0.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.2](https://img.shields.io/badge/AppVersion-1.0.2-informational?style=flat-square) Servarr complete Helm Chart for Kubernetes From 61f22c8940051e8bfae8b41fa61fad296ca9b2a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Servarr=20Bot=20=F0=9F=A4=96?= Date: Wed, 24 Apr 2024 19:25:39 +0000 Subject: [PATCH 9/9] update Helm documentation --- servarr/servarr-chart/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servarr/servarr-chart/README.md b/servarr/servarr-chart/README.md index afd51f6..f812908 100644 --- a/servarr/servarr-chart/README.md +++ b/servarr/servarr-chart/README.md @@ -2,7 +2,7 @@ -![Version: 1.0.2](https://img.shields.io/badge/Version-1.0.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.2](https://img.shields.io/badge/AppVersion-1.0.2-informational?style=flat-square) +![Version: 1.0.0](https://img.shields.io/badge/Version-1.0.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 1.0.0](https://img.shields.io/badge/AppVersion-1.0.0-informational?style=flat-square) Servarr complete Helm Chart for Kubernetes