From 76f7f433cc39860df16de3a86d85da0fbb152cc5 Mon Sep 17 00:00:00 2001 From: sonicaj Date: Thu, 11 Jan 2024 11:14:35 +0000 Subject: [PATCH] Publish new changes in catalog --- community/invidious/1.0.0/Chart.lock | 6 + community/invidious/1.0.0/Chart.yaml | 25 + community/invidious/1.0.0/README.md | 16 + community/invidious/1.0.0/app-readme.md | 16 + .../invidious/1.0.0/charts/common-1.2.7.tgz | Bin 0 -> 63151 bytes .../invidious/1.0.0/ci/basic-values.yaml | 18 + community/invidious/1.0.0/ix_values.yaml | 61 ++ community/invidious/1.0.0/metadata.yaml | 13 + community/invidious/1.0.0/questions.yaml | 540 ++++++++++++++++++ community/invidious/1.0.0/templates/NOTES.txt | 1 + .../1.0.0/templates/_configuration.tpl | 62 ++ .../invidious/1.0.0/templates/_invidious.tpl | 117 ++++ .../1.0.0/templates/_persistence.tpl | 52 ++ .../invidious/1.0.0/templates/_portal.tpl | 12 + .../invidious/1.0.0/templates/_postgres.tpl | 6 + .../invidious/1.0.0/templates/_service.tpl | 17 + .../invidious/1.0.0/templates/common.yaml | 13 + .../invidious/1.0.0/upgrade_strategy_disabled | 31 + community/invidious/item.yaml | 12 + 19 files changed, 1018 insertions(+) create mode 100644 community/invidious/1.0.0/Chart.lock create mode 100644 community/invidious/1.0.0/Chart.yaml create mode 100644 community/invidious/1.0.0/README.md create mode 100644 community/invidious/1.0.0/app-readme.md create mode 100644 community/invidious/1.0.0/charts/common-1.2.7.tgz create mode 100644 community/invidious/1.0.0/ci/basic-values.yaml create mode 100644 community/invidious/1.0.0/ix_values.yaml create mode 100644 community/invidious/1.0.0/metadata.yaml create mode 100644 community/invidious/1.0.0/questions.yaml create mode 100644 community/invidious/1.0.0/templates/NOTES.txt create mode 100644 community/invidious/1.0.0/templates/_configuration.tpl create mode 100644 community/invidious/1.0.0/templates/_invidious.tpl create mode 100644 community/invidious/1.0.0/templates/_persistence.tpl create mode 100644 community/invidious/1.0.0/templates/_portal.tpl create mode 100644 community/invidious/1.0.0/templates/_postgres.tpl create mode 100644 community/invidious/1.0.0/templates/_service.tpl create mode 100644 community/invidious/1.0.0/templates/common.yaml create mode 100755 community/invidious/1.0.0/upgrade_strategy_disabled create mode 100644 community/invidious/item.yaml diff --git a/community/invidious/1.0.0/Chart.lock b/community/invidious/1.0.0/Chart.lock new file mode 100644 index 0000000000..a29541fb4c --- /dev/null +++ b/community/invidious/1.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.2.7 +digest: sha256:d69abe6772f86bc5c22cd95bf4505685ca88a1f5f99d78e2cf58cb66bb945e07 +generated: "2024-01-10T16:53:36.659684978+02:00" diff --git a/community/invidious/1.0.0/Chart.yaml b/community/invidious/1.0.0/Chart.yaml new file mode 100644 index 0000000000..c128385cb1 --- /dev/null +++ b/community/invidious/1.0.0/Chart.yaml @@ -0,0 +1,25 @@ +name: invidious +description: Invidious is an alternative front-end to YouTube +annotations: + title: Invidious +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: latest +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.2.7 +home: https://invidious.io/ +icon: https://media.sys.truenas.net/apps/invidious/icons/icon.svg +sources: + - https://invidious.io/ + - https://github.com/truenas/charts/tree/master/community/invidious + - https://quay.io/repository/invidious +keywords: + - youtube diff --git a/community/invidious/1.0.0/README.md b/community/invidious/1.0.0/README.md new file mode 100644 index 0000000000..f01f004794 --- /dev/null +++ b/community/invidious/1.0.0/README.md @@ -0,0 +1,16 @@ +# Invidious + +[Invidious](https://invidious.io/) is an alternative front-end to YouTube. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. + +Additional configuration can be specified + +- Via [environment variables](https://github.com/iv-org/invidious/pull/1702) +- By editing the file `/config/config.yaml` (see [example](https://github.com/iv-org/invidious/blob/master/config/config.example.yml)) diff --git a/community/invidious/1.0.0/app-readme.md b/community/invidious/1.0.0/app-readme.md new file mode 100644 index 0000000000..f01f004794 --- /dev/null +++ b/community/invidious/1.0.0/app-readme.md @@ -0,0 +1,16 @@ +# Invidious + +[Invidious](https://invidious.io/) is an alternative front-end to YouTube. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. + +Additional configuration can be specified + +- Via [environment variables](https://github.com/iv-org/invidious/pull/1702) +- By editing the file `/config/config.yaml` (see [example](https://github.com/iv-org/invidious/blob/master/config/config.example.yml)) diff --git a/community/invidious/1.0.0/charts/common-1.2.7.tgz b/community/invidious/1.0.0/charts/common-1.2.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b3b92ec645097b108a42e9f7c1a4370b59c4bc4d GIT binary patch literal 63151 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 QWcT_9}~ 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 literal 0 HcmV?d00001 diff --git a/community/invidious/1.0.0/ci/basic-values.yaml b/community/invidious/1.0.0/ci/basic-values.yaml new file mode 100644 index 0000000000..f982af71eb --- /dev/null +++ b/community/invidious/1.0.0/ci/basic-values.yaml @@ -0,0 +1,18 @@ +invidiousNetwork: + webPort: 31000 + +invidiousConfig: + admins: + - admin1 + - admin2 + +invidiousStorage: + config: + type: pvc + pgData: + type: pvc + pgBackup: + type: emptyDir + emptyDirConfig: + medium: "" + size: "" diff --git a/community/invidious/1.0.0/ix_values.yaml b/community/invidious/1.0.0/ix_values.yaml new file mode 100644 index 0000000000..6fcb2a7021 --- /dev/null +++ b/community/invidious/1.0.0/ix_values.yaml @@ -0,0 +1,61 @@ +image: + repository: quay.io/invidious/invidious + pullPolicy: IfNotPresent + tag: latest +gitImage: + repository: bitnami/git + pullPolicy: IfNotPresent + tag: latest + +resources: + limits: + cpu: 4000m + memory: 8Gi + +invidiousConfig: + admins: [] + registrationEnabled: true + loginEnabled: true + captchaEnabled: true + additionalEnvs: [] + +invidiousNetwork: + webPort: 31008 + +invidiousStorage: + config: + type: ixVolume + ixVolumeConfig: + datasetName: config + pgData: + type: ixVolume + ixVolumeConfig: + datasetName: pgData + pgBackup: + type: ixVolume + ixVolumeConfig: + datasetName: pgBackup + additionalStorages: [] + +notes: + custom: | + ## Database + You can connect to the database using the pgAdmin App from the catalog + +
+ Database Details + + - Database: `invidious` + - Username: `kemal` + - Password: `{{ .Values.invidiousDbPass }}` + - Host: `{{ .Values.invidiousDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + +
+ {{- $_ := unset .Values "invidiousDbPass" }} + {{- $_ := unset .Values "invidiousDbHost" }} + + Additional configuration can be specified + + - Via [environment variables](https://github.com/iv-org/invidious/pull/1702) + - By editing the file `/config/config.yaml` (see [example](https://github.com/iv-org/invidious/blob/master/config/config.example.yml)) diff --git a/community/invidious/1.0.0/metadata.yaml b/community/invidious/1.0.0/metadata.yaml new file mode 100644 index 0000000000..fa204fea32 --- /dev/null +++ b/community/invidious/1.0.0/metadata.yaml @@ -0,0 +1,13 @@ +runAsContext: + - userName: invidious + groupName: invidious + gid: 1000 + uid: 1000 + description: Invidious runs as non-root user + - userName: postgres + groupName: postgres + gid: 999 + uid: 999 + description: Postgres runs as a non-root user. +capabilities: [] +hostMounts: [] diff --git a/community/invidious/1.0.0/questions.yaml b/community/invidious/1.0.0/questions.yaml new file mode 100644 index 0000000000..18c3de9bf6 --- /dev/null +++ b/community/invidious/1.0.0/questions.yaml @@ -0,0 +1,540 @@ +groups: + - name: Invidious Configuration + description: Configure Invidious + - name: Network Configuration + description: Configure Network for Invidious + - name: Storage Configuration + description: Configure Storage for Invidious + - name: Resources Configuration + description: Configure Resources for Invidious + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + + - variable: invidiousConfig + label: "" + group: Invidious Configuration + schema: + type: dict + attrs: + - variable: admins + label: Admins + description: List of usernames that will be granted administrator rights. + schema: + type: list + default: [] + items: + - variable: admin + label: Admin + schema: + type: string + required: true + - variable: registrationEnabled + label: Registration Enabled + description: Enable registration for Invidious. + schema: + type: boolean + default: true + - variable: loginEnabled + label: Login Enabled + description: Enable login for Invidious. + schema: + type: boolean + default: true + - variable: captchaEnabled + label: Captcha Enabled + description: Enable captcha for Invidious. + schema: + type: boolean + default: true + + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Invidious. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: invidiousNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Invidious WebUI. + schema: + type: int + default: 31008 + min: 9000 + max: 65535 + required: true + + - variable: invidiousStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Invidious Config Storage + description: The path to store Invidious Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "config" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + - variable: pgData + label: Invidious Postgres Data Storage + description: The path to store Invidious Postgres Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + # Nothing to show for the user + hidden: true + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "pgData" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: pgBackup + label: Invidious Postgres Backup Storage + description: The path to store Invidious Postgres Backup. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + immutable: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + # Nothing to show for the user + hidden: true + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + hidden: true + default: "pgBackup" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + # Postgres does a CHMOD at startup + # Which fails with ACL + hidden: true + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Invidious. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system.
+ SMB Share: Is a SMB share that is mounted to a persistent volume claim. + schema: + type: string + required: true + default: "ixVolume" + immutable: true + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - value: "smb-pv-pvc" + description: SMB Share (Mounts a persistent volume claim to a SMB share) + - variable: readOnly + label: Read Only + description: Mount the volume as read only. + schema: + type: boolean + default: false + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPathConfig + label: Host Path Configuration + schema: + type: dict + show_if: [["type", "=", "hostPath"]] + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: acl + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + $ref: + - "normalize/acl" + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["aclEnable", "=", false]] + required: true + - variable: ixVolumeConfig + label: ixVolume Configuration + description: The configuration for the ixVolume dataset. + schema: + type: dict + show_if: [["type", "=", "ixVolume"]] + $ref: + - "normalize/ixVolume" + attrs: + - variable: aclEnable + label: Enable ACL + description: Enable ACL for the dataset. + schema: + type: boolean + default: false + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + required: true + immutable: true + default: "storage_entry" + - variable: aclEntries + label: ACL Configuration + schema: + type: dict + show_if: [["aclEnable", "=", true]] + attrs: [] + - variable: smbConfig + label: SMB Share Configuration + description: The configuration for the SMB Share. + schema: + type: dict + show_if: [["type", "=", "smb-pv-pvc"]] + attrs: + - variable: server + label: Server + description: The server for the SMB share. + schema: + type: string + required: true + - variable: share + label: Share + description: The share name for the SMB share. + schema: + type: string + required: true + - variable: domain + label: Domain (Optional) + description: The domain for the SMB share. + schema: + type: string + - variable: username + label: Username + description: The username for the SMB share. + schema: + type: string + required: true + - variable: password + label: Password + description: The password for the SMB share. + schema: + type: string + required: true + private: true + - variable: size + label: Size (in Gi) + description: The size of the volume quota. + schema: + type: int + required: true + min: 1 + default: 1 + + - variable: resources + label: "" + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Invidious. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Invidious. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/community/invidious/1.0.0/templates/NOTES.txt b/community/invidious/1.0.0/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/community/invidious/1.0.0/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/community/invidious/1.0.0/templates/_configuration.tpl b/community/invidious/1.0.0/templates/_configuration.tpl new file mode 100644 index 0000000000..761daeac6e --- /dev/null +++ b/community/invidious/1.0.0/templates/_configuration.tpl @@ -0,0 +1,62 @@ +{{- define "invidious.configuration" -}} + + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "kemal" -}} {{/* User is hardcoded */}} + {{- $dbName := "invidious" -}} + + {{- $dbPass := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- end -}} + + {{- $hmacKey := (randAlphaNum 64) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-invidious-creds" $fullname)) -}} + {{- $hmacKey = ((index .data "INVIDIOUS_HMAC_KEY") | b64dec) -}} + {{- end -}} + + {{/* Temporary set dynamic db details on values, + so we can print them on the notes */}} + {{- $_ := set .Values "invidiousDbPass" $dbPass -}} + {{- $_ := set .Values "invidiousDbHost" $dbHost -}} + + {{- $dbURL := (printf "postgres://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) }} +secret: + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} + # Used by invidious init script + PGPASSWORD: {{ $dbPass }} + PGHOST: {{ $dbHost }} + PGPORT: "5432" + + + invidious-creds: + enabled: true + data: + # Source config + INVIDIOUS_CONFIG_FILE: /config/config.yaml + # See https://github.com/iv-org/invidious/pull/1702 + # Override config + INVIDIOUS_HMAC_KEY: {{ $hmacKey }} + INVIDIOUS_CHECK_TABLES: "true" + INVIDIOUS_DATABASE_URL: {{ $dbURL }} + INVIDIOUS_DB_USER: {{ $dbUser }} + INVIDIOUS_DB_PASSWORD: {{ $dbPass }} + INVIDIOUS_DB_DBNAME: {{ $dbName }} + INVIDIOUS_DB_HOST: {{ $dbHost }} + INVIDIOUS_DB_PORT: "5432" + INVIDIOUS_HOST_BINDING: "0.0.0.0" + INVIDIOUS_PORT: {{ .Values.invidiousNetwork.webPort | quote }} + # Add some easy to use values in UI + INVIDIOUS_ADMINS: {{ .Values.invidiousConfig.admins | toJson | quote }} + INVIDIOUS_REGISTRATION_ENABLED: {{ .Values.invidiousConfig.registrationEnabled | quote }} + INVIDIOUS_LOGIN_ENABLED: {{ .Values.invidiousConfig.loginEnabled | quote }} + INVIDIOUS_CAPTCHA_ENABLED: {{ .Values.invidiousConfig.captchaEnabled | quote }} +{{- end -}} diff --git a/community/invidious/1.0.0/templates/_invidious.tpl b/community/invidious/1.0.0/templates/_invidious.tpl new file mode 100644 index 0000000000..dbe1bc9aba --- /dev/null +++ b/community/invidious/1.0.0/templates/_invidious.tpl @@ -0,0 +1,117 @@ +{{- define "invidious.workload" -}} +workload: + invidious: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: false + containers: + invidious: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + envFrom: + - secretRef: + name: invidious-creds + {{ with .Values.invidiousConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + path: /api/v1/comments/jNQXAC9IVRw + port: {{ .Values.invidiousNetwork.webPort }} + readiness: + enabled: true + type: http + path: /api/v1/comments/jNQXAC9IVRw + port: {{ .Values.invidiousNetwork.webPort }} + startup: + enabled: true + type: http + path: /api/v1/comments/jNQXAC9IVRw + port: {{ .Values.invidiousNetwork.webPort }} + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 1000 + "GID" 1000 + "mode" "check" + "type" "install") | nindent 8 }} + {{- include "ix.v1.common.app.postgresWait" (dict "name" "01-postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} + 02-fetch-seed: + enabled: {{ .Release.IsInstall }} + type: init + imageSelector: gitImage + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + command: + - /bin/sh + - -c + args: + - | + echo "Fetching DB Seed..." + mkdir -p /shared/invidious + cd /shared/invidious + + git init && \ + git remote add invidious https://github.com/iv-org/invidious.git && \ + git fetch invidious && \ + # Fetch config and docker dirs + git checkout invidious/master -- docker config + + # Move config into docker dir + echo "Preparing directory structure..." + mv -fv config docker + echo "Done." + 03-init-db: + enabled: {{ .Release.IsInstall }} + type: init + imageSelector: postgresImage + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + envFrom: + - secretRef: + name: postgres-creds + command: + - /bin/sh + - -c + args: + - | + echo "Initializing Invidious DB..." + cd /shared/invidious/docker + ./init-invidious-db.sh + echo "Done." + 04-init-config: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + envFrom: + - secretRef: + name: postgres-creds + command: + - /bin/sh + - -c + args: + - | + if [ ! -f /config/config.yaml ]; then + echo "Initializing Invidious Config..." + cp -v /invidious/config/config.yml /config/config.yaml + exit 0 + fi + echo "Config already exists, skipping." +{{- end -}} diff --git a/community/invidious/1.0.0/templates/_persistence.tpl b/community/invidious/1.0.0/templates/_persistence.tpl new file mode 100644 index 0000000000..2faf16f80f --- /dev/null +++ b/community/invidious/1.0.0/templates/_persistence.tpl @@ -0,0 +1,52 @@ +{{- define "invidious.persistence" -}} +persistence: + config: + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" .Values.invidiousStorage.config) | nindent 4 }} + targetSelector: + invidious: + invidious: + mountPath: /config + 04-init-config: + mountPath: /config + {{- if and (eq .Values.invidiousStorage.config.type "ixVolume") + (not (.Values.invidiousStorage.config.ixVolumeConfig | default dict).aclEnable) }} + 01-permissions: + mountPath: /mnt/directories/config + {{- end }} + shared: + enabled: true + type: emptyDir + targetSelector: + invidious: + 02-fetch-seed: + mountPath: /shared + 03-init-db: + mountPath: /shared + tmp: + enabled: true + type: emptyDir + targetSelector: + invidious: + invidious: + mountPath: /tmp + + {{- range $idx, $storage := .Values.invidiousStorage.additionalStorages }} + {{ printf "invidious-%v:" (int $idx) }} + enabled: true + {{- include "ix.v1.common.app.storageOptions" (dict "storage" $storage) | nindent 4 }} + targetSelector: + invidious: + invidious: + mountPath: {{ $storage.mountPath }} + {{- if and (eq $storage.type "ixVolume") (not ($storage.ixVolumeConfig | default dict).aclEnable) }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} + {{- end }} + + {{- include "ix.v1.common.app.postgresPersistence" + (dict "pgData" .Values.invidiousStorage.pgData + "pgBackup" .Values.invidiousStorage.pgBackup + ) | nindent 2 }} +{{- end -}} diff --git a/community/invidious/1.0.0/templates/_portal.tpl b/community/invidious/1.0.0/templates/_portal.tpl new file mode 100644 index 0000000000..34ecd67b78 --- /dev/null +++ b/community/invidious/1.0.0/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "invidious.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + port: {{ .Values.invidiousNetwork.webPort | quote }} + path: "/" + protocol: http + host: $node_ip +{{- end -}} diff --git a/community/invidious/1.0.0/templates/_postgres.tpl b/community/invidious/1.0.0/templates/_postgres.tpl new file mode 100644 index 0000000000..0c050b6ca0 --- /dev/null +++ b/community/invidious/1.0.0/templates/_postgres.tpl @@ -0,0 +1,6 @@ +{{- define "postgres.workload" -}} +workload: +{{- include "ix.v1.common.app.postgres" (dict "secretName" "postgres-creds" + "resources" .Values.resources + "ixChartContext" .Values.ixChartContext) | nindent 2 }} +{{- end -}} diff --git a/community/invidious/1.0.0/templates/_service.tpl b/community/invidious/1.0.0/templates/_service.tpl new file mode 100644 index 0000000000..20d68e87ed --- /dev/null +++ b/community/invidious/1.0.0/templates/_service.tpl @@ -0,0 +1,17 @@ +{{- define "invidious.service" -}} +service: + invidious: + enabled: true + primary: true + type: NodePort + targetSelector: invidious + ports: + webui: + enabled: true + primary: true + port: {{ .Values.invidiousNetwork.webPort }} + nodePort: {{ .Values.invidiousNetwork.webPort }} + targetSelector: invidious + {{- include "ix.v1.common.app.postgresService" $ | nindent 2 }} + +{{- end -}} diff --git a/community/invidious/1.0.0/templates/common.yaml b/community/invidious/1.0.0/templates/common.yaml new file mode 100644 index 0000000000..730f7da691 --- /dev/null +++ b/community/invidious/1.0.0/templates/common.yaml @@ -0,0 +1,13 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "invidious.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "invidious.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "invidious.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "invidious.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "invidious.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/community/invidious/1.0.0/upgrade_strategy_disabled b/community/invidious/1.0.0/upgrade_strategy_disabled new file mode 100755 index 0000000000..696b64e6e3 --- /dev/null +++ b/community/invidious/1.0.0/upgrade_strategy_disabled @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip("-apache"): t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/community/invidious/item.yaml b/community/invidious/item.yaml new file mode 100644 index 0000000000..4679248cec --- /dev/null +++ b/community/invidious/item.yaml @@ -0,0 +1,12 @@ +icon_url: https://media.sys.truenas.net/apps/invidious/icons/icon.svg +categories: + - media +screenshots: + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot1.png + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot2.png + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot3.png + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot4.png + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot5.png + - https://media.sys.truenas.net/apps/invidious/screenshots/screenshot6.png +tags: + - youtube