From 198ee74f556cc7270650e9491a465495160435e4 Mon Sep 17 00:00:00 2001 From: flymin <905370712@qq.com> Date: Tue, 17 Sep 2024 12:35:59 +0800 Subject: [PATCH 1/8] alist to 3.37.3 --- catalog.json | 8 +- stable/alist/10.2.3/.helmignore | 32 + stable/alist/10.2.3/CHANGELOG.md | 3 + stable/alist/10.2.3/Chart.yaml | 38 + stable/alist/10.2.3/README.md | 61 + stable/alist/10.2.3/app-readme.md | 8 + stable/alist/10.2.3/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes stable/alist/10.2.3/icon-small.webp | Bin 0 -> 658 bytes stable/alist/10.2.3/icon.webp | Bin 0 -> 3118 bytes stable/alist/10.2.3/ix_values.yaml | 48 + stable/alist/10.2.3/questions.yaml | 3207 ++++++++++ stable/alist/10.2.3/templates/NOTES.txt | 1 + stable/alist/10.2.3/templates/common.yaml | 1 + stable/alist/10.2.3/values.yaml | 0 stable/alist/app_versions.json | 5363 +++++++++++++++++ 15 files changed, 8766 insertions(+), 4 deletions(-) create mode 100644 stable/alist/10.2.3/.helmignore create mode 100644 stable/alist/10.2.3/CHANGELOG.md create mode 100644 stable/alist/10.2.3/Chart.yaml create mode 100644 stable/alist/10.2.3/README.md create mode 100644 stable/alist/10.2.3/app-readme.md create mode 100644 stable/alist/10.2.3/charts/common-23.0.10.tgz create mode 100644 stable/alist/10.2.3/icon-small.webp create mode 100644 stable/alist/10.2.3/icon.webp create mode 100644 stable/alist/10.2.3/ix_values.yaml create mode 100644 stable/alist/10.2.3/questions.yaml create mode 100644 stable/alist/10.2.3/templates/NOTES.txt create mode 100644 stable/alist/10.2.3/templates/common.yaml create mode 100644 stable/alist/10.2.3/values.yaml diff --git a/catalog.json b/catalog.json index e8a19c8e0e..3749f8200f 100644 --- a/catalog.json +++ b/catalog.json @@ -1396,10 +1396,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/alist", "location": "/home/runner/_work/catalog/catalog/stable/alist", - "latest_version": "10.2.2", - "latest_app_version": "3.35.0", - "latest_human_version": "3.35.0_10.2.2", - "last_update": "2024-05-29 12:35:14", + "latest_version": "10.2.3", + "latest_app_version": "3.37.3", + "latest_human_version": "3.37.3_10.2.3", + "last_update": "2024-09-17 12:35:14", "name": "alist", "recommended": false, "title": "Alist", diff --git a/stable/alist/10.2.3/.helmignore b/stable/alist/10.2.3/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/alist/10.2.3/.helmignore @@ -0,0 +1,32 @@ +# 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 +# docs folder +/docs +# icon +icon.png +icon.webp +icon-small.webp diff --git a/stable/alist/10.2.3/CHANGELOG.md b/stable/alist/10.2.3/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/alist/10.2.3/CHANGELOG.md @@ -0,0 +1,3 @@ +*for the complete changelog, please refer to the website* + +**Important:** \ No newline at end of file diff --git a/stable/alist/10.2.3/Chart.yaml b/stable/alist/10.2.3/Chart.yaml new file mode 100644 index 0000000000..edb0a04fa4 --- /dev/null +++ b/stable/alist/10.2.3/Chart.yaml @@ -0,0 +1,38 @@ +annotations: + truecharts.org/category: cloud + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 3.37.3 +dependencies: + - name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: Alist program that supports multiple storage, powered by Gin and React +home: https://truecharts.org/charts/stable/alist +icon: https://truecharts.org/img/hotlink-ok/chart-icons/alist.webp +keywords: + - alist + - storage + - webdav + - google driver + - aliyun driver + - baiduyun +kubeVersion: '>=1.24.0-0' +maintainers: + - name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: alist +sources: + - https://github.com/Xhofe/alist + - https://github.com/truecharts/charts/tree/master/charts/stable/alist + - https://hub.docker.com/r/xhofe/alist-aria2 +type: application +version: 10.2.3 diff --git a/stable/alist/10.2.3/README.md b/stable/alist/10.2.3/README.md new file mode 100644 index 0000000000..977e425800 --- /dev/null +++ b/stable/alist/10.2.3/README.md @@ -0,0 +1,61 @@ +--- +title: README +--- + +## General Info + +TrueCharts can be installed as both _normal_ Helm Charts or as TrueNAS SCALE Apps. +Both solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible + +For more information about this Chart, please check the docs on the TrueCharts [website](https://truecharts.org/charts/stable/alist) + +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/charts/issues/new/choose)** + +## Installation + +### Helm-Chart installation + +To install TrueCharts Helm charts using Helm, you can use our OCI Repository. + +`helm install mychart oci://tccr.io/truecharts/CHARTNAME` + +For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/ + + +### TrueNAS SCALE Apps + +For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the [quick-start guides for TrueNAS SCALE](https://truecharts.org/scale). + +## Chart Specific Guides and information + +All our charts have dedicated documentation pages. +The documentation for this chart can be found here: +https://truecharts.org/charts/stable/alist + +## Configuration Options + +Please note: For TrueNAS SCALE, only options available in the GUI are supported. +Hence most of these docs do not apply to TrueNAS SCALE + +To view the chart specific options, please view Values.yaml included in the chart. +The most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/alist/values.yaml + +All our Charts use a shared "common" library chart that contains most of the templating and options. +For the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/ + +For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml + +## Support + +- See the [Website](https://truecharts.org) +- Check our [Discord](https://discord.gg/tVsPTHWTtr) +- Open a [issue](https://github.com/truecharts/charts/issues/new/choose) + +--- + +## Sponsor TrueCharts + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/general/sponsor) or contributing back to the project any way you can! + +_All Rights Reserved - The TrueCharts Project_ diff --git a/stable/alist/10.2.3/app-readme.md b/stable/alist/10.2.3/app-readme.md new file mode 100644 index 0000000000..13a6976337 --- /dev/null +++ b/stable/alist/10.2.3/app-readme.md @@ -0,0 +1,8 @@ +Alist program that supports multiple storage, powered by Gin and React + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/alist](https://truecharts.org/charts/stable/alist) + +--- + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/sponsor) or contributing back to the project any way you can! diff --git a/stable/alist/10.2.3/charts/common-23.0.10.tgz b/stable/alist/10.2.3/charts/common-23.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5eefcb329be559e54998b5f211021daca81c39ef GIT binary patch literal 96939 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 literal 0 HcmV?d00001 diff --git a/stable/alist/10.2.3/icon-small.webp b/stable/alist/10.2.3/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..79e9281992d36cfc6de63f982ab27bd25473a672 GIT binary patch literal 658 zcmV;D0&V?LNk&GB0ssJ4MM6+kP&il$0000G0000V0018V06|PpNNNE900E#w+t#tY zT3^1{wr$&XO4~L%+cqj!wr$(CZLQ+_ncUk)#02nvTc}U6=qd2oqrvD198h~iM{CtL zsiH3NlMt6g-4y*fLw}cvs{B86DjW4wFp75Rlf>lws$HX|iP{Pnqpwm#MS=%{(!rK2034 zxVQ9p4A`WXf#k1rTEvFx@6ymnZ4S^~e-wyFme0Bv;@;MMfso)i-5rrN`X&_&)1QS1 zv+^Hp5?*b!CuIGiGa%5sNdQ*qg9Ks4zNTk`uv(ubfl=BDGJVoa>#7Nf8>JHJB}3sVz0bV9bodEhY>tfm;XUlP&gp^00026 z1OS}@Dj)zL00ICsC9neQe+l#Gtn|P)hW~B|*U_^vdbTI9C6O-YkEjz`0092)$^ZX& zr%$4V{u}gmqXJX4t$9TMdAyI=lz;QwwS>M;`lpe07l#$Mf9Eo;ZI`32ndR2lPKxQ) z-LrdHf_V-kX=`c1v8Lw=P11#)%$@X@kDs;wl`w@BwU%349lli;Rs?cp(CftN(6zbi z0c1$6uqcOj3RL6h%dgwbJmHM3_tz@ubw$_Pzw_mU?j9a@if6e0L6?)jsO4v literal 0 HcmV?d00001 diff --git a/stable/alist/10.2.3/icon.webp b/stable/alist/10.2.3/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..ba0dc3abce40de533387ed20fabfb6cb4b7485ac GIT binary patch literal 3118 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 IG_(K!0Q{{3%m4rY literal 0 HcmV?d00001 diff --git a/stable/alist/10.2.3/ix_values.yaml b/stable/alist/10.2.3/ix_values.yaml new file mode 100644 index 0000000000..6c941e4e17 --- /dev/null +++ b/stable/alist/10.2.3/ix_values.yaml @@ -0,0 +1,48 @@ +image: + repository: xhofe/alist-aria2 + pullPolicy: IfNotPresent + tag: v3.37.3@sha256:57d115bc788b7f49b4ac5db8ad8431594e5950f1e96735fd19d93318065bd655 +securityContext: + container: + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + runAsGroup: 0 +service: + main: + ports: + main: + targetPort: 5244 + protocol: http + port: 10167 + aria2: + enabled: true + ports: + aria2: + enabled: true + targetPort: 6800 + protocol: http + port: 6800 +workload: + main: + podSpec: + containers: + main: + probes: + liveness: + type: http + path: / + readiness: + type: http + path: / + startup: + type: http + path: / + env: {} +persistence: + data: + enabled: true + mountPath: /opt/alist/data +portal: + open: + enabled: true diff --git a/stable/alist/10.2.3/questions.yaml b/stable/alist/10.2.3/questions.yaml new file mode 100644 index 0000000000..da41f3bba8 --- /dev/null +++ b/stable/alist/10.2.3/questions.yaml @@ -0,0 +1,3207 @@ +groups: + - name: Image + description: | + Configured the images to be used for the Chart. + It's wise to use "digest pinned" tags and to avoid using "latest". + + Checkout the following documentation for more information: + - https://truecharts.org/common/#images + + + - name: General + description: | + For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general. + + Checkout the following documentation for more information: + - https://truecharts.org/common/global/ + - https://truecharts.org/common/#tz + - https://truecharts.org/common/podoptions/ + - Image Pull Secrets + + + - name: Workload + description: | + These settings configure how the actual Pods and containers are running. + Generally, on SCALE, we only expose a limited subset of these settings for the primary workload and container. + + Checkout the following documentation for more information: + - https://truecharts.org/common/workload/ + - https://truecharts.org/common/container/ + + + - name: App Configuration + description: | + Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application. + Most options should have a Tooltip (Circled Question Mark) to further describe said option. + + To find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/ + + - name: Services + description: | + Service and Networking options for any applications are contained here. + Some applications may have complicated networking setups with multiple options or some may have no options here at all. + + Options here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes. + + Checkout the following documentation for more information: + - https://truecharts.org/common/service/ + + - name: Networking + description: | + Contains advanced networking options that are not actively supported by the TrueCharts team. + Currently only contains scaleExternalInterfaces. + + Checkout the following documentation for more information: + - https://truecharts.org/common/scaleexternalinterface/ + + - name: Persistence + description: | + Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types. + This storage is called Persistence since it is not deleted upon restart or upgrade of an application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/ + - https://truecharts.org/scale/guides/nfs-share/ + - https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath + + + - name: Ingress + description: | + Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names). + If you choose to enable this you must have a "Ingress Provider" aka "Reverse Proxy" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/) + It also requiresa DNS service to actually resolve the DNS name of the FQDN specified. + + Checkout the following documentation for more information: + - https://truecharts.org/common/ingress/ + + + - name: SecurityContext + description: | + The security settings for each application and/or permissions that each application may have for the files/directories created. + Each application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities. + + Unless necessary users are advised to keep this section mostly to defaults. + + Checkout the following documentation for more information: + - https://truecharts.org/common/securitycontext/ + + + - name: Resources + description: | + Resources limits that have been defined by each application are in this section. + Most will have a specific default that some users may want to change based on their specific hardware or needs. + + This also contains the options to mount GPUs or, more precisely, "request" GPU's to be mounted. + + Checkout the following documentation for more information: + - https://truecharts.org/common/resources/ + + - name: Devices + description: | + These are special "mountpoints" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts. + For clearity we've decided to seperate this from persistence on SCALE. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/device/ + - https://truecharts.org/scale/guides/pci-passthrough/ + + - name: Middlewares + description: Traefik Middlewares + + - name: StorageClass + description: | + StorageClasses define where to storage Storage. + + Checkout the following documentation for more information: + + - name: Metrics + description: | + Contains options to configure Prometheus metrics for the application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/metrics/ + + + - name: Addons + description: | + Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application’s defaults. + Things included here are VPN addons, Codeserver for editing files inside the application’s container, Netshoot for network troubelshooting, etc. + + Generally not required for use but may be necessary or usefull at times for specific applications. + + Checkout the following documentation for more information: + - https://truecharts.org/common/addons/ + - https://truecharts.org/scale/guides/vpn-setup/ + + + - name: Experimental + description: | + Experimental Configuration Options + Often these are not fully flushed-out, could randomly break or might not work at-all. + + - name: Postgresql + description: | + For Postgresql we use "CloudNative-PG" as a backend, which has to be installed first. + + Checkout the following documentation for more information: + - https://truecharts.org/common/cnpg/ + - https://truecharts.org/scale/guides/sql-export/ + - https://truecharts.org/scale/guides/recover-cnpg/ + + - name: Dependencies + description: | + contains dependency setting for which we, currently, do not have seperate catagories (yet) + + + - name: Documentation + description: | + We added this section to make everyone aware that OpenSource isn't always easy. + It doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects. + + Before installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/ + We would also advice going over our https://truecharts.org/scale/guides/scale-intro/ + and many of the other documentation pages... + +portals: + open: + protocols: + - "$kubernetes-resource_configmap_tcportal-open_protocol" + host: + - "$kubernetes-resource_configmap_tcportal-open_host" + ports: + - "$kubernetes-resource_configmap_tcportal-open_port" + +questions: + - variable: global + group: General + label: "Global Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: stopAll + label: Stop All + description: "Stops All Running pods and hibernates cnpg" + schema: + type: boolean + default: false + + - variable: credentialsList + group: General + label: "Credentials (Experimental)" + schema: + type: list + default: [] + items: + - variable: credentialsEntry + label: "Enter Credentials" + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name" + schema: + type: string + required: true + default: "" + - variable: type + label: Type + description: "Type of Credential" + schema: + type: string + default: "s3" + enum: + - value: s3 + description: s3 Storage + - variable: url + label: "url" + schema: + type: string + default: "" + required: true + - variable: path + label: "path" + description: "Path Prefix not needed for most cases" + schema: + type: string + default: "" + - variable: bucket + label: "bucket" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: accessKey + label: "accessKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: secretKey + label: "secretKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: encrKey + label: "encrKey" + description: "The Encryption key is needed for tools like volsync if not needed it will be ignored" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "MYSECRETPASSPHRASE" + required: true + + - variable: workload + group: "Workload" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: type + label: Type (Advanced) + schema: + type: string + default: Deployment + enum: + - value: Deployment + description: Deployment + - value: DaemonSet + description: DaemonSet + + - variable: replicas + label: Replicas (Advanced) + description: Set the number of Replicas + schema: + type: int + show_if: [["type", "!=", "DaemonSet"]] + default: 1 + + - variable: podSpec + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: containers + label: Containers + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Container + schema: + additional_attrs: true + type: dict + attrs: + + - variable: envList + label: Extra Environment Variables + description: "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting..." + schema: + type: list + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + - variable: value + label: Value + schema: + type: string + - variable: extraArgs + label: Extra Args + schema: + type: list + default: [] + items: + - variable: arg + label: Arg + schema: + type: string + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: command + label: Command + schema: + type: list + default: [] + items: + - variable: param + label: Param + schema: + type: string + + - variable: TZ + label: Timezone + group: "General" + schema: + type: string + default: "Etc/UTC" + $ref: + - "definitions/timezone" + + - variable: podOptions + group: "General" + label: "Global Pod Options (Advanced)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: expertPodOpts + label: "Expert - Pod Options" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + label: "Host Networking" + schema: + type: boolean + default: false + - variable: dnsConfig + label: "DNS Configuration" + schema: + type: dict + additional_attrs: true + attrs: + - variable: options + label: "Options" + schema: + type: list + default: [{"name": "ndots", "value": "1"}] + items: + - variable: optionsEntry + label: "Option Entry" + schema: + type: dict + additional_attrs: true + attrs: + - variable: name + label: "Name" + schema: + type: string + required: true + - variable: value + label: "Value" + schema: + type: string + - variable: nameservers + label: "Nameservers" + schema: + type: list + default: [] + items: + - variable: nsEntry + label: "Nameserver Entry" + schema: + type: string + required: true + - variable: searches + label: "Searches" + schema: + type: list + default: [] + items: + - variable: searchEntry + label: "Search Entry" + schema: + type: string + required: true + + - variable: imagePullSecretList + group: "General" + label: "Image Pull Secrets" + schema: + type: list + default: [] + items: + - variable: pullsecretentry + label: "Pull Secret" + schema: + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: true + - variable: data + label: Data + schema: + type: dict + additional_attrs: true + attrs: + - variable: registry + label: "Registry" + schema: + type: string + required: true + default: "https://index.docker.io/v1/" + - variable: username + label: "Username" + schema: + type: string + required: true + default: "" + - variable: password + label: "Password" + schema: + type: string + required: true + private: true + default: "" + - variable: email + label: "Email" + schema: + type: string + required: true + default: "" + + - variable: service + group: 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: + + - variable: enabled + label: Enable the Service + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "Service's Port(s) Configuration" + schema: + additional_attrs: true + type: dict + attrs: + + - 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: 10167 + required: true + - variable: aria2 + label: Aria 2 RPC Service Port + description: Adds another port for Aria 2 RPC connections + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Service + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "Service's Port(s) Configuration" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: aria2 + label: Aria 2 RPC Service Port + 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: 6800 + required: true + - variable: scaleExternalInterface + description: 'Add External Interfaces (Experimental, might change or be removed without further notice)' + label: Add external Interfaces (Experimental) + group: Networking + schema: + type: list + items: + - variable: interfaceConfiguration + description: Interface Configuration + label: Interface Configuration + schema: + additional_attrs: true + type: dict + $ref: + - "normalize/interfaceConfiguration" + attrs: + - variable: hostInterface + description: Please Specify Host Interface + label: Host Interface + schema: + type: string + required: true + $ref: + - "definitions/interface" + - variable: ipam + description: Define how IP Address will be managed + label: IP Address Management + schema: + additional_attrs: true + type: dict + required: true + attrs: + - variable: type + description: Specify type for IPAM + label: IPAM Type + schema: + type: string + required: true + enum: + - value: dhcp + description: Use DHCP + - value: static + description: Use Static IP + - variable: staticIPConfigurations + label: Static IP Addresses + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticIP + label: Static IP + schema: + type: ipaddr + cidr: true + - variable: staticRoutes + label: Static Routes + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticRouteConfiguration + label: Static Route Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: destination + label: Destination + schema: + type: ipaddr + cidr: true + required: true + - variable: gateway + label: Gateway + schema: + type: ipaddr + cidr: false + required: true + + + - variable: serviceList + label: Add Manual Custom Services + group: Services + schema: + type: list + default: [] + items: + - variable: serviceListEntry + label: Custom Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the service + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + - value: Simple + description: Deprecated CHANGE THIS + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: advancedsvcset + label: Show Advanced Service Settings + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: externalIPs + label: "External IP's" + description: "External IP's" + schema: + type: list + default: [] + items: + - variable: externalIP + label: External IP + schema: + type: string + - variable: ipFamilyPolicy + label: IP Family Policy + description: Specify the IP Policy + schema: + type: string + default: SingleStack + enum: + - value: SingleStack + description: SingleStack + - value: PreferDualStack + description: PreferDualStack + - value: RequireDualStack + description: RequireDualStack + - variable: ipFamilies + label: IP Families + description: (Advanced) The IP Families that should be used + schema: + type: list + default: [] + items: + - variable: ipFamily + label: IP Family + schema: + type: string + - variable: portsList + label: Additional Service Ports + schema: + type: list + default: [] + items: + - variable: portsListEntry + label: Custom ports + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Port + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Port Name + schema: + type: string + default: "" + - variable: protocol + label: Port Type + schema: + type: string + default: tcp + enum: + - value: http + description: HTTP + - value: https + description: HTTPS + - value: tcp + description: TCP + - value: udp + description: UDP + - variable: targetPort + label: Target Port + description: This port exposes the container port on the service + schema: + type: int + required: true + - variable: port + label: Container Port + schema: + type: int + required: true + + - variable: persistence + label: Integrated Persistent Storage + description: Integrated Persistent Storage + group: Persistence + schema: + additional_attrs: true + type: dict + attrs: + + - variable: data + label: "App Data Storage" + description: "Stores the Application Data." + 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: pvc + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - value: iscsi + description: iSCSI Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + 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 + - variable: size + label: Size quotum of Storage (Do NOT REDUCE after installation) + description: This value can ONLY be INCREASED after the installation + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: disabled + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: persistenceList + label: Additional App Storage + group: Persistence + schema: + type: list + default: [] + items: + - variable: persistenceListEntry + label: Custom Storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the storage + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Type of Storage + description: Sets the persistence type, Anything other than PVC could break rollback! + schema: + type: string + default: hostPath + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + description: Path inside the container the storage is mounted + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: mountPath + label: Mount Path + description: Path inside the container the storage is mounted + schema: + type: string + default: "" + required: true + valid_chars: '^\/([a-zA-Z0-9._-]+(\s?[a-zA-Z0-9._-]+|\/?))+$' + - variable: medium + label: EmptyDir Medium + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: Default + - value: Memory + description: Memory + - variable: size + label: Size Quotum of Storage + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: "disabled" + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: ingress + label: "" + group: Ingress + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: "Main Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name (Optional) + description: Defaults to chart name + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description (Optional) + description: Defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: icon + label: Icon (Optional) + description: Defaults to chart icon + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + - variable: widget + label: Widget Settings + schema: + type: dict + additional_attrs: true + show_if: [["enabled", "=", true]] + attrs: + - variable: enabled + label: Enable Widget + description: When disabled all widget annotations are skipped. + schema: + type: boolean + default: true + - variable: custom + label: Options + schema: + type: dict + additional_attrs: true + attrs: + - variable: key + label: API-key (key) + schema: + type: string + default: "" + - variable: customkv + label: Custom Options + schema: + type: list + default: [] + items: + - variable: option + label: Option + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + default: "" + required: true + - variable: value + label: Value + schema: + type: string + default: "" + required: true + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + + - variable: ingressList + label: Add Manual Custom Ingresses + group: Ingress + schema: + type: list + default: [] + items: + - variable: ingressListEntry + label: Custom Ingress + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: ingressClassName + label: IngressClass Name + schema: + type: string + default: "" + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: overrideService + label: Linked Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Service Name + schema: + type: string + default: "" + - variable: port + label: Service Port + schema: + type: int + - variable: tls + label: TLS-Settings + schema: + type: list + default: [] + show_if: [["certificateIssuer", "=", ""]] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: Use Custom Secret (Advanced) + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: "Allow Cross Origin Requests" + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: namespace + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description + description: defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + + - variable: securityContext + group: SecurityContext + label: Security Context + schema: + additional_attrs: true + type: dict + attrs: + - variable: container + label: Container + schema: + additional_attrs: true + type: dict + attrs: + # Settings from questions.yaml get appended here on a per-app basis + + - 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 + # Settings from questions.yaml get appended here on a per-app basis + - variable: PUID + label: Process User ID - PUID + description: When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps + schema: + type: int + show_if: [["runAsUser", "=", 0]] + default: 568 + - variable: UMASK + label: UMASK + description: When supported by the container, this sets the UMASK for the App. Not supported by all Apps + schema: + type: string + default: "0022" + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: true + + - variable: pod + label: Pod + schema: + additional_attrs: true + type: dict + attrs: + - variable: fsGroupChangePolicy + label: "When should we take ownership?" + schema: + type: string + default: OnRootMismatch + enum: + - value: OnRootMismatch + description: OnRootMismatch + - value: Always + description: Always + - variable: supplementalGroups + label: Supplemental Groups + schema: + type: list + default: [] + items: + - variable: supplementalGroupsEntry + label: Supplemental Group + schema: + type: int + # Settings from questions.yaml get appended here on a per-app basis + + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 + - variable: resources + group: Resources + label: "Resource Limits" + schema: + additional_attrs: true + type: dict + attrs: + - variable: limits + label: Advanced Limit Resource Consumption + schema: + additional_attrs: true + type: dict + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 4000m + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: RAM + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 8Gi + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: 'gpu.intel.com/i915' + label: Add Intel i915 GPUs + schema: + type: int + default: 0 + - variable: 'nvidia.com/gpu' + label: Add NVIDIA GPUs (Experimental) + schema: + type: int + default: 0 + - variable: 'amd.com/gpu' + label: Add AMD GPUs + schema: + type: int + default: 0 + - variable: requests + label: "Minimum Resources Required (request)" + schema: + additional_attrs: true + type: dict + hidden: true + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 10m + hidden: true + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: "RAM" + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 50Mi + hidden: true + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: deviceList + label: Mount USB Devices + group: Devices + schema: + type: list + default: [] + items: + - variable: deviceListEntry + label: Device + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Storage + schema: + type: boolean + default: true + - variable: type + label: (Advanced) Type of Storage + description: Sets the persistence type + schema: + type: string + default: device + hidden: true + - variable: readOnly + label: readOnly + schema: + type: boolean + default: false + - variable: hostPath + label: Host Device Path + description: Path to the device on the host system + schema: + type: path + - variable: mountPath + label: Container Device Path + description: Path inside the container the device is mounted + schema: + type: string + default: "/dev/ttyACM0" + +# - variable: horizontalPodAutoscaler +# group: Experimental +# label: (Advanced) Horizontal Pod Autoscaler +# schema: +# type: list +# default: [] +# items: +# - variable: hpaEntry +# label: HPA Entry +# schema: +# additional_attrs: true +# type: dict +# attrs: +# - variable: name +# label: Name +# schema: +# type: string +# required: true +# default: "" +# - variable: enabled +# label: Enabled +# schema: +# type: boolean +# default: false +# show_subquestions_if: true +# subquestions: +# - variable: target +# label: Target +# description: Deployment name, Defaults to Main Deployment +# schema: +# type: string +# default: "" +# - variable: minReplicas +# label: Minimum Replicas +# schema: +# type: int +# default: 1 +# - variable: maxReplicas +# label: Maximum Replicas +# schema: +# type: int +# default: 5 +# - variable: targetCPUUtilizationPercentage +# label: Target CPU Utilization Percentage +# schema: +# type: int +# default: 80 +# - variable: targetMemoryUtilizationPercentage +# label: Target Memory Utilization Percentage +# schema: +# type: int +# default: 80 + - variable: networkPolicy + group: Experimental + label: (Advanced) Network Policy + schema: + type: list + default: [] + items: + - variable: netPolicyEntry + label: Network Policy Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + default: "" + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: policyType + label: Policy Type + schema: + type: string + default: "" + enum: + - value: "" + description: Default + - value: ingress + description: Ingress + - value: egress + description: Egress + - value: ingress-egress + description: Ingress and Egress + - variable: egress + label: Egress + schema: + type: list + default: [] + items: + - variable: egressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: to + label: To + schema: + type: list + default: [] + items: + - variable: toEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + - variable: ingress + label: Ingress + schema: + type: list + default: [] + items: + - variable: ingressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: from + label: From + schema: + type: list + default: [] + items: + - variable: fromEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + + - variable: addons + group: Addons + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: codeserver + label: Codeserver + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: service + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: NodePort + description: Deprecated CHANGE THIS + - value: ClusterIP + description: ClusterIP + - value: LoadBalancer + description: LoadBalancer + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: codeserver + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + default: 36107 + - variable: ingress + label: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + - variable: scaleCert + label: 'Use TrueNAS SCALE Certificate (Deprecated)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: int + $ref: + - "definitions/certificate" + - variable: envList + label: Codeserver Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: netshoot + label: Netshoot + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: envList + label: Netshoot Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: vpn + label: VPN + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + default: disabled + enum: + - value: disabled + description: disabled + - value: gluetun + description: Gluetun + - value: tailscale + description: Tailscale + - value: openvpn + description: OpenVPN (Deprecated) + - value: wireguard + description: Wireguard (Deprecated) + - variable: openvpn + label: OpenVPN Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "openvpn"]] + attrs: + - variable: username + label: Authentication Username (Optional) + description: Authentication Username, Optional + schema: + type: string + default: "" + - variable: password + label: Authentication Password + description: Authentication Credentials + schema: + type: string + show_if: [["username", "!=", ""]] + default: "" + required: true + - variable: tailscale + label: Tailscale Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "tailscale"]] + attrs: + - variable: authkey + label: Authentication Key + description: Provide an auth key to automatically authenticate the node as your user account. + schema: + type: string + private: true + default: "" + - variable: auth_once + label: Auth Once + description: Only attempt to log in if not already logged in. + schema: + type: boolean + default: true + - variable: accept_dns + label: Accept DNS + description: Accept DNS configuration from the admin console. + schema: + type: boolean + default: false + - variable: userspace + label: Userspace + description: Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device. + schema: + type: boolean + default: false + - variable: routes + label: Routes + description: Expose physical subnet routes to your entire Tailscale network. + schema: + type: string + default: "" + - variable: dest_ip + label: Destination IP + description: Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched. + schema: + type: string + default: "" + - variable: sock5_server + label: Sock5 Server + description: The address on which to listen for SOCKS5 proxying into the tailscale net. + schema: + type: string + default: "" + - variable: outbound_http_proxy_listen + label: Outbound HTTP Proxy Listen + description: The address on which to listen for HTTP proxying into the tailscale net. + schema: + type: string + default: "" + - variable: extra_args + label: Extra Args + description: Extra Args + schema: + type: string + default: "" + - variable: daemon_extra_args + label: Tailscale Daemon Extra Args + description: Tailscale Daemon Extra Args + schema: + type: string + default: "" + - variable: killSwitch + label: Enable Killswitch + schema: + type: boolean + show_if: [["type", "!=", "disabled"]] + default: true + - variable: excludedNetworks_IPv4 + label: Killswitch Excluded IPv4 networks + description: List of Killswitch Excluded IPv4 Addresses + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv4 + label: IPv4 Network + schema: + type: string + required: true + - variable: excludedNetworks_IPv6 + label: Killswitch Excluded IPv6 networks + description: "List of Killswitch Excluded IPv6 Addresses" + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv6 + label: IPv6 Network + schema: + type: string + required: true + - variable: configFile + label: VPN Config File Location + schema: + type: string + show_if: [["type", "!=", "disabled"]] + default: "" + + - variable: envList + label: VPN Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + max_length: 10240 + + - variable: docs + group: Documentation + label: Please read the documentation at https://truecharts.org + description: Please read the documentation at +
https://truecharts.org + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDocs + label: I have checked the documentation + schema: + type: boolean + default: true + - variable: donateNag + group: Documentation + label: Please consider supporting TrueCharts, see https://truecharts.org/sponsor + description: Please consider supporting TrueCharts, see +
https://truecharts.org/sponsor + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDonate + label: I have considered donating + schema: + type: boolean + default: true + hidden: true + diff --git a/stable/alist/10.2.3/templates/NOTES.txt b/stable/alist/10.2.3/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/alist/10.2.3/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/alist/10.2.3/templates/common.yaml b/stable/alist/10.2.3/templates/common.yaml new file mode 100644 index 0000000000..b51394e00a --- /dev/null +++ b/stable/alist/10.2.3/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} diff --git a/stable/alist/10.2.3/values.yaml b/stable/alist/10.2.3/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/alist/app_versions.json b/stable/alist/app_versions.json index 361d4c19ac..66f7560fd8 100644 --- a/stable/alist/app_versions.json +++ b/stable/alist/app_versions.json @@ -1,4 +1,5367 @@ { + "10.2.3": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/alist/10.2.3", + "last_update": "2024-09-17 12:35:14", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "3.37.3_10.2.3", + "version": "10.2.3", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "cloud", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "3.37.3", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "Alist program that supports multiple storage, powered by Gin and React", + "home": "https://truecharts.org/charts/stable/alist", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/alist.webp", + "keywords": [ + "alist", + "storage", + "webdav", + "google driver", + "aliyun driver", + "baiduyun" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "alist", + "sources": [ + "https://github.com/Xhofe/alist", + "https://github.com/truecharts/charts/tree/master/charts/stable/alist", + "https://hub.docker.com/r/xhofe/alist-aria2" + ], + "type": "application", + "version": "10.2.3" + }, + "app_metadata": null, + "schema": { + "groups": [ + { + "name": "Image", + "description": "Configured the images to be used for the Chart.\nIt's wise to use \"digest pinned\" tags and to avoid using \"latest\".\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/#images\n" + }, + { + "name": "General", + "description": "For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general.\n\nCheckout the following documentation for more information:\n - https://truecharts.org/common/global/\n - https://truecharts.org/common/#tz\n - https://truecharts.org/common/podoptions/\n - Image Pull Secrets\n" + }, + { + "name": "Workload", + "description": "These settings configure how the actual Pods and containers are running.\nGenerally, on SCALE, we only expose a limited subset of these settings for the primary workload and container.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/workload/\n- https://truecharts.org/common/container/\n" + }, + { + "name": "App Configuration", + "description": "Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application.\nMost options should have a Tooltip (Circled Question Mark) to further describe said option.\n\nTo find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/\n" + }, + { + "name": "Services", + "description": "Service and Networking options for any applications are contained here.\nSome applications may have complicated networking setups with multiple options or some may have no options here at all.\n\nOptions here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/service/\n" + }, + { + "name": "Networking", + "description": "Contains advanced networking options that are not actively supported by the TrueCharts team.\nCurrently only contains scaleExternalInterfaces.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/scaleexternalinterface/\n" + }, + { + "name": "Persistence", + "description": "Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types.\nThis storage is called Persistence since it is not deleted upon restart or upgrade of an application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/\n- https://truecharts.org/scale/guides/nfs-share/\n- https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath\n" + }, + { + "name": "Ingress", + "description": "Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names).\nIf you choose to enable this you must have a \"Ingress Provider\" aka \"Reverse Proxy\" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/)\nIt also requiresa DNS service to actually resolve the DNS name of the FQDN specified.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/ingress/\n" + }, + { + "name": "SecurityContext", + "description": "The security settings for each application and/or permissions that each application may have for the files/directories created.\nEach application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities.\n\nUnless necessary users are advised to keep this section mostly to defaults.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/securitycontext/\n" + }, + { + "name": "Resources", + "description": "Resources limits that have been defined by each application are in this section.\nMost will have a specific default that some users may want to change based on their specific hardware or needs.\n\nThis also contains the options to mount GPUs or, more precisely, \"request\" GPU's to be mounted.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/resources/\n" + }, + { + "name": "Devices", + "description": "These are special \"mountpoints\" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts.\nFor clearity we've decided to seperate this from persistence on SCALE.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/device/\n- https://truecharts.org/scale/guides/pci-passthrough/\n" + }, + { + "name": "Middlewares", + "description": "Traefik Middlewares" + }, + { + "name": "StorageClass", + "description": "StorageClasses define where to storage Storage.\n\nCheckout the following documentation for more information:\n" + }, + { + "name": "Metrics", + "description": "Contains options to configure Prometheus metrics for the application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/metrics/\n" + }, + { + "name": "Addons", + "description": "Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application\u2019s defaults.\nThings included here are VPN addons, Codeserver for editing files inside the application\u2019s container, Netshoot for network troubelshooting, etc.\n\nGenerally not required for use but may be necessary or usefull at times for specific applications.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/addons/\n- https://truecharts.org/scale/guides/vpn-setup/\n" + }, + { + "name": "Experimental", + "description": "Experimental Configuration Options\nOften these are not fully flushed-out, could randomly break or might not work at-all.\n" + }, + { + "name": "Postgresql", + "description": "For Postgresql we use \"CloudNative-PG\" as a backend, which has to be installed first.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/cnpg/\n- https://truecharts.org/scale/guides/sql-export/\n- https://truecharts.org/scale/guides/recover-cnpg/\n" + }, + { + "name": "Dependencies", + "description": "contains dependency setting for which we, currently, do not have seperate catagories (yet)\n" + }, + { + "name": "Documentation", + "description": "We added this section to make everyone aware that OpenSource isn't always easy.\nIt doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects.\n\nBefore installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/\nWe would also advice going over our https://truecharts.org/scale/guides/scale-intro/\nand many of the other documentation pages...\n" + } + ], + "portals": { + "open": { + "protocols": [ + "$kubernetes-resource_configmap_tcportal-open_protocol" + ], + "host": [ + "$kubernetes-resource_configmap_tcportal-open_host" + ], + "ports": [ + "$kubernetes-resource_configmap_tcportal-open_port" + ] + } + }, + "questions": [ + { + "variable": "global", + "group": "General", + "label": "Global Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "stopAll", + "label": "Stop All", + "description": "Stops All Running pods and hibernates cnpg", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + }, + { + "variable": "credentialsList", + "group": "General", + "label": "Credentials (Experimental)", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "credentialsEntry", + "label": "Enter Credentials", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "type", + "label": "Type", + "description": "Type of Credential", + "schema": { + "type": "string", + "default": "s3", + "enum": [ + { + "value": "s3", + "description": "s3 Storage" + } + ] + } + }, + { + "variable": "url", + "label": "url", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "path", + "label": "path", + "description": "Path Prefix not needed for most cases", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "bucket", + "label": "bucket", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "accessKey", + "label": "accessKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "secretKey", + "label": "secretKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "encrKey", + "label": "encrKey", + "description": "The Encryption key is needed for tools like volsync if not needed it will be ignored", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "MYSECRETPASSPHRASE", + "required": true + } + } + ] + } + } + ] + } + }, + { + "variable": "workload", + "group": "Workload", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type (Advanced)", + "schema": { + "type": "string", + "default": "Deployment", + "enum": [ + { + "value": "Deployment", + "description": "Deployment" + }, + { + "value": "DaemonSet", + "description": "DaemonSet" + } + ] + } + }, + { + "variable": "replicas", + "label": "Replicas (Advanced)", + "description": "Set the number of Replicas", + "schema": { + "type": "int", + "show_if": [ + [ + "type", + "!=", + "DaemonSet" + ] + ], + "default": 1 + } + }, + { + "variable": "podSpec", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "containers", + "label": "Containers", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Container", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "envList", + "label": "Extra Environment Variables", + "description": "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting...", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string" + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "extraArgs", + "label": "Extra Args", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "arg", + "label": "Arg", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "command", + "label": "Command", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "param", + "label": "Param", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "TZ", + "label": "Timezone", + "group": "General", + "schema": { + "type": "string", + "default": "America/Los_Angeles", + "$ref": [ + "definitions/timezone" + ], + "enum": [ + { + "value": "Asia/Damascus", + "description": "'Asia/Damascus' timezone" + }, + { + "value": "Asia/Saigon", + "description": "'Asia/Saigon' timezone" + } + ] + } + }, + { + "variable": "podOptions", + "group": "General", + "label": "Global Pod Options (Advanced)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "expertPodOpts", + "label": "Expert - Pod Options", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hostNetwork", + "label": "Host Networking", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "dnsConfig", + "label": "DNS Configuration", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "options", + "label": "Options", + "schema": { + "type": "list", + "default": [ + { + "name": "ndots", + "value": "1" + } + ], + "items": [ + { + "variable": "optionsEntry", + "label": "Option Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "nameservers", + "label": "Nameservers", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "nsEntry", + "label": "Nameserver Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "searches", + "label": "Searches", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "searchEntry", + "label": "Search Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "imagePullSecretList", + "group": "General", + "label": "Image Pull Secrets", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pullsecretentry", + "label": "Pull Secret", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "data", + "label": "Data", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "registry", + "label": "Registry", + "schema": { + "type": "string", + "required": true, + "default": "https://index.docker.io/v1/" + } + }, + { + "variable": "username", + "label": "Username", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "schema": { + "type": "string", + "required": true, + "private": true, + "default": "" + } + }, + { + "variable": "email", + "label": "Email", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "service", + "group": "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": [ + { + "variable": "enabled", + "label": "Enable the Service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "Service's Port(s) Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "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": 10167, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "aria2", + "label": "Aria 2 RPC Service Port", + "description": "Adds another port for Aria 2 RPC connections", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "Service's Port(s) Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "aria2", + "label": "Aria 2 RPC Service Port", + "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": 6800, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "scaleExternalInterface", + "description": "Add External Interfaces (Experimental, might change or be removed without further notice)", + "label": "Add external Interfaces (Experimental)", + "group": "Networking", + "schema": { + "type": "list", + "items": [ + { + "variable": "interfaceConfiguration", + "description": "Interface Configuration", + "label": "Interface Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "$ref": [ + "normalize/interfaceConfiguration" + ], + "attrs": [ + { + "variable": "hostInterface", + "description": "Please Specify Host Interface", + "label": "Host Interface", + "schema": { + "type": "string", + "required": true, + "$ref": [ + "definitions/interface" + ], + "enum": [] + } + }, + { + "variable": "ipam", + "description": "Define how IP Address will be managed", + "label": "IP Address Management", + "schema": { + "additional_attrs": true, + "type": "dict", + "required": true, + "attrs": [ + { + "variable": "type", + "description": "Specify type for IPAM", + "label": "IPAM Type", + "schema": { + "type": "string", + "required": true, + "enum": [ + { + "value": "dhcp", + "description": "Use DHCP" + }, + { + "value": "static", + "description": "Use Static IP" + } + ] + } + }, + { + "variable": "staticIPConfigurations", + "label": "Static IP Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticIP", + "label": "Static IP", + "schema": { + "type": "ipaddr", + "cidr": true + } + } + ] + } + }, + { + "variable": "staticRoutes", + "label": "Static Routes", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticRouteConfiguration", + "label": "Static Route Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "destination", + "label": "Destination", + "schema": { + "type": "ipaddr", + "cidr": true, + "required": true + } + }, + { + "variable": "gateway", + "label": "Gateway", + "schema": { + "type": "ipaddr", + "cidr": false, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "serviceList", + "label": "Add Manual Custom Services", + "group": "Services", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "serviceListEntry", + "label": "Custom Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + }, + { + "value": "Simple", + "description": "Deprecated CHANGE THIS" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "advancedsvcset", + "label": "Show Advanced Service Settings", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "externalIPs", + "label": "External IP's", + "description": "External IP's", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "externalIP", + "label": "External IP", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "ipFamilyPolicy", + "label": "IP Family Policy", + "description": "Specify the IP Policy", + "schema": { + "type": "string", + "default": "SingleStack", + "enum": [ + { + "value": "SingleStack", + "description": "SingleStack" + }, + { + "value": "PreferDualStack", + "description": "PreferDualStack" + }, + { + "value": "RequireDualStack", + "description": "RequireDualStack" + } + ] + } + }, + { + "variable": "ipFamilies", + "label": "IP Families", + "description": "(Advanced) The IP Families that should be used", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipFamily", + "label": "IP Family", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "portsList", + "label": "Additional Service Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsListEntry", + "label": "Custom ports", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Port", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Port Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "protocol", + "label": "Port Type", + "schema": { + "type": "string", + "default": "tcp", + "enum": [ + { + "value": "http", + "description": "HTTP" + }, + { + "value": "https", + "description": "HTTPS" + }, + { + "value": "tcp", + "description": "TCP" + }, + { + "value": "udp", + "description": "UDP" + } + ] + } + }, + { + "variable": "targetPort", + "label": "Target Port", + "description": "This port exposes the container port on the service", + "schema": { + "type": "int", + "required": true + } + }, + { + "variable": "port", + "label": "Container Port", + "schema": { + "type": "int", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistence", + "label": "Integrated Persistent Storage", + "description": "Integrated Persistent Storage", + "group": "Persistence", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "data", + "label": "App Data Storage", + "description": "Stores the Application Data.", + "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": "pvc", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + }, + { + "value": "iscsi", + "description": "iSCSI Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "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" + } + ] + } + }, + { + "variable": "size", + "label": "Size quotum of Storage (Do NOT REDUCE after installation)", + "description": "This value can ONLY be INCREASED after the installation", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistenceList", + "label": "Additional App Storage", + "group": "Persistence", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "persistenceListEntry", + "label": "Custom Storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the storage", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Type of Storage", + "description": "Sets the persistence type, Anything other than PVC could break rollback!", + "schema": { + "type": "string", + "default": "hostPath", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "show_if": [ + [ + "type", + "=", + "hostPath" + ] + ], + "type": "hostpath" + } + }, + { + "variable": "mountPath", + "label": "Mount Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "type": "string", + "default": "", + "required": true, + "valid_chars": "^\\/([a-zA-Z0-9._-]+(\\s?[a-zA-Z0-9._-]+|\\/?))+$" + } + }, + { + "variable": "medium", + "label": "EmptyDir Medium", + "schema": { + "show_if": [ + [ + "type", + "=", + "emptyDir" + ] + ], + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "Memory", + "description": "Memory" + } + ] + } + }, + { + "variable": "size", + "label": "Size Quotum of Storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "", + "group": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name (Optional)", + "description": "Defaults to chart name", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description (Optional)", + "description": "Defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "icon", + "label": "Icon (Optional)", + "description": "Defaults to chart icon", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "widget", + "label": "Widget Settings", + "schema": { + "type": "dict", + "additional_attrs": true, + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "attrs": [ + { + "variable": "enabled", + "label": "Enable Widget", + "description": "When disabled all widget annotations are skipped.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "custom", + "label": "Options", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "key", + "label": "API-key (key)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "customkv", + "label": "Custom Options", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "option", + "label": "Option", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingressList", + "label": "Add Manual Custom Ingresses", + "group": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressListEntry", + "label": "Custom Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "ingressClassName", + "label": "IngressClass Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + }, + { + "variable": "overrideService", + "label": "Linked Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Service Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "port", + "label": "Service Port", + "schema": { + "type": "int" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Secret (Advanced)", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description", + "description": "defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "securityContext", + "group": "SecurityContext", + "label": "Security Context", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "container", + "label": "Container", + "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": "PUID", + "label": "Process User ID - PUID", + "description": "When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps", + "schema": { + "type": "int", + "show_if": [ + [ + "runAsUser", + "=", + 0 + ] + ], + "default": 568 + } + }, + { + "variable": "UMASK", + "label": "UMASK", + "description": "When supported by the container, this sets the UMASK for the App. Not supported by all Apps", + "schema": { + "type": "string", + "default": "0022" + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "privileged", + "label": "Privileged mode", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "readOnlyRootFilesystem", + "label": "ReadOnly Root Filesystem", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + }, + { + "variable": "pod", + "label": "Pod", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "fsGroupChangePolicy", + "label": "When should we take ownership?", + "schema": { + "type": "string", + "default": "OnRootMismatch", + "enum": [ + { + "value": "OnRootMismatch", + "description": "OnRootMismatch" + }, + { + "value": "Always", + "description": "Always" + } + ] + } + }, + { + "variable": "supplementalGroups", + "label": "Supplemental Groups", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "supplementalGroupsEntry", + "label": "Supplemental Group", + "schema": { + "type": "int" + } + } + ] + } + }, + { + "variable": "fsGroup", + "label": "fsGroup", + "description": "The group that should own ALL storage.", + "schema": { + "type": "int", + "default": 568 + } + } + ] + } + } + ] + } + }, + { + "variable": "resources", + "group": "Resources", + "label": "Resource Limits", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "limits", + "label": "Advanced Limit Resource Consumption", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "4000m", + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "8Gi", + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + }, + { + "variable": "gpu.intel.com/i915", + "label": "Add Intel i915 GPUs", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "nvidia.com/gpu", + "label": "Add NVIDIA GPUs (Experimental)", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "amd.com/gpu", + "label": "Add AMD GPUs", + "schema": { + "type": "int", + "default": 0 + } + } + ] + } + }, + { + "variable": "requests", + "label": "Minimum Resources Required (request)", + "schema": { + "additional_attrs": true, + "type": "dict", + "hidden": true, + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "10m", + "hidden": true, + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "50Mi", + "hidden": true, + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + } + ] + } + } + ] + } + }, + { + "variable": "deviceList", + "label": "Mount USB Devices", + "group": "Devices", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "deviceListEntry", + "label": "Device", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Storage", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "type", + "label": "(Advanced) Type of Storage", + "description": "Sets the persistence type", + "schema": { + "type": "string", + "default": "device", + "hidden": true + } + }, + { + "variable": "readOnly", + "label": "readOnly", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Device Path", + "description": "Path to the device on the host system", + "schema": { + "type": "path" + } + }, + { + "variable": "mountPath", + "label": "Container Device Path", + "description": "Path inside the container the device is mounted", + "schema": { + "type": "string", + "default": "/dev/ttyACM0" + } + } + ] + } + } + ] + } + }, + { + "variable": "networkPolicy", + "group": "Experimental", + "label": "(Advanced) Network Policy", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "netPolicyEntry", + "label": "Network Policy Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "policyType", + "label": "Policy Type", + "schema": { + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "ingress", + "description": "Ingress" + }, + { + "value": "egress", + "description": "Egress" + }, + { + "value": "ingress-egress", + "description": "Ingress and Egress" + } + ] + } + }, + { + "variable": "egress", + "label": "Egress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "egressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "to", + "label": "To", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "toEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "from", + "label": "From", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "fromEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "addons", + "group": "Addons", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "Codeserver", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "service", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "NodePort", + "description": "Deprecated CHANGE THIS" + }, + { + "value": "ClusterIP", + "description": "ClusterIP" + }, + { + "value": "LoadBalancer", + "description": "LoadBalancer" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int", + "default": 36107 + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "scaleCert", + "label": "Use TrueNAS SCALE Certificate (Deprecated)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "int", + "$ref": [ + "definitions/certificate" + ], + "enum": [ + { + "value": null, + "description": "No Certificate" + } + ], + "default": null, + "null": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "envList", + "label": "Codeserver Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "netshoot", + "label": "Netshoot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "envList", + "label": "Netshoot Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "vpn", + "label": "VPN", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "gluetun", + "description": "Gluetun" + }, + { + "value": "tailscale", + "description": "Tailscale" + }, + { + "value": "openvpn", + "description": "OpenVPN (Deprecated)" + }, + { + "value": "wireguard", + "description": "Wireguard (Deprecated)" + } + ] + } + }, + { + "variable": "openvpn", + "label": "OpenVPN Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "openvpn" + ] + ], + "attrs": [ + { + "variable": "username", + "label": "Authentication Username (Optional)", + "description": "Authentication Username, Optional", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "Authentication Password", + "description": "Authentication Credentials", + "schema": { + "type": "string", + "show_if": [ + [ + "username", + "!=", + "" + ] + ], + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "tailscale", + "label": "Tailscale Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "tailscale" + ] + ], + "attrs": [ + { + "variable": "authkey", + "label": "Authentication Key", + "description": "Provide an auth key to automatically authenticate the node as your user account.", + "schema": { + "type": "string", + "private": true, + "default": "" + } + }, + { + "variable": "auth_once", + "label": "Auth Once", + "description": "Only attempt to log in if not already logged in.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "accept_dns", + "label": "Accept DNS", + "description": "Accept DNS configuration from the admin console.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "userspace", + "label": "Userspace", + "description": "Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "routes", + "label": "Routes", + "description": "Expose physical subnet routes to your entire Tailscale network.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "dest_ip", + "label": "Destination IP", + "description": "Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "sock5_server", + "label": "Sock5 Server", + "description": "The address on which to listen for SOCKS5 proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "outbound_http_proxy_listen", + "label": "Outbound HTTP Proxy Listen", + "description": "The address on which to listen for HTTP proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "extra_args", + "label": "Extra Args", + "description": "Extra Args", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "daemon_extra_args", + "label": "Tailscale Daemon Extra Args", + "description": "Tailscale Daemon Extra Args", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "killSwitch", + "label": "Enable Killswitch", + "schema": { + "type": "boolean", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": true + } + }, + { + "variable": "excludedNetworks_IPv4", + "label": "Killswitch Excluded IPv4 networks", + "description": "List of Killswitch Excluded IPv4 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv4", + "label": "IPv4 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "excludedNetworks_IPv6", + "label": "Killswitch Excluded IPv6 networks", + "description": "List of Killswitch Excluded IPv6 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv6", + "label": "IPv6 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "configFile", + "label": "VPN Config File Location", + "schema": { + "type": "string", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": "" + } + }, + { + "variable": "envList", + "label": "VPN Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true, + "max_length": 10240 + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "docs", + "group": "Documentation", + "label": "Please read the documentation at https://truecharts.org", + "description": "Please read the documentation at
https://truecharts.org", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDocs", + "label": "I have checked the documentation", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "donateNag", + "group": "Documentation", + "label": "Please consider supporting TrueCharts, see https://truecharts.org/sponsor", + "description": "Please consider supporting TrueCharts, see
https://truecharts.org/sponsor", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDonate", + "label": "I have considered donating", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + } + ] + } + } + ] + }, + "app_readme": "

Alist program that supports multiple storage, powered by Gin and React

\n

This App is supplied by TrueCharts, for more information visit the manual: https://truecharts.org/charts/stable/alist

\n
\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

", + "detailed_readme": "
\n

title: README

\n

General Info

\n

TrueCharts can be installed as both normal Helm Charts or as TrueNAS SCALE Apps.\nBoth solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible

\n

For more information about this Chart, please check the docs on the TrueCharts website

\n

This chart is not maintained by the upstream project and any issues with the chart should be raised here

\n

Installation

\n

Helm-Chart installation

\n

To install TrueCharts Helm charts using Helm, you can use our OCI Repository.

\n

helm install mychart oci://tccr.io/truecharts/CHARTNAME

\n

For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/

\n

TrueNAS SCALE Apps

\n

For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the quick-start guides for TrueNAS SCALE.

\n

Chart Specific Guides and information

\n

All our charts have dedicated documentation pages.\nThe documentation for this chart can be found here:\nhttps://truecharts.org/charts/stable/alist

\n

Configuration Options

\n

Please note: For TrueNAS SCALE, only options available in the GUI are supported.\nHence most of these docs do not apply to TrueNAS SCALE

\n

To view the chart specific options, please view Values.yaml included in the chart.\nThe most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/alist/values.yaml

\n

All our Charts use a shared \"common\" library chart that contains most of the templating and options.\nFor the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/

\n

For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml

\n

Support

\n\n
\n

Sponsor TrueCharts

\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

\n

All Rights Reserved - The TrueCharts Project

", + "changelog": "

for the complete changelog, please refer to the website

\n

Important:

" + }, "10.2.2": { "healthy": true, "supported": true, From 60a3d8323214458c490a26647116ff1148a25587 Mon Sep 17 00:00:00 2001 From: "Gao, Ruiyuan" <905370712@qq.com> Date: Tue, 17 Sep 2024 12:44:33 +0800 Subject: [PATCH 2/8] Create sync_upstream.yml --- .github/workflows/sync_upstream.yml | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/sync_upstream.yml diff --git a/.github/workflows/sync_upstream.yml b/.github/workflows/sync_upstream.yml new file mode 100644 index 0000000000..01fdf49051 --- /dev/null +++ b/.github/workflows/sync_upstream.yml @@ -0,0 +1,43 @@ +name: Sync Upstream + +env: + # Required, URL to upstream (fork base) + UPSTREAM_URL: "https://github.com/v3DJG6GL/truecharts_archive" + # Required, token to authenticate bot, could use ${{ secrets.GITHUB_TOKEN }} + # Over here, we use a PAT instead to authenticate workflow file changes. + WORKFLOW_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + # Optional, defaults to main + UPSTREAM_BRANCH: "main" + # Optional, defaults to UPSTREAM_BRANCH + DOWNSTREAM_BRANCH: "" + # Optional fetch arguments + FETCH_ARGS: "" + # Optional merge arguments + MERGE_ARGS: "" + # Optional push arguments + PUSH_ARGS: "" + # Optional toggle to spawn time logs (keeps action active) + SPAWN_LOGS: "false" # "true" or "false" + +# This runs every day on 1801 UTC +on: + schedule: + - cron: '1 18 * * *' + # Allows manual workflow run (must in default branch to work) + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: GitHub Sync to Upstream Repository + uses: dabreadman/sync-upstream-repo@v1.3.0 + with: + upstream_repo: ${{ env.UPSTREAM_URL }} + upstream_branch: ${{ env.UPSTREAM_BRANCH }} + downstream_branch: ${{ env.DOWNSTREAM_BRANCH }} + token: ${{ env.WORKFLOW_TOKEN }} + fetch_args: ${{ env.FETCH_ARGS }} + merge_args: ${{ env.MERGE_ARGS }} + push_args: ${{ env.PUSH_ARGS }} + spawn_logs: ${{ env.SPAWN_LOGS }} From 2b33ab30822546f70dc6a43c543079eac5c63eb9 Mon Sep 17 00:00:00 2001 From: "Gao, Ruiyuan" <905370712@qq.com> Date: Tue, 17 Sep 2024 12:47:14 +0800 Subject: [PATCH 3/8] Update sync_upstream.yml --- .github/workflows/sync_upstream.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync_upstream.yml b/.github/workflows/sync_upstream.yml index 01fdf49051..bda7aa623e 100644 --- a/.github/workflows/sync_upstream.yml +++ b/.github/workflows/sync_upstream.yml @@ -2,7 +2,7 @@ name: Sync Upstream env: # Required, URL to upstream (fork base) - UPSTREAM_URL: "https://github.com/v3DJG6GL/truecharts_archive" + UPSTREAM_URL: "https://github.com/v3DJG6GL/truecharts_archive.git" # Required, token to authenticate bot, could use ${{ secrets.GITHUB_TOKEN }} # Over here, we use a PAT instead to authenticate workflow file changes. WORKFLOW_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} From c3c198778b8aae89467265ac05d307ea35c7e6f6 Mon Sep 17 00:00:00 2001 From: "Gao, Ruiyuan" <905370712@qq.com> Date: Tue, 17 Sep 2024 12:50:26 +0800 Subject: [PATCH 4/8] Update sync_upstream.yml --- .github/workflows/sync_upstream.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync_upstream.yml b/.github/workflows/sync_upstream.yml index bda7aa623e..cac91d80be 100644 --- a/.github/workflows/sync_upstream.yml +++ b/.github/workflows/sync_upstream.yml @@ -5,7 +5,7 @@ env: UPSTREAM_URL: "https://github.com/v3DJG6GL/truecharts_archive.git" # Required, token to authenticate bot, could use ${{ secrets.GITHUB_TOKEN }} # Over here, we use a PAT instead to authenticate workflow file changes. - WORKFLOW_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} + WORKFLOW_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Optional, defaults to main UPSTREAM_BRANCH: "main" # Optional, defaults to UPSTREAM_BRANCH From 3713db6ccde95e26eb545b84833480801356386d Mon Sep 17 00:00:00 2001 From: flymin <905370712@qq.com> Date: Tue, 17 Sep 2024 13:08:14 +0800 Subject: [PATCH 5/8] firefox 128.0.3 --- catalog.json | 8 +- stable/firefox/14.0.15/.helmignore | 32 + stable/firefox/14.0.15/CHANGELOG.md | 3 + stable/firefox/14.0.15/Chart.yaml | 34 + stable/firefox/14.0.15/README.md | 61 + stable/firefox/14.0.15/app-readme.md | 8 + .../firefox/14.0.15/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes stable/firefox/14.0.15/icon-small.webp | Bin 0 -> 704 bytes stable/firefox/14.0.15/icon.webp | Bin 0 -> 3684 bytes stable/firefox/14.0.15/ix_values.yaml | 41 + stable/firefox/14.0.15/questions.yaml | 3166 ++++++++++ stable/firefox/14.0.15/templates/NOTES.txt | 1 + stable/firefox/14.0.15/templates/common.yaml | 1 + stable/firefox/14.0.15/values.yaml | 0 stable/firefox/app_versions.json | 5293 +++++++++++++++++ 15 files changed, 8644 insertions(+), 4 deletions(-) create mode 100644 stable/firefox/14.0.15/.helmignore create mode 100644 stable/firefox/14.0.15/CHANGELOG.md create mode 100644 stable/firefox/14.0.15/Chart.yaml create mode 100644 stable/firefox/14.0.15/README.md create mode 100644 stable/firefox/14.0.15/app-readme.md create mode 100644 stable/firefox/14.0.15/charts/common-23.0.10.tgz create mode 100644 stable/firefox/14.0.15/icon-small.webp create mode 100644 stable/firefox/14.0.15/icon.webp create mode 100644 stable/firefox/14.0.15/ix_values.yaml create mode 100644 stable/firefox/14.0.15/questions.yaml create mode 100644 stable/firefox/14.0.15/templates/NOTES.txt create mode 100644 stable/firefox/14.0.15/templates/common.yaml create mode 100644 stable/firefox/14.0.15/values.yaml diff --git a/catalog.json b/catalog.json index 3749f8200f..d83959d53f 100644 --- a/catalog.json +++ b/catalog.json @@ -7607,10 +7607,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/firefox", "location": "/home/runner/_work/catalog/catalog/stable/firefox", - "latest_version": "14.0.14", - "latest_app_version": "125.0.3", - "latest_human_version": "125.0.3_14.0.14", - "last_update": "2024-05-29 12:35:14", + "latest_version": "14.0.15", + "latest_app_version": "128.0.3", + "latest_human_version": "125.0.3_14.0.15", + "last_update": "2024-09-17 12:35:14", "name": "firefox", "recommended": false, "title": "Firefox", diff --git a/stable/firefox/14.0.15/.helmignore b/stable/firefox/14.0.15/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/firefox/14.0.15/.helmignore @@ -0,0 +1,32 @@ +# 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 +# docs folder +/docs +# icon +icon.png +icon.webp +icon-small.webp diff --git a/stable/firefox/14.0.15/CHANGELOG.md b/stable/firefox/14.0.15/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/firefox/14.0.15/CHANGELOG.md @@ -0,0 +1,3 @@ +*for the complete changelog, please refer to the website* + +**Important:** \ No newline at end of file diff --git a/stable/firefox/14.0.15/Chart.yaml b/stable/firefox/14.0.15/Chart.yaml new file mode 100644 index 0000000000..a05601eb96 --- /dev/null +++ b/stable/firefox/14.0.15/Chart.yaml @@ -0,0 +1,34 @@ +annotations: + truecharts.org/category: browser + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 128.0.3 +dependencies: + - name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. +home: https://truecharts.org/charts/stable/firefox +icon: https://truecharts.org/img/hotlink-ok/chart-icons/firefox.webp +keywords: + - firefox + - browser +kubeVersion: '>=1.24.0-0' +maintainers: + - name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: firefox +sources: + - https://ghcr.io/linuxserver/firefox + - https://github.com/linuxserver/docker-firefox + - https://github.com/truecharts/charts/tree/master/charts/stable/firefox +type: application +version: 14.0.15 diff --git a/stable/firefox/14.0.15/README.md b/stable/firefox/14.0.15/README.md new file mode 100644 index 0000000000..b2a92e2db4 --- /dev/null +++ b/stable/firefox/14.0.15/README.md @@ -0,0 +1,61 @@ +--- +title: README +--- + +## General Info + +TrueCharts can be installed as both _normal_ Helm Charts or as TrueNAS SCALE Apps. +Both solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible + +For more information about this Chart, please check the docs on the TrueCharts [website](https://truecharts.org/charts/stable/firefox) + +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/charts/issues/new/choose)** + +## Installation + +### Helm-Chart installation + +To install TrueCharts Helm charts using Helm, you can use our OCI Repository. + +`helm install mychart oci://tccr.io/truecharts/CHARTNAME` + +For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/ + + +### TrueNAS SCALE Apps + +For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the [quick-start guides for TrueNAS SCALE](https://truecharts.org/scale). + +## Chart Specific Guides and information + +All our charts have dedicated documentation pages. +The documentation for this chart can be found here: +https://truecharts.org/charts/stable/firefox + +## Configuration Options + +Please note: For TrueNAS SCALE, only options available in the GUI are supported. +Hence most of these docs do not apply to TrueNAS SCALE + +To view the chart specific options, please view Values.yaml included in the chart. +The most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/firefox/values.yaml + +All our Charts use a shared "common" library chart that contains most of the templating and options. +For the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/ + +For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml + +## Support + +- See the [Website](https://truecharts.org) +- Check our [Discord](https://discord.gg/tVsPTHWTtr) +- Open a [issue](https://github.com/truecharts/charts/issues/new/choose) + +--- + +## Sponsor TrueCharts + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/general/sponsor) or contributing back to the project any way you can! + +_All Rights Reserved - The TrueCharts Project_ diff --git a/stable/firefox/14.0.15/app-readme.md b/stable/firefox/14.0.15/app-readme.md new file mode 100644 index 0000000000..06d4ce1422 --- /dev/null +++ b/stable/firefox/14.0.15/app-readme.md @@ -0,0 +1,8 @@ +a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/firefox](https://truecharts.org/charts/stable/firefox) + +--- + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/sponsor) or contributing back to the project any way you can! diff --git a/stable/firefox/14.0.15/charts/common-23.0.10.tgz b/stable/firefox/14.0.15/charts/common-23.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5eefcb329be559e54998b5f211021daca81c39ef GIT binary patch literal 96939 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 literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.15/icon-small.webp b/stable/firefox/14.0.15/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd3abc3018f1c0f8a061702ad64eeda485f820c4 GIT binary patch literal 704 zcmV;x0zdsyNk&Gv0ssJ4MM6+kP&il$0000G0000V0018V06|PpNDKi000Dq&+qSW1 z|Ndj6Q=61lo0^r)XRvLjGP<<3ZL_q^6MVXF5D^mqDcvS@!PNJe(wR6t5xqJw&}7Pm$Ka#@rCfZ4fpH`f0UB3&%F z8>MQK@u<6{>Cpkdx>1T2Ed&Q&h`Ek}ShL&X#~s(>G(pZRD1-Dqe0z;T%8TKk#0d0*Tb)d)T)n&>6L*bQuq zO0kcL@U2#mh<_+G3pFZYpyuXlU(niaNuEQ0ax=SrKsWY#kr~^#o2tV&FU(XNS8nkt zH&gQy-(+2tt?j=xV2tnuyA9<#slyhP{wm9ehlh$irlhObt;Lf(|IhNITHrHrqvd>^ mkdlwD@XhgQOK!i2PE1YJSB?u#z&%pOGb*UlYIp3_F+c!(@JV+7 literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.15/icon.webp b/stable/firefox/14.0.15/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..a4a8de69361787a5eb31eb70a737f4f587d9b3fc GIT binary patch literal 3684 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 Ci6ZI% literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.15/ix_values.yaml b/stable/firefox/14.0.15/ix_values.yaml new file mode 100644 index 0000000000..9483fd882b --- /dev/null +++ b/stable/firefox/14.0.15/ix_values.yaml @@ -0,0 +1,41 @@ +image: + repository: ghcr.io/linuxserver/firefox + pullPolicy: IfNotPresent + tag: 128.0.3@sha256:729b994a73681a08dc303dab2f844bd6b7267646d3365fb071104450c4d2af1a +securityContext: + container: + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + runAsGroup: 0 +service: + main: + ports: + main: + protocol: http + port: 10131 +workload: + main: + podSpec: + containers: + main: + probes: + liveness: + type: http + readiness: + type: http + startup: + type: http + env: + FM_HOME: "/config" + CUSTOM_PORT: "{{ .Values.service.main.ports.main.port }}" + TITLE: "TrueChartVNC Client" +persistence: + config: + enabled: true + mountPath: /config + varrun: + enabled: false +portal: + open: + enabled: true diff --git a/stable/firefox/14.0.15/questions.yaml b/stable/firefox/14.0.15/questions.yaml new file mode 100644 index 0000000000..7c609a6dd2 --- /dev/null +++ b/stable/firefox/14.0.15/questions.yaml @@ -0,0 +1,3166 @@ +groups: + - name: Image + description: | + Configured the images to be used for the Chart. + It's wise to use "digest pinned" tags and to avoid using "latest". + + Checkout the following documentation for more information: + - https://truecharts.org/common/#images + + + - name: General + description: | + For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general. + + Checkout the following documentation for more information: + - https://truecharts.org/common/global/ + - https://truecharts.org/common/#tz + - https://truecharts.org/common/podoptions/ + - Image Pull Secrets + + + - name: Workload + description: | + These settings configure how the actual Pods and containers are running. + Generally, on SCALE, we only expose a limited subset of these settings for the primary workload and container. + + Checkout the following documentation for more information: + - https://truecharts.org/common/workload/ + - https://truecharts.org/common/container/ + + + - name: App Configuration + description: | + Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application. + Most options should have a Tooltip (Circled Question Mark) to further describe said option. + + To find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/ + + - name: Services + description: | + Service and Networking options for any applications are contained here. + Some applications may have complicated networking setups with multiple options or some may have no options here at all. + + Options here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes. + + Checkout the following documentation for more information: + - https://truecharts.org/common/service/ + + - name: Networking + description: | + Contains advanced networking options that are not actively supported by the TrueCharts team. + Currently only contains scaleExternalInterfaces. + + Checkout the following documentation for more information: + - https://truecharts.org/common/scaleexternalinterface/ + + - name: Persistence + description: | + Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types. + This storage is called Persistence since it is not deleted upon restart or upgrade of an application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/ + - https://truecharts.org/scale/guides/nfs-share/ + - https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath + + + - name: Ingress + description: | + Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names). + If you choose to enable this you must have a "Ingress Provider" aka "Reverse Proxy" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/) + It also requiresa DNS service to actually resolve the DNS name of the FQDN specified. + + Checkout the following documentation for more information: + - https://truecharts.org/common/ingress/ + + + - name: SecurityContext + description: | + The security settings for each application and/or permissions that each application may have for the files/directories created. + Each application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities. + + Unless necessary users are advised to keep this section mostly to defaults. + + Checkout the following documentation for more information: + - https://truecharts.org/common/securitycontext/ + + + - name: Resources + description: | + Resources limits that have been defined by each application are in this section. + Most will have a specific default that some users may want to change based on their specific hardware or needs. + + This also contains the options to mount GPUs or, more precisely, "request" GPU's to be mounted. + + Checkout the following documentation for more information: + - https://truecharts.org/common/resources/ + + - name: Devices + description: | + These are special "mountpoints" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts. + For clearity we've decided to seperate this from persistence on SCALE. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/device/ + - https://truecharts.org/scale/guides/pci-passthrough/ + + - name: Middlewares + description: Traefik Middlewares + + - name: StorageClass + description: | + StorageClasses define where to storage Storage. + + Checkout the following documentation for more information: + + - name: Metrics + description: | + Contains options to configure Prometheus metrics for the application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/metrics/ + + + - name: Addons + description: | + Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application’s defaults. + Things included here are VPN addons, Codeserver for editing files inside the application’s container, Netshoot for network troubelshooting, etc. + + Generally not required for use but may be necessary or usefull at times for specific applications. + + Checkout the following documentation for more information: + - https://truecharts.org/common/addons/ + - https://truecharts.org/scale/guides/vpn-setup/ + + + - name: Experimental + description: | + Experimental Configuration Options + Often these are not fully flushed-out, could randomly break or might not work at-all. + + - name: Postgresql + description: | + For Postgresql we use "CloudNative-PG" as a backend, which has to be installed first. + + Checkout the following documentation for more information: + - https://truecharts.org/common/cnpg/ + - https://truecharts.org/scale/guides/sql-export/ + - https://truecharts.org/scale/guides/recover-cnpg/ + + - name: Dependencies + description: | + contains dependency setting for which we, currently, do not have seperate catagories (yet) + + + - name: Documentation + description: | + We added this section to make everyone aware that OpenSource isn't always easy. + It doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects. + + Before installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/ + We would also advice going over our https://truecharts.org/scale/guides/scale-intro/ + and many of the other documentation pages... + +portals: + open: + protocols: + - "$kubernetes-resource_configmap_tcportal-open_protocol" + host: + - "$kubernetes-resource_configmap_tcportal-open_host" + ports: + - "$kubernetes-resource_configmap_tcportal-open_port" + +questions: + - variable: global + group: General + label: "Global Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: stopAll + label: Stop All + description: "Stops All Running pods and hibernates cnpg" + schema: + type: boolean + default: false + + - variable: credentialsList + group: General + label: "Credentials (Experimental)" + schema: + type: list + default: [] + items: + - variable: credentialsEntry + label: "Enter Credentials" + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name" + schema: + type: string + required: true + default: "" + - variable: type + label: Type + description: "Type of Credential" + schema: + type: string + default: "s3" + enum: + - value: s3 + description: s3 Storage + - variable: url + label: "url" + schema: + type: string + default: "" + required: true + - variable: path + label: "path" + description: "Path Prefix not needed for most cases" + schema: + type: string + default: "" + - variable: bucket + label: "bucket" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: accessKey + label: "accessKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: secretKey + label: "secretKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: encrKey + label: "encrKey" + description: "The Encryption key is needed for tools like volsync if not needed it will be ignored" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "MYSECRETPASSPHRASE" + required: true + + - variable: workload + group: "Workload" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: type + label: Type (Advanced) + schema: + type: string + default: Deployment + enum: + - value: Deployment + description: Deployment + - value: DaemonSet + description: DaemonSet + + - variable: replicas + label: Replicas (Advanced) + description: Set the number of Replicas + schema: + type: int + show_if: [["type", "!=", "DaemonSet"]] + default: 1 + + - variable: podSpec + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: containers + label: Containers + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Container + schema: + additional_attrs: true + type: dict + attrs: + + - variable: env + label: Image Environment + schema: + additional_attrs: true + type: dict + attrs: + - variable: TITLE + label: Title + description: The page title displayed on the web browser + schema: + type: string + default: "TrueChartVNC Client" + - variable: envList + label: Extra Environment Variables + description: "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting..." + schema: + type: list + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + - variable: value + label: Value + schema: + type: string + - variable: extraArgs + label: Extra Args + schema: + type: list + default: [] + items: + - variable: arg + label: Arg + schema: + type: string + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: command + label: Command + schema: + type: list + default: [] + items: + - variable: param + label: Param + schema: + type: string + + - variable: TZ + label: Timezone + group: "General" + schema: + type: string + default: "Etc/UTC" + $ref: + - "definitions/timezone" + + - variable: podOptions + group: "General" + label: "Global Pod Options (Advanced)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: expertPodOpts + label: "Expert - Pod Options" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + label: "Host Networking" + schema: + type: boolean + default: false + - variable: dnsConfig + label: "DNS Configuration" + schema: + type: dict + additional_attrs: true + attrs: + - variable: options + label: "Options" + schema: + type: list + default: [{"name": "ndots", "value": "1"}] + items: + - variable: optionsEntry + label: "Option Entry" + schema: + type: dict + additional_attrs: true + attrs: + - variable: name + label: "Name" + schema: + type: string + required: true + - variable: value + label: "Value" + schema: + type: string + - variable: nameservers + label: "Nameservers" + schema: + type: list + default: [] + items: + - variable: nsEntry + label: "Nameserver Entry" + schema: + type: string + required: true + - variable: searches + label: "Searches" + schema: + type: list + default: [] + items: + - variable: searchEntry + label: "Search Entry" + schema: + type: string + required: true + + - variable: imagePullSecretList + group: "General" + label: "Image Pull Secrets" + schema: + type: list + default: [] + items: + - variable: pullsecretentry + label: "Pull Secret" + schema: + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: true + - variable: data + label: Data + schema: + type: dict + additional_attrs: true + attrs: + - variable: registry + label: "Registry" + schema: + type: string + required: true + default: "https://index.docker.io/v1/" + - variable: username + label: "Username" + schema: + type: string + required: true + default: "" + - variable: password + label: "Password" + schema: + type: string + required: true + private: true + default: "" + - variable: email + label: "Email" + schema: + type: string + required: true + default: "" + + - variable: service + group: Services + label: Configure Service(s) + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Service + description: The Primary service on which the Minecraft Server runs on + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Service + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "Service's Port(s) Configuration" + schema: + additional_attrs: true + type: dict + attrs: + + - 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: 10131 + required: true + - variable: scaleExternalInterface + description: 'Add External Interfaces (Experimental, might change or be removed without further notice)' + label: Add external Interfaces (Experimental) + group: Networking + schema: + type: list + items: + - variable: interfaceConfiguration + description: Interface Configuration + label: Interface Configuration + schema: + additional_attrs: true + type: dict + $ref: + - "normalize/interfaceConfiguration" + attrs: + - variable: hostInterface + description: Please Specify Host Interface + label: Host Interface + schema: + type: string + required: true + $ref: + - "definitions/interface" + - variable: ipam + description: Define how IP Address will be managed + label: IP Address Management + schema: + additional_attrs: true + type: dict + required: true + attrs: + - variable: type + description: Specify type for IPAM + label: IPAM Type + schema: + type: string + required: true + enum: + - value: dhcp + description: Use DHCP + - value: static + description: Use Static IP + - variable: staticIPConfigurations + label: Static IP Addresses + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticIP + label: Static IP + schema: + type: ipaddr + cidr: true + - variable: staticRoutes + label: Static Routes + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticRouteConfiguration + label: Static Route Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: destination + label: Destination + schema: + type: ipaddr + cidr: true + required: true + - variable: gateway + label: Gateway + schema: + type: ipaddr + cidr: false + required: true + + + - variable: serviceList + label: Add Manual Custom Services + group: Services + schema: + type: list + default: [] + items: + - variable: serviceListEntry + label: Custom Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the service + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + - value: Simple + description: Deprecated CHANGE THIS + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: advancedsvcset + label: Show Advanced Service Settings + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: externalIPs + label: "External IP's" + description: "External IP's" + schema: + type: list + default: [] + items: + - variable: externalIP + label: External IP + schema: + type: string + - variable: ipFamilyPolicy + label: IP Family Policy + description: Specify the IP Policy + schema: + type: string + default: SingleStack + enum: + - value: SingleStack + description: SingleStack + - value: PreferDualStack + description: PreferDualStack + - value: RequireDualStack + description: RequireDualStack + - variable: ipFamilies + label: IP Families + description: (Advanced) The IP Families that should be used + schema: + type: list + default: [] + items: + - variable: ipFamily + label: IP Family + schema: + type: string + - variable: portsList + label: Additional Service Ports + schema: + type: list + default: [] + items: + - variable: portsListEntry + label: Custom ports + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Port + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Port Name + schema: + type: string + default: "" + - variable: protocol + label: Port Type + schema: + type: string + default: tcp + enum: + - value: http + description: HTTP + - value: https + description: HTTPS + - value: tcp + description: TCP + - value: udp + description: UDP + - variable: targetPort + label: Target Port + description: This port exposes the container port on the service + schema: + type: int + required: true + - variable: port + label: Container Port + schema: + type: int + required: true + + - variable: persistence + label: Integrated Persistent Storage + description: Integrated Persistent Storage + group: 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: pvc + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - value: iscsi + description: iSCSI Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + 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 + - variable: size + label: Size quotum of Storage (Do NOT REDUCE after installation) + description: This value can ONLY be INCREASED after the installation + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: disabled + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: persistenceList + label: Additional App Storage + group: Persistence + schema: + type: list + default: [] + items: + - variable: persistenceListEntry + label: Custom Storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the storage + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Type of Storage + description: Sets the persistence type, Anything other than PVC could break rollback! + schema: + type: string + default: hostPath + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + description: Path inside the container the storage is mounted + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: mountPath + label: Mount Path + description: Path inside the container the storage is mounted + schema: + type: string + default: "" + required: true + valid_chars: '^\/([a-zA-Z0-9._-]+(\s?[a-zA-Z0-9._-]+|\/?))+$' + - variable: medium + label: EmptyDir Medium + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: Default + - value: Memory + description: Memory + - variable: size + label: Size Quotum of Storage + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: "disabled" + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: ingress + label: "" + group: Ingress + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Ingress + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name (Optional) + description: Defaults to chart name + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description (Optional) + description: Defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: icon + label: Icon (Optional) + description: Defaults to chart icon + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + - variable: widget + label: Widget Settings + schema: + type: dict + additional_attrs: true + show_if: [["enabled", "=", true]] + attrs: + - variable: enabled + label: Enable Widget + description: When disabled all widget annotations are skipped. + schema: + type: boolean + default: true + - variable: custom + label: Options + schema: + type: dict + additional_attrs: true + attrs: + - variable: key + label: API-key (key) + schema: + type: string + default: "" + - variable: customkv + label: Custom Options + schema: + type: list + default: [] + items: + - variable: option + label: Option + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + default: "" + required: true + - variable: value + label: Value + schema: + type: string + default: "" + required: true + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + + - variable: ingressList + label: Add Manual Custom Ingresses + group: Ingress + schema: + type: list + default: [] + items: + - variable: ingressListEntry + label: Custom Ingress + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: ingressClassName + label: IngressClass Name + schema: + type: string + default: "" + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: overrideService + label: Linked Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Service Name + schema: + type: string + default: "" + - variable: port + label: Service Port + schema: + type: int + - variable: tls + label: TLS-Settings + schema: + type: list + default: [] + show_if: [["certificateIssuer", "=", ""]] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: Use Custom Secret (Advanced) + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: "Allow Cross Origin Requests" + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: namespace + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description + description: defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + + - variable: securityContext + group: SecurityContext + label: Security Context + schema: + additional_attrs: true + type: dict + attrs: + - variable: container + label: Container + schema: + additional_attrs: true + type: dict + attrs: + # Settings from questions.yaml get appended here on a per-app basis + + - 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 + # Settings from questions.yaml get appended here on a per-app basis + - variable: PUID + label: Process User ID - PUID + description: When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps + schema: + type: int + show_if: [["runAsUser", "=", 0]] + default: 568 + - variable: UMASK + label: UMASK + description: When supported by the container, this sets the UMASK for the App. Not supported by all Apps + schema: + type: string + default: "0022" + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: true + + - variable: pod + label: Pod + schema: + additional_attrs: true + type: dict + attrs: + - variable: fsGroupChangePolicy + label: "When should we take ownership?" + schema: + type: string + default: OnRootMismatch + enum: + - value: OnRootMismatch + description: OnRootMismatch + - value: Always + description: Always + - variable: supplementalGroups + label: Supplemental Groups + schema: + type: list + default: [] + items: + - variable: supplementalGroupsEntry + label: Supplemental Group + schema: + type: int + # Settings from questions.yaml get appended here on a per-app basis + + - variable: fsGroup + label: fsGroup + description: The group that should own ALL storage. + schema: + type: int + default: 568 + - variable: resources + group: Resources + label: "Resource Limits" + schema: + additional_attrs: true + type: dict + attrs: + - variable: limits + label: Advanced Limit Resource Consumption + schema: + additional_attrs: true + type: dict + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 4000m + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: RAM + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 8Gi + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: 'gpu.intel.com/i915' + label: Add Intel i915 GPUs + schema: + type: int + default: 0 + - variable: 'nvidia.com/gpu' + label: Add NVIDIA GPUs (Experimental) + schema: + type: int + default: 0 + - variable: 'amd.com/gpu' + label: Add AMD GPUs + schema: + type: int + default: 0 + - variable: requests + label: "Minimum Resources Required (request)" + schema: + additional_attrs: true + type: dict + hidden: true + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 10m + hidden: true + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: "RAM" + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 50Mi + hidden: true + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: deviceList + label: Mount USB Devices + group: Devices + schema: + type: list + default: [] + items: + - variable: deviceListEntry + label: Device + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Storage + schema: + type: boolean + default: true + - variable: type + label: (Advanced) Type of Storage + description: Sets the persistence type + schema: + type: string + default: device + hidden: true + - variable: readOnly + label: readOnly + schema: + type: boolean + default: false + - variable: hostPath + label: Host Device Path + description: Path to the device on the host system + schema: + type: path + - variable: mountPath + label: Container Device Path + description: Path inside the container the device is mounted + schema: + type: string + default: "/dev/ttyACM0" + +# - variable: horizontalPodAutoscaler +# group: Experimental +# label: (Advanced) Horizontal Pod Autoscaler +# schema: +# type: list +# default: [] +# items: +# - variable: hpaEntry +# label: HPA Entry +# schema: +# additional_attrs: true +# type: dict +# attrs: +# - variable: name +# label: Name +# schema: +# type: string +# required: true +# default: "" +# - variable: enabled +# label: Enabled +# schema: +# type: boolean +# default: false +# show_subquestions_if: true +# subquestions: +# - variable: target +# label: Target +# description: Deployment name, Defaults to Main Deployment +# schema: +# type: string +# default: "" +# - variable: minReplicas +# label: Minimum Replicas +# schema: +# type: int +# default: 1 +# - variable: maxReplicas +# label: Maximum Replicas +# schema: +# type: int +# default: 5 +# - variable: targetCPUUtilizationPercentage +# label: Target CPU Utilization Percentage +# schema: +# type: int +# default: 80 +# - variable: targetMemoryUtilizationPercentage +# label: Target Memory Utilization Percentage +# schema: +# type: int +# default: 80 + - variable: networkPolicy + group: Experimental + label: (Advanced) Network Policy + schema: + type: list + default: [] + items: + - variable: netPolicyEntry + label: Network Policy Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + default: "" + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: policyType + label: Policy Type + schema: + type: string + default: "" + enum: + - value: "" + description: Default + - value: ingress + description: Ingress + - value: egress + description: Egress + - value: ingress-egress + description: Ingress and Egress + - variable: egress + label: Egress + schema: + type: list + default: [] + items: + - variable: egressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: to + label: To + schema: + type: list + default: [] + items: + - variable: toEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + - variable: ingress + label: Ingress + schema: + type: list + default: [] + items: + - variable: ingressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: from + label: From + schema: + type: list + default: [] + items: + - variable: fromEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + + - variable: addons + group: Addons + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: codeserver + label: Codeserver + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: service + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: NodePort + description: Deprecated CHANGE THIS + - value: ClusterIP + description: ClusterIP + - value: LoadBalancer + description: LoadBalancer + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: codeserver + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + default: 36107 + - variable: ingress + label: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + - variable: scaleCert + label: 'Use TrueNAS SCALE Certificate (Deprecated)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: int + $ref: + - "definitions/certificate" + - variable: envList + label: Codeserver Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: netshoot + label: Netshoot + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: envList + label: Netshoot Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: vpn + label: VPN + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + default: disabled + enum: + - value: disabled + description: disabled + - value: gluetun + description: Gluetun + - value: tailscale + description: Tailscale + - value: openvpn + description: OpenVPN (Deprecated) + - value: wireguard + description: Wireguard (Deprecated) + - variable: openvpn + label: OpenVPN Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "openvpn"]] + attrs: + - variable: username + label: Authentication Username (Optional) + description: Authentication Username, Optional + schema: + type: string + default: "" + - variable: password + label: Authentication Password + description: Authentication Credentials + schema: + type: string + show_if: [["username", "!=", ""]] + default: "" + required: true + - variable: tailscale + label: Tailscale Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "tailscale"]] + attrs: + - variable: authkey + label: Authentication Key + description: Provide an auth key to automatically authenticate the node as your user account. + schema: + type: string + private: true + default: "" + - variable: auth_once + label: Auth Once + description: Only attempt to log in if not already logged in. + schema: + type: boolean + default: true + - variable: accept_dns + label: Accept DNS + description: Accept DNS configuration from the admin console. + schema: + type: boolean + default: false + - variable: userspace + label: Userspace + description: Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device. + schema: + type: boolean + default: false + - variable: routes + label: Routes + description: Expose physical subnet routes to your entire Tailscale network. + schema: + type: string + default: "" + - variable: dest_ip + label: Destination IP + description: Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched. + schema: + type: string + default: "" + - variable: sock5_server + label: Sock5 Server + description: The address on which to listen for SOCKS5 proxying into the tailscale net. + schema: + type: string + default: "" + - variable: outbound_http_proxy_listen + label: Outbound HTTP Proxy Listen + description: The address on which to listen for HTTP proxying into the tailscale net. + schema: + type: string + default: "" + - variable: extra_args + label: Extra Args + description: Extra Args + schema: + type: string + default: "" + - variable: daemon_extra_args + label: Tailscale Daemon Extra Args + description: Tailscale Daemon Extra Args + schema: + type: string + default: "" + - variable: killSwitch + label: Enable Killswitch + schema: + type: boolean + show_if: [["type", "!=", "disabled"]] + default: true + - variable: excludedNetworks_IPv4 + label: Killswitch Excluded IPv4 networks + description: List of Killswitch Excluded IPv4 Addresses + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv4 + label: IPv4 Network + schema: + type: string + required: true + - variable: excludedNetworks_IPv6 + label: Killswitch Excluded IPv6 networks + description: "List of Killswitch Excluded IPv6 Addresses" + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv6 + label: IPv6 Network + schema: + type: string + required: true + - variable: configFile + label: VPN Config File Location + schema: + type: string + show_if: [["type", "!=", "disabled"]] + default: "" + + - variable: envList + label: VPN Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + max_length: 10240 + + - variable: docs + group: Documentation + label: Please read the documentation at https://truecharts.org + description: Please read the documentation at +
https://truecharts.org + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDocs + label: I have checked the documentation + schema: + type: boolean + default: true + - variable: donateNag + group: Documentation + label: Please consider supporting TrueCharts, see https://truecharts.org/sponsor + description: Please consider supporting TrueCharts, see +
https://truecharts.org/sponsor + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDonate + label: I have considered donating + schema: + type: boolean + default: true + hidden: true + diff --git a/stable/firefox/14.0.15/templates/NOTES.txt b/stable/firefox/14.0.15/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/firefox/14.0.15/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/firefox/14.0.15/templates/common.yaml b/stable/firefox/14.0.15/templates/common.yaml new file mode 100644 index 0000000000..b51394e00a --- /dev/null +++ b/stable/firefox/14.0.15/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} diff --git a/stable/firefox/14.0.15/values.yaml b/stable/firefox/14.0.15/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/firefox/app_versions.json b/stable/firefox/app_versions.json index 6f65857338..af2f3c4a75 100644 --- a/stable/firefox/app_versions.json +++ b/stable/firefox/app_versions.json @@ -1,4 +1,5297 @@ { + "14.0.15": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/firefox/14.0.15", + "last_update": "2024-09-17 12:35:14", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "128.0.3_14.0.15", + "version": "14.0.15", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "browser", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "128.0.3", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation.", + "home": "https://truecharts.org/charts/stable/firefox", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/firefox.webp", + "keywords": [ + "firefox", + "browser" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "firefox", + "sources": [ + "https://ghcr.io/linuxserver/firefox", + "https://github.com/linuxserver/docker-firefox", + "https://github.com/truecharts/charts/tree/master/charts/stable/firefox" + ], + "type": "application", + "version": "14.0.15" + }, + "app_metadata": null, + "schema": { + "groups": [ + { + "name": "Image", + "description": "Configured the images to be used for the Chart.\nIt's wise to use \"digest pinned\" tags and to avoid using \"latest\".\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/#images\n" + }, + { + "name": "General", + "description": "For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general.\n\nCheckout the following documentation for more information:\n - https://truecharts.org/common/global/\n - https://truecharts.org/common/#tz\n - https://truecharts.org/common/podoptions/\n - Image Pull Secrets\n" + }, + { + "name": "Workload", + "description": "These settings configure how the actual Pods and containers are running.\nGenerally, on SCALE, we only expose a limited subset of these settings for the primary workload and container.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/workload/\n- https://truecharts.org/common/container/\n" + }, + { + "name": "App Configuration", + "description": "Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application.\nMost options should have a Tooltip (Circled Question Mark) to further describe said option.\n\nTo find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/\n" + }, + { + "name": "Services", + "description": "Service and Networking options for any applications are contained here.\nSome applications may have complicated networking setups with multiple options or some may have no options here at all.\n\nOptions here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/service/\n" + }, + { + "name": "Networking", + "description": "Contains advanced networking options that are not actively supported by the TrueCharts team.\nCurrently only contains scaleExternalInterfaces.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/scaleexternalinterface/\n" + }, + { + "name": "Persistence", + "description": "Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types.\nThis storage is called Persistence since it is not deleted upon restart or upgrade of an application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/\n- https://truecharts.org/scale/guides/nfs-share/\n- https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath\n" + }, + { + "name": "Ingress", + "description": "Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names).\nIf you choose to enable this you must have a \"Ingress Provider\" aka \"Reverse Proxy\" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/)\nIt also requiresa DNS service to actually resolve the DNS name of the FQDN specified.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/ingress/\n" + }, + { + "name": "SecurityContext", + "description": "The security settings for each application and/or permissions that each application may have for the files/directories created.\nEach application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities.\n\nUnless necessary users are advised to keep this section mostly to defaults.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/securitycontext/\n" + }, + { + "name": "Resources", + "description": "Resources limits that have been defined by each application are in this section.\nMost will have a specific default that some users may want to change based on their specific hardware or needs.\n\nThis also contains the options to mount GPUs or, more precisely, \"request\" GPU's to be mounted.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/resources/\n" + }, + { + "name": "Devices", + "description": "These are special \"mountpoints\" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts.\nFor clearity we've decided to seperate this from persistence on SCALE.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/device/\n- https://truecharts.org/scale/guides/pci-passthrough/\n" + }, + { + "name": "Middlewares", + "description": "Traefik Middlewares" + }, + { + "name": "StorageClass", + "description": "StorageClasses define where to storage Storage.\n\nCheckout the following documentation for more information:\n" + }, + { + "name": "Metrics", + "description": "Contains options to configure Prometheus metrics for the application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/metrics/\n" + }, + { + "name": "Addons", + "description": "Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application\u2019s defaults.\nThings included here are VPN addons, Codeserver for editing files inside the application\u2019s container, Netshoot for network troubelshooting, etc.\n\nGenerally not required for use but may be necessary or usefull at times for specific applications.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/addons/\n- https://truecharts.org/scale/guides/vpn-setup/\n" + }, + { + "name": "Experimental", + "description": "Experimental Configuration Options\nOften these are not fully flushed-out, could randomly break or might not work at-all.\n" + }, + { + "name": "Postgresql", + "description": "For Postgresql we use \"CloudNative-PG\" as a backend, which has to be installed first.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/cnpg/\n- https://truecharts.org/scale/guides/sql-export/\n- https://truecharts.org/scale/guides/recover-cnpg/\n" + }, + { + "name": "Dependencies", + "description": "contains dependency setting for which we, currently, do not have seperate catagories (yet)\n" + }, + { + "name": "Documentation", + "description": "We added this section to make everyone aware that OpenSource isn't always easy.\nIt doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects.\n\nBefore installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/\nWe would also advice going over our https://truecharts.org/scale/guides/scale-intro/\nand many of the other documentation pages...\n" + } + ], + "portals": { + "open": { + "protocols": [ + "$kubernetes-resource_configmap_tcportal-open_protocol" + ], + "host": [ + "$kubernetes-resource_configmap_tcportal-open_host" + ], + "ports": [ + "$kubernetes-resource_configmap_tcportal-open_port" + ] + } + }, + "questions": [ + { + "variable": "global", + "group": "General", + "label": "Global Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "stopAll", + "label": "Stop All", + "description": "Stops All Running pods and hibernates cnpg", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + }, + { + "variable": "credentialsList", + "group": "General", + "label": "Credentials (Experimental)", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "credentialsEntry", + "label": "Enter Credentials", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "type", + "label": "Type", + "description": "Type of Credential", + "schema": { + "type": "string", + "default": "s3", + "enum": [ + { + "value": "s3", + "description": "s3 Storage" + } + ] + } + }, + { + "variable": "url", + "label": "url", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "path", + "label": "path", + "description": "Path Prefix not needed for most cases", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "bucket", + "label": "bucket", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "accessKey", + "label": "accessKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "secretKey", + "label": "secretKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "encrKey", + "label": "encrKey", + "description": "The Encryption key is needed for tools like volsync if not needed it will be ignored", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "MYSECRETPASSPHRASE", + "required": true + } + } + ] + } + } + ] + } + }, + { + "variable": "workload", + "group": "Workload", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type (Advanced)", + "schema": { + "type": "string", + "default": "Deployment", + "enum": [ + { + "value": "Deployment", + "description": "Deployment" + }, + { + "value": "DaemonSet", + "description": "DaemonSet" + } + ] + } + }, + { + "variable": "replicas", + "label": "Replicas (Advanced)", + "description": "Set the number of Replicas", + "schema": { + "type": "int", + "show_if": [ + [ + "type", + "!=", + "DaemonSet" + ] + ], + "default": 1 + } + }, + { + "variable": "podSpec", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "containers", + "label": "Containers", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Container", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "env", + "label": "Image Environment", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "TITLE", + "label": "Title", + "description": "The page title displayed on the web browser", + "schema": { + "type": "string", + "default": "TrueChartVNC Client" + } + } + ] + } + }, + { + "variable": "envList", + "label": "Extra Environment Variables", + "description": "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting...", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string" + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "extraArgs", + "label": "Extra Args", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "arg", + "label": "Arg", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "command", + "label": "Command", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "param", + "label": "Param", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "TZ", + "label": "Timezone", + "group": "General", + "schema": { + "type": "string", + "default": "America/Los_Angeles", + "$ref": [ + "definitions/timezone" + ], + "enum": [ + { + "value": "Asia/Damascus", + "description": "'Asia/Damascus' timezone" + }, + { + "value": "Asia/Saigon", + "description": "'Asia/Saigon' timezone" + } + ] + } + }, + { + "variable": "podOptions", + "group": "General", + "label": "Global Pod Options (Advanced)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "expertPodOpts", + "label": "Expert - Pod Options", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hostNetwork", + "label": "Host Networking", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "dnsConfig", + "label": "DNS Configuration", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "options", + "label": "Options", + "schema": { + "type": "list", + "default": [ + { + "name": "ndots", + "value": "1" + } + ], + "items": [ + { + "variable": "optionsEntry", + "label": "Option Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "nameservers", + "label": "Nameservers", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "nsEntry", + "label": "Nameserver Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "searches", + "label": "Searches", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "searchEntry", + "label": "Search Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "imagePullSecretList", + "group": "General", + "label": "Image Pull Secrets", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pullsecretentry", + "label": "Pull Secret", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "data", + "label": "Data", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "registry", + "label": "Registry", + "schema": { + "type": "string", + "required": true, + "default": "https://index.docker.io/v1/" + } + }, + { + "variable": "username", + "label": "Username", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "schema": { + "type": "string", + "required": true, + "private": true, + "default": "" + } + }, + { + "variable": "email", + "label": "Email", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "service", + "group": "Services", + "label": "Configure Service(s)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Service", + "description": "The Primary service on which the Minecraft Server runs on", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "Service's Port(s) Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "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": 10131, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "scaleExternalInterface", + "description": "Add External Interfaces (Experimental, might change or be removed without further notice)", + "label": "Add external Interfaces (Experimental)", + "group": "Networking", + "schema": { + "type": "list", + "items": [ + { + "variable": "interfaceConfiguration", + "description": "Interface Configuration", + "label": "Interface Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "$ref": [ + "normalize/interfaceConfiguration" + ], + "attrs": [ + { + "variable": "hostInterface", + "description": "Please Specify Host Interface", + "label": "Host Interface", + "schema": { + "type": "string", + "required": true, + "$ref": [ + "definitions/interface" + ], + "enum": [] + } + }, + { + "variable": "ipam", + "description": "Define how IP Address will be managed", + "label": "IP Address Management", + "schema": { + "additional_attrs": true, + "type": "dict", + "required": true, + "attrs": [ + { + "variable": "type", + "description": "Specify type for IPAM", + "label": "IPAM Type", + "schema": { + "type": "string", + "required": true, + "enum": [ + { + "value": "dhcp", + "description": "Use DHCP" + }, + { + "value": "static", + "description": "Use Static IP" + } + ] + } + }, + { + "variable": "staticIPConfigurations", + "label": "Static IP Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticIP", + "label": "Static IP", + "schema": { + "type": "ipaddr", + "cidr": true + } + } + ] + } + }, + { + "variable": "staticRoutes", + "label": "Static Routes", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticRouteConfiguration", + "label": "Static Route Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "destination", + "label": "Destination", + "schema": { + "type": "ipaddr", + "cidr": true, + "required": true + } + }, + { + "variable": "gateway", + "label": "Gateway", + "schema": { + "type": "ipaddr", + "cidr": false, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "serviceList", + "label": "Add Manual Custom Services", + "group": "Services", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "serviceListEntry", + "label": "Custom Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + }, + { + "value": "Simple", + "description": "Deprecated CHANGE THIS" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "advancedsvcset", + "label": "Show Advanced Service Settings", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "externalIPs", + "label": "External IP's", + "description": "External IP's", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "externalIP", + "label": "External IP", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "ipFamilyPolicy", + "label": "IP Family Policy", + "description": "Specify the IP Policy", + "schema": { + "type": "string", + "default": "SingleStack", + "enum": [ + { + "value": "SingleStack", + "description": "SingleStack" + }, + { + "value": "PreferDualStack", + "description": "PreferDualStack" + }, + { + "value": "RequireDualStack", + "description": "RequireDualStack" + } + ] + } + }, + { + "variable": "ipFamilies", + "label": "IP Families", + "description": "(Advanced) The IP Families that should be used", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipFamily", + "label": "IP Family", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "portsList", + "label": "Additional Service Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsListEntry", + "label": "Custom ports", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Port", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Port Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "protocol", + "label": "Port Type", + "schema": { + "type": "string", + "default": "tcp", + "enum": [ + { + "value": "http", + "description": "HTTP" + }, + { + "value": "https", + "description": "HTTPS" + }, + { + "value": "tcp", + "description": "TCP" + }, + { + "value": "udp", + "description": "UDP" + } + ] + } + }, + { + "variable": "targetPort", + "label": "Target Port", + "description": "This port exposes the container port on the service", + "schema": { + "type": "int", + "required": true + } + }, + { + "variable": "port", + "label": "Container Port", + "schema": { + "type": "int", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistence", + "label": "Integrated Persistent Storage", + "description": "Integrated Persistent Storage", + "group": "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": "pvc", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + }, + { + "value": "iscsi", + "description": "iSCSI Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "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" + } + ] + } + }, + { + "variable": "size", + "label": "Size quotum of Storage (Do NOT REDUCE after installation)", + "description": "This value can ONLY be INCREASED after the installation", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistenceList", + "label": "Additional App Storage", + "group": "Persistence", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "persistenceListEntry", + "label": "Custom Storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the storage", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Type of Storage", + "description": "Sets the persistence type, Anything other than PVC could break rollback!", + "schema": { + "type": "string", + "default": "hostPath", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "show_if": [ + [ + "type", + "=", + "hostPath" + ] + ], + "type": "hostpath" + } + }, + { + "variable": "mountPath", + "label": "Mount Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "type": "string", + "default": "", + "required": true, + "valid_chars": "^\\/([a-zA-Z0-9._-]+(\\s?[a-zA-Z0-9._-]+|\\/?))+$" + } + }, + { + "variable": "medium", + "label": "EmptyDir Medium", + "schema": { + "show_if": [ + [ + "type", + "=", + "emptyDir" + ] + ], + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "Memory", + "description": "Memory" + } + ] + } + }, + { + "variable": "size", + "label": "Size Quotum of Storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "", + "group": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name (Optional)", + "description": "Defaults to chart name", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description (Optional)", + "description": "Defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "icon", + "label": "Icon (Optional)", + "description": "Defaults to chart icon", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "widget", + "label": "Widget Settings", + "schema": { + "type": "dict", + "additional_attrs": true, + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "attrs": [ + { + "variable": "enabled", + "label": "Enable Widget", + "description": "When disabled all widget annotations are skipped.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "custom", + "label": "Options", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "key", + "label": "API-key (key)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "customkv", + "label": "Custom Options", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "option", + "label": "Option", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingressList", + "label": "Add Manual Custom Ingresses", + "group": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressListEntry", + "label": "Custom Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "ingressClassName", + "label": "IngressClass Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + }, + { + "variable": "overrideService", + "label": "Linked Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Service Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "port", + "label": "Service Port", + "schema": { + "type": "int" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Secret (Advanced)", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description", + "description": "defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "securityContext", + "group": "SecurityContext", + "label": "Security Context", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "container", + "label": "Container", + "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": "PUID", + "label": "Process User ID - PUID", + "description": "When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps", + "schema": { + "type": "int", + "show_if": [ + [ + "runAsUser", + "=", + 0 + ] + ], + "default": 568 + } + }, + { + "variable": "UMASK", + "label": "UMASK", + "description": "When supported by the container, this sets the UMASK for the App. Not supported by all Apps", + "schema": { + "type": "string", + "default": "0022" + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "privileged", + "label": "Privileged mode", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "readOnlyRootFilesystem", + "label": "ReadOnly Root Filesystem", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + }, + { + "variable": "pod", + "label": "Pod", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "fsGroupChangePolicy", + "label": "When should we take ownership?", + "schema": { + "type": "string", + "default": "OnRootMismatch", + "enum": [ + { + "value": "OnRootMismatch", + "description": "OnRootMismatch" + }, + { + "value": "Always", + "description": "Always" + } + ] + } + }, + { + "variable": "supplementalGroups", + "label": "Supplemental Groups", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "supplementalGroupsEntry", + "label": "Supplemental Group", + "schema": { + "type": "int" + } + } + ] + } + }, + { + "variable": "fsGroup", + "label": "fsGroup", + "description": "The group that should own ALL storage.", + "schema": { + "type": "int", + "default": 568 + } + } + ] + } + } + ] + } + }, + { + "variable": "resources", + "group": "Resources", + "label": "Resource Limits", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "limits", + "label": "Advanced Limit Resource Consumption", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "4000m", + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "8Gi", + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + }, + { + "variable": "gpu.intel.com/i915", + "label": "Add Intel i915 GPUs", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "nvidia.com/gpu", + "label": "Add NVIDIA GPUs (Experimental)", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "amd.com/gpu", + "label": "Add AMD GPUs", + "schema": { + "type": "int", + "default": 0 + } + } + ] + } + }, + { + "variable": "requests", + "label": "Minimum Resources Required (request)", + "schema": { + "additional_attrs": true, + "type": "dict", + "hidden": true, + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "10m", + "hidden": true, + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "50Mi", + "hidden": true, + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + } + ] + } + } + ] + } + }, + { + "variable": "deviceList", + "label": "Mount USB Devices", + "group": "Devices", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "deviceListEntry", + "label": "Device", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Storage", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "type", + "label": "(Advanced) Type of Storage", + "description": "Sets the persistence type", + "schema": { + "type": "string", + "default": "device", + "hidden": true + } + }, + { + "variable": "readOnly", + "label": "readOnly", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Device Path", + "description": "Path to the device on the host system", + "schema": { + "type": "path" + } + }, + { + "variable": "mountPath", + "label": "Container Device Path", + "description": "Path inside the container the device is mounted", + "schema": { + "type": "string", + "default": "/dev/ttyACM0" + } + } + ] + } + } + ] + } + }, + { + "variable": "networkPolicy", + "group": "Experimental", + "label": "(Advanced) Network Policy", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "netPolicyEntry", + "label": "Network Policy Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "policyType", + "label": "Policy Type", + "schema": { + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "ingress", + "description": "Ingress" + }, + { + "value": "egress", + "description": "Egress" + }, + { + "value": "ingress-egress", + "description": "Ingress and Egress" + } + ] + } + }, + { + "variable": "egress", + "label": "Egress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "egressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "to", + "label": "To", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "toEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "from", + "label": "From", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "fromEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "addons", + "group": "Addons", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "Codeserver", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "service", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "NodePort", + "description": "Deprecated CHANGE THIS" + }, + { + "value": "ClusterIP", + "description": "ClusterIP" + }, + { + "value": "LoadBalancer", + "description": "LoadBalancer" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int", + "default": 36107 + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "scaleCert", + "label": "Use TrueNAS SCALE Certificate (Deprecated)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "int", + "$ref": [ + "definitions/certificate" + ], + "enum": [ + { + "value": null, + "description": "No Certificate" + } + ], + "default": null, + "null": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "envList", + "label": "Codeserver Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "netshoot", + "label": "Netshoot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "envList", + "label": "Netshoot Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "vpn", + "label": "VPN", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "gluetun", + "description": "Gluetun" + }, + { + "value": "tailscale", + "description": "Tailscale" + }, + { + "value": "openvpn", + "description": "OpenVPN (Deprecated)" + }, + { + "value": "wireguard", + "description": "Wireguard (Deprecated)" + } + ] + } + }, + { + "variable": "openvpn", + "label": "OpenVPN Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "openvpn" + ] + ], + "attrs": [ + { + "variable": "username", + "label": "Authentication Username (Optional)", + "description": "Authentication Username, Optional", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "Authentication Password", + "description": "Authentication Credentials", + "schema": { + "type": "string", + "show_if": [ + [ + "username", + "!=", + "" + ] + ], + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "tailscale", + "label": "Tailscale Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "tailscale" + ] + ], + "attrs": [ + { + "variable": "authkey", + "label": "Authentication Key", + "description": "Provide an auth key to automatically authenticate the node as your user account.", + "schema": { + "type": "string", + "private": true, + "default": "" + } + }, + { + "variable": "auth_once", + "label": "Auth Once", + "description": "Only attempt to log in if not already logged in.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "accept_dns", + "label": "Accept DNS", + "description": "Accept DNS configuration from the admin console.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "userspace", + "label": "Userspace", + "description": "Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "routes", + "label": "Routes", + "description": "Expose physical subnet routes to your entire Tailscale network.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "dest_ip", + "label": "Destination IP", + "description": "Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "sock5_server", + "label": "Sock5 Server", + "description": "The address on which to listen for SOCKS5 proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "outbound_http_proxy_listen", + "label": "Outbound HTTP Proxy Listen", + "description": "The address on which to listen for HTTP proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "extra_args", + "label": "Extra Args", + "description": "Extra Args", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "daemon_extra_args", + "label": "Tailscale Daemon Extra Args", + "description": "Tailscale Daemon Extra Args", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "killSwitch", + "label": "Enable Killswitch", + "schema": { + "type": "boolean", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": true + } + }, + { + "variable": "excludedNetworks_IPv4", + "label": "Killswitch Excluded IPv4 networks", + "description": "List of Killswitch Excluded IPv4 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv4", + "label": "IPv4 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "excludedNetworks_IPv6", + "label": "Killswitch Excluded IPv6 networks", + "description": "List of Killswitch Excluded IPv6 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv6", + "label": "IPv6 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "configFile", + "label": "VPN Config File Location", + "schema": { + "type": "string", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": "" + } + }, + { + "variable": "envList", + "label": "VPN Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true, + "max_length": 10240 + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "docs", + "group": "Documentation", + "label": "Please read the documentation at https://truecharts.org", + "description": "Please read the documentation at
https://truecharts.org", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDocs", + "label": "I have checked the documentation", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "donateNag", + "group": "Documentation", + "label": "Please consider supporting TrueCharts, see https://truecharts.org/sponsor", + "description": "Please consider supporting TrueCharts, see
https://truecharts.org/sponsor", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDonate", + "label": "I have considered donating", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + } + ] + } + } + ] + }, + "app_readme": "

a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation.

\n

This App is supplied by TrueCharts, for more information visit the manual: https://truecharts.org/charts/stable/firefox

\n
\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

", + "detailed_readme": "
\n

title: README

\n

General Info

\n

TrueCharts can be installed as both normal Helm Charts or as TrueNAS SCALE Apps.\nBoth solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible

\n

For more information about this Chart, please check the docs on the TrueCharts website

\n

This chart is not maintained by the upstream project and any issues with the chart should be raised here

\n

Installation

\n

Helm-Chart installation

\n

To install TrueCharts Helm charts using Helm, you can use our OCI Repository.

\n

helm install mychart oci://tccr.io/truecharts/CHARTNAME

\n

For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/

\n

TrueNAS SCALE Apps

\n

For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the quick-start guides for TrueNAS SCALE.

\n

Chart Specific Guides and information

\n

All our charts have dedicated documentation pages.\nThe documentation for this chart can be found here:\nhttps://truecharts.org/charts/stable/firefox

\n

Configuration Options

\n

Please note: For TrueNAS SCALE, only options available in the GUI are supported.\nHence most of these docs do not apply to TrueNAS SCALE

\n

To view the chart specific options, please view Values.yaml included in the chart.\nThe most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/firefox/values.yaml

\n

All our Charts use a shared \"common\" library chart that contains most of the templating and options.\nFor the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/

\n

For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml

\n

Support

\n\n
\n

Sponsor TrueCharts

\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

\n

All Rights Reserved - The TrueCharts Project

", + "changelog": "

for the complete changelog, please refer to the website

\n

Important:

" + }, "14.0.14": { "healthy": true, "supported": true, From f0596a6d38f1d0addbd4047adceb87fccf9a587f Mon Sep 17 00:00:00 2001 From: "Gao, Ruiyuan" <905370712@qq.com> Date: Mon, 30 Sep 2024 18:09:11 +0800 Subject: [PATCH 6/8] Create sync_gitea.yml --- .github/workflows/sync_gitea.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/sync_gitea.yml diff --git a/.github/workflows/sync_gitea.yml b/.github/workflows/sync_gitea.yml new file mode 100644 index 0000000000..d6bde947b9 --- /dev/null +++ b/.github/workflows/sync_gitea.yml @@ -0,0 +1,23 @@ +# This runs every day on 1801 UTC +on: + # schedule: + # - cron: '1 18 * * *' + push: + branches: + - main + # Allows manual workflow run (must in default branch to work) + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Sync gitea + uses: Yikun/hub-mirror-action@v1.4 + with: + src: github/flymin + dst: gitee/flyminnnnn + dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} + dst_token: ${{ secrets.GITEE_TOKEN }} + static_list: "truecharts_archive" + force_update: true From a64f675ee5700624aab1d5613f25e4d8f7c3fdb9 Mon Sep 17 00:00:00 2001 From: flymin <905370712@qq.com> Date: Tue, 8 Oct 2024 14:53:08 +0800 Subject: [PATCH 7/8] update action --- .github/workflows/sync_gitea.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync_gitea.yml b/.github/workflows/sync_gitea.yml index d6bde947b9..29fca1f5d0 100644 --- a/.github/workflows/sync_gitea.yml +++ b/.github/workflows/sync_gitea.yml @@ -1,7 +1,7 @@ # This runs every day on 1801 UTC on: - # schedule: - # - cron: '1 18 * * *' + schedule: + - cron: '30 18 * * *' push: branches: - main From 7c888bc20dc791a46e5d849eec9b1fd528f8ddf5 Mon Sep 17 00:00:00 2001 From: flymin <905370712@qq.com> Date: Wed, 18 Dec 2024 14:40:26 +0800 Subject: [PATCH 8/8] firefox 133.0.3 --- catalog.json | 8 +- stable/firefox/14.0.16/.helmignore | 32 + stable/firefox/14.0.16/CHANGELOG.md | 3 + stable/firefox/14.0.16/Chart.yaml | 34 + stable/firefox/14.0.16/README.md | 61 + stable/firefox/14.0.16/app-readme.md | 8 + .../firefox/14.0.16/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes stable/firefox/14.0.16/icon-small.webp | Bin 0 -> 704 bytes stable/firefox/14.0.16/icon.webp | Bin 0 -> 3684 bytes stable/firefox/14.0.16/ix_values.yaml | 41 + stable/firefox/14.0.16/questions.yaml | 3166 ++++++++++ stable/firefox/14.0.16/templates/NOTES.txt | 1 + stable/firefox/14.0.16/templates/common.yaml | 1 + stable/firefox/14.0.16/values.yaml | 0 stable/firefox/app_versions.json | 5293 +++++++++++++++++ 15 files changed, 8644 insertions(+), 4 deletions(-) create mode 100644 stable/firefox/14.0.16/.helmignore create mode 100644 stable/firefox/14.0.16/CHANGELOG.md create mode 100644 stable/firefox/14.0.16/Chart.yaml create mode 100644 stable/firefox/14.0.16/README.md create mode 100644 stable/firefox/14.0.16/app-readme.md create mode 100644 stable/firefox/14.0.16/charts/common-23.0.10.tgz create mode 100644 stable/firefox/14.0.16/icon-small.webp create mode 100644 stable/firefox/14.0.16/icon.webp create mode 100644 stable/firefox/14.0.16/ix_values.yaml create mode 100644 stable/firefox/14.0.16/questions.yaml create mode 100644 stable/firefox/14.0.16/templates/NOTES.txt create mode 100644 stable/firefox/14.0.16/templates/common.yaml create mode 100644 stable/firefox/14.0.16/values.yaml diff --git a/catalog.json b/catalog.json index dac15d7953..c24db7645c 100644 --- a/catalog.json +++ b/catalog.json @@ -7607,10 +7607,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/firefox", "location": "/home/runner/_work/catalog/catalog/stable/firefox", - "latest_version": "14.0.15", - "latest_app_version": "128.0.3", - "latest_human_version": "125.0.3_14.0.15", - "last_update": "2024-09-17 12:35:14", + "latest_version": "14.0.16", + "latest_app_version": "133.0.3", + "latest_human_version": "133.0.3_14.0.16", + "last_update": "2024-12-18 12:35:14", "name": "firefox", "recommended": false, "title": "Firefox", diff --git a/stable/firefox/14.0.16/.helmignore b/stable/firefox/14.0.16/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/firefox/14.0.16/.helmignore @@ -0,0 +1,32 @@ +# 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 +# docs folder +/docs +# icon +icon.png +icon.webp +icon-small.webp diff --git a/stable/firefox/14.0.16/CHANGELOG.md b/stable/firefox/14.0.16/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/firefox/14.0.16/CHANGELOG.md @@ -0,0 +1,3 @@ +*for the complete changelog, please refer to the website* + +**Important:** \ No newline at end of file diff --git a/stable/firefox/14.0.16/Chart.yaml b/stable/firefox/14.0.16/Chart.yaml new file mode 100644 index 0000000000..5c683b830b --- /dev/null +++ b/stable/firefox/14.0.16/Chart.yaml @@ -0,0 +1,34 @@ +annotations: + truecharts.org/category: browser + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 133.0.3 +dependencies: + - name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. +home: https://truecharts.org/charts/stable/firefox +icon: https://truecharts.org/img/hotlink-ok/chart-icons/firefox.webp +keywords: + - firefox + - browser +kubeVersion: '>=1.24.0-0' +maintainers: + - name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: firefox +sources: + - https://ghcr.io/linuxserver/firefox + - https://github.com/linuxserver/docker-firefox + - https://github.com/truecharts/charts/tree/master/charts/stable/firefox +type: application +version: 14.0.16 diff --git a/stable/firefox/14.0.16/README.md b/stable/firefox/14.0.16/README.md new file mode 100644 index 0000000000..b2a92e2db4 --- /dev/null +++ b/stable/firefox/14.0.16/README.md @@ -0,0 +1,61 @@ +--- +title: README +--- + +## General Info + +TrueCharts can be installed as both _normal_ Helm Charts or as TrueNAS SCALE Apps. +Both solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible + +For more information about this Chart, please check the docs on the TrueCharts [website](https://truecharts.org/charts/stable/firefox) + +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/charts/issues/new/choose)** + +## Installation + +### Helm-Chart installation + +To install TrueCharts Helm charts using Helm, you can use our OCI Repository. + +`helm install mychart oci://tccr.io/truecharts/CHARTNAME` + +For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/ + + +### TrueNAS SCALE Apps + +For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the [quick-start guides for TrueNAS SCALE](https://truecharts.org/scale). + +## Chart Specific Guides and information + +All our charts have dedicated documentation pages. +The documentation for this chart can be found here: +https://truecharts.org/charts/stable/firefox + +## Configuration Options + +Please note: For TrueNAS SCALE, only options available in the GUI are supported. +Hence most of these docs do not apply to TrueNAS SCALE + +To view the chart specific options, please view Values.yaml included in the chart. +The most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/firefox/values.yaml + +All our Charts use a shared "common" library chart that contains most of the templating and options. +For the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/ + +For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml + +## Support + +- See the [Website](https://truecharts.org) +- Check our [Discord](https://discord.gg/tVsPTHWTtr) +- Open a [issue](https://github.com/truecharts/charts/issues/new/choose) + +--- + +## Sponsor TrueCharts + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/general/sponsor) or contributing back to the project any way you can! + +_All Rights Reserved - The TrueCharts Project_ diff --git a/stable/firefox/14.0.16/app-readme.md b/stable/firefox/14.0.16/app-readme.md new file mode 100644 index 0000000000..06d4ce1422 --- /dev/null +++ b/stable/firefox/14.0.16/app-readme.md @@ -0,0 +1,8 @@ +a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation. + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/firefox](https://truecharts.org/charts/stable/firefox) + +--- + +TrueCharts can only exist due to the incredible effort of our staff. +Please consider making a [donation](https://truecharts.org/sponsor) or contributing back to the project any way you can! diff --git a/stable/firefox/14.0.16/charts/common-23.0.10.tgz b/stable/firefox/14.0.16/charts/common-23.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5eefcb329be559e54998b5f211021daca81c39ef GIT binary patch literal 96939 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 literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.16/icon-small.webp b/stable/firefox/14.0.16/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd3abc3018f1c0f8a061702ad64eeda485f820c4 GIT binary patch literal 704 zcmV;x0zdsyNk&Gv0ssJ4MM6+kP&il$0000G0000V0018V06|PpNDKi000Dq&+qSW1 z|Ndj6Q=61lo0^r)XRvLjGP<<3ZL_q^6MVXF5D^mqDcvS@!PNJe(wR6t5xqJw&}7Pm$Ka#@rCfZ4fpH`f0UB3&%F z8>MQK@u<6{>Cpkdx>1T2Ed&Q&h`Ek}ShL&X#~s(>G(pZRD1-Dqe0z;T%8TKk#0d0*Tb)d)T)n&>6L*bQuq zO0kcL@U2#mh<_+G3pFZYpyuXlU(niaNuEQ0ax=SrKsWY#kr~^#o2tV&FU(XNS8nkt zH&gQy-(+2tt?j=xV2tnuyA9<#slyhP{wm9ehlh$irlhObt;Lf(|IhNITHrHrqvd>^ mkdlwD@XhgQOK!i2PE1YJSB?u#z&%pOGb*UlYIp3_F+c!(@JV+7 literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.16/icon.webp b/stable/firefox/14.0.16/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..a4a8de69361787a5eb31eb70a737f4f587d9b3fc GIT binary patch literal 3684 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 Ci6ZI% literal 0 HcmV?d00001 diff --git a/stable/firefox/14.0.16/ix_values.yaml b/stable/firefox/14.0.16/ix_values.yaml new file mode 100644 index 0000000000..ace9679e6b --- /dev/null +++ b/stable/firefox/14.0.16/ix_values.yaml @@ -0,0 +1,41 @@ +image: + repository: ghcr.io/linuxserver/firefox + pullPolicy: IfNotPresent + tag: 133.0.3@sha256:95ed2b14929eee46dab9109602063cd85859d4bcab7167319cf12b5ec7a0034d +securityContext: + container: + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + runAsGroup: 0 +service: + main: + ports: + main: + protocol: http + port: 10131 +workload: + main: + podSpec: + containers: + main: + probes: + liveness: + type: http + readiness: + type: http + startup: + type: http + env: + FM_HOME: "/config" + CUSTOM_PORT: "{{ .Values.service.main.ports.main.port }}" + TITLE: "TrueChartVNC Client" +persistence: + config: + enabled: true + mountPath: /config + varrun: + enabled: false +portal: + open: + enabled: true diff --git a/stable/firefox/14.0.16/questions.yaml b/stable/firefox/14.0.16/questions.yaml new file mode 100644 index 0000000000..7c609a6dd2 --- /dev/null +++ b/stable/firefox/14.0.16/questions.yaml @@ -0,0 +1,3166 @@ +groups: + - name: Image + description: | + Configured the images to be used for the Chart. + It's wise to use "digest pinned" tags and to avoid using "latest". + + Checkout the following documentation for more information: + - https://truecharts.org/common/#images + + + - name: General + description: | + For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general. + + Checkout the following documentation for more information: + - https://truecharts.org/common/global/ + - https://truecharts.org/common/#tz + - https://truecharts.org/common/podoptions/ + - Image Pull Secrets + + + - name: Workload + description: | + These settings configure how the actual Pods and containers are running. + Generally, on SCALE, we only expose a limited subset of these settings for the primary workload and container. + + Checkout the following documentation for more information: + - https://truecharts.org/common/workload/ + - https://truecharts.org/common/container/ + + + - name: App Configuration + description: | + Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application. + Most options should have a Tooltip (Circled Question Mark) to further describe said option. + + To find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/ + + - name: Services + description: | + Service and Networking options for any applications are contained here. + Some applications may have complicated networking setups with multiple options or some may have no options here at all. + + Options here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes. + + Checkout the following documentation for more information: + - https://truecharts.org/common/service/ + + - name: Networking + description: | + Contains advanced networking options that are not actively supported by the TrueCharts team. + Currently only contains scaleExternalInterfaces. + + Checkout the following documentation for more information: + - https://truecharts.org/common/scaleexternalinterface/ + + - name: Persistence + description: | + Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types. + This storage is called Persistence since it is not deleted upon restart or upgrade of an application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/ + - https://truecharts.org/scale/guides/nfs-share/ + - https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath + + + - name: Ingress + description: | + Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names). + If you choose to enable this you must have a "Ingress Provider" aka "Reverse Proxy" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/) + It also requiresa DNS service to actually resolve the DNS name of the FQDN specified. + + Checkout the following documentation for more information: + - https://truecharts.org/common/ingress/ + + + - name: SecurityContext + description: | + The security settings for each application and/or permissions that each application may have for the files/directories created. + Each application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities. + + Unless necessary users are advised to keep this section mostly to defaults. + + Checkout the following documentation for more information: + - https://truecharts.org/common/securitycontext/ + + + - name: Resources + description: | + Resources limits that have been defined by each application are in this section. + Most will have a specific default that some users may want to change based on their specific hardware or needs. + + This also contains the options to mount GPUs or, more precisely, "request" GPU's to be mounted. + + Checkout the following documentation for more information: + - https://truecharts.org/common/resources/ + + - name: Devices + description: | + These are special "mountpoints" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts. + For clearity we've decided to seperate this from persistence on SCALE. + + Checkout the following documentation for more information: + - https://truecharts.org/common/persistence/device/ + - https://truecharts.org/scale/guides/pci-passthrough/ + + - name: Middlewares + description: Traefik Middlewares + + - name: StorageClass + description: | + StorageClasses define where to storage Storage. + + Checkout the following documentation for more information: + + - name: Metrics + description: | + Contains options to configure Prometheus metrics for the application. + + Checkout the following documentation for more information: + - https://truecharts.org/common/metrics/ + + + - name: Addons + description: | + Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application’s defaults. + Things included here are VPN addons, Codeserver for editing files inside the application’s container, Netshoot for network troubelshooting, etc. + + Generally not required for use but may be necessary or usefull at times for specific applications. + + Checkout the following documentation for more information: + - https://truecharts.org/common/addons/ + - https://truecharts.org/scale/guides/vpn-setup/ + + + - name: Experimental + description: | + Experimental Configuration Options + Often these are not fully flushed-out, could randomly break or might not work at-all. + + - name: Postgresql + description: | + For Postgresql we use "CloudNative-PG" as a backend, which has to be installed first. + + Checkout the following documentation for more information: + - https://truecharts.org/common/cnpg/ + - https://truecharts.org/scale/guides/sql-export/ + - https://truecharts.org/scale/guides/recover-cnpg/ + + - name: Dependencies + description: | + contains dependency setting for which we, currently, do not have seperate catagories (yet) + + + - name: Documentation + description: | + We added this section to make everyone aware that OpenSource isn't always easy. + It doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects. + + Before installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/ + We would also advice going over our https://truecharts.org/scale/guides/scale-intro/ + and many of the other documentation pages... + +portals: + open: + protocols: + - "$kubernetes-resource_configmap_tcportal-open_protocol" + host: + - "$kubernetes-resource_configmap_tcportal-open_host" + ports: + - "$kubernetes-resource_configmap_tcportal-open_port" + +questions: + - variable: global + group: General + label: "Global Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: stopAll + label: Stop All + description: "Stops All Running pods and hibernates cnpg" + schema: + type: boolean + default: false + + - variable: credentialsList + group: General + label: "Credentials (Experimental)" + schema: + type: list + default: [] + items: + - variable: credentialsEntry + label: "Enter Credentials" + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name" + schema: + type: string + required: true + default: "" + - variable: type + label: Type + description: "Type of Credential" + schema: + type: string + default: "s3" + enum: + - value: s3 + description: s3 Storage + - variable: url + label: "url" + schema: + type: string + default: "" + required: true + - variable: path + label: "path" + description: "Path Prefix not needed for most cases" + schema: + type: string + default: "" + - variable: bucket + label: "bucket" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: accessKey + label: "accessKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: secretKey + label: "secretKey" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "" + required: true + - variable: encrKey + label: "encrKey" + description: "The Encryption key is needed for tools like volsync if not needed it will be ignored" + schema: + show_if: [["type", "=", "s3"]] + type: string + default: "MYSECRETPASSPHRASE" + required: true + + - variable: workload + group: "Workload" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: type + label: Type (Advanced) + schema: + type: string + default: Deployment + enum: + - value: Deployment + description: Deployment + - value: DaemonSet + description: DaemonSet + + - variable: replicas + label: Replicas (Advanced) + description: Set the number of Replicas + schema: + type: int + show_if: [["type", "!=", "DaemonSet"]] + default: 1 + + - variable: podSpec + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: containers + label: Containers + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Container + schema: + additional_attrs: true + type: dict + attrs: + + - variable: env + label: Image Environment + schema: + additional_attrs: true + type: dict + attrs: + - variable: TITLE + label: Title + description: The page title displayed on the web browser + schema: + type: string + default: "TrueChartVNC Client" + - variable: envList + label: Extra Environment Variables + description: "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting..." + schema: + type: list + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + - variable: value + label: Value + schema: + type: string + - variable: extraArgs + label: Extra Args + schema: + type: list + default: [] + items: + - variable: arg + label: Arg + schema: + type: string + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: command + label: Command + schema: + type: list + default: [] + items: + - variable: param + label: Param + schema: + type: string + + - variable: TZ + label: Timezone + group: "General" + schema: + type: string + default: "Etc/UTC" + $ref: + - "definitions/timezone" + + - variable: podOptions + group: "General" + label: "Global Pod Options (Advanced)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: expertPodOpts + label: "Expert - Pod Options" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + label: "Host Networking" + schema: + type: boolean + default: false + - variable: dnsConfig + label: "DNS Configuration" + schema: + type: dict + additional_attrs: true + attrs: + - variable: options + label: "Options" + schema: + type: list + default: [{"name": "ndots", "value": "1"}] + items: + - variable: optionsEntry + label: "Option Entry" + schema: + type: dict + additional_attrs: true + attrs: + - variable: name + label: "Name" + schema: + type: string + required: true + - variable: value + label: "Value" + schema: + type: string + - variable: nameservers + label: "Nameservers" + schema: + type: list + default: [] + items: + - variable: nsEntry + label: "Nameserver Entry" + schema: + type: string + required: true + - variable: searches + label: "Searches" + schema: + type: list + default: [] + items: + - variable: searchEntry + label: "Search Entry" + schema: + type: string + required: true + + - variable: imagePullSecretList + group: "General" + label: "Image Pull Secrets" + schema: + type: list + default: [] + items: + - variable: pullsecretentry + label: "Pull Secret" + schema: + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: true + - variable: data + label: Data + schema: + type: dict + additional_attrs: true + attrs: + - variable: registry + label: "Registry" + schema: + type: string + required: true + default: "https://index.docker.io/v1/" + - variable: username + label: "Username" + schema: + type: string + required: true + default: "" + - variable: password + label: "Password" + schema: + type: string + required: true + private: true + default: "" + - variable: email + label: "Email" + schema: + type: string + required: true + default: "" + + - variable: service + group: Services + label: Configure Service(s) + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Service + description: The Primary service on which the Minecraft Server runs on + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Service + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "Service's Port(s) Configuration" + schema: + additional_attrs: true + type: dict + attrs: + + - 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: 10131 + required: true + - variable: scaleExternalInterface + description: 'Add External Interfaces (Experimental, might change or be removed without further notice)' + label: Add external Interfaces (Experimental) + group: Networking + schema: + type: list + items: + - variable: interfaceConfiguration + description: Interface Configuration + label: Interface Configuration + schema: + additional_attrs: true + type: dict + $ref: + - "normalize/interfaceConfiguration" + attrs: + - variable: hostInterface + description: Please Specify Host Interface + label: Host Interface + schema: + type: string + required: true + $ref: + - "definitions/interface" + - variable: ipam + description: Define how IP Address will be managed + label: IP Address Management + schema: + additional_attrs: true + type: dict + required: true + attrs: + - variable: type + description: Specify type for IPAM + label: IPAM Type + schema: + type: string + required: true + enum: + - value: dhcp + description: Use DHCP + - value: static + description: Use Static IP + - variable: staticIPConfigurations + label: Static IP Addresses + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticIP + label: Static IP + schema: + type: ipaddr + cidr: true + - variable: staticRoutes + label: Static Routes + schema: + type: list + show_if: [["type", "=", "static"]] + items: + - variable: staticRouteConfiguration + label: Static Route Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: destination + label: Destination + schema: + type: ipaddr + cidr: true + required: true + - variable: gateway + label: Gateway + schema: + type: ipaddr + cidr: false + required: true + + + - variable: serviceList + label: Add Manual Custom Services + group: Services + schema: + type: list + default: [] + items: + - variable: serviceListEntry + label: Custom Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the service + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: LoadBalancer + description: LoadBalancer (Expose Ports) + - value: ClusterIP + description: ClusterIP (Do Not Expose Ports) + - value: Simple + description: Deprecated CHANGE THIS + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: advancedsvcset + label: Show Advanced Service Settings + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: externalIPs + label: "External IP's" + description: "External IP's" + schema: + type: list + default: [] + items: + - variable: externalIP + label: External IP + schema: + type: string + - variable: ipFamilyPolicy + label: IP Family Policy + description: Specify the IP Policy + schema: + type: string + default: SingleStack + enum: + - value: SingleStack + description: SingleStack + - value: PreferDualStack + description: PreferDualStack + - value: RequireDualStack + description: RequireDualStack + - variable: ipFamilies + label: IP Families + description: (Advanced) The IP Families that should be used + schema: + type: list + default: [] + items: + - variable: ipFamily + label: IP Family + schema: + type: string + - variable: portsList + label: Additional Service Ports + schema: + type: list + default: [] + items: + - variable: portsListEntry + label: Custom ports + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Port + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Port Name + schema: + type: string + default: "" + - variable: protocol + label: Port Type + schema: + type: string + default: tcp + enum: + - value: http + description: HTTP + - value: https + description: HTTPS + - value: tcp + description: TCP + - value: udp + description: UDP + - variable: targetPort + label: Target Port + description: This port exposes the container port on the service + schema: + type: int + required: true + - variable: port + label: Container Port + schema: + type: int + required: true + + - variable: persistence + label: Integrated Persistent Storage + description: Integrated Persistent Storage + group: 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: pvc + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - value: iscsi + description: iSCSI Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + 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 + - variable: size + label: Size quotum of Storage (Do NOT REDUCE after installation) + description: This value can ONLY be INCREASED after the installation + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: disabled + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: persistenceList + label: Additional App Storage + group: Persistence + schema: + type: list + default: [] + items: + - variable: persistenceListEntry + label: Custom Storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the storage + schema: + type: boolean + default: true + hidden: true + - variable: type + label: Type of Storage + description: Sets the persistence type, Anything other than PVC could break rollback! + schema: + type: string + default: hostPath + enum: + - value: pvc + description: PVC + - value: hostPath + description: Host Path + - value: emptyDir + description: emptyDir + - value: nfs + description: NFS Share + - variable: server + label: NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: path + label: Path on NFS Server + schema: + show_if: [["type", "=", "nfs"]] + type: string + default: "" + - variable: iscsi + label: iSCSI Options + schema: + show_if: [["type", "=", "iscsi"]] + type: dict + additional_attrs: true + attrs: + - variable: targetPortal + label: targetPortal + schema: + type: string + required: true + default: "" + - variable: iqn + label: iqn + schema: + type: string + required: true + default: "" + - variable: lun + label: lun + schema: + type: int + default: 0 + - variable: authSession + label: authSession + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: authDiscovery + label: authDiscovery + schema: + type: dict + additional_attrs: true + attrs: + - variable: username + label: username + schema: + type: string + default: "" + - variable: password + label: password + schema: + type: string + default: "" + - variable: usernameInitiator + label: usernameInitiator + schema: + type: string + default: "" + - variable: passwordInitiator + label: passwordInitiator + schema: + type: string + default: "" + - variable: autoPermissions + label: Automatic Permissions Configuration + description: Automatically set permissions + schema: + show_if: [["type", "!=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: chown + label: Run CHOWN + description: | + It will run CHOWN on the path with the given fsGroup + schema: + type: boolean + default: false + - variable: chmod + label: Run CHMOD + description: | + It will run CHMOD on the path with the given value
+ Format should be 3 digits, e.g. 770 + schema: + type: string + valid_chars: '[0-9]{3}' + default: "" + - variable: recursive + label: Recursive + description: | + It will run CHOWN and CHMOD recursively + schema: + type: boolean + default: false + - variable: readOnly + label: Read Only + schema: + type: boolean + default: false + - variable: hostPath + label: Host Path + description: Path inside the container the storage is mounted + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: mountPath + label: Mount Path + description: Path inside the container the storage is mounted + schema: + type: string + default: "" + required: true + valid_chars: '^\/([a-zA-Z0-9._-]+(\s?[a-zA-Z0-9._-]+|\/?))+$' + - variable: medium + label: EmptyDir Medium + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: Default + - value: Memory + description: Memory + - variable: size + label: Size Quotum of Storage + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: 256Gi + - variable: storageClass + label: 'storageClass (Advanced)' + description: 'sets the storageClass to something other than iX default. Only for advanced usecases!' + schema: + show_if: [["type", "=", "pvc"]] + type: string + default: "" + - variable: volsync + label: 'VolSync (Experimental)' + description: Backup, Restore and Synchronise PVC storage + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: VolSyncEntry + label: VolSync Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: "Name of backup configuration" + schema: + type: string + default: "" + required: true + - variable: type + label: Type VolSync/Backup + description: Sets the VolSync Type + schema: + type: string + default: "restic" + enum: + - value: restic + description: Restic + - variable: credentials + label: Credentials + description: "Name of credentials in the credentials section" + schema: + type: string + default: "" + required: true + - variable: dest + label: VolSync Destination (Restore) + description: VolSYnc Destination is the location where data is the reciever and configures recovery of backups + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: src + label: VolSync Source (Backup) + description: VolSYnc Source is the location where data is the sender and creates backups to storage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: true + - variable: static + label: 'Static Fixed PVC Bindings (Experimental)' + description: Link a PVC to a specific storage location + schema: + show_if: [["type", "=", "pvc"]] + type: dict + additional_attrs: true + attrs: + - variable: mode + label: mode + description: | + disabled: use normal dynamic PVCs + smb: connect to an SMB share + nfs: connect to an NFS share + schema: + type: string + default: "disabled" + enum: + - value: "disabled" + description: disabled + - value: smb + description: smb + - value: nfs + description: nfs + - variable: server + label: Server + description: server to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "myserver" + - variable: share + label: Share + description: share to connect to + schema: + type: string + show_if: [["mode", "!=", "disabled"]] + default: "/myshare" + - variable: user + label: User + description: connecting user + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "myuser" + - variable: domain + label: Domain + description: user domain + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: password + label: Password + description: connecting password + schema: + type: string + show_if: [["mode", "=", "smb"]] + default: "" + - variable: volumeSnapshots + label: 'Volume Snapshots (Experimental)' + description: Add an entry to the list to force creation of a volumeSnapshot of this PVC + schema: + show_if: [["type", "=", "pvc"]] + type: list + default: [] + items: + - variable: volumeSnapshotEntry + label: Custom volumeSnapshot + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + description: 'WARNING: renaming this, means deletion of the snapshot with the old name!' + schema: + type: string + default: "mysnapshot" + required: true + - variable: volumeSnapshotClassName + label: 'volumeSnapshot Class Name (Advanced)' + description: For use with PVCs using a non-default storageClass + schema: + type: string + default: "" + + - variable: ingress + label: "" + group: Ingress + schema: + additional_attrs: true + type: dict + attrs: + + - variable: main + label: Main Ingress + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name (Optional) + description: Defaults to chart name + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description (Optional) + description: Defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: icon + label: Icon (Optional) + description: Defaults to chart icon + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + - variable: widget + label: Widget Settings + schema: + type: dict + additional_attrs: true + show_if: [["enabled", "=", true]] + attrs: + - variable: enabled + label: Enable Widget + description: When disabled all widget annotations are skipped. + schema: + type: boolean + default: true + - variable: custom + label: Options + schema: + type: dict + additional_attrs: true + attrs: + - variable: key + label: API-key (key) + schema: + type: string + default: "" + - variable: customkv + label: Custom Options + schema: + type: list + default: [] + items: + - variable: option + label: Option + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + default: "" + required: true + - variable: value + label: Value + schema: + type: string + default: "" + required: true + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + + - variable: ingressList + label: Add Manual Custom Ingresses + group: Ingress + schema: + type: list + default: [] + items: + - variable: ingressListEntry + label: Custom Ingress + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: true + hidden: true + - variable: name + label: Name + schema: + type: string + default: "" + - variable: ingressClassName + label: IngressClass Name + schema: + type: string + default: "" + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: overrideService + label: Linked Service + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Service Name + schema: + type: string + default: "" + - variable: port + label: Service Port + schema: + type: int + - variable: tls + label: TLS-Settings + schema: + type: list + default: [] + show_if: [["certificateIssuer", "=", ""]] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: Use Custom Secret (Advanced) + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: "Allow Cross Origin Requests" + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: namespace + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: homepage + label: Homepage + description: Connect ingress with Homepage + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: name + label: Name + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: description + label: Description + description: defaults to chart description + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: group + label: Group + schema: + type: string + required: true + default: "default" + show_if: [["enabled", "=", true]] + + - variable: securityContext + group: SecurityContext + label: Security Context + schema: + additional_attrs: true + type: dict + attrs: + - variable: container + label: Container + schema: + additional_attrs: true + type: dict + attrs: + # Settings from questions.yaml get appended here on a per-app basis + + - 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 + # Settings from questions.yaml get appended here on a per-app basis + - variable: PUID + label: Process User ID - PUID + description: When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps + schema: + type: int + show_if: [["runAsUser", "=", 0]] + default: 568 + - variable: UMASK + label: UMASK + description: When supported by the container, this sets the UMASK for the App. Not supported by all Apps + schema: + type: string + default: "0022" + + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: true + + - variable: pod + label: Pod + schema: + additional_attrs: true + type: dict + attrs: + - variable: fsGroupChangePolicy + label: "When should we take ownership?" + schema: + type: string + default: OnRootMismatch + enum: + - value: OnRootMismatch + description: OnRootMismatch + - value: Always + description: Always + - variable: supplementalGroups + label: Supplemental Groups + schema: + type: list + default: [] + items: + - variable: supplementalGroupsEntry + label: Supplemental Group + schema: + type: int + # Settings from questions.yaml get appended here on a per-app basis + + - variable: fsGroup + label: fsGroup + description: The group that should own ALL storage. + schema: + type: int + default: 568 + - variable: resources + group: Resources + label: "Resource Limits" + schema: + additional_attrs: true + type: dict + attrs: + - variable: limits + label: Advanced Limit Resource Consumption + schema: + additional_attrs: true + type: dict + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 4000m + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: RAM + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 8Gi + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: 'gpu.intel.com/i915' + label: Add Intel i915 GPUs + schema: + type: int + default: 0 + - variable: 'nvidia.com/gpu' + label: Add NVIDIA GPUs (Experimental) + schema: + type: int + default: 0 + - variable: 'amd.com/gpu' + label: Add AMD GPUs + schema: + type: int + default: 0 + - variable: requests + label: "Minimum Resources Required (request)" + schema: + additional_attrs: true + type: dict + hidden: true + attrs: + - variable: cpu + label: CPU + description: "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 10m + hidden: true + valid_chars: '^(?!^0(\.0|m|)$)([0-9]+)(\.[0-9]|m?)$' + - variable: memory + label: "RAM" + description: "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation" + schema: + type: string + default: 50Mi + hidden: true + valid_chars: '^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$' + - variable: deviceList + label: Mount USB Devices + group: Devices + schema: + type: list + default: [] + items: + - variable: deviceListEntry + label: Device + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable the Storage + schema: + type: boolean + default: true + - variable: type + label: (Advanced) Type of Storage + description: Sets the persistence type + schema: + type: string + default: device + hidden: true + - variable: readOnly + label: readOnly + schema: + type: boolean + default: false + - variable: hostPath + label: Host Device Path + description: Path to the device on the host system + schema: + type: path + - variable: mountPath + label: Container Device Path + description: Path inside the container the device is mounted + schema: + type: string + default: "/dev/ttyACM0" + +# - variable: horizontalPodAutoscaler +# group: Experimental +# label: (Advanced) Horizontal Pod Autoscaler +# schema: +# type: list +# default: [] +# items: +# - variable: hpaEntry +# label: HPA Entry +# schema: +# additional_attrs: true +# type: dict +# attrs: +# - variable: name +# label: Name +# schema: +# type: string +# required: true +# default: "" +# - variable: enabled +# label: Enabled +# schema: +# type: boolean +# default: false +# show_subquestions_if: true +# subquestions: +# - variable: target +# label: Target +# description: Deployment name, Defaults to Main Deployment +# schema: +# type: string +# default: "" +# - variable: minReplicas +# label: Minimum Replicas +# schema: +# type: int +# default: 1 +# - variable: maxReplicas +# label: Maximum Replicas +# schema: +# type: int +# default: 5 +# - variable: targetCPUUtilizationPercentage +# label: Target CPU Utilization Percentage +# schema: +# type: int +# default: 80 +# - variable: targetMemoryUtilizationPercentage +# label: Target Memory Utilization Percentage +# schema: +# type: int +# default: 80 + - variable: networkPolicy + group: Experimental + label: (Advanced) Network Policy + schema: + type: list + default: [] + items: + - variable: netPolicyEntry + label: Network Policy Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + default: "" + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: policyType + label: Policy Type + schema: + type: string + default: "" + enum: + - value: "" + description: Default + - value: ingress + description: Ingress + - value: egress + description: Egress + - value: ingress-egress + description: Ingress and Egress + - variable: egress + label: Egress + schema: + type: list + default: [] + items: + - variable: egressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: to + label: To + schema: + type: list + default: [] + items: + - variable: toEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + - variable: ingress + label: Ingress + schema: + type: list + default: [] + items: + - variable: ingressEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: from + label: From + schema: + type: list + default: [] + items: + - variable: fromEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: ipBlock + label: IP Block + schema: + additional_attrs: true + type: dict + attrs: + - variable: cidr + label: CIDR + schema: + type: string + default: "" + - variable: except + label: Except + schema: + type: list + default: [] + items: + - variable: exceptint + label: "" + schema: + type: string + - variable: namespaceSelector + label: Namespace Selector + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: podSelector + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: matchExpressions + label: Match Expressions + schema: + type: list + default: [] + items: + - variable: expressionEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: key + label: Key + schema: + type: string + - variable: operator + label: Operator + schema: + type: string + default: TCP + enum: + - value: In + description: In + - value: NotIn + description: NotIn + - value: Exists + description: Exists + - value: DoesNotExist + description: DoesNotExist + - variable: values + label: Values + schema: + type: list + default: [] + items: + - variable: value + label: "" + schema: + type: string + - variable: ports + label: Ports + schema: + type: list + default: [] + items: + - variable: portsEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + - variable: endPort + label: End Port + schema: + type: int + - variable: protocol + label: Protocol + schema: + type: string + default: TCP + enum: + - value: TCP + description: TCP + - value: UDP + description: UDP + - value: SCTP + description: SCTP + + - variable: addons + group: Addons + label: "" + schema: + additional_attrs: true + type: dict + attrs: + + - variable: codeserver + label: Codeserver + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: service + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Service Type + description: "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer" + schema: + type: string + default: LoadBalancer + enum: + - value: NodePort + description: Deprecated CHANGE THIS + - value: ClusterIP + description: ClusterIP + - value: LoadBalancer + description: LoadBalancer + - variable: loadBalancerIP + label: LoadBalancer IP + description: "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB" + schema: + show_if: [["type", "=", "LoadBalancer"]] + type: string + default: "" + - variable: ports + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: codeserver + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: Port + schema: + type: int + default: 36107 + - variable: ingress + label: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Ingress + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hosts + label: Hosts + schema: + type: list + default: [] + items: + - variable: hostEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: host + label: HostName + schema: + type: string + default: "" + required: true + - variable: paths + label: Paths + schema: + type: list + default: [{path: "/", pathType: "Prefix"}] + items: + - variable: pathEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: path + label: Path + schema: + type: string + required: true + default: "/" + - variable: pathType + label: Path Type + schema: + type: string + required: true + default: Prefix + - variable: integrations + label: Integrations + description: Connect ingress with other charts + schema: + additional_attrs: true + type: dict + attrs: + - variable: traefik + label: Traefik + description: Connect ingress with Traefik + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: true + - variable: allowCors + label: 'Allow Cross Origin Requests (advanced)' + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + - variable: entrypoints + label: Entrypoints + schema: + type: list + default: ["websecure"] + show_if: [["enabled", "=", true]] + items: + - variable: entrypoint + label: Entrypoint + schema: + type: string + - variable: middlewares + label: Middlewares + schema: + type: list + default: [] + show_if: [["enabled", "=", true]] + items: + - variable: middleware + label: Middleware + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: name + schema: + type: string + default: "" + required: true + - variable: namespace + label: 'namespace (optional)' + schema: + type: string + default: "" + - variable: certManager + label: certManager + description: Connect ingress with certManager + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: enabled + schema: + type: boolean + default: false + - variable: certificateIssuer + label: certificateIssuer + description: defaults to chartname + schema: + type: string + default: "" + show_if: [["enabled", "=", true]] + - variable: advanced + label: Show Advanced Settings + description: Advanced settings are not covered by TrueCharts Support + schema: + type: boolean + default: false + - variable: ingressClassName + label: (Advanced/Optional) IngressClass Name + schema: + type: string + show_if: [["advanced", "=", true]] + default: "" + - variable: tls + label: TLS-Settings + schema: + type: list + show_if: [["advanced", "=", true]] + default: [] + items: + - variable: tlsEntry + label: Host + schema: + additional_attrs: true + type: dict + attrs: + - variable: hosts + label: Certificate Hosts + schema: + type: list + default: [] + items: + - variable: host + label: Host + schema: + type: string + default: "" + required: true + + - variable: certificateIssuer + label: Use Cert-Manager clusterIssuer + description: 'add the name of your cert-manager clusterIssuer here for automatic tls certificates.' + schema: + type: string + default: "" + - variable: clusterCertificate + label: 'Cluster Certificate (Advanced)' + description: 'Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.' + schema: + type: string + show_if: [["certificateIssuer", "=", ""]] + default: "" + - variable: secretName + label: 'Use Custom Certificate Secret (Advanced)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: string + default: "" + - variable: scaleCert + label: 'Use TrueNAS SCALE Certificate (Deprecated)' + schema: + show_if: [["certificateIssuer", "=", ""]] + type: int + $ref: + - "definitions/certificate" + - variable: envList + label: Codeserver Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: netshoot + label: Netshoot + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: envList + label: Netshoot Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: vpn + label: VPN + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + default: disabled + enum: + - value: disabled + description: disabled + - value: gluetun + description: Gluetun + - value: tailscale + description: Tailscale + - value: openvpn + description: OpenVPN (Deprecated) + - value: wireguard + description: Wireguard (Deprecated) + - variable: openvpn + label: OpenVPN Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "openvpn"]] + attrs: + - variable: username + label: Authentication Username (Optional) + description: Authentication Username, Optional + schema: + type: string + default: "" + - variable: password + label: Authentication Password + description: Authentication Credentials + schema: + type: string + show_if: [["username", "!=", ""]] + default: "" + required: true + - variable: tailscale + label: Tailscale Settings + schema: + additional_attrs: true + type: dict + show_if: [["type", "=", "tailscale"]] + attrs: + - variable: authkey + label: Authentication Key + description: Provide an auth key to automatically authenticate the node as your user account. + schema: + type: string + private: true + default: "" + - variable: auth_once + label: Auth Once + description: Only attempt to log in if not already logged in. + schema: + type: boolean + default: true + - variable: accept_dns + label: Accept DNS + description: Accept DNS configuration from the admin console. + schema: + type: boolean + default: false + - variable: userspace + label: Userspace + description: Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device. + schema: + type: boolean + default: false + - variable: routes + label: Routes + description: Expose physical subnet routes to your entire Tailscale network. + schema: + type: string + default: "" + - variable: dest_ip + label: Destination IP + description: Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched. + schema: + type: string + default: "" + - variable: sock5_server + label: Sock5 Server + description: The address on which to listen for SOCKS5 proxying into the tailscale net. + schema: + type: string + default: "" + - variable: outbound_http_proxy_listen + label: Outbound HTTP Proxy Listen + description: The address on which to listen for HTTP proxying into the tailscale net. + schema: + type: string + default: "" + - variable: extra_args + label: Extra Args + description: Extra Args + schema: + type: string + default: "" + - variable: daemon_extra_args + label: Tailscale Daemon Extra Args + description: Tailscale Daemon Extra Args + schema: + type: string + default: "" + - variable: killSwitch + label: Enable Killswitch + schema: + type: boolean + show_if: [["type", "!=", "disabled"]] + default: true + - variable: excludedNetworks_IPv4 + label: Killswitch Excluded IPv4 networks + description: List of Killswitch Excluded IPv4 Addresses + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv4 + label: IPv4 Network + schema: + type: string + required: true + - variable: excludedNetworks_IPv6 + label: Killswitch Excluded IPv6 networks + description: "List of Killswitch Excluded IPv6 Addresses" + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: networkv6 + label: IPv6 Network + schema: + type: string + required: true + - variable: configFile + label: VPN Config File Location + schema: + type: string + show_if: [["type", "!=", "disabled"]] + default: "" + + - variable: envList + label: VPN Environment Variables + schema: + type: list + show_if: [["type", "!=", "disabled"]] + default: [] + items: + - variable: envItem + label: Environment Variable + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + max_length: 10240 + + - variable: docs + group: Documentation + label: Please read the documentation at https://truecharts.org + description: Please read the documentation at +
https://truecharts.org + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDocs + label: I have checked the documentation + schema: + type: boolean + default: true + - variable: donateNag + group: Documentation + label: Please consider supporting TrueCharts, see https://truecharts.org/sponsor + description: Please consider supporting TrueCharts, see +
https://truecharts.org/sponsor + schema: + additional_attrs: true + type: dict + attrs: + - variable: confirmDonate + label: I have considered donating + schema: + type: boolean + default: true + hidden: true + diff --git a/stable/firefox/14.0.16/templates/NOTES.txt b/stable/firefox/14.0.16/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/firefox/14.0.16/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/firefox/14.0.16/templates/common.yaml b/stable/firefox/14.0.16/templates/common.yaml new file mode 100644 index 0000000000..b51394e00a --- /dev/null +++ b/stable/firefox/14.0.16/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} diff --git a/stable/firefox/14.0.16/values.yaml b/stable/firefox/14.0.16/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/firefox/app_versions.json b/stable/firefox/app_versions.json index af2f3c4a75..a843029678 100644 --- a/stable/firefox/app_versions.json +++ b/stable/firefox/app_versions.json @@ -1,4 +1,5297 @@ { + "14.0.16": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/firefox/14.0.16", + "last_update": "2024-12-18 12:35:14", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "133.0.3_14.0.16", + "version": "14.0.16", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "browser", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "133.0.3", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation.", + "home": "https://truecharts.org/charts/stable/firefox", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/firefox.webp", + "keywords": [ + "firefox", + "browser" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "firefox", + "sources": [ + "https://ghcr.io/linuxserver/firefox", + "https://github.com/linuxserver/docker-firefox", + "https://github.com/truecharts/charts/tree/master/charts/stable/firefox" + ], + "type": "application", + "version": "14.0.16" + }, + "app_metadata": null, + "schema": { + "groups": [ + { + "name": "Image", + "description": "Configured the images to be used for the Chart.\nIt's wise to use \"digest pinned\" tags and to avoid using \"latest\".\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/#images\n" + }, + { + "name": "General", + "description": "For TrueNAS SCALE We've grouped a number of settings here, that all effact how apps run in general.\n\nCheckout the following documentation for more information:\n - https://truecharts.org/common/global/\n - https://truecharts.org/common/#tz\n - https://truecharts.org/common/podoptions/\n - Image Pull Secrets\n" + }, + { + "name": "Workload", + "description": "These settings configure how the actual Pods and containers are running.\nGenerally, on SCALE, we only expose a limited subset of these settings for the primary workload and container.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/workload/\n- https://truecharts.org/common/container/\n" + }, + { + "name": "App Configuration", + "description": "Every application has different values that may be required to run or have multiple options that the user may choose to enable or disable to change the behavior of the application.\nMost options should have a Tooltip (Circled Question Mark) to further describe said option.\n\nTo find more information, lookup your chart-specific documentation in the Charts List: https://truecharts.org/charts/description-list/\n" + }, + { + "name": "Services", + "description": "Service and Networking options for any applications are contained here.\nSome applications may have complicated networking setups with multiple options or some may have no options here at all.\n\nOptions here include the service and port configurations for the application, and more may be enabled or changed under the Advanced Settings and Show Expert Config boxes.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/service/\n" + }, + { + "name": "Networking", + "description": "Contains advanced networking options that are not actively supported by the TrueCharts team.\nCurrently only contains scaleExternalInterfaces.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/scaleexternalinterface/\n" + }, + { + "name": "Persistence", + "description": "Many applications will have certain options for storage to be configurable by the user, the main two being PVC and hostpath but may include other types.\nThis storage is called Persistence since it is not deleted upon restart or upgrade of an application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/\n- https://truecharts.org/scale/guides/nfs-share/\n- https://truecharts.org/general/faq/#why-pvc-is-recommended-over-hostpath\n" + }, + { + "name": "Ingress", + "description": "Ingress (more commonly known as Reverse Proxy) settings can be configured here. This is how Kubernetes connects your Applications in containers to FQDNs (fully qualified domain names).\nIf you choose to enable this you must have a \"Ingress Provider\" aka \"Reverse Proxy\" installed (We highly advice Traefik: https://truecharts.org/charts/premium/traefik/)\nIt also requiresa DNS service to actually resolve the DNS name of the FQDN specified.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/ingress/\n" + }, + { + "name": "SecurityContext", + "description": "The security settings for each application and/or permissions that each application may have for the files/directories created.\nEach application will come with predefined permissions but users may want to change certain setting depending on their usage or capabilities.\n\nUnless necessary users are advised to keep this section mostly to defaults.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/securitycontext/\n" + }, + { + "name": "Resources", + "description": "Resources limits that have been defined by each application are in this section.\nMost will have a specific default that some users may want to change based on their specific hardware or needs.\n\nThis also contains the options to mount GPUs or, more precisely, \"request\" GPU's to be mounted.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/resources/\n" + }, + { + "name": "Devices", + "description": "These are special \"mountpoints\" that can be used to mount miscelanious USB and PCI devices using special hostPath mounts.\nFor clearity we've decided to seperate this from persistence on SCALE.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/persistence/device/\n- https://truecharts.org/scale/guides/pci-passthrough/\n" + }, + { + "name": "Middlewares", + "description": "Traefik Middlewares" + }, + { + "name": "StorageClass", + "description": "StorageClasses define where to storage Storage.\n\nCheckout the following documentation for more information:\n" + }, + { + "name": "Metrics", + "description": "Contains options to configure Prometheus metrics for the application.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/metrics/\n" + }, + { + "name": "Addons", + "description": "Addons that are supplied by the TrueCharts team to add additional capabilities for users to use on top of the application\u2019s defaults.\nThings included here are VPN addons, Codeserver for editing files inside the application\u2019s container, Netshoot for network troubelshooting, etc.\n\nGenerally not required for use but may be necessary or usefull at times for specific applications.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/addons/\n- https://truecharts.org/scale/guides/vpn-setup/\n" + }, + { + "name": "Experimental", + "description": "Experimental Configuration Options\nOften these are not fully flushed-out, could randomly break or might not work at-all.\n" + }, + { + "name": "Postgresql", + "description": "For Postgresql we use \"CloudNative-PG\" as a backend, which has to be installed first.\n\nCheckout the following documentation for more information:\n- https://truecharts.org/common/cnpg/\n- https://truecharts.org/scale/guides/sql-export/\n- https://truecharts.org/scale/guides/recover-cnpg/\n" + }, + { + "name": "Dependencies", + "description": "contains dependency setting for which we, currently, do not have seperate catagories (yet)\n" + }, + { + "name": "Documentation", + "description": "We added this section to make everyone aware that OpenSource isn't always easy.\nIt doesn't keep existing without signficant ongoing support, so please consider supporting TrueCharts and other OpenSource projects.\n\nBefore installing, be sure you've followed the https://truecharts.org/scale/guides/getting-started/\nWe would also advice going over our https://truecharts.org/scale/guides/scale-intro/\nand many of the other documentation pages...\n" + } + ], + "portals": { + "open": { + "protocols": [ + "$kubernetes-resource_configmap_tcportal-open_protocol" + ], + "host": [ + "$kubernetes-resource_configmap_tcportal-open_host" + ], + "ports": [ + "$kubernetes-resource_configmap_tcportal-open_port" + ] + } + }, + "questions": [ + { + "variable": "global", + "group": "General", + "label": "Global Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "stopAll", + "label": "Stop All", + "description": "Stops All Running pods and hibernates cnpg", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + }, + { + "variable": "credentialsList", + "group": "General", + "label": "Credentials (Experimental)", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "credentialsEntry", + "label": "Enter Credentials", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "type", + "label": "Type", + "description": "Type of Credential", + "schema": { + "type": "string", + "default": "s3", + "enum": [ + { + "value": "s3", + "description": "s3 Storage" + } + ] + } + }, + { + "variable": "url", + "label": "url", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "path", + "label": "path", + "description": "Path Prefix not needed for most cases", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "bucket", + "label": "bucket", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "accessKey", + "label": "accessKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "secretKey", + "label": "secretKey", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "encrKey", + "label": "encrKey", + "description": "The Encryption key is needed for tools like volsync if not needed it will be ignored", + "schema": { + "show_if": [ + [ + "type", + "=", + "s3" + ] + ], + "type": "string", + "default": "MYSECRETPASSPHRASE", + "required": true + } + } + ] + } + } + ] + } + }, + { + "variable": "workload", + "group": "Workload", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type (Advanced)", + "schema": { + "type": "string", + "default": "Deployment", + "enum": [ + { + "value": "Deployment", + "description": "Deployment" + }, + { + "value": "DaemonSet", + "description": "DaemonSet" + } + ] + } + }, + { + "variable": "replicas", + "label": "Replicas (Advanced)", + "description": "Set the number of Replicas", + "schema": { + "type": "int", + "show_if": [ + [ + "type", + "!=", + "DaemonSet" + ] + ], + "default": 1 + } + }, + { + "variable": "podSpec", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "containers", + "label": "Containers", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Container", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "env", + "label": "Image Environment", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "TITLE", + "label": "Title", + "description": "The page title displayed on the web browser", + "schema": { + "type": "string", + "default": "TrueChartVNC Client" + } + } + ] + } + }, + { + "variable": "envList", + "label": "Extra Environment Variables", + "description": "Please be aware that some variables are set in the background, adding duplicates here might cause issues or prevent the app from starting...", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string" + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "extraArgs", + "label": "Extra Args", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "arg", + "label": "Arg", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "command", + "label": "Command", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "param", + "label": "Param", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "TZ", + "label": "Timezone", + "group": "General", + "schema": { + "type": "string", + "default": "America/Los_Angeles", + "$ref": [ + "definitions/timezone" + ], + "enum": [ + { + "value": "Asia/Damascus", + "description": "'Asia/Damascus' timezone" + }, + { + "value": "Asia/Saigon", + "description": "'Asia/Saigon' timezone" + } + ] + } + }, + { + "variable": "podOptions", + "group": "General", + "label": "Global Pod Options (Advanced)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "expertPodOpts", + "label": "Expert - Pod Options", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hostNetwork", + "label": "Host Networking", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "dnsConfig", + "label": "DNS Configuration", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "options", + "label": "Options", + "schema": { + "type": "list", + "default": [ + { + "name": "ndots", + "value": "1" + } + ], + "items": [ + { + "variable": "optionsEntry", + "label": "Option Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "nameservers", + "label": "Nameservers", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "nsEntry", + "label": "Nameserver Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "searches", + "label": "Searches", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "searchEntry", + "label": "Search Entry", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "imagePullSecretList", + "group": "General", + "label": "Image Pull Secrets", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pullsecretentry", + "label": "Pull Secret", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "data", + "label": "Data", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "registry", + "label": "Registry", + "schema": { + "type": "string", + "required": true, + "default": "https://index.docker.io/v1/" + } + }, + { + "variable": "username", + "label": "Username", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "schema": { + "type": "string", + "required": true, + "private": true, + "default": "" + } + }, + { + "variable": "email", + "label": "Email", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "service", + "group": "Services", + "label": "Configure Service(s)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Service", + "description": "The Primary service on which the Minecraft Server runs on", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "Service's Port(s) Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "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": 10131, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "scaleExternalInterface", + "description": "Add External Interfaces (Experimental, might change or be removed without further notice)", + "label": "Add external Interfaces (Experimental)", + "group": "Networking", + "schema": { + "type": "list", + "items": [ + { + "variable": "interfaceConfiguration", + "description": "Interface Configuration", + "label": "Interface Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "$ref": [ + "normalize/interfaceConfiguration" + ], + "attrs": [ + { + "variable": "hostInterface", + "description": "Please Specify Host Interface", + "label": "Host Interface", + "schema": { + "type": "string", + "required": true, + "$ref": [ + "definitions/interface" + ], + "enum": [] + } + }, + { + "variable": "ipam", + "description": "Define how IP Address will be managed", + "label": "IP Address Management", + "schema": { + "additional_attrs": true, + "type": "dict", + "required": true, + "attrs": [ + { + "variable": "type", + "description": "Specify type for IPAM", + "label": "IPAM Type", + "schema": { + "type": "string", + "required": true, + "enum": [ + { + "value": "dhcp", + "description": "Use DHCP" + }, + { + "value": "static", + "description": "Use Static IP" + } + ] + } + }, + { + "variable": "staticIPConfigurations", + "label": "Static IP Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticIP", + "label": "Static IP", + "schema": { + "type": "ipaddr", + "cidr": true + } + } + ] + } + }, + { + "variable": "staticRoutes", + "label": "Static Routes", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "=", + "static" + ] + ], + "items": [ + { + "variable": "staticRouteConfiguration", + "label": "Static Route Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "destination", + "label": "Destination", + "schema": { + "type": "ipaddr", + "cidr": true, + "required": true + } + }, + { + "variable": "gateway", + "label": "Gateway", + "schema": { + "type": "ipaddr", + "cidr": false, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "serviceList", + "label": "Add Manual Custom Services", + "group": "Services", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "serviceListEntry", + "label": "Custom Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the service", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "LoadBalancer", + "description": "LoadBalancer (Expose Ports)" + }, + { + "value": "ClusterIP", + "description": "ClusterIP (Do Not Expose Ports)" + }, + { + "value": "Simple", + "description": "Deprecated CHANGE THIS" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "advancedsvcset", + "label": "Show Advanced Service Settings", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "externalIPs", + "label": "External IP's", + "description": "External IP's", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "externalIP", + "label": "External IP", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "ipFamilyPolicy", + "label": "IP Family Policy", + "description": "Specify the IP Policy", + "schema": { + "type": "string", + "default": "SingleStack", + "enum": [ + { + "value": "SingleStack", + "description": "SingleStack" + }, + { + "value": "PreferDualStack", + "description": "PreferDualStack" + }, + { + "value": "RequireDualStack", + "description": "RequireDualStack" + } + ] + } + }, + { + "variable": "ipFamilies", + "label": "IP Families", + "description": "(Advanced) The IP Families that should be used", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipFamily", + "label": "IP Family", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "portsList", + "label": "Additional Service Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsListEntry", + "label": "Custom ports", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Port", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Port Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "protocol", + "label": "Port Type", + "schema": { + "type": "string", + "default": "tcp", + "enum": [ + { + "value": "http", + "description": "HTTP" + }, + { + "value": "https", + "description": "HTTPS" + }, + { + "value": "tcp", + "description": "TCP" + }, + { + "value": "udp", + "description": "UDP" + } + ] + } + }, + { + "variable": "targetPort", + "label": "Target Port", + "description": "This port exposes the container port on the service", + "schema": { + "type": "int", + "required": true + } + }, + { + "variable": "port", + "label": "Container Port", + "schema": { + "type": "int", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistence", + "label": "Integrated Persistent Storage", + "description": "Integrated Persistent Storage", + "group": "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": "pvc", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + }, + { + "value": "iscsi", + "description": "iSCSI Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "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" + } + ] + } + }, + { + "variable": "size", + "label": "Size quotum of Storage (Do NOT REDUCE after installation)", + "description": "This value can ONLY be INCREASED after the installation", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "persistenceList", + "label": "Additional App Storage", + "group": "Persistence", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "persistenceListEntry", + "label": "Custom Storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the storage", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "type", + "label": "Type of Storage", + "description": "Sets the persistence type, Anything other than PVC could break rollback!", + "schema": { + "type": "string", + "default": "hostPath", + "enum": [ + { + "value": "pvc", + "description": "PVC" + }, + { + "value": "hostPath", + "description": "Host Path" + }, + { + "value": "emptyDir", + "description": "emptyDir" + }, + { + "value": "nfs", + "description": "NFS Share" + } + ] + } + }, + { + "variable": "server", + "label": "NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "path", + "label": "Path on NFS Server", + "schema": { + "show_if": [ + [ + "type", + "=", + "nfs" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "iscsi", + "label": "iSCSI Options", + "schema": { + "show_if": [ + [ + "type", + "=", + "iscsi" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "targetPortal", + "label": "targetPortal", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "iqn", + "label": "iqn", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lun", + "label": "lun", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "authSession", + "label": "authSession", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "authDiscovery", + "label": "authDiscovery", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "username", + "label": "username", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "password", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "usernameInitiator", + "label": "usernameInitiator", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "passwordInitiator", + "label": "passwordInitiator", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "autoPermissions", + "label": "Automatic Permissions Configuration", + "description": "Automatically set permissions", + "schema": { + "show_if": [ + [ + "type", + "!=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "chown", + "label": "Run CHOWN", + "description": "It will run CHOWN on the path with the given fsGroup\n", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "chmod", + "label": "Run CHMOD", + "description": "It will run CHMOD on the path with the given value
\nFormat should be 3 digits, e.g. 770\n", + "schema": { + "type": "string", + "valid_chars": "[0-9]{3}", + "default": "" + } + }, + { + "variable": "recursive", + "label": "Recursive", + "description": "It will run CHOWN and CHMOD recursively\n", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + }, + { + "variable": "readOnly", + "label": "Read Only", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "show_if": [ + [ + "type", + "=", + "hostPath" + ] + ], + "type": "hostpath" + } + }, + { + "variable": "mountPath", + "label": "Mount Path", + "description": "Path inside the container the storage is mounted", + "schema": { + "type": "string", + "default": "", + "required": true, + "valid_chars": "^\\/([a-zA-Z0-9._-]+(\\s?[a-zA-Z0-9._-]+|\\/?))+$" + } + }, + { + "variable": "medium", + "label": "EmptyDir Medium", + "schema": { + "show_if": [ + [ + "type", + "=", + "emptyDir" + ] + ], + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "Memory", + "description": "Memory" + } + ] + } + }, + { + "variable": "size", + "label": "Size Quotum of Storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "256Gi" + } + }, + { + "variable": "storageClass", + "label": "storageClass (Advanced)", + "description": "sets the storageClass to something other than iX default. Only for advanced usecases!", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "volsync", + "label": "VolSync (Experimental)", + "description": "Backup, Restore and Synchronise PVC storage", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "VolSyncEntry", + "label": "VolSync Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "Name of backup configuration", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "type", + "label": "Type VolSync/Backup", + "description": "Sets the VolSync Type", + "schema": { + "type": "string", + "default": "restic", + "enum": [ + { + "value": "restic", + "description": "Restic" + } + ] + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of credentials in the credentials section", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "dest", + "label": "VolSync Destination (Restore)", + "description": "VolSYnc Destination is the location where data is the reciever and configures recovery of backups", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "src", + "label": "VolSync Source (Backup)", + "description": "VolSYnc Source is the location where data is the sender and creates backups to storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "static", + "label": "Static Fixed PVC Bindings (Experimental)", + "description": "Link a PVC to a specific storage location", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "mode", + "label": "mode", + "description": "disabled: use normal dynamic PVCs\nsmb: connect to an SMB share\nnfs: connect to an NFS share\n", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "smb", + "description": "smb" + }, + { + "value": "nfs", + "description": "nfs" + } + ] + } + }, + { + "variable": "server", + "label": "Server", + "description": "server to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "myserver" + } + }, + { + "variable": "share", + "label": "Share", + "description": "share to connect to", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "!=", + "disabled" + ] + ], + "default": "/myshare" + } + }, + { + "variable": "user", + "label": "User", + "description": "connecting user", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "myuser" + } + }, + { + "variable": "domain", + "label": "Domain", + "description": "user domain", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + }, + { + "variable": "password", + "label": "Password", + "description": "connecting password", + "schema": { + "type": "string", + "show_if": [ + [ + "mode", + "=", + "smb" + ] + ], + "default": "" + } + } + ] + } + }, + { + "variable": "volumeSnapshots", + "label": "Volume Snapshots (Experimental)", + "description": "Add an entry to the list to force creation of a volumeSnapshot of this PVC", + "schema": { + "show_if": [ + [ + "type", + "=", + "pvc" + ] + ], + "type": "list", + "default": [], + "items": [ + { + "variable": "volumeSnapshotEntry", + "label": "Custom volumeSnapshot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "description": "WARNING: renaming this, means deletion of the snapshot with the old name!", + "schema": { + "type": "string", + "default": "mysnapshot", + "required": true + } + }, + { + "variable": "volumeSnapshotClassName", + "label": "volumeSnapshot Class Name (Advanced)", + "description": "For use with PVCs using a non-default storageClass", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "", + "group": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name (Optional)", + "description": "Defaults to chart name", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description (Optional)", + "description": "Defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "icon", + "label": "Icon (Optional)", + "description": "Defaults to chart icon", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "widget", + "label": "Widget Settings", + "schema": { + "type": "dict", + "additional_attrs": true, + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "attrs": [ + { + "variable": "enabled", + "label": "Enable Widget", + "description": "When disabled all widget annotations are skipped.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "custom", + "label": "Options", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "key", + "label": "API-key (key)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "customkv", + "label": "Custom Options", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "option", + "label": "Option", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingressList", + "label": "Add Manual Custom Ingresses", + "group": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressListEntry", + "label": "Custom Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "ingressClassName", + "label": "IngressClass Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + }, + { + "variable": "overrideService", + "label": "Linked Service", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Service Name", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "port", + "label": "Service Port", + "schema": { + "type": "int" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your Cert-Manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Secret (Advanced)", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + }, + { + "variable": "homepage", + "label": "Homepage", + "description": "Connect ingress with Homepage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "name", + "label": "Name", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "description", + "label": "Description", + "description": "defaults to chart description", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "group", + "label": "Group", + "schema": { + "type": "string", + "required": true, + "default": "default", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "securityContext", + "group": "SecurityContext", + "label": "Security Context", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "container", + "label": "Container", + "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": "PUID", + "label": "Process User ID - PUID", + "description": "When supported by the container, this sets the User ID running the Application Process. Not supported by all Apps", + "schema": { + "type": "int", + "show_if": [ + [ + "runAsUser", + "=", + 0 + ] + ], + "default": 568 + } + }, + { + "variable": "UMASK", + "label": "UMASK", + "description": "When supported by the container, this sets the UMASK for the App. Not supported by all Apps", + "schema": { + "type": "string", + "default": "0022" + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "privileged", + "label": "Privileged mode", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "readOnlyRootFilesystem", + "label": "ReadOnly Root Filesystem", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + } + ] + } + }, + { + "variable": "pod", + "label": "Pod", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "fsGroupChangePolicy", + "label": "When should we take ownership?", + "schema": { + "type": "string", + "default": "OnRootMismatch", + "enum": [ + { + "value": "OnRootMismatch", + "description": "OnRootMismatch" + }, + { + "value": "Always", + "description": "Always" + } + ] + } + }, + { + "variable": "supplementalGroups", + "label": "Supplemental Groups", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "supplementalGroupsEntry", + "label": "Supplemental Group", + "schema": { + "type": "int" + } + } + ] + } + }, + { + "variable": "fsGroup", + "label": "fsGroup", + "description": "The group that should own ALL storage.", + "schema": { + "type": "int", + "default": 568 + } + } + ] + } + } + ] + } + }, + { + "variable": "resources", + "group": "Resources", + "label": "Resource Limits", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "limits", + "label": "Advanced Limit Resource Consumption", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "4000m", + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "8Gi", + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + }, + { + "variable": "gpu.intel.com/i915", + "label": "Add Intel i915 GPUs", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "nvidia.com/gpu", + "label": "Add NVIDIA GPUs (Experimental)", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "amd.com/gpu", + "label": "Add AMD GPUs", + "schema": { + "type": "int", + "default": 0 + } + } + ] + } + }, + { + "variable": "requests", + "label": "Minimum Resources Required (request)", + "schema": { + "additional_attrs": true, + "type": "dict", + "hidden": true, + "attrs": [ + { + "variable": "cpu", + "label": "CPU", + "description": "1000m means 1 hyperthread. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "10m", + "hidden": true, + "valid_chars": "^(?!^0(\\.0|m|)$)([0-9]+)(\\.[0-9]|m?)$" + } + }, + { + "variable": "memory", + "label": "RAM", + "description": "1Gi means 1 Gibibyte RAM. Detailed info: https://truecharts.org/manual/SCALE/validation", + "schema": { + "type": "string", + "default": "50Mi", + "hidden": true, + "valid_chars": "^(?!^0(e[0-9]|[EPTGMK]i?|)$)([0-9]+)(|[EPTGMK]i?|e[0-9]+)$" + } + } + ] + } + } + ] + } + }, + { + "variable": "deviceList", + "label": "Mount USB Devices", + "group": "Devices", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "deviceListEntry", + "label": "Device", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable the Storage", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "type", + "label": "(Advanced) Type of Storage", + "description": "Sets the persistence type", + "schema": { + "type": "string", + "default": "device", + "hidden": true + } + }, + { + "variable": "readOnly", + "label": "readOnly", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "hostPath", + "label": "Host Device Path", + "description": "Path to the device on the host system", + "schema": { + "type": "path" + } + }, + { + "variable": "mountPath", + "label": "Container Device Path", + "description": "Path inside the container the device is mounted", + "schema": { + "type": "string", + "default": "/dev/ttyACM0" + } + } + ] + } + } + ] + } + }, + { + "variable": "networkPolicy", + "group": "Experimental", + "label": "(Advanced) Network Policy", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "netPolicyEntry", + "label": "Network Policy Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "policyType", + "label": "Policy Type", + "schema": { + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Default" + }, + { + "value": "ingress", + "description": "Ingress" + }, + { + "value": "egress", + "description": "Egress" + }, + { + "value": "ingress-egress", + "description": "Ingress and Egress" + } + ] + } + }, + { + "variable": "egress", + "label": "Egress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "egressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "to", + "label": "To", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "toEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ingressEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "from", + "label": "From", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "fromEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "ipBlock", + "label": "IP Block", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "cidr", + "label": "CIDR", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "except", + "label": "Except", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "exceptint", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + }, + { + "variable": "namespaceSelector", + "label": "Namespace Selector", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "podSelector", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "matchExpressions", + "label": "Match Expressions", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "expressionEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "key", + "label": "Key", + "schema": { + "type": "string" + } + }, + { + "variable": "operator", + "label": "Operator", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "In", + "description": "In" + }, + { + "value": "NotIn", + "description": "NotIn" + }, + { + "value": "Exists", + "description": "Exists" + }, + { + "value": "DoesNotExist", + "description": "DoesNotExist" + } + ] + } + }, + { + "variable": "values", + "label": "Values", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "value", + "label": "", + "schema": { + "type": "string" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ports", + "label": "Ports", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "portsEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int" + } + }, + { + "variable": "endPort", + "label": "End Port", + "schema": { + "type": "int" + } + }, + { + "variable": "protocol", + "label": "Protocol", + "schema": { + "type": "string", + "default": "TCP", + "enum": [ + { + "value": "TCP", + "description": "TCP" + }, + { + "value": "UDP", + "description": "UDP" + }, + { + "value": "SCTP", + "description": "SCTP" + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "addons", + "group": "Addons", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "Codeserver", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "service", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Service Type", + "description": "ClusterIP's are only internally available and Loadbalancer exposes the service using the system loadbalancer", + "schema": { + "type": "string", + "default": "LoadBalancer", + "enum": [ + { + "value": "NodePort", + "description": "Deprecated CHANGE THIS" + }, + { + "value": "ClusterIP", + "description": "ClusterIP" + }, + { + "value": "LoadBalancer", + "description": "LoadBalancer" + } + ] + } + }, + { + "variable": "loadBalancerIP", + "label": "LoadBalancer IP", + "description": "MetalLB Only: Selects the Loadbalancer IP to expose on. Required when using PortalButton with MetalLB", + "schema": { + "show_if": [ + [ + "type", + "=", + "LoadBalancer" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "ports", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "codeserver", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "port", + "label": "Port", + "schema": { + "type": "int", + "default": 36107 + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "ingress", + "label": "Ingress", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Ingress", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "hosts", + "label": "Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "hostEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "host", + "label": "HostName", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "paths", + "label": "Paths", + "schema": { + "type": "list", + "default": [ + { + "path": "/", + "pathType": "Prefix" + } + ], + "items": [ + { + "variable": "pathEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "path", + "label": "Path", + "schema": { + "type": "string", + "required": true, + "default": "/" + } + }, + { + "variable": "pathType", + "label": "Path Type", + "schema": { + "type": "string", + "required": true, + "default": "Prefix" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "integrations", + "label": "Integrations", + "description": "Connect ingress with other charts", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "traefik", + "label": "Traefik", + "description": "Connect ingress with Traefik", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "allowCors", + "label": "Allow Cross Origin Requests (advanced)", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + }, + { + "variable": "entrypoints", + "label": "Entrypoints", + "schema": { + "type": "list", + "default": [ + "websecure" + ], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "entrypoint", + "label": "Entrypoint", + "schema": { + "type": "string" + } + } + ] + } + }, + { + "variable": "middlewares", + "label": "Middlewares", + "schema": { + "type": "list", + "default": [], + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "items": [ + { + "variable": "middleware", + "label": "Middleware", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "name", + "schema": { + "type": "string", + "default": "", + "required": true + } + }, + { + "variable": "namespace", + "label": "namespace (optional)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "certManager", + "label": "certManager", + "description": "Connect ingress with certManager", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "certificateIssuer", + "label": "certificateIssuer", + "description": "defaults to chartname", + "schema": { + "type": "string", + "default": "", + "show_if": [ + [ + "enabled", + "=", + true + ] + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advanced", + "label": "Show Advanced Settings", + "description": "Advanced settings are not covered by TrueCharts Support", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "ingressClassName", + "label": "(Advanced/Optional) IngressClass Name", + "schema": { + "type": "string", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "tls", + "label": "TLS-Settings", + "schema": { + "type": "list", + "show_if": [ + [ + "advanced", + "=", + true + ] + ], + "default": [], + "items": [ + { + "variable": "tlsEntry", + "label": "Host", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hosts", + "label": "Certificate Hosts", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "host", + "label": "Host", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "certificateIssuer", + "label": "Use Cert-Manager clusterIssuer", + "description": "add the name of your cert-manager clusterIssuer here for automatic tls certificates.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "clusterCertificate", + "label": "Cluster Certificate (Advanced)", + "description": "Add the name of your cluster-wide certificate, that you set up in the ClusterIssuer chart.", + "schema": { + "type": "string", + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "default": "" + } + }, + { + "variable": "secretName", + "label": "Use Custom Certificate Secret (Advanced)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "string", + "default": "" + } + }, + { + "variable": "scaleCert", + "label": "Use TrueNAS SCALE Certificate (Deprecated)", + "schema": { + "show_if": [ + [ + "certificateIssuer", + "=", + "" + ] + ], + "type": "int", + "$ref": [ + "definitions/certificate" + ], + "enum": [ + { + "value": null, + "description": "No Certificate" + } + ], + "default": null, + "null": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "envList", + "label": "Codeserver Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "netshoot", + "label": "Netshoot", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "envList", + "label": "Netshoot Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "vpn", + "label": "VPN", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type", + "schema": { + "type": "string", + "default": "disabled", + "enum": [ + { + "value": "disabled", + "description": "disabled" + }, + { + "value": "gluetun", + "description": "Gluetun" + }, + { + "value": "tailscale", + "description": "Tailscale" + }, + { + "value": "openvpn", + "description": "OpenVPN (Deprecated)" + }, + { + "value": "wireguard", + "description": "Wireguard (Deprecated)" + } + ] + } + }, + { + "variable": "openvpn", + "label": "OpenVPN Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "openvpn" + ] + ], + "attrs": [ + { + "variable": "username", + "label": "Authentication Username (Optional)", + "description": "Authentication Username, Optional", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "password", + "label": "Authentication Password", + "description": "Authentication Credentials", + "schema": { + "type": "string", + "show_if": [ + [ + "username", + "!=", + "" + ] + ], + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "tailscale", + "label": "Tailscale Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "show_if": [ + [ + "type", + "=", + "tailscale" + ] + ], + "attrs": [ + { + "variable": "authkey", + "label": "Authentication Key", + "description": "Provide an auth key to automatically authenticate the node as your user account.", + "schema": { + "type": "string", + "private": true, + "default": "" + } + }, + { + "variable": "auth_once", + "label": "Auth Once", + "description": "Only attempt to log in if not already logged in.", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "accept_dns", + "label": "Accept DNS", + "description": "Accept DNS configuration from the admin console.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "userspace", + "label": "Userspace", + "description": "Userspace Networking mode allows running Tailscale where you do not have access to create a VPN tunnel device.", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "routes", + "label": "Routes", + "description": "Expose physical subnet routes to your entire Tailscale network.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "dest_ip", + "label": "Destination IP", + "description": "Tells the DNAT mechanism which Destination IP to set in the IP header, and where to send packets that are matched.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "sock5_server", + "label": "Sock5 Server", + "description": "The address on which to listen for SOCKS5 proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "outbound_http_proxy_listen", + "label": "Outbound HTTP Proxy Listen", + "description": "The address on which to listen for HTTP proxying into the tailscale net.", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "extra_args", + "label": "Extra Args", + "description": "Extra Args", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "daemon_extra_args", + "label": "Tailscale Daemon Extra Args", + "description": "Tailscale Daemon Extra Args", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "killSwitch", + "label": "Enable Killswitch", + "schema": { + "type": "boolean", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": true + } + }, + { + "variable": "excludedNetworks_IPv4", + "label": "Killswitch Excluded IPv4 networks", + "description": "List of Killswitch Excluded IPv4 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv4", + "label": "IPv4 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "excludedNetworks_IPv6", + "label": "Killswitch Excluded IPv6 networks", + "description": "List of Killswitch Excluded IPv6 Addresses", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "networkv6", + "label": "IPv6 Network", + "schema": { + "type": "string", + "required": true + } + } + ] + } + }, + { + "variable": "configFile", + "label": "VPN Config File Location", + "schema": { + "type": "string", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": "" + } + }, + { + "variable": "envList", + "label": "VPN Environment Variables", + "schema": { + "type": "list", + "show_if": [ + [ + "type", + "!=", + "disabled" + ] + ], + "default": [], + "items": [ + { + "variable": "envItem", + "label": "Environment Variable", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Name", + "schema": { + "type": "string", + "required": true + } + }, + { + "variable": "value", + "label": "Value", + "schema": { + "type": "string", + "required": true, + "max_length": 10240 + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "docs", + "group": "Documentation", + "label": "Please read the documentation at https://truecharts.org", + "description": "Please read the documentation at
https://truecharts.org", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDocs", + "label": "I have checked the documentation", + "schema": { + "type": "boolean", + "default": true + } + } + ] + } + }, + { + "variable": "donateNag", + "group": "Documentation", + "label": "Please consider supporting TrueCharts, see https://truecharts.org/sponsor", + "description": "Please consider supporting TrueCharts, see
https://truecharts.org/sponsor", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "confirmDonate", + "label": "I have considered donating", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + } + ] + } + } + ] + }, + "app_readme": "

a free and open-source web browser developed by the Mozilla Foundation and its subsidiary, the Mozilla Corporation.

\n

This App is supplied by TrueCharts, for more information visit the manual: https://truecharts.org/charts/stable/firefox

\n
\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

", + "detailed_readme": "
\n

title: README

\n

General Info

\n

TrueCharts can be installed as both normal Helm Charts or as TrueNAS SCALE Apps.\nBoth solutions are fully supported, but we heavily advice the use of normal Helm Charts where possible

\n

For more information about this Chart, please check the docs on the TrueCharts website

\n

This chart is not maintained by the upstream project and any issues with the chart should be raised here

\n

Installation

\n

Helm-Chart installation

\n

To install TrueCharts Helm charts using Helm, you can use our OCI Repository.

\n

helm install mychart oci://tccr.io/truecharts/CHARTNAME

\n

For more information on how to install TrueCharts Helm charts, checkout the instructions on the website: https://truecharts.org/helm/

\n

TrueNAS SCALE Apps

\n

For more information on how to use TrueCharts as TrueNAS SCALE Apps, please checkout the quick-start guides for TrueNAS SCALE.

\n

Chart Specific Guides and information

\n

All our charts have dedicated documentation pages.\nThe documentation for this chart can be found here:\nhttps://truecharts.org/charts/stable/firefox

\n

Configuration Options

\n

Please note: For TrueNAS SCALE, only options available in the GUI are supported.\nHence most of these docs do not apply to TrueNAS SCALE

\n

To view the chart specific options, please view Values.yaml included in the chart.\nThe most recent version of which, is available here: https://github.com/truecharts/charts/charts/stable/firefox/values.yaml

\n

All our Charts use a shared \"common\" library chart that contains most of the templating and options.\nFor the complete overview of all available options, please checkout the documentation for them on the website: https://truecharts.org/common/

\n

For information about the common chart and all defaults included with it, please review its values.yaml file available here: https://github.com/truecharts/library-charts/blob/main/library/common/values.yaml

\n

Support

\n\n
\n

Sponsor TrueCharts

\n

TrueCharts can only exist due to the incredible effort of our staff.\nPlease consider making a donation or contributing back to the project any way you can!

\n

All Rights Reserved - The TrueCharts Project

", + "changelog": "

for the complete changelog, please refer to the website

\n

Important:

" + }, "14.0.15": { "healthy": true, "supported": true,