From 2e8b975d4d685c91aade7a63b3ecd4f70637e979 Mon Sep 17 00:00:00 2001 From: brothergomez <38558969+brothergomez@users.noreply.github.com> Date: Fri, 25 Feb 2022 11:37:08 +0000 Subject: [PATCH] feat(deemix): Add deemix (#1933) * First commit * add values.yaml * Remove autogen files. Update for service. Add icon. * Update app-requests.md fix bad change * Fix source * Fix questions.yaml ordering. * Further questions fix * Address comments * Update charts/incubator/deemix/values.yaml Co-authored-by: Matt Haddock Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> --- charts/incubator/deemix/Chart.yaml | 30 ++ charts/incubator/deemix/questions.yaml | 320 ++++++++++++++++++ charts/incubator/deemix/templates/common.yaml | 1 + charts/incubator/deemix/values.yaml | 32 ++ docs/_static/img/appicons/deemix-icon.png | Bin 0 -> 14015 bytes docs/apps/app-requests.md | 2 +- docs/manual/default-ports.md | 1 + 7 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 charts/incubator/deemix/Chart.yaml create mode 100644 charts/incubator/deemix/questions.yaml create mode 100644 charts/incubator/deemix/templates/common.yaml create mode 100644 charts/incubator/deemix/values.yaml create mode 100644 docs/_static/img/appicons/deemix-icon.png diff --git a/charts/incubator/deemix/Chart.yaml b/charts/incubator/deemix/Chart.yaml new file mode 100644 index 00000000000..f5ec1b45ca5 --- /dev/null +++ b/charts/incubator/deemix/Chart.yaml @@ -0,0 +1,30 @@ +apiVersion: v2 +appVersion: "latest" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.16.0 +deprecated: false +description: deemix is a deezer downloader built from the ashes of Deezloader Remix. +home: https://github.com/truecharts/apps/tree/master/charts/incubator/deemix +icon: https://truecharts.org/_static/img/appicons/deemix-icon.png +keywords: +- music +- deemix +- deezer +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: deemix +sources: +- https://gitlab.com/Bockiii/deemix-docker.git +- https://git.freezerapp.xyz/RemixDev/deemix-py +type: application +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/deemix/questions.yaml b/charts/incubator/deemix/questions.yaml new file mode 100644 index 00000000000..740db57da7c --- /dev/null +++ b/charts/incubator/deemix/questions.yaml @@ -0,0 +1,320 @@ +# Include{groups} +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: true +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + # Include{fixedEnv} + - variable: PUID + label: "PUID" + description: "User ID of the user you want the container to run as in order to fix folder permission issues" + schema: + type: int + default: 1000 + +# Include{containerConfig} + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 6595 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 6595 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: config + label: "App Config Storage" + description: "Stores the Application Configuration." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + additional_attrs: true + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: true +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/deemix/templates/common.yaml b/charts/incubator/deemix/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/deemix/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/deemix/values.yaml b/charts/incubator/deemix/values.yaml new file mode 100644 index 00000000000..175ea267a07 --- /dev/null +++ b/charts/incubator/deemix/values.yaml @@ -0,0 +1,32 @@ +image: + repository: tccr.io/truecharts/deemix + pullPolicy: IfNotPresent + tag: latest@sha256:cc770caa2f11b2e1b89129e17ebbbbb2533bd3e7c93303e52a072e1b3e471f70 + +env: + UMASK_SET: "{{ .Values.env.UMASK }}" + INTPORT: "{{ .Values.service.main.ports.main.targetPort }}" + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +service: + main: + enabled: true + ports: + main: + port: 6595 + targetPort: 6595 + +persistence: + config: + enabled: true + mountPath: "/config" + data: + enabled: true + mountPath: "/downloads" diff --git a/docs/_static/img/appicons/deemix-icon.png b/docs/_static/img/appicons/deemix-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e944ad2a82a197db46a994797911796090d0a60e GIT binary patch literal 14015 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 nhSdZuf(rHj@(Rt`|AZ|5D%M*5gVPT