From be992b82f2ef0d4d3cd019403099ca2ce29c0c80 Mon Sep 17 00:00:00 2001 From: sagit <36596628+Sagit-chu@users.noreply.github.com> Date: Wed, 16 Mar 2022 01:37:11 +0800 Subject: [PATCH] feat(iyuuplus): Add iyuuplus (#2172) * add-iyuuplus * fix permission * Update charts/incubator/iyuuplus/Chart.yaml * Update charts/incubator/iyuuplus/values.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * Update charts/incubator/iyuuplus/questions.yaml Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> * update * update * add icon Co-authored-by: Stavros Kois <47820033+stavros-k@users.noreply.github.com> --- charts/incubator/iyuuplus/.helmignore | 26 ++ charts/incubator/iyuuplus/Chart.yaml | 29 ++ charts/incubator/iyuuplus/questions.yaml | 393 ++++++++++++++++++ .../incubator/iyuuplus/templates/common.yaml | 1 + charts/incubator/iyuuplus/values.yaml | 30 ++ docs/_static/img/appicons/iyuuplus.png | Bin 0 -> 13833 bytes docs/manual/default-ports.md | 1 + 7 files changed, 480 insertions(+) create mode 100644 charts/incubator/iyuuplus/.helmignore create mode 100644 charts/incubator/iyuuplus/Chart.yaml create mode 100644 charts/incubator/iyuuplus/questions.yaml create mode 100644 charts/incubator/iyuuplus/templates/common.yaml create mode 100644 charts/incubator/iyuuplus/values.yaml create mode 100644 docs/_static/img/appicons/iyuuplus.png diff --git a/charts/incubator/iyuuplus/.helmignore b/charts/incubator/iyuuplus/.helmignore new file mode 100644 index 00000000000..4379e2b3014 --- /dev/null +++ b/charts/incubator/iyuuplus/.helmignore @@ -0,0 +1,26 @@ +# 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 +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS +# helm-docs templates +*.gotmpl diff --git a/charts/incubator/iyuuplus/Chart.yaml b/charts/incubator/iyuuplus/Chart.yaml new file mode 100644 index 00000000000..de897b23ba1 --- /dev/null +++ b/charts/incubator/iyuuplus/Chart.yaml @@ -0,0 +1,29 @@ +apiVersion: v2 +kubeVersion: ">=1.16.0-0" +name: iyuuplus +version: 0.0.1 +appVersion: "2.1.0" +description: The IYUU automatic seeding tool can automatically seed most PT sites in China, support downloader clusters, multiple disks, multiple download directories, connecting to remote downloaders, etc. +type: application +deprecated: false +home: https://github.com/truecharts/apps/tree/master/charts/stable/iyuuplus +icon: https://truecharts.org/_static/img/appicons/iyuuplus.png +keywords: + - iyuuplus + - pt +sources: + - https://hub.docker.com/r/iyuucn/iyuuplus +dependencies: +- name: common + repository: https://truecharts.org + version: 9.1.2 + # condition: +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/iyuuplus/questions.yaml b/charts/incubator/iyuuplus/questions.yaml new file mode 100644 index 00000000000..25fd209c2fd --- /dev/null +++ b/charts/incubator/iyuuplus/questions.yaml @@ -0,0 +1,393 @@ +# Include{groups} +portals: + open: + 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} + +# 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: 10188 + 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: 8787 + + - 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 Config." + 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} + - variable: torrents + label: "App Torrent Storage" + description: "transmission torrent directory" + 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} + - variable: btbackup + label: "App BT Backup Storage" + description: "qBittorrent torrent directory" + 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} + +# Include{security} + + - 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: false +# 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/iyuuplus/templates/common.yaml b/charts/incubator/iyuuplus/templates/common.yaml new file mode 100644 index 00000000000..a6613c2ce21 --- /dev/null +++ b/charts/incubator/iyuuplus/templates/common.yaml @@ -0,0 +1 @@ +{{ include "common.all" . }} diff --git a/charts/incubator/iyuuplus/values.yaml b/charts/incubator/iyuuplus/values.yaml new file mode 100644 index 00000000000..6034f526784 --- /dev/null +++ b/charts/incubator/iyuuplus/values.yaml @@ -0,0 +1,30 @@ +image: + repository: iyuucn/iyuuplus + pullPolicy: IfNotPresent + tag: latest@sha256:657efe26a464638a2e39ba618e8912830c6280fa1fe9af55adb942175cf0835e + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +service: + main: + ports: + main: + targetPort: 8787 + port: 10188 + +persistence: + config: + enabled: true + mountPath: "/IYUU/db" + torrents: + enabled: true + mountPath: "/torrents" + btbackup: + enabled: true + mountPath: "/BT_backup" diff --git a/docs/_static/img/appicons/iyuuplus.png b/docs/_static/img/appicons/iyuuplus.png new file mode 100644 index 0000000000000000000000000000000000000000..d662819b8efd25d6d68cbea332bfadc81c86e19b GIT binary patch literal 13833 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 d%UBqAk`k+Qo{{w