From 2cf8c79b1a877ec9f2f3b8b94785a642cc1c9a97 Mon Sep 17 00:00:00 2001 From: Exophobias <26949488+Exophobias@users.noreply.github.com> Date: Sat, 21 Dec 2024 22:27:11 -0800 Subject: [PATCH] Automatic Update 2024.12.21 @ 10:27 PM PST - ### Changelog: - 2024.12.21 @ 10:27 PM PST: - Stable: - dell-idrac-fan-controller: v1.7 --> vlatest - prowlarr: v1.28.0.4862 --> v1.28.2.4885 - sabnzbd: v4.4.0 --> v4.4.1 - Premium: - blocky: vdevelopment --> v0.24.0 --- README.md | 7 + catalog.json | 32 +- premium/blocky/15.2.4/.helmignore | 32 + premium/blocky/15.2.4/CHANGELOG.md | 3 + premium/blocky/15.2.4/Chart.yaml | 45 + premium/blocky/15.2.4/LICENSE | 106 + premium/blocky/15.2.4/README.md | 61 + premium/blocky/15.2.4/app-readme.md | 8 + .../blocky/15.2.4/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes premium/blocky/15.2.4/charts/redis-14.0.5.tgz | Bin 0 -> 102937 bytes premium/blocky/15.2.4/dashboard.json | 1939 +++++ premium/blocky/15.2.4/dashboardpsql.json | 874 +++ premium/blocky/15.2.4/icon-small.webp | Bin 0 -> 754 bytes premium/blocky/15.2.4/icon.webp | Bin 0 -> 4120 bytes premium/blocky/15.2.4/ix_values.yaml | 378 + premium/blocky/15.2.4/questions.yaml | 3804 ++++++++++ premium/blocky/15.2.4/templates/NOTES.txt | 1 + .../blocky/15.2.4/templates/_blockyConfig.tpl | 238 + .../blocky/15.2.4/templates/_k8sgateway.tpl | 90 + premium/blocky/15.2.4/templates/common.yaml | 106 + premium/blocky/15.2.4/values.yaml | 0 premium/blocky/app_versions.json | 6270 +++++++++++++++++ .../6.1.1/.helmignore | 32 + .../6.1.1/CHANGELOG.md | 3 + .../6.1.1/Chart.yaml | 35 + .../dell-idrac-fan-controller/6.1.1/README.md | 61 + .../6.1.1/app-readme.md | 8 + .../6.1.1/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes .../6.1.1/icon-small.webp | Bin 0 -> 818 bytes .../dell-idrac-fan-controller/6.1.1/icon.webp | Bin 0 -> 5158 bytes .../6.1.1/ix_values.yaml | 33 + .../6.1.1/questions.yaml | 2261 ++++++ .../6.1.1/templates/NOTES.txt | 1 + .../6.1.1/templates/common.yaml | 1 + .../6.1.1/values.yaml | 0 .../app_versions.json | 3656 ++++++++++ stable/prowlarr/17.4.0/.helmignore | 32 + stable/prowlarr/17.4.0/CHANGELOG.md | 3 + stable/prowlarr/17.4.0/Chart.yaml | 38 + stable/prowlarr/17.4.0/README.md | 61 + stable/prowlarr/17.4.0/app-readme.md | 8 + .../prowlarr/17.4.0/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes stable/prowlarr/17.4.0/ci/default-values.yaml | 3 + .../17.4.0/ci/disabledmetrics-values.yaml | 9 + stable/prowlarr/17.4.0/dashboard.json | 1612 +++++ stable/prowlarr/17.4.0/icon-small.webp | Bin 0 -> 698 bytes stable/prowlarr/17.4.0/icon.webp | Bin 0 -> 4794 bytes stable/prowlarr/17.4.0/ix_values.yaml | 111 + stable/prowlarr/17.4.0/questions.yaml | 3214 +++++++++ stable/prowlarr/17.4.0/templates/NOTES.txt | 1 + stable/prowlarr/17.4.0/templates/common.yaml | 1 + stable/prowlarr/17.4.0/values.yaml | 0 stable/prowlarr/app_versions.json | 5370 +++++++++++++- stable/sabnzbd/20.3.2/.helmignore | 32 + stable/sabnzbd/20.3.2/CHANGELOG.md | 3 + stable/sabnzbd/20.3.2/Chart.yaml | 35 + stable/sabnzbd/20.3.2/README.md | 61 + stable/sabnzbd/20.3.2/app-readme.md | 8 + .../sabnzbd/20.3.2/charts/common-23.0.10.tgz | Bin 0 -> 96939 bytes stable/sabnzbd/20.3.2/icon-small.webp | Bin 0 -> 720 bytes stable/sabnzbd/20.3.2/icon.webp | Bin 0 -> 1960 bytes stable/sabnzbd/20.3.2/ix_values.yaml | 90 + stable/sabnzbd/20.3.2/questions.yaml | 3197 +++++++++ stable/sabnzbd/20.3.2/templates/NOTES.txt | 1 + stable/sabnzbd/20.3.2/templates/common.yaml | 1 + stable/sabnzbd/20.3.2/values.yaml | 0 stable/sabnzbd/app_versions.json | 5338 ++++++++++++++ 67 files changed, 39297 insertions(+), 17 deletions(-) create mode 100644 premium/blocky/15.2.4/.helmignore create mode 100644 premium/blocky/15.2.4/CHANGELOG.md create mode 100644 premium/blocky/15.2.4/Chart.yaml create mode 100644 premium/blocky/15.2.4/LICENSE create mode 100644 premium/blocky/15.2.4/README.md create mode 100644 premium/blocky/15.2.4/app-readme.md create mode 100644 premium/blocky/15.2.4/charts/common-23.0.10.tgz create mode 100644 premium/blocky/15.2.4/charts/redis-14.0.5.tgz create mode 100644 premium/blocky/15.2.4/dashboard.json create mode 100644 premium/blocky/15.2.4/dashboardpsql.json create mode 100644 premium/blocky/15.2.4/icon-small.webp create mode 100644 premium/blocky/15.2.4/icon.webp create mode 100644 premium/blocky/15.2.4/ix_values.yaml create mode 100644 premium/blocky/15.2.4/questions.yaml create mode 100644 premium/blocky/15.2.4/templates/NOTES.txt create mode 100644 premium/blocky/15.2.4/templates/_blockyConfig.tpl create mode 100644 premium/blocky/15.2.4/templates/_k8sgateway.tpl create mode 100644 premium/blocky/15.2.4/templates/common.yaml create mode 100644 premium/blocky/15.2.4/values.yaml create mode 100644 stable/dell-idrac-fan-controller/6.1.1/.helmignore create mode 100644 stable/dell-idrac-fan-controller/6.1.1/CHANGELOG.md create mode 100644 stable/dell-idrac-fan-controller/6.1.1/Chart.yaml create mode 100644 stable/dell-idrac-fan-controller/6.1.1/README.md create mode 100644 stable/dell-idrac-fan-controller/6.1.1/app-readme.md create mode 100644 stable/dell-idrac-fan-controller/6.1.1/charts/common-23.0.10.tgz create mode 100644 stable/dell-idrac-fan-controller/6.1.1/icon-small.webp create mode 100644 stable/dell-idrac-fan-controller/6.1.1/icon.webp create mode 100644 stable/dell-idrac-fan-controller/6.1.1/ix_values.yaml create mode 100644 stable/dell-idrac-fan-controller/6.1.1/questions.yaml create mode 100644 stable/dell-idrac-fan-controller/6.1.1/templates/NOTES.txt create mode 100644 stable/dell-idrac-fan-controller/6.1.1/templates/common.yaml create mode 100644 stable/dell-idrac-fan-controller/6.1.1/values.yaml create mode 100644 stable/prowlarr/17.4.0/.helmignore create mode 100644 stable/prowlarr/17.4.0/CHANGELOG.md create mode 100644 stable/prowlarr/17.4.0/Chart.yaml create mode 100644 stable/prowlarr/17.4.0/README.md create mode 100644 stable/prowlarr/17.4.0/app-readme.md create mode 100644 stable/prowlarr/17.4.0/charts/common-23.0.10.tgz create mode 100644 stable/prowlarr/17.4.0/ci/default-values.yaml create mode 100644 stable/prowlarr/17.4.0/ci/disabledmetrics-values.yaml create mode 100644 stable/prowlarr/17.4.0/dashboard.json create mode 100644 stable/prowlarr/17.4.0/icon-small.webp create mode 100644 stable/prowlarr/17.4.0/icon.webp create mode 100644 stable/prowlarr/17.4.0/ix_values.yaml create mode 100644 stable/prowlarr/17.4.0/questions.yaml create mode 100644 stable/prowlarr/17.4.0/templates/NOTES.txt create mode 100644 stable/prowlarr/17.4.0/templates/common.yaml create mode 100644 stable/prowlarr/17.4.0/values.yaml create mode 100644 stable/sabnzbd/20.3.2/.helmignore create mode 100644 stable/sabnzbd/20.3.2/CHANGELOG.md create mode 100644 stable/sabnzbd/20.3.2/Chart.yaml create mode 100644 stable/sabnzbd/20.3.2/README.md create mode 100644 stable/sabnzbd/20.3.2/app-readme.md create mode 100644 stable/sabnzbd/20.3.2/charts/common-23.0.10.tgz create mode 100644 stable/sabnzbd/20.3.2/icon-small.webp create mode 100644 stable/sabnzbd/20.3.2/icon.webp create mode 100644 stable/sabnzbd/20.3.2/ix_values.yaml create mode 100644 stable/sabnzbd/20.3.2/questions.yaml create mode 100644 stable/sabnzbd/20.3.2/templates/NOTES.txt create mode 100644 stable/sabnzbd/20.3.2/templates/common.yaml create mode 100644 stable/sabnzbd/20.3.2/values.yaml diff --git a/README.md b/README.md index d2d1418a80..821efab192 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,13 @@ Now you should be able to update your applications again. - unpackerr: v0.14.5 *(Updated: 2024.08.05)* - ### Changelog: + - 2024.12.21 @ 10:27 PM PST: + - Stable: + - dell-idrac-fan-controller: v1.7 --> vlatest + - prowlarr: v1.28.0.4862 --> v1.28.2.4885 + - sabnzbd: v4.4.0 --> v4.4.1 + - Premium: + - blocky: vdevelopment --> v0.24.0 - 2024.12.17 @ 11:38 PM PST: - Stable: - actualserver: v24.5.0 --> v24.11.0 diff --git a/catalog.json b/catalog.json index 7dc1b64791..a23fd4c748 100644 --- a/catalog.json +++ b/catalog.json @@ -747,10 +747,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/premium/blocky", "location": "/home/runner/_work/catalog/catalog/premium/blocky", - "latest_version": "15.2.3", - "latest_app_version": "development", - "latest_human_version": "development_15.2.3", - "last_update": "2024-12-17 23:38:02", + "latest_version": "15.2.4", + "latest_app_version": "0.24.0", + "latest_human_version": "0.24.0_15.2.4", + "last_update": "2024-12-21 22:27:07", "name": "blocky", "recommended": false, "title": "Blocky", @@ -5695,10 +5695,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/dell-idrac-fan-controller", "location": "/home/runner/_work/catalog/catalog/stable/dell-idrac-fan-controller", - "latest_version": "6.1.0", - "latest_app_version": "1.7", - "latest_human_version": "1.7_6.1.0", - "last_update": "2024-12-17 23:37:54", + "latest_version": "6.1.1", + "latest_app_version": "latest", + "latest_human_version": "latest_6.1.1", + "last_update": "2024-12-21 22:26:56", "name": "dell-idrac-fan-controller", "recommended": false, "title": "Dell-idrac-fan-controller", @@ -17469,10 +17469,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/prowlarr", "location": "/home/runner/_work/catalog/catalog/stable/prowlarr", - "latest_version": "17.3.11", - "latest_app_version": "1.28.0.4862", - "latest_human_version": "1.28.0.4862_17.3.11", - "last_update": "2024-12-08 23:00:00", + "latest_version": "17.4.0", + "latest_app_version": "1.28.2.4885", + "latest_human_version": "1.28.2.4885_17.4.0", + "last_update": "2024-12-21 22:26:56", "name": "prowlarr", "recommended": false, "title": "Prowlarr", @@ -19560,10 +19560,10 @@ "healthy_error": null, "home": "https://truecharts.org/charts/stable/sabnzbd", "location": "/home/runner/_work/catalog/catalog/stable/sabnzbd", - "latest_version": "20.3.1", - "latest_app_version": "4.4.0", - "latest_human_version": "4.4.0_20.3.1", - "last_update": "2024-12-12 14:54:29", + "latest_version": "20.3.2", + "latest_app_version": "4.4.1", + "latest_human_version": "4.4.1_20.3.2", + "last_update": "2024-12-21 22:26:56", "name": "sabnzbd", "recommended": false, "title": "Sabnzbd", diff --git a/premium/blocky/15.2.4/.helmignore b/premium/blocky/15.2.4/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/premium/blocky/15.2.4/.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/premium/blocky/15.2.4/CHANGELOG.md b/premium/blocky/15.2.4/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/premium/blocky/15.2.4/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/premium/blocky/15.2.4/Chart.yaml b/premium/blocky/15.2.4/Chart.yaml new file mode 100644 index 0000000000..9934f91c8e --- /dev/null +++ b/premium/blocky/15.2.4/Chart.yaml @@ -0,0 +1,45 @@ +annotations: + truecharts.org/category: network + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: premium +apiVersion: v2 +appVersion: 0.24.0 +dependencies: +- name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +- name: redis + version: 14.0.5 + repository: oci://tccr.io/truecharts + condition: redis.enabled + alias: "" + tags: [] + import-values: [] +deprecated: false +description: Blocky is a DNS proxy, DNS enhancer and ad-blocker for the local network + written in Go +home: https://truecharts.org/charts/premium/blocky +icon: https://truecharts.org/img/hotlink-ok/chart-icons/blocky.webp +keywords: +- dns +- blocky +kubeVersion: '>=1.24.0-0' +maintainers: +- name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: blocky +sources: +- https://0xerr0r.github.io/blocky/ +- https://github.com/0xERR0R/blocky +- https://github.com/Mozart409/blocky-frontend +- https://github.com/truecharts/charts/tree/master/charts/premium/blocky +- https://hub.docker.com/r/spx01/blocky +- https://quay.io/oriedge/k8s_gateway +type: application +version: 15.2.4 diff --git a/premium/blocky/15.2.4/LICENSE b/premium/blocky/15.2.4/LICENSE new file mode 100644 index 0000000000..33a8cbb23f --- /dev/null +++ b/premium/blocky/15.2.4/LICENSE @@ -0,0 +1,106 @@ +Business Source License 1.1 + +Parameters + +Licensor: The TrueCharts Project, it's owner and it's contributors +Licensed Work: The TrueCharts "Blocky" Helm Chart +Additional Use Grant: You may use the licensed work in production, as long + as it is directly sourced from a TrueCharts provided + official repository, catalog or source. You may also make private + modification to the directly sourced licenced work, + when used in production. + + The following cases are, due to their nature, also + defined as 'production use' and explicitly prohibited: + - Bundling, including or displaying the licensed work + with(in) another work intended for production use, + with the apparent intend of facilitating and/or + promoting production use by third parties in + violation of this license. + +Change Date: 2050-01-01 + +Change License: 3-clause BSD license + +For information about alternative licensing arrangements for the Software, +please contact: legal@truecharts.org + +Notice + +The Business Source License (this document, or the “License”) is not an Open +Source license. However, the Licensed Work will eventually be made available +under an Open Source License, as stated in this License. + +License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved. +“Business Source License” is a trademark of MariaDB Corporation Ab. + +----------------------------------------------------------------------------- + +Business Source License 1.1 + +Terms + +The Licensor hereby grants you the right to copy, modify, create derivative +works, redistribute, and make non-production use of the Licensed Work. The +Licensor may make an Additional Use Grant, above, permitting limited +production use. + +Effective on the Change Date, or the fourth anniversary of the first publicly +available distribution of a specific version of the Licensed Work under this +License, whichever comes first, the Licensor hereby grants you rights under +the terms of the Change License, and the rights granted in the paragraph +above terminate. + +If your use of the Licensed Work does not comply with the requirements +currently in effect as described in this License, you must purchase a +commercial license from the Licensor, its affiliated entities, or authorized +resellers, or you must refrain from using the Licensed Work. + +All copies of the original and modified Licensed Work, and derivative works +of the Licensed Work, are subject to this License. This License applies +separately for each version of the Licensed Work and the Change Date may vary +for each version of the Licensed Work released by Licensor. + +You must conspicuously display this License on each original or modified copy +of the Licensed Work. If you receive the Licensed Work in original or +modified form from a third party, the terms and conditions set forth in this +License apply to your use of that work. + +Any use of the Licensed Work in violation of this License will automatically +terminate your rights under this License for the current and all other +versions of the Licensed Work. + +This License does not grant you any right in any trademark or logo of +Licensor or its affiliates (provided that you may use a trademark or logo of +Licensor as expressly required by this License). + +TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON +AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, +EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND +TITLE. + +MariaDB hereby grants you permission to use this License’s text to license +your works, and to refer to it using the trademark “Business Source License”, +as long as you comply with the Covenants of Licensor below. + +Covenants of Licensor + +In consideration of the right to use this License’s text and the “Business +Source License” name and trademark, Licensor covenants to MariaDB, and to all +other recipients of the licensed work to be provided by Licensor: + +1. To specify as the Change License the GPL Version 2.0 or any later version, + or a license that is compatible with GPL Version 2.0 or a later version, + where “compatible” means that software provided under the Change License can + be included in a program with software provided under GPL Version 2.0 or a + later version. Licensor may specify additional Change Licenses without + limitation. + +2. To either: (a) specify an additional grant of rights to use that does not + impose any additional restriction on the right granted in this License, as + the Additional Use Grant; or (b) insert the text “None”. + +3. To specify a Change Date. + +4. Not to modify this License in any other way. diff --git a/premium/blocky/15.2.4/README.md b/premium/blocky/15.2.4/README.md new file mode 100644 index 0000000000..eba4c26c27 --- /dev/null +++ b/premium/blocky/15.2.4/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/premium/blocky) + +**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/premium/blocky + +## 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/premium/blocky/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/premium/blocky/15.2.4/app-readme.md b/premium/blocky/15.2.4/app-readme.md new file mode 100644 index 0000000000..d9cf183273 --- /dev/null +++ b/premium/blocky/15.2.4/app-readme.md @@ -0,0 +1,8 @@ +Blocky is a DNS proxy, DNS enhancer and ad-blocker for the local network written in Go + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/premium/blocky](https://truecharts.org/charts/premium/blocky) + +--- + +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/premium/blocky/15.2.4/charts/common-23.0.10.tgz b/premium/blocky/15.2.4/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/premium/blocky/15.2.4/charts/redis-14.0.5.tgz b/premium/blocky/15.2.4/charts/redis-14.0.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f6f458e04aba10503ed78df29f527476b6e1e6a5 GIT binary patch literal 102937 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

Z13!>;y*3rY34%{G3T5D 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

>d|F?g9(8d4V%A@dqZ}B9z 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

i1Tvy^Iv`+@BEha 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 R{{jF2|Nk$+kIVp|3;@VH6BPge literal 0 HcmV?d00001 diff --git a/premium/blocky/15.2.4/dashboard.json b/premium/blocky/15.2.4/dashboard.json new file mode 100644 index 0000000000..847da7c67d --- /dev/null +++ b/premium/blocky/15.2.4/dashboard.json @@ -0,0 +1,1939 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }, + { + "name": "VAR_BLOCKY_URL", + "type": "constant", + "label": "blocky API URL", + "value": "", + "description": "" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.3.3" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "panel", + "id": "piechart", + "name": "Pie chart", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "iteration": 1641070862290, + "links": [ + { + "icon": "external link", + "tags": [], + "title": "blocky @ GitHub", + "tooltip": "open GitHub repo", + "type": "link", + "url": "https://github.com/0xERR0R/blocky" + } + ], + "liveNow": false, + "panels": [ + { + "description": "current service state", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "text": "down" + }, + "1": { + "text": "up" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#299c46", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "id": 26, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "sum(up{job=~\"$job\"})", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "State", + "transparent": true, + "type": "stat" + }, + { + "description": "Is blocking enabled?", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "text": "off" + }, + "1": { + "text": "on" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#299c46", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 43, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "value" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "blocky_blocking_enabled", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Blocking", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Enable Ad disable blocking", + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 42, + "options": { + "content": "\n

\n ×Done!\n
\n
\n \n \n \n
\n\n\n", + "mode": "html" + }, + "pluginVersion": "8.3.3", + "title": "Blocking status", + "transparent": true, + "type": "text" + }, + { + "description": "Blocky [version](https://github.com/0xERR0R/blocky) number", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 3 + }, + "id": 55, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "/^version$/", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "repeatDirection": "v", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "blocky_build_info ", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Version", + "transformations": [ + { + "id": "labelsToFields", + "options": {} + }, + { + "id": "merge", + "options": {} + } + ], + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Average query response time for all query types", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 3 + }, + "id": 24, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_request_duration_ms_sum[$__range])) / sum(increase(blocky_request_duration_ms_count[$__range]))", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Avg response time", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Number of blacklist entries", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 5 + }, + "id": 30, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(blocky_blacklist_cache) / sum(up{job=~\"$job\"})", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Blacklist entries total", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 12 + }, + "id": 28, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(go_memstats_sys_bytes{job=~\"$job\"})/sum(up{job=~\"$job\"})", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Memory allocated", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Percentage of blocked queries", + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 6 + }, + "id": 34, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_response_total{response_type=\"BLOCKED\"}[$__range])) / sum(increase(blocky_query_total[$__range])) ", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Queries blocked", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Number of all queries. Shows the last value", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 6 + }, + "hideTimeOverride": true, + "id": 4, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "ceil(sum(increase(blocky_query_total[$__range]))) ", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Query Count Total", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Number of entries in the cache. Shows the last value", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 8 + }, + "id": 45, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["last"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(blocky_cache_entry_count)/ sum(up{job=~\"$job\"})", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Cache entries count", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Cache Hit/Miss ratio. 100 % means, all queries could be answered from the cache, 0% - all queries must be resolved via external DNS", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 8 + }, + "id": 47, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["mean"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_cache_hit_count[$__range])) / (sum(increase(blocky_cache_hit_count[$__range])) + sum(increase(blocky_cache_miss_count[$__range])))", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Cache Hit/Miss ratio", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Number of occured errors", + "fieldConfig": { + "defaults": { + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 12 + }, + "id": 36, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_error_total[$__range]))", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Error count", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Amount of performed DNS queries to prefetch cached queries", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 9 + }, + "id": 53, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "ceil(sum(increase(blocky_prefetch_count[$__range])))", + "format": "table", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Prefetch count", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Amount of prefetch queries per minute", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 11 + }, + "id": 51, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(rate(blocky_prefetch_count[5m])) * 60", + "format": "table", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Prefetch rate per min", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "How many of cached entries were prefetched automatically", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 11 + }, + "id": 58, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["mean"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_prefetch_hit_count[$__range])) / (sum(increase(blocky_cache_hit_count[$__range])))", + "format": "table", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Prefetch Hit ratio", + "transparent": true, + "type": "stat" + }, + { + "description": "Time since last list refresh", + "fieldConfig": { + "defaults": { + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 5 + }, + "id": 57, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "sum(time() -blocky_last_list_group_refresh)/ sum(up{job=~\"$job\"})", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Last list refresh", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "uid": "${DS_PROMETHEUS}" + }, + "description": "Amount of unique domains in the prefetched cache", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 9 + }, + "id": 49, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(blocky_prefetch_domain_name_cache_count)/ sum(up{job=~\"$job\"})", + "format": "table", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Prefetch domain count", + "transparent": true, + "type": "stat" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "avg requests / min", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(rate(blocky_query_total[5m])) * 60", + "format": "time_series", + "instant": false, + "interval": "", + "legendFormat": " ", + "refId": "A" + } + ], + "title": "Request rate", + "transparent": true, + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "avg requests / min", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 52, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum by (client) (rate(blocky_query_total[5m])) * 60", + "format": "time_series", + "instant": false, + "interval": "", + "legendFormat": " {{client}}", + "refId": "A" + } + ], + "title": "Request rate per client", + "transparent": true, + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#FADE2A", + "colorScale": "sqrt", + "colorScheme": "interpolateYlOrBr", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 29 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 22, + "legend": { + "show": true + }, + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": true, + "expr": "sum(increase(blocky_request_duration_ms_bucket{response_type=\"RESOLVED\"}[$__range])) by (le)", + "format": "heatmap", + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "refId": "A" + } + ], + "title": "request duration (upstream)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "transparent": true, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "ms", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "id": 2, + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value", "percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["sum"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "6.6.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": " sort_desc(sum by (type) (ceil(increase(blocky_query_total[$__range]))))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{ type }}", + "refId": "A" + } + ], + "title": "Query by type", + "transparent": true, + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "id": 8, + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value", "percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "6.6.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "sort_desc(sum by (client) (ceil(increase(blocky_query_total[$__range]))))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{ client }}", + "refId": "A" + } + ], + "title": "Query per Client", + "transparent": true, + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "id": 32, + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "6.6.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": "topk(1, blocky_blacklist_cache) by (group)", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{ group }}", + "refId": "A" + } + ], + "title": "Blacklist by group", + "transparent": true, + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 46 + }, + "id": 14, + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value", "percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": " sort_desc(sum by (reason) (ceil(increase(blocky_response_total[$__range]))))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{reason}}", + "refId": "A" + } + ], + "title": "Response Reasons", + "transparent": true, + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "id": 38, + "interval": "", + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value", "percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["sum"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": " sort_desc(sum by (response_type) (ceil(increase(blocky_response_total[$__range]))))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{response_type}}", + "refId": "A" + } + ], + "title": "Response Type", + "transparent": true, + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "decimals": 0, + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "id": 12, + "links": [], + "maxDataPoints": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "values": ["value", "percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "exemplar": false, + "expr": " sort_desc(sum by (response_code) (ceil(increase(blocky_response_total[$__range]))))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{response_code}}", + "refId": "A" + } + ], + "title": "Response status", + "transparent": true, + "type": "piechart" + } + ], + "refresh": false, + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "DS_PROMETHEUS", + "label": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "hide": 0, + "label": "blocky API URL", + "name": "blocky_url", + "query": "${VAR_BLOCKY_URL}", + "skipUrlSync": false, + "type": "constant", + "current": { + "value": "${VAR_BLOCKY_URL}", + "text": "${VAR_BLOCKY_URL}", + "selected": false + }, + "options": [ + { + "value": "${VAR_BLOCKY_URL}", + "text": "${VAR_BLOCKY_URL}", + "selected": false + } + ] + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(blocky_blocking_enabled,job)", + "hide": 0, + "includeAll": true, + "label": "job", + "multi": false, + "name": "job", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(blocky_blocking_enabled,job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "", + "title": "blocky", + "uid": "JvOqE4gRk", + "version": 1, + "weekStart": "" +} diff --git a/premium/blocky/15.2.4/dashboardpsql.json b/premium/blocky/15.2.4/dashboardpsql.json new file mode 100644 index 0000000000..203723f09d --- /dev/null +++ b/premium/blocky/15.2.4/dashboardpsql.json @@ -0,0 +1,874 @@ +{ + "__inputs": [ + { + "name": "DS_POSTGRES", + "label": "Postgres", + "description": "", + "type": "datasource", + "pluginId": "postgres", + "pluginName": "Postgres" + } + ], + "__requires": [ + { + "type": "panel", + "id": "barchart", + "name": "Bar chart", + "version": "" + }, + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.1.2" + }, + { + "type": "datasource", + "id": "postgres", + "name": "Postgres", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "piechart", + "name": "Pie chart", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "iteration": 1631130053746, + "links": [], + "panels": [ + { + "cacheTimeout": null, + "datasource": "${DS_POSTGRES}", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "displayName": "${__field.labels.response_type}", + "mappings": [], + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 14, + "interval": null, + "links": [], + "options": { + "displayLabels": [], + "legend": { + "displayMode": "table", + "placement": "right", + "values": ["value"] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": ["sum"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.1.2", + "repeatDirection": "v", + "targets": [ + { + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT t.response_type, max(t.request_Ts) as time, count(*) as cnt from log_entries t \n WHERE $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0)\n group by t.response_type\n order by time", + "refId": "A", + "select": [ + [ + { + "params": ["value"], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Query count by response type", + "transformations": [], + "type": "piechart" + }, + { + "datasource": "${DS_POSTGRES}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 16, + "options": { + "displayLabels": [], + "legend": { + "displayMode": "table", + "placement": "right", + "values": ["value"] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT max(t.request_ts) AS time,\n case when t.reason like ''BLOCKED%'' then SPLIT_PART(SPLIT_PART(t.reason,''('',-1), '')'',1) else '''' end AS metric,\n count(t.reason) AS cnt\nFROM log_entries t\nWHERE t.response_type =''BLOCKED''\n AND $__timeFilter(t.request_Ts)\n AND t.client_name in ($client_name)\n AND (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0)\nGROUP BY 2\nORDER BY time", + "refId": "A", + "select": [ + [ + { + "params": ["duration_ms"], + "type": "column" + } + ] + ], + "table": "log_entries", + "timeColumn": "request_ts", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Blocked by Blacklist", + "type": "piechart" + }, + { + "cacheTimeout": null, + "datasource": "${DS_POSTGRES}", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 13, + "interval": null, + "links": [], + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": true + }, + "showUnfilled": true, + "text": {} + }, + "pluginVersion": "8.1.2", + "repeatDirection": "v", + "targets": [ + { + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT max(t.request_Ts) as time, t.client_name as metric, count(*) as cnt from log_entries t \n WHERE $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0)\n group by t.client_name\n order by 3 desc", + "refId": "A", + "select": [ + [ + { + "params": ["value"], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Query count by client", + "transformations": [], + "type": "bargauge" + }, + { + "datasource": "${DS_POSTGRES}", + "description": "Top 20 effective top level domain plus one more label", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 67, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 2 + }, + "displayName": "count", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 11, + "options": { + "barWidth": 0.26, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "orientation": "horizontal", + "showValue": "never", + "stacking": "none", + "text": { + "valueSize": 10 + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "format": "table", + "group": [], + "hide": false, + "metricColumn": "question_name", + "rawQuery": true, + "rawSql": "SELECT t.effective_tldp as metric, count(*) as value from log_entries t \nWHERE $__timeFilter(t.request_Ts) \n and t.response_type in ($response_type) \n and t.client_name in ($client_name) \n and (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0) \n group by t.effective_tldp order by count(*) desc limit 20", + "refId": "A", + "select": [ + [ + { + "params": ["value"], + "type": "column" + } + ] + ], + "table": "log_entries", + "timeColumn": "request_ts", + "where": [] + } + ], + "title": "Top 20 effective TLD+1", + "type": "barchart" + }, + { + "datasource": "${DS_POSTGRES}", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 67, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineWidth": 2 + }, + "displayName": "count", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 8, + "options": { + "barWidth": 0.26, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "orientation": "horizontal", + "showValue": "never", + "stacking": "none", + "text": { + "valueSize": 10 + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "format": "table", + "group": [], + "hide": false, + "metricColumn": "question_name", + "rawQuery": true, + "rawSql": "SELECT t.question_name as metric, count(*) as value from log_entries t \n WHERE $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0) \n group by t.question_name order by count(*) desc limit 20", + "refId": "A", + "select": [ + [ + { + "params": ["value"], + "type": "column" + } + ] + ], + "table": "log_entries", + "timeColumn": "request_ts", + "where": [] + } + ], + "title": "Top 20 queried domains", + "type": "barchart" + }, + { + "datasource": "${DS_POSTGRES}", + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "queries count", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 35, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 12, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "displayName": "${__field.labels.client_name}", + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right" + }, + "tooltip": { + "mode": "single" + } + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT\n $__timeGroupAlias(t.request_Ts, ''30m''),\n t.client_name,\n count(*) as c\nFROM log_entries t\nWHERE\n $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0)\nGROUP BY 1,2\nORDER BY 1", + "refId": "A", + "select": [ + [ + { + "params": ["duration_ms"], + "type": "column" + } + ] + ], + "table": "log_entries", + "timeColumn": "request_ts", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Queries number per client (30m)", + "type": "timeseries" + }, + { + "datasource": "${DS_POSTGRES}", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": -1, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepBefore", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "format": "time_series", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT\n EXTRACT(EPOCH from t.request_Ts) as time,\n t.duration_ms\nFROM log_entries t\nWHERE\n $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0)\nORDER BY request_ts", + "refId": "A", + "select": [ + [ + { + "params": ["duration_ms"], + "type": "column" + } + ] + ], + "table": "log_entries", + "timeColumn": "request_ts", + "timeColumnType": "timestamp", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "title": "Query duration", + "type": "timeseries" + }, + { + "datasource": "${DS_POSTGRES}", + "description": "Last 100 queries, newest on top", + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "displayMode": "auto", + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "time" + }, + "properties": [ + { + "id": "unit", + "value": "dateTimeAsIsoNoDateIfToday" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 31 + }, + "id": 4, + "options": { + "showHeader": true + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "format": "table", + "group": [], + "metricColumn": "none", + "rawQuery": true, + "rawSql": "SELECT EXTRACT(EPOCH from t.request_Ts) as \"time\", \n t.client_ip as \"client IP\", \n t.client_name as \"client name\", \n t.duration_ms as \"duration in ms\", \n t.response_type as \"response type\", \n t.question_type as \"question type\", \n t.question_name as \"question name\", \n t.effective_tldp as \"effective TLD+1\", \n t.answer as \"answer\" from log_entries t \n WHERE $__timeFilter(t.request_Ts) and \n t.response_type in ($response_type) and \n t.client_name in ($client_name) and \n (length(''$question'') = 0 or POSITION(lower(''$question'') IN t.question_name) > 0) \n order by t.request_Ts desc limit 100", + "refId": "A", + "select": [ + [ + { + "params": ["value"], + "type": "column" + } + ] + ], + "timeColumn": "time", + "where": [ + { + "name": "$__timeFilter", + "params": [], + "type": "macro" + } + ] + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Last queries", + "type": "table" + } + ], + "refresh": "", + "schemaVersion": 30, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "BlockyPostgres", + "value": "blockypostgres" + }, + "hide": 0, + "includeAll": false, + "label": "datasource", + "multi": false, + "name": "DS_POSTGRES", + "options": [], + "query": "grafana-postgresql-datasource", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": "", + "current": {}, + "datasource": "${DS_POSTGRES}", + "definition": "select distinct client_name from log_entries", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Client name", + "multi": true, + "name": "client_name", + "options": [], + "query": "select distinct client_name from log_entries", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "${DS_POSTGRES}", + "definition": "select distinct response_type from log_entries", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Response type", + "multi": true, + "name": "response_type", + "options": [], + "query": "select distinct response_type from log_entries", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "description": null, + "error": null, + "hide": 0, + "label": "Domain (contains)", + "name": "question", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "textbox" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Blocky query", + "uid": "AVmWSVWgz", + "version": 3 +} diff --git a/premium/blocky/15.2.4/icon-small.webp b/premium/blocky/15.2.4/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..194c29b9d16e19bfe30a98e499cba6508770c490 GIT binary patch literal 754 zcmV<^&>Q0^q-t@=8z<(hT#K2LNTa@Nj>3 zD@9OSLmUvXeTjJACvN^LGJo7SLc~0gB1FWWDB(9t5rbPud8@fQQJw|LNgoLQy>euM z(N7|LY{-g6@?KUJ-4QF3ZkrWESI<)aN_DEnf<>Y+J>V7+*#O^>NMAtp7s(Gp0r*6M z_ksnU(;!~da2`?NBIhpIBhr_9Nv8U(J!OPZI4JV=#j;{@?*IEa>i z7MoL58@liYakHKu0y$CuAO(^-{z_{YonIKOi~k%Bq^7mNb(E)}23AlwAjAOx0I&!E zodGH!03ZMY05m120(8rb)B|VB7{G0SyJp^Zd}?4Ffd&Mq9@Vu5{a4>J{eV29NtJOn zv_SCj;7Hd>4gf*s>YMOLeMH|Y_zQSW_d2rUlbx7>un*_8yrBlw zEPco(dFhV;?USJJJEt;u7Q?wo?0!Q5i(TQAb5aTwOtskHB&u26^|b`WFJ3~Qv5I0|@>oI;N1JETs^`%0dfsv@11GfS-zcfk^u&_ImyY;)Pt zrt+yP1s1qD`rg*FJ-tJY^Vh@V6o4m4wey&|0znG<{tPWSqR@c$!HVMY%hE0k@!(@W(>^5XdRU!@|zR)Pp+GvnYxSs0AChW%K!iX literal 0 HcmV?d00001 diff --git a/premium/blocky/15.2.4/icon.webp b/premium/blocky/15.2.4/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..9f7d4cc84426dad70f18480790b2e9018ebf4784 GIT binary patch literal 4120 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 WBQx?aRDBa_`Y(V0000000001%)%ZmK literal 0 HcmV?d00001 diff --git a/premium/blocky/15.2.4/ix_values.yaml b/premium/blocky/15.2.4/ix_values.yaml new file mode 100644 index 0000000000..9824973eb8 --- /dev/null +++ b/premium/blocky/15.2.4/ix_values.yaml @@ -0,0 +1,378 @@ +image: + repository: "docker.io/spx01/blocky" + tag: "v0.24@sha256:9a82e0235c52ef3048586f8006add06e52132adaae70d02f980569dae16421a2" + pullPolicy: "IfNotPresent" +k8sgatewayImage: + repository: quay.io/oriedge/k8s_gateway + pullPolicy: IfNotPresent + tag: v0.4.0@sha256:7bdbd447c0244b8f89de9cd6f4826ed0ac66c9406fac3a4ac80081020c251c6b + +workload: + main: + replicas: 2 + strategy: RollingUpdate + podSpec: + containers: + main: + probes: + liveness: + enabled: false + type: exec + command: + - /app/blocky + - healthcheck + readiness: + enabled: false + type: exec + command: + - /app/blocky + - healthcheck + startup: + enabled: false + type: exec + command: + - /app/blocky + - healthcheck +# -- Blocky Config File content +blockyConfig: {} +# upstream: +# default: +# - 1.1.1.1 + +# -- some general blocky settings +blocky: + # -- Enable prometheus annotations + enablePrometheus: true +service: + main: + enabled: true + ports: + main: + enabled: true + port: 4000 + protocol: http + targetPort: 4000 + dns: + enabled: true + ports: + dns: + enabled: true + port: 53 + protocol: udp + targetPort: 53 + dnstcp: + enabled: true + protocol: tcp + port: "{{ .Values.service.dns.ports.dns.port }}" + targetPort: 53 + dot: + enabled: true + ports: + dot: + enabled: true + port: 853 + protocol: tcp + targetPort: 853 + https: + enabled: true + ports: + https: + enabled: true + port: 4443 + protocol: https + targetPort: 4443 + k8sgateway: + enabled: true + ports: + k8sgateway: + enabled: true + port: 5353 + protocol: udp + targetPort: 5353 +## TODO Add support for SCALE certificates and certificates secrets here +certFile: "" +keyFile: "" +logLevel: info +logFormat: text +logTimestamp: true +logPrivacy: false +dohUserAgent: "" +minTlsServeVersion: 1.2 +# -- set the default DNS upstream servers +# Primarily designed for inclusion in the TrueNAS SCALE GUI +defaultUpstreams: + # Cloudflare +- 1.1.1.1 +- 1.0.0.1 + # Google +- 8.8.8.8 +- 8.8.4.4 + # Quad9 +- 9.9.9.9 +- 149.112.112.112 + # OpenDNS +- 208.67.222.222 +- 208.67.220.220 + # ComodoSecure DNS +- 8.26.56.26 +- 8.20.247.20 +# -- set additional upstreams +# Primarily designed for inclusion in the TrueNAS SCALE GUI +upstreams: +# - name: group2 +# dnsservers: +# - 1.1.1.1 + +# -- set bootstrap dns (not needed) +# Ensures bootstrap encryption and ensure it doesn't use k8s dns +bootstrapDns: + # -- Upstream + upstream: "" + # -- IP's linked to upstream DoT/DoH DNS name + ips: [] +# -- set additional bootstrap dns (not needed, only used if bootstrapDns is set) +additionalBootstrapDns: [] +# - upstream: "" +# ips: [] + +# -- Return empty answer for these queries +filtering: + # -- Ensures filtering by query type + queryTypes: [] +# -- Set manual custom DNS resolution +customDNS: + customTTL: 1h + filterUnmappedTypes: true + rewrite: [] + # - in: something.com + # out: somethingelse.com + mapping: [] + # - domain: something.com + # dnsserver: 192.168.178.1 +# -- Setup client-name lookup +clientLookup: + # -- upstream used for client-name lookup + upstream: "" + singleNameOrder: [] + clients: + # - domain: laptop + # ips: [] +# -- Setup caching +caching: + minTime: 15m + maxTime: 0 + maxItemsCount: 0 + prefetching: true + prefetchExpires: 12h + prefetchThreshold: 5 + prefetchMaxItemsCount: 0 + cacheTimeNegative: 30m +# -- set conditional settings +# Primarily designed for inclusion in the TrueNAS SCALE GUI +conditional: + rewrite: [] + # - in: something.com + # out: somethingelse.com + mapping: [] + # - domain: something.com + # dnsserver: 192.168.178.1 +# -- set blocking settings using Lists +# Primarily designed for inclusion in the TrueNAS SCALE GUI +blocking: + # -- Sets the blocktype + blockType: nxDomain + # -- Sets the block ttl + blockTTL: 6h + # -- Sets the block refreshPeriod + refreshPeriod: 4h + # -- Sets the block download timeout + downloadTimeout: 60s + # -- Sets the block download attempt count + downloadAttempts: 3 + # -- Sets the block download cooldown + downloadCooldown: 5s + # -- Set the start strategy (blocking | failOnError | fast) + startStrategy: fast + # -- Sets how many list-groups can be processed at the same time + processingConcurrency: 8 + # -- Add blocky whitelists + # `default` name is reservered for TrueCharts included default whitelist + # example shows the structure, though name should be changed when used + whitelist: [] + # - name: default + # lists: + # - https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/optional-list.txt + # - https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/whitelist.txt + # - https://raw.githubusercontent.com/rahilpathan/pihole-whitelist/main/1.LowWL.txt + + # -- Blocky blacklists + # `default` name is reservered for TrueCharts included default blacklist + # example shows the structure, though name should be changed when used + blacklist: [] + # - name: default + # lists: + # - https://big.oisd.nl/domainswild + + # -- Blocky clientGroupsBlock + clientGroupsBlock: + - name: default + groups: + - default +# -- configure using hostsfile for lookups +# Allows for using the hosts configured in kubernetes and such +hostsFile: + enabled: false + filePath: /etc/hosts + hostsTTL: 60m + refreshPeriod: 30m + +podOptions: + automountServiceAccountToken: true +portal: + open: + enabled: false +serviceAccount: + main: + # -- Specifies whether a service account should be created + enabled: true + primary: true +# -- Create a ClusterRole and ClusterRoleBinding +# @default -- See below +rbac: + main: + # -- Enables or disables the ClusterRole and ClusterRoleBinding + enabled: true + primary: true + clusterWide: true + # -- Set Rules on the ClusterRole + rules: + - apiGroups: + - "" + resources: + - services + - namespaces + verbs: + - list + - watch + - apiGroups: + - extensions + - networking.k8s.io + resources: + - ingresses + verbs: + - list + - watch +k8sgateway: + enabled: true + # -- TTL for non-apex responses (in seconds) + ttl: 300 + # -- Limit what kind of resources to watch, e.g. watchedResources: ["Ingress"] + watchedResources: [] + # -- Service name of a secondary DNS server (should be `serviceName.namespace`) + secondary: "" + # -- Override the default `serviceName.namespace` domain apex + apex: "" + # -- list of processed domains + domains: [] + # -- Delegated domain + # - domain: "example.com" + # # -- Optional configuration option for DNS01 challenge that will redirect all acme + # # challenge requests to external cloud domain (e.g. managed by cert-manager) + # # See: https://cert-manager.io/docs/configuration/acme/dns01/ + # dnsChallenge: + # enabled: false + # domain: dns01.clouddns.com + + forward: + enabled: false + primary: tls://1.1.1.1 + secondary: tls://1.0.0.1 + options: + - name: tls_servername + value: cloudflare-dns.com + +configmap: + dashboard: + enabled: true + labels: + grafana_dashboard: "1" + data: + blocky.json: >- + {{ .Files.Get "dashboard.json" | indent 8 }} + blockypostgres.json: >- + {{ .Files.Get "dashboardpsql.json" | indent 8 }} + datasource: + enabled: true + labels: + grafana_datasources: "1" + data: + datasourceblockypsql.yaml: |- + apiVersion: 1 + datasources: + - name: BlockyPostgres + type: postgres + uid: blockypostgres + url: {{ printf "%s.%s:5432" (.Values.cnpg.main.creds.host | trimAll "\"") .Release.Namespace }} + access: proxy + user: {{ .Values.cnpg.main.user }} + secureJsonData: + password: {{ .Values.cnpg.main.creds.password | default "na" }} + jsonData: + database: {{ .Values.cnpg.main.database }} + sslmode: 'disable' # disable/require/verify-ca/verify-full + maxOpenConns: 100 # Grafana v5.4+ + maxIdleConns: 100 # Grafana v5.4+ + maxIdleConnsAuto: true # Grafana v9.5.1+ + connMaxLifetime: 14400 # Grafana v5.4+ + postgresVersion: 1500 # 903=9.3, 904=9.4, 905=9.5, 906=9.6, 1000=10 + timescaledb: false + +metrics: + main: + # -- Enable and configure a Prometheus serviceMonitor for the chart under this key. + # @default -- See values.yaml + enabled: true + type: "servicemonitor" + endpoints: + - port: main + path: /metrics + # -- Enable and configure Prometheus Rules for the chart under this key. + # @default -- See values.yaml + prometheusRule: + enabled: false + labels: {} + # -- Configure additionial rules for the chart under this key. + # @default -- See prometheusrules.yaml + rules: [] + # - alert: UnifiPollerAbsent + # annotations: + # description: Unifi Poller has disappeared from Prometheus service discovery. + # summary: Unifi Poller is down. + # expr: | + # absent(up{job=~".*unifi-poller.*"} == 1) + # for: 5m + # labels: + # severity: critical + +redis: + enabled: true + includeCommon: true +# CANNOT be defined in above yaml section +queryLog: + # optional one of: mysql, postgresql, csv, csv-client. If empty, log to console + type: "postgresql" + # directory (should be mounted as volume in docker) for csv, db connection string for mysql, ignored for included postgresql + # target: /var/log/something + # postgresql target: postgres://user:password@db_host_or_ip:5432/db_name + # if > 0, deletes log files which are older than ... days + logRetentionDays: 0 + # optional: Max attempts to create specific query log writer, default: 3 + creationAttempts: 3 + # optional: Time between the creation attempts, default: 2s + creationCooldown: 2s + +cnpg: + main: + enabled: true + user: blocky + database: blocky diff --git a/premium/blocky/15.2.4/questions.yaml b/premium/blocky/15.2.4/questions.yaml new file mode 100644 index 0000000000..b1e2a474f8 --- /dev/null +++ b/premium/blocky/15.2.4/questions.yaml @@ -0,0 +1,3804 @@ +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: webUI + group: App Configuration + label: WebUI Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable Web UI + description: Enables Web UI + schema: + type: boolean + default: true + - variable: apiURL + label: API URL + description: API URL for webUI, including port. Only used when not using ingress + schema: + type: string + default: "http://127.0.0.1:4000" + - variable: overrideDefaults + group: App Configuration + label: Override Default Upstreams + description: Overrides the predefined DNS server upstream list + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: defaultUpstreams + label: Default Upstreams + schema: + type: list + default: [] + items: + - variable: upstreamEntry + label: Upstream Entry + schema: + type: string + required: true + default: "" + - variable: upstreams + group: App Configuration + label: Upstreams Groups + description: Refer to +
https://0xerr0r.github.io/blocky/configuration/#upstream-configuration + schema: + type: list + default: [] + items: + - variable: upstreamsGroupEntry + label: Upstreams Group Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Group Name + schema: + type: string + required: true + default: "" + - variable: upstreams + label: Upstreams + schema: + type: list + required: true + default: [] + items: + - variable: upstreamEntry + label: upstream Entry + schema: + type: string + required: true + default: "" + - variable: bootstrapDns + group: App Configuration + label: Bootstrap DNS + description: Used to resolve upstream DoH and DoT servers that are specified as hostnames. +
Refer to https://0xerr0r.github.io/blocky/configuration/#bootstrap-dns-configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: upstream + label: Upstream + schema: + type: string + default: "" + - variable: ips + label: IPs + schema: + type: list + default: [] + items: + - variable: ipEntry + label: IP Entry + schema: + type: string + required: true + default: "" + - variable: additionalBootstrapDns + group: App Configuration + label: Additional Bootstrap DNS + schema: + type: list + show_if: [[ "bootstrapDns", "!=", {"upstream": "", "ips": []} ]] + default: [] + items: + - variable: additionalBootstrapDnsEntry + label: Additional Bootstrap DNS Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: upstream + label: Upstream + schema: + type: string + default: "" + - variable: ips + label: IPs + schema: + type: list + default: [] + items: + - variable: ipEntry + label: IP Entry + schema: + type: string + required: true + default: "" + - variable: filtering + group: App Configuration + label: Filtering + description: Define one or more DNS query types; all queries with these types will be dropped +
Refer to https://0xerr0r.github.io/blocky/configuration/#filtering + schema: + additional_attrs: true + type: dict + attrs: + - variable: queryTypes + label: Query Types + schema: + type: list + default: [] + items: + - variable: queryTypeEntry + label: Query Type Entry + schema: + type: string + required: true + default: "" + - variable: customDNS + group: App Configuration + label: Custom DNS + description: Define your own domain name to IP mappings. +
Refer to https://0xerr0r.github.io/blocky/configuration/#custom-dns + schema: + additional_attrs: true + type: dict + attrs: + - variable: customTTL + label: Custom TTL + schema: + type: string + default: 1h + - variable: filterUnmappedTypes + label: Filter Unmapped Types + schema: + type: boolean + default: true + - variable: rewrite + label: Rewrite + schema: + type: list + default: [] + items: + - variable: rewriteEntry + label: Rewrite Entry + schema: + type: dict + additional_attrs: true + attrs: + - variable: in + label: In + schema: + type: string + required: true + default: "" + - variable: out + label: Out + schema: + type: string + required: true + default: "" + - variable: mapping + label: Mapping + schema: + type: list + default: [] + items: + - variable: mappingEntry + label: Mapping Entry + schema: + type: dict + additional_attrs: true + attrs: + - variable: domain + label: Domain + schema: + type: string + required: true + default: "" + - variable: dnsserver + label: DNS Server + schema: + type: string + required: true + default: "" + - variable: clientLookup + group: App Configuration + label: Client Lookup + description: Blocky can try to resolve a user-friendly client name from the IP address or server URL (DoT and DoH) +
Refer to https://0xerr0r.github.io/blocky/configuration/#client-name-lookup + schema: + additional_attrs: true + type: dict + attrs: + - variable: upstream + label: Upstream + schema: + type: string + default: "" + - variable: singleNameOrder + label: Single Name Order + schema: + type: list + default: [] + items: + - variable: singleNameEntry + label: Single Name Entry + schema: + type: string + required: true + default: "" + - variable: clients + label: Clients + schema: + type: list + default: [] + items: + - variable: clientEntry + label: Client Entry + schema: + type: dict + additional_attrs: true + attrs: + - variable: domain + label: Domain + schema: + type: string + required: true + default: "" + - variable: ips + label: IPs + schema: + type: list + default: [] + items: + - variable: ipEntry + label: IP Entry + schema: + type: string + required: true + default: "" + - variable: caching + group: App Configuration + label: Caching + description: Refer to +
https://0xerr0r.github.io/blocky/configuration/#caching + schema: + additional_attrs: true + type: dict + attrs: + - variable: minTime + label: Min Time + schema: + type: string + default: 5m + - variable: maxTime + label: Max Time + schema: + type: string + default: 30m + - variable: maxItemsCount + label: Max Items Count + schema: + type: int + default: 0 + - variable: prefetching + label: Prefetching + schema: + type: boolean + default: false + - variable: prefetchExpires + label: Prefetch Expires + schema: + type: string + default: 2h + - variable: prefetchThreshold + label: Prefetch Threshold + schema: + type: int + default: 5 + - variable: prefetchMaxItemsCount + label: Prefetch Max Items Count + schema: + type: int + default: 0 + - variable: cacheTimeNegative + label: Cache Time Negative + schema: + type: string + default: 30m + - variable: conditional + group: App Configuration + label: Conditional + description: Define which DNS resolver(s) should be used for queries for the particular domain +
Refer to https://0xerr0r.github.io/blocky/configuration/#conditional-dns-resolution + schema: + additional_attrs: true + type: dict + attrs: + - variable: rewrite + label: Rewrite + schema: + type: list + default: [] + items: + - variable: rewriteEntry + label: Rewrite Entry + schema: + type: dict + additional_attrs: true + attrs: + - variable: in + label: In + schema: + type: string + required: true + default: "" + - variable: out + label: Out + schema: + type: string + required: true + default: "" + - variable: mapping + label: Mapping + schema: + type: list + default: [] + items: + - variable: mappingEntry + label: Mapping Entry + schema: + type: dict + additional_attrs: true + attrs: + - variable: domain + label: Domain + schema: + type: string + required: true + default: "" + - variable: dnsserver + label: DNS Server + schema: + type: string + required: true + default: "" + - variable: blocking + group: App Configuration + label: Blocking + description: Each black or whitelist can be either a path to the local file or a URL to download. All Urls must be grouped to a group name. +
Refer to https://0xerr0r.github.io/blocky/configuration/#blocking-and-whitelisting + schema: + additional_attrs: true + type: dict + attrs: + - variable: blockType + label: Block Type + description: Set the response should be sent to the client, if a requested query is blocked + schema: + type: string + default: nxDomain + - variable: blockTTL + label: Block TTL + description: Set the TTL for answers to blocked domains + schema: + type: string + default: 6h + - variable: refreshPeriod + label: Refresh Period + description: Set how often blocky should refresh list cache + schema: + type: string + default: 4h + - variable: downloadTimeout + label: Download Timeout + description: Download attempt timeout + schema: + type: string + default: 60s + - variable: downloadAttempts + label: Download Attempts + description: How many download attempts should be performed + schema: + type: int + default: 3 + - variable: downloadCooldown + label: Download Cooldown + description: Time between the download attempts + schema: + type: string + default: 2s + - variable: startStrategy + label: Start Strategy + description: | + blocking: all blocking lists will be loaded before DNS resolution starts.
+ failOnError: like blocking but blocky will shut down if any download fails.
+ fast: DNS resolution starts immediately without blocking which will be enabled after list load is completed + schema: + type: string + default: blocking + enum: + - value: blocking + description: Blocking + - value: failOnError + description: Fail On Error + - value: fast + description: Fast + - variable: processingConcurrency + label: Processing Concurrency + description: Sets how many list-groups can be processed at the same time + schema: + type: int + default: 4 + - variable: whitelist + label: Whitelist + description: Define whitelists, either URL or file + schema: + type: list + default: [] + items: + - variable: whitelistEntry + label: Whitelist Group Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Group Name + schema: + type: string + required: true + default: "" + - variable: lists + label: Lists + schema: + type: list + required: true + default: [] + items: + - variable: listEntry + label: List Entry + schema: + type: string + required: true + default: "" + - variable: blacklist + label: Blacklist + description: Define blacklists, either URL or file + schema: + type: list + default: [] + items: + - variable: blacklistEntry + label: Blacklist Group Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Group Name + schema: + type: string + required: true + default: "" + - variable: lists + label: Lists + schema: + type: list + required: true + default: [] + items: + - variable: listEntry + label: List Entry + schema: + type: string + required: true + default: "" + - variable: clientGroupsBlock + label: Client Groups Block + description: Define, which blocking group(s) should be used for which client in your network. + schema: + type: list + default: [] + items: + - variable: clientGroupBlockEntry + label: Client Group Block Entry + schema: + additional_attrs: true + type: dict + attrs: + - variable: name + label: Client Group Name + schema: + type: string + required: true + default: "" + - variable: groups + label: Groups + schema: + type: list + required: true + default: [] + items: + - variable: groupEntry + label: Group Entry + schema: + type: string + required: true + default: "" + - variable: hostsFile + group: App Configuration + label: Hosts File + description: You can enable resolving of entries, located in local hosts file. +
Refer to https://0xerr0r.github.io/blocky/configuration/#hosts-file + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: filePath + label: File Path + schema: + type: string + default: /etc/hosts + - variable: hostsTTL + label: Hosts TTL + schema: + type: string + default: 60m + - variable: refreshPeriod + label: Refresh Period + schema: + type: string + default: 30m + - variable: queryLog + group: App Configuration + label: Query Logging configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + default: "" + enum: + - value: "" + description: Console + - value: postgresql + description: postgresql + - value: csv + description: csv + - value: csv-client + description: csv-client + - variable: target + label: Target + schema: + type: string + show_if: [["type", "!=", "postgresql"]] + default: "/var/log/something" + - variable: logRetentionDays + label: Log Retention Days + schema: + type: int + default: 0 + - variable: creationAttempts + label: Creation Attempts + schema: + type: int + default: 3 + - variable: creationCooldown + label: Creation Cooldown + schema: + type: string + default: 2s + - variable: k8sgateway + group: App Configuration + label: k8s-Gateway Configuration + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable k8s-Gateway + description: Enables k8s-Gateway + schema: + type: boolean + default: true + show_subquestions_if: true + subquestions: + - variable: domains + label: Domains + description: Please refer to CoreDNS docs for options + schema: + type: list + default: [] + items: + - variable: domainEntry + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: domain + label: Domain name + schema: + type: string + required: true + default: example.com + - variable: dnsChallenge + label: Forward dnsChallenge + description: Optional configuration option for DNS01 challenge that will redirect all acme + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enable + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: domain + label: Forward to Domain + schema: + type: string + required: true + default: dns01.clouddns.com + - variable: advancedOptions + label: Advanced Options + schema: + type: boolean + default: false + show_if: [["enabled", "=", true]] + show_subquestions_if: true + subquestions: + - variable: ttl + label: ttl + description: TTL for non-apex responses (in seconds) + schema: + type: int + default: 300 + - variable: watchedResources + label: Watched Resources + description: imit what kind of resources to watch, e.g. Ingress + schema: + type: list + default: [] + items: + - variable: watchedResource + label: Watched Resource + schema: + type: string + default: "" + - variable: secondary + label: Secondary DNS Server Service + description: Service name of a secondary DNS server (should be serviceName.namespace) + schema: + type: string + default: "" + - variable: apex + label: Apex + description: Override the default `serviceName.namespace` domain apex + schema: + type: string + default: "" + - 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: dns + label: DNS Service + description: The DNS service + 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: dns + label: DNS 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: 53 + required: true + - variable: dot + label: DoT Service + description: "DNS-over-TLS service" + 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: ClusterIP + 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: dot + label: DoT 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: 853 + 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: 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: 568 + - variable: runAsGroup + label: "runAsGroup" + description: "The groupID of the user running the application" + schema: + type: int + default: 568 + # 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: cnpg + group: Postgresql + label: "CloudNative-PG (CNPG)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Postgresql Database" + schema: + additional_attrs: true + type: dict + attrs: + - variable: hibernate + label: Hibernate + description: "enable to safely hibernate and shutdown the postgresql cluster" + schema: + type: boolean + default: false + - variable: mode + label: Mode + description: 'Cluster mode of operation. Available modes: standalone - default mode. Creates new or updates an existing CNPG cluster. recovery - Same as standalone but creates a cluster from a backup, object store or via pg_basebackup replica - Creates a replica cluster from an existing CNPG cluster. # TODO.' + schema: + type: string + default: "standalone" + enum: + - value: standalone + description: standalone + - value: replica + description: replica + - value: recovery + description: recovery + - variable: pgVersion + label: Postgres Version + description: "Set the Postgresql version used" + schema: + type: int + default: 16 + required: true + - variable: password + label: Password + description: "Set the password for the database-user" + schema: + type: string + default: "PLACEHOLDERPASSWORD" + required: true + - variable: cluster + label: "Cluster Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: instances + label: Instances + schema: + type: int + default: 1 + - variable: singleNode + label: singleNode + schema: + type: boolean + default: true + hidden: true + - variable: storage + label: "Storage" + schema: + additional_attrs: true + type: dict + attrs: + - variable: size + label: Size + schema: + type: string + default: "256Gi" + - variable: walStorage + label: "WAL Storage" + schema: + additional_attrs: true + type: dict + attrs: + - variable: size + label: Size + schema: + type: string + default: "256Gi" + - variable: monitoring + label: "Monitoring Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enablePodMonitor + label: "enablePodMonitor" + schema: + type: boolean + default: true + - variable: disableDefaultQueries + label: "disableDefaultQueries" + schema: + type: boolean + default: false + - variable: pooler + label: "Pooler Settings" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + schema: + type: boolean + default: false + - variable: instances + label: Instances + schema: + type: int + show_if: [["enabled", "=", true]] + default: 1 + - variable: createRO + label: "Create ReadOnly Instance" + schema: + type: boolean + show_if: [["enabled", "=", true]] + default: false + - variable: backups + label: "Backup Settings (Experimental)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: "enabled" + schema: + type: boolean + default: false + - variable: revision + label: "revision" + schema: + type: string + default: "" + - variable: retentionPolicy + label: "retentionPolicy" + schema: + type: string + show_if: [["enabled", "=", true]] + default: "30d" + - variable: credentials + label: "Credentials" + description: "Name of the credentials in the credentials section" + schema: + type: string + show_if: [["enabled", "=", true]] + default: "" + required: true + - variable: recovery + label: "Recovery Settings (Experimental)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: "enabled" + schema: + type: boolean + default: false + - variable: serverName + label: "serverName" + schema: + type: string + default: "" + - variable: revision + label: "revision" + schema: + type: string + default: "" + - variable: method + label: "method" + schema: + type: string + show_if: [["enabled", "=", true]] + default: "object_store" + - variable: backupName + label: "backupName" + schema: + type: string + show_if: [["enabled", "=", true]] + default: "" + - variable: credentials + label: "Credentials" + description: "Name of the credentials in the credentials section" + schema: + type: string + show_if: [["enabled", "=", true]] + default: "" + required: true + + - variable: metrics + group: Metrics + label: Prometheus Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: Main Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Prometheus Metrics + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + + - variable: prometheusRule + label: PrometheusRule + description: Enable and configure Prometheus Rules for the App. + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Prometheus Metrics + schema: + type: boolean + default: false + # TODO: Rule List section + +# - 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/premium/blocky/15.2.4/templates/NOTES.txt b/premium/blocky/15.2.4/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/premium/blocky/15.2.4/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/premium/blocky/15.2.4/templates/_blockyConfig.tpl b/premium/blocky/15.2.4/templates/_blockyConfig.tpl new file mode 100644 index 0000000000..9e6cd8624d --- /dev/null +++ b/premium/blocky/15.2.4/templates/_blockyConfig.tpl @@ -0,0 +1,238 @@ +{{/* Define the config */}} +{{- define "blocky.configmap" -}} +{{- $config := mustMerge ( include "blocky.config" . | fromYaml ) ( .Values.blockyConfig ) }} +enabled: true +data: + config.yml: | +{{ $config | toYaml | indent 4 }} +{{- end -}} + +{{- define "blocky.config" -}} +redis: + address: {{ printf "%v-%v" .Release.Name "redis" }}:6379 + password: {{ .Values.redis.creds.redisPassword | trimAll "\"" }} + database: 0 + required: true + connectionAttempts: 10 + connectionCooldown: 3s +prometheus: + enable: true + path: /metrics +queryLog: + # optional one of: postgresql, csv, csv-client. If empty, log to console + type: {{ .Values.queryLog.type }} + # directory (should be mounted as volume in docker) for csv, db connection string for mysql/postgresql + #postgresql target: postgres://user:password@db_host_or_ip:5432/db_name + {{- if eq .Values.queryLog.type "postgresql" }} + target: {{ .Values.cnpg.main.creds.std }} + {{- else }} + target: {{ .Values.queryLog.target }} + {{- end }} + # if > 0, deletes log files which are older than ... days + logRetentionDays: {{ .Values.queryLog.logRetentionDays | default 0 }} + # optional: Max attempts to create specific query log writer + creationAttempts: {{ .Values.queryLog.creationAttempts | default 3 }} + # optional: Time between the creation attempts + creationCooldown: {{ .Values.queryLog.creationAttempts | default "2s" }} + +upstream: + default: +{{- .Values.defaultUpstreams | toYaml | nindent 8 }} +{{- range $id, $value := .Values.upstreams }} + {{ $value.name }}: +{{- $value.dnsservers | toYaml | nindent 8 }} +{{- end }} + +upstreamTimeout: {{ .Values.upstreamTimeout | default "1s" }} + +ports: + {{- if .Values.service.dns.enabled }} + dns: {{ .Values.service.dns.ports.dns.targetPort }} + {{- end }} + {{- if .Values.service.dot.enabled }} + tls: {{ .Values.service.dot.ports.dot.targetPort }} + {{- end }} + {{- if .Values.service.main.enabled }} + http: {{ .Values.service.main.ports.main.targetPort }} + {{- end }} + {{- if .Values.service.https.enabled }} + https: {{ .Values.service.https.ports.https.targetPort }} + {{- end }} + +{{- if .Values.certFile }} +certFile: {{ .Values.certFile }} +{{- end }} + +{{- if .Values.keyFile }} +keyFile: {{ .Values.keyFile }} +{{- end }} + +log: + {{- if .Values.logLevel }} + level: {{ .Values.logLevel }} + {{- end }} + {{- if .Values.logTimestamp }} + timestamp: {{ .Values.logTimestamp }} + {{- end }} + {{- if .Values.logPrivacy }} + privacy: {{ .Values.logPrivacy }} + {{- end }} + +{{- if .Values.dohUserAgent }} +dohUserAgent: {{ .Values.dohUserAgent }} +{{- end }} + +{{- if .Values.minTlsServeVersion }} +minTlsServeVersion: {{ .Values.minTlsServeVersion }} +{{- end }} + +caching: +{{ toYaml .Values.caching | indent 2 }} + +{{- if .Values.hostsFile.enabled }} +{{ $hostsfile := omit .Values.hostsFile "enabled" }} +hostsFile: +{{ toYaml $hostsfile | indent 2 }} +{{- end }} + +{{- if or .Values.bootstrapDns.upstream .Values.bootstrapDns.ips }} +bootstrapDns: + {{- if .Values.bootstrapDns.upstream }} + - upstream: {{ .Values.bootstrapDns.upstream }} + {{- end }} + {{- if .Values.bootstrapDns.ips }} + ips: + {{- range $id, $value := .Values.bootstrapDns.ips }} + - {{ $value }} + {{- end }} + {{- end }} + {{/* Add additional Bootstrap DNS */}} + {{- range .Values.additionalBootstrapDns }} + {{- with .upstream }} + - upstream: {{ . }} + {{- end }} + {{- if .ips }} + ips: + {{- range $id, $value := .ips }} + - {{ $value }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} + +{{- if or .Values.filtering.filtering }} +filtering: +{{- if .Values.filtering.ips }} + queryTypes: +{{- range $id, $value := .Values.filtering.ips }} + - {{ $value }} +{{- end }} +{{- end }} +{{- end }} + +{{- if or .Values.customDNS.filterUnmappedTypes .Values.customDNS.customTTL .Values.customDNS.rewrite .Values.customDNS.mapping }} +customDNS: +{{- if .Values.customDNS.upstream }} + upstream: {{ .Values.customDNS.upstream }} +{{- end }} +{{- if .Values.customDNS.customTTL }} + customTTL: {{ .Values.customDNS.customTTL }} +{{- end }} +{{- if .Values.customDNS.rewrite }} + rewrite: +{{- range $id, $value := .Values.customDNS.rewrite }} + {{ $value.in }}: {{ $value.out }} +{{- end }} +{{- end }} + +{{- if .Values.customDNS.mapping }} + mapping: +{{- range $id, $value := .Values.customDNS.mapping }} + {{ $value.domain }}: {{ $value.dnsserver }} +{{- end }} +{{- end }} +{{- end }} + +{{- if or .Values.clientLookup.upstream .Values.clientLookup.ips }} +clientLookup: +{{- if .Values.clientLookup.upstream }} + upstream: {{ .Values.clientLookup.upstream }} +{{- end }} +{{- if .Values.clientLookup.ips }} + singleNameOrder: +{{- range $id, $value := .Values.clientLookup.ips }} + - {{ $value }} +{{- end }} +{{- end }} +{{- if .Values.clientLookup.clients }} + clients: +{{- range $id, $value := .Values.clientLookup.clients }} + {{ $value.domain }}: + {{- range $id, $value := .ips }} + - {{ $value }} + {{- end }} +{{- end }} +{{- end }} +{{- end }} + +{{- if or .Values.conditional.rewrite .Values.conditional.mapping ( and .Values.k8sgateway.enabled .Values.k8sgateway.domains ) }} +conditional: +{{- if .Values.conditional.rewrite }} + rewrite: +{{- range $id, $value := .Values.conditional.rewrite }} + {{ $value.in }}: {{ $value.out }} +{{- end }} +{{- end }} + +{{- if or .Values.conditional.mapping ( and .Values.k8sgateway.enabled .Values.k8sgateway.domains ) }} + mapping: +{{- if and .Values.k8sgateway.enabled .Values.k8sgateway.domains }} +{{- range $id, $value := .Values.k8sgateway.domains }} + {{ .domain }}: 127.0.0.1:{{ $.Values.service.k8sgateway.ports.k8sgateway.targetPort }} +{{- end }} +{{- end }} +{{- range $id, $value := .Values.conditional.mapping }} + {{ $value.domain }}: {{ $value.dnsserver }} +{{- end }} +{{- end }} +{{- end }} + +blocking: + blockType: {{ .Values.blocking.blockType }} + blockTTL: {{ .Values.blocking.blockTTL }} + refreshPeriod: {{ .Values.blocking.refreshPeriod }} + downloadTimeout: {{ .Values.blocking.downloadTimeout }} + downloadAttempts: {{ .Values.blocking.downloadAttempts }} + downloadCooldown: {{ .Values.blocking.downloadCooldown }} + startStrategy: {{ .Values.blocking.startStrategy }} + processingConcurrency: {{ .Values.blocking.processingConcurrency }} + + whiteLists: + default: + - https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/optional-list.txt + - https://raw.githubusercontent.com/anudeepND/whitelist/master/domains/whitelist.txt + - https://raw.githubusercontent.com/rahilpathan/pihole-whitelist/main/1.LowWL.txt +{{- range $id, $value := .Values.blocking.whitelist }} + {{ $value.name }}: +{{- $value.lists | toYaml | nindent 10 }} +{{- end }} + + + blackLists: + default: + - https://big.oisd.nl/domainswild + - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts +{{- range $id, $value := .Values.blocking.blacklist }} + {{ $value.name }}: +{{- $value.lists | toYaml | nindent 10 }} +{{- end }} + +{{- if .Values.blocking.clientGroupsBlock }} + clientGroupsBlock: +{{- range $id, $value := .Values.blocking.clientGroupsBlock }} + {{ $value.name }}: +{{- $value.groups | toYaml | nindent 10 }} +{{- end }} +{{- end }} + +{{- end -}} diff --git a/premium/blocky/15.2.4/templates/_k8sgateway.tpl b/premium/blocky/15.2.4/templates/_k8sgateway.tpl new file mode 100644 index 0000000000..463923f85d --- /dev/null +++ b/premium/blocky/15.2.4/templates/_k8sgateway.tpl @@ -0,0 +1,90 @@ +{{- define "k8sgateway.container" -}} +enabled: true +imageSelector: k8sgatewayImage +securityContext: + runAsUser: 0 + runAsGroup: 0 + readOnlyRootFilesystem: true +args: ["-conf", "/etc/coredns/Corefile"] +probes: + readiness: + enabled: true + path: /ready + port: 8181 + liveness: + enabled: true + path: /health + port: 8080 + startup: + enabled: true + path: /ready + port: 8181 +{{- end -}} + +{{/* +Create the matchable regex from domain +*/}} +{{- define "k8sgateway.configmap.regex" -}} +{{- if .dnsChallenge.domain }} +{{- .dnsChallenge.domain | replace "." "[.]" -}} +{{- else -}} + {{ "unset" }} +{{- end }} +{{- end -}} + +{{/* Define the configmap */}} +{{- define "k8sgateway.configmap" -}} +{{- $values := .Values.k8sgateway }} +{{- $fqdn := ( include "tc.v1.common.lib.chart.names.fqdn" . ) }} +enabled: true +data: + Corefile: | + .:{{ .Values.service.k8sgateway.ports.k8sgateway.targetPort }} { + errors + log + health { + lameduck 5s + } + ready + {{- range .Values.k8sgateway.domains }} + {{- if .dnsChallenge.enabled }} + {{- if not .dnsChallenge.domain -}} + {{- fail "DNS01 challenge domain is mandatory" -}} + {{- end }} + + template IN ANY {{ required "Delegated domain ('domain') is mandatory" .domain }} { + match "_acme-challenge[.](.*)[.]{{ include "k8sgateway.configmap.regex" . }}" + {{- $name := "{{ \"{{ .Name }}\" }}" }} + {{- $index := "{{ \"{{ index .Match 1 }}\" }}" }} + answer "{{ $name }} 5 IN CNAME {{ $index }}.{{ .dnsChallenge.domain }}" + fallthrough + } + {{- end }} + {{- end }} + k8s_gateway {{ range .Values.k8sgateway.domains }}"{{ required "Delegated domain ('domain') is mandatory " .domain }}"{{ end }} { + apex {{ $values.apex | default $fqdn }} + ttl {{ $values.ttl }} + {{- if $values.secondary }} + secondary {{ $values.secondary }} + {{- end }} + {{- if $values.watchedResources }} + resources {{ join " " $values.watchedResources }} + {{- end }} + fallthrough + } + + prometheus 0.0.0.0:9153 + {{- if .Values.k8sgateway.forward.enabled }} + forward . {{ .Values.k8sgateway.forward.primary }} {{ .Values.k8sgateway.forward.secondary }} { + {{- range .Values.k8sgateway.forward.options }} + {{ .name }} {{ .value }} + {{- end }} + } + {{- else }} + forward . 1.1.1.1 + {{- end }} + loop + reload + loadbalance + } +{{- end -}} diff --git a/premium/blocky/15.2.4/templates/common.yaml b/premium/blocky/15.2.4/templates/common.yaml new file mode 100644 index 0000000000..310ef64af8 --- /dev/null +++ b/premium/blocky/15.2.4/templates/common.yaml @@ -0,0 +1,106 @@ +{{/* Make sure all variables are set properly */}} +{{- if eq .Values.queryLog.type "postgresql" -}} + {{- $_ := set .Values.cnpg.main "enabled" true -}} +{{- end }} +{{- include "tc.v1.common.loader.init" . }} + +{{/* Render configmap for blocky */}} +{{- $configmapFile := include "blocky.configmap" . | fromYaml -}} +{{- if $configmapFile -}} + {{- $_ := set .Values.configmap "config" $configmapFile -}} +{{- end -}} + +{{- $gatewayconfig := include "k8sgateway.configmap" . | fromYaml -}} +{{- if $gatewayconfig -}} + {{- $_ := set .Values.configmap "corefile" $gatewayconfig -}} +{{- end -}} + +{{/* Always mount the configmap, with the basic config, plus the 'blockyConfig' */}} +{{- define "blocky.configmap.mount" -}} +enabled: true +type: configmap +mountPath: /app/config.yml +objectName: config +readOnly: true +subPath: config.yml +{{- end -}} + +{{/* Append the general configMap volume to the volumes */}} +{{- define "k8sgateway.configvolume" -}} +enabled: true +type: configmap +objectName: corefile +items: + - key: Corefile + path: Corefile +targetSelector: + main: + k8sgateway: + mountPath: "/etc/coredns" + readOnly: true + +{{- end -}} + +{{- $_ := set .Values.persistence "tc-config" (include "blocky.configmap.mount" . | fromYaml) -}} + +{{- if and .Values.k8sgateway.enabled .Values.k8sgateway.domains -}} +{{- $_ := set .Values.persistence "config-volume" (include "k8sgateway.configvolume" . | fromYaml) -}} +{{- $_ := set .Values.workload.main.podSpec.containers "k8sgateway" (include "k8sgateway.container" . | fromYaml) -}} +{{- end -}} + +{{/* Define path for api */}} +{{- define "blocky.api" -}} +{{- $fullname := include "tc.v1.common.lib.chart.names.fullname" . -}} +path: "/api" +# -- Ignored if not kubeVersion >= 1.14-0 +pathType: Prefix +service: + # -- Overrides the service name reference for this path + name: {{ printf "%s-main" $fullname }} + port: {{ .Values.service.main.ports.main.port }} +{{- end -}} + +{{/* inject websocket path to all main ingress hosts*/}} +{{- define "blocky.apiinjector" -}} +{{- $path := list (include "blocky.api" . | fromYaml) -}} +{{- if .Values.ingress.main.enabled }} +{{- range .Values.ingress.main.hosts }} +{{- $newpaths := list }} +{{- $newpaths := concat .paths $path }} +{{- $_ := set . "paths" ( deepCopy $newpaths ) -}} +{{- end }} +{{- end }} +{{- end -}} + +{{/* inject api paths in ingress */}} +{{- include "blocky.apiinjector" . }} + +{{/* Define path for DoH */}} +{{- define "blocky.doh" -}} +{{- $fullname := include "tc.v1.common.lib.chart.names.fullname" . -}} +path: "/dns-query" +# -- Ignored if not kubeVersion >= 1.14-0 +pathType: Prefix +service: + # -- Overrides the service name reference for this path + name: {{ printf "%s-main" $fullname }} + port: {{ .Values.service.main.ports.main.port }} +{{- end -}} + +{{/* inject websocket path to all main ingress hosts*/}} +{{- define "blocky.dohinjector" -}} +{{- $path := list (include "blocky.doh" . | fromYaml) -}} +{{- if .Values.ingress.main.enabled }} +{{- range .Values.ingress.main.hosts }} +{{- $newpaths := list }} +{{- $newpaths := concat .paths $path }} +{{- $_ := set . "paths" ( deepCopy $newpaths ) -}} +{{- end }} +{{- end }} +{{- end -}} + +{{/* inject api paths in ingress */}} +{{- include "blocky.dohinjector" . }} + +{{/* Render the templates */}} +{{ include "tc.v1.common.loader.apply" . }} diff --git a/premium/blocky/15.2.4/values.yaml b/premium/blocky/15.2.4/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/premium/blocky/app_versions.json b/premium/blocky/app_versions.json index 942c1d6886..004d808f2b 100644 --- a/premium/blocky/app_versions.json +++ b/premium/blocky/app_versions.json @@ -1,4 +1,6274 @@ { + "15.2.4": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/premium/blocky/15.2.4", + "last_update": "2024-12-21 22:27:06", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "0.24.0_15.2.4", + "version": "15.2.4", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "network", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "premium" + }, + "apiVersion": "v2", + "appVersion": "0.24.0", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + }, + { + "name": "redis", + "version": "14.0.5", + "repository": "oci://tccr.io/truecharts", + "condition": "redis.enabled", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "Blocky is a DNS proxy, DNS enhancer and ad-blocker for the local network written in Go", + "home": "https://truecharts.org/charts/premium/blocky", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/blocky.webp", + "keywords": [ + "dns", + "blocky" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "blocky", + "sources": [ + "https://0xerr0r.github.io/blocky/", + "https://github.com/0xERR0R/blocky", + "https://github.com/Mozart409/blocky-frontend", + "https://github.com/truecharts/charts/tree/master/charts/premium/blocky", + "https://hub.docker.com/r/spx01/blocky", + "https://quay.io/oriedge/k8s_gateway" + ], + "type": "application", + "version": "15.2.4" + }, + "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": "webUI", + "group": "App Configuration", + "label": "WebUI Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable Web UI", + "description": "Enables Web UI", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "apiURL", + "label": "API URL", + "description": "API URL for webUI, including port. Only used when not using ingress", + "schema": { + "type": "string", + "default": "http://127.0.0.1:4000" + } + } + ] + } + }, + { + "variable": "overrideDefaults", + "group": "App Configuration", + "label": "Override Default Upstreams", + "description": "Overrides the predefined DNS server upstream list", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "defaultUpstreams", + "label": "Default Upstreams", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "upstreamEntry", + "label": "Upstream Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "upstreams", + "group": "App Configuration", + "label": "Upstreams Groups", + "description": "Refer to
https://0xerr0r.github.io/blocky/configuration/#upstream-configuration", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "upstreamsGroupEntry", + "label": "Upstreams Group Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Group Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "upstreams", + "label": "Upstreams", + "schema": { + "type": "list", + "required": true, + "default": [], + "items": [ + { + "variable": "upstreamEntry", + "label": "upstream Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "bootstrapDns", + "group": "App Configuration", + "label": "Bootstrap DNS", + "description": "Used to resolve upstream DoH and DoT servers that are specified as hostnames.
Refer to https://0xerr0r.github.io/blocky/configuration/#bootstrap-dns-configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "upstream", + "label": "Upstream", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "ips", + "label": "IPs", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipEntry", + "label": "IP Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "additionalBootstrapDns", + "group": "App Configuration", + "label": "Additional Bootstrap DNS", + "schema": { + "type": "list", + "show_if": [ + [ + "bootstrapDns", + "!=", + { + "upstream": "", + "ips": [] + } + ] + ], + "default": [], + "items": [ + { + "variable": "additionalBootstrapDnsEntry", + "label": "Additional Bootstrap DNS Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "upstream", + "label": "Upstream", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "ips", + "label": "IPs", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipEntry", + "label": "IP Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "filtering", + "group": "App Configuration", + "label": "Filtering", + "description": "Define one or more DNS query types; all queries with these types will be dropped
Refer to https://0xerr0r.github.io/blocky/configuration/#filtering", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "queryTypes", + "label": "Query Types", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "queryTypeEntry", + "label": "Query Type Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "customDNS", + "group": "App Configuration", + "label": "Custom DNS", + "description": "Define your own domain name to IP mappings.
Refer to https://0xerr0r.github.io/blocky/configuration/#custom-dns", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "customTTL", + "label": "Custom TTL", + "schema": { + "type": "string", + "default": "1h" + } + }, + { + "variable": "filterUnmappedTypes", + "label": "Filter Unmapped Types", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "rewrite", + "label": "Rewrite", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "rewriteEntry", + "label": "Rewrite Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "in", + "label": "In", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "out", + "label": "Out", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "mapping", + "label": "Mapping", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "mappingEntry", + "label": "Mapping Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "domain", + "label": "Domain", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "dnsserver", + "label": "DNS Server", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "clientLookup", + "group": "App Configuration", + "label": "Client Lookup", + "description": "Blocky can try to resolve a user-friendly client name from the IP address or server URL (DoT and DoH)
Refer to https://0xerr0r.github.io/blocky/configuration/#client-name-lookup", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "upstream", + "label": "Upstream", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "singleNameOrder", + "label": "Single Name Order", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "singleNameEntry", + "label": "Single Name Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + }, + { + "variable": "clients", + "label": "Clients", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "clientEntry", + "label": "Client Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "domain", + "label": "Domain", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "ips", + "label": "IPs", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "ipEntry", + "label": "IP Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "caching", + "group": "App Configuration", + "label": "Caching", + "description": "Refer to
https://0xerr0r.github.io/blocky/configuration/#caching", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "minTime", + "label": "Min Time", + "schema": { + "type": "string", + "default": "5m" + } + }, + { + "variable": "maxTime", + "label": "Max Time", + "schema": { + "type": "string", + "default": "30m" + } + }, + { + "variable": "maxItemsCount", + "label": "Max Items Count", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "prefetching", + "label": "Prefetching", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "prefetchExpires", + "label": "Prefetch Expires", + "schema": { + "type": "string", + "default": "2h" + } + }, + { + "variable": "prefetchThreshold", + "label": "Prefetch Threshold", + "schema": { + "type": "int", + "default": 5 + } + }, + { + "variable": "prefetchMaxItemsCount", + "label": "Prefetch Max Items Count", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "cacheTimeNegative", + "label": "Cache Time Negative", + "schema": { + "type": "string", + "default": "30m" + } + } + ] + } + }, + { + "variable": "conditional", + "group": "App Configuration", + "label": "Conditional", + "description": "Define which DNS resolver(s) should be used for queries for the particular domain
Refer to https://0xerr0r.github.io/blocky/configuration/#conditional-dns-resolution", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "rewrite", + "label": "Rewrite", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "rewriteEntry", + "label": "Rewrite Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "in", + "label": "In", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "out", + "label": "Out", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + }, + { + "variable": "mapping", + "label": "Mapping", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "mappingEntry", + "label": "Mapping Entry", + "schema": { + "type": "dict", + "additional_attrs": true, + "attrs": [ + { + "variable": "domain", + "label": "Domain", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "dnsserver", + "label": "DNS Server", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "blocking", + "group": "App Configuration", + "label": "Blocking", + "description": "Each black or whitelist can be either a path to the local file or a URL to download. All Urls must be grouped to a group name.
Refer to https://0xerr0r.github.io/blocky/configuration/#blocking-and-whitelisting", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "blockType", + "label": "Block Type", + "description": "Set the response should be sent to the client, if a requested query is blocked", + "schema": { + "type": "string", + "default": "nxDomain" + } + }, + { + "variable": "blockTTL", + "label": "Block TTL", + "description": "Set the TTL for answers to blocked domains", + "schema": { + "type": "string", + "default": "6h" + } + }, + { + "variable": "refreshPeriod", + "label": "Refresh Period", + "description": "Set how often blocky should refresh list cache", + "schema": { + "type": "string", + "default": "4h" + } + }, + { + "variable": "downloadTimeout", + "label": "Download Timeout", + "description": "Download attempt timeout", + "schema": { + "type": "string", + "default": "60s" + } + }, + { + "variable": "downloadAttempts", + "label": "Download Attempts", + "description": "How many download attempts should be performed", + "schema": { + "type": "int", + "default": 3 + } + }, + { + "variable": "downloadCooldown", + "label": "Download Cooldown", + "description": "Time between the download attempts", + "schema": { + "type": "string", + "default": "2s" + } + }, + { + "variable": "startStrategy", + "label": "Start Strategy", + "description": "blocking: all blocking lists will be loaded before DNS resolution starts.
\nfailOnError: like blocking but blocky will shut down if any download fails.
\nfast: DNS resolution starts immediately without blocking which will be enabled after list load is completed\n", + "schema": { + "type": "string", + "default": "blocking", + "enum": [ + { + "value": "blocking", + "description": "Blocking" + }, + { + "value": "failOnError", + "description": "Fail On Error" + }, + { + "value": "fast", + "description": "Fast" + } + ] + } + }, + { + "variable": "processingConcurrency", + "label": "Processing Concurrency", + "description": "Sets how many list-groups can be processed at the same time", + "schema": { + "type": "int", + "default": 4 + } + }, + { + "variable": "whitelist", + "label": "Whitelist", + "description": "Define whitelists, either URL or file", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "whitelistEntry", + "label": "Whitelist Group Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Group Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lists", + "label": "Lists", + "schema": { + "type": "list", + "required": true, + "default": [], + "items": [ + { + "variable": "listEntry", + "label": "List Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "blacklist", + "label": "Blacklist", + "description": "Define blacklists, either URL or file", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "blacklistEntry", + "label": "Blacklist Group Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Group Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "lists", + "label": "Lists", + "schema": { + "type": "list", + "required": true, + "default": [], + "items": [ + { + "variable": "listEntry", + "label": "List Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "clientGroupsBlock", + "label": "Client Groups Block", + "description": "Define, which blocking group(s) should be used for which client in your network.", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "clientGroupBlockEntry", + "label": "Client Group Block Entry", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "name", + "label": "Client Group Name", + "schema": { + "type": "string", + "required": true, + "default": "" + } + }, + { + "variable": "groups", + "label": "Groups", + "schema": { + "type": "list", + "required": true, + "default": [], + "items": [ + { + "variable": "groupEntry", + "label": "Group Entry", + "schema": { + "type": "string", + "required": true, + "default": "" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "hostsFile", + "group": "App Configuration", + "label": "Hosts File", + "description": "You can enable resolving of entries, located in local hosts file.
Refer to https://0xerr0r.github.io/blocky/configuration/#hosts-file", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "filePath", + "label": "File Path", + "schema": { + "type": "string", + "default": "/etc/hosts" + } + }, + { + "variable": "hostsTTL", + "label": "Hosts TTL", + "schema": { + "type": "string", + "default": "60m" + } + }, + { + "variable": "refreshPeriod", + "label": "Refresh Period", + "schema": { + "type": "string", + "default": "30m" + } + } + ] + } + } + ] + } + }, + { + "variable": "queryLog", + "group": "App Configuration", + "label": "Query Logging configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type", + "schema": { + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "Console" + }, + { + "value": "postgresql", + "description": "postgresql" + }, + { + "value": "csv", + "description": "csv" + }, + { + "value": "csv-client", + "description": "csv-client" + } + ] + } + }, + { + "variable": "target", + "label": "Target", + "schema": { + "type": "string", + "show_if": [ + [ + "type", + "!=", + "postgresql" + ] + ], + "default": "/var/log/something" + } + }, + { + "variable": "logRetentionDays", + "label": "Log Retention Days", + "schema": { + "type": "int", + "default": 0 + } + }, + { + "variable": "creationAttempts", + "label": "Creation Attempts", + "schema": { + "type": "int", + "default": 3 + } + }, + { + "variable": "creationCooldown", + "label": "Creation Cooldown", + "schema": { + "type": "string", + "default": "2s" + } + } + ] + } + }, + { + "variable": "k8sgateway", + "group": "App Configuration", + "label": "k8s-Gateway Configuration", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable k8s-Gateway", + "description": "Enables k8s-Gateway", + "schema": { + "type": "boolean", + "default": true, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "domains", + "label": "Domains", + "description": "Please refer to CoreDNS docs for options", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "domainEntry", + "label": "", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "domain", + "label": "Domain name", + "schema": { + "type": "string", + "required": true, + "default": "example.com" + } + }, + { + "variable": "dnsChallenge", + "label": "Forward dnsChallenge", + "description": "Optional configuration option for DNS01 challenge that will redirect all acme", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enable", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "domain", + "label": "Forward to Domain", + "schema": { + "type": "string", + "required": true, + "default": "dns01.clouddns.com" + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "advancedOptions", + "label": "Advanced Options", + "schema": { + "type": "boolean", + "default": false, + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "ttl", + "label": "ttl", + "description": "TTL for non-apex responses (in seconds)", + "schema": { + "type": "int", + "default": 300 + } + }, + { + "variable": "watchedResources", + "label": "Watched Resources", + "description": "imit what kind of resources to watch, e.g. Ingress", + "schema": { + "type": "list", + "default": [], + "items": [ + { + "variable": "watchedResource", + "label": "Watched Resource", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "variable": "secondary", + "label": "Secondary DNS Server Service", + "description": "Service name of a secondary DNS server (should be serviceName.namespace)", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "apex", + "label": "Apex", + "description": "Override the default `serviceName.namespace` domain apex", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + } + ] + } + }, + { + "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": "dns", + "label": "DNS Service", + "description": "The DNS service", + "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": "dns", + "label": "DNS 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": 53, + "required": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "dot", + "label": "DoT Service", + "description": "DNS-over-TLS service", + "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": "ClusterIP", + "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": "dot", + "label": "DoT 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": 853, + "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": "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": 568 + } + }, + { + "variable": "runAsGroup", + "label": "runAsGroup", + "description": "The groupID of the user running the application", + "schema": { + "type": "int", + "default": 568 + } + }, + { + "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": "cnpg", + "group": "Postgresql", + "label": "CloudNative-PG (CNPG)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Postgresql Database", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "hibernate", + "label": "Hibernate", + "description": "enable to safely hibernate and shutdown the postgresql cluster", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "mode", + "label": "Mode", + "description": "Cluster mode of operation. Available modes: standalone - default mode. Creates new or updates an existing CNPG cluster. recovery - Same as standalone but creates a cluster from a backup, object store or via pg_basebackup replica - Creates a replica cluster from an existing CNPG cluster. # TODO.", + "schema": { + "type": "string", + "default": "standalone", + "enum": [ + { + "value": "standalone", + "description": "standalone" + }, + { + "value": "replica", + "description": "replica" + }, + { + "value": "recovery", + "description": "recovery" + } + ] + } + }, + { + "variable": "pgVersion", + "label": "Postgres Version", + "description": "Set the Postgresql version used", + "schema": { + "type": "int", + "default": 16, + "required": true + } + }, + { + "variable": "password", + "label": "Password", + "description": "Set the password for the database-user", + "schema": { + "type": "string", + "default": "PLACEHOLDERPASSWORD", + "required": true + } + }, + { + "variable": "cluster", + "label": "Cluster Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "instances", + "label": "Instances", + "schema": { + "type": "int", + "default": 1 + } + }, + { + "variable": "singleNode", + "label": "singleNode", + "schema": { + "type": "boolean", + "default": true, + "hidden": true + } + }, + { + "variable": "storage", + "label": "Storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "size", + "label": "Size", + "schema": { + "type": "string", + "default": "256Gi" + } + } + ] + } + }, + { + "variable": "walStorage", + "label": "WAL Storage", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "size", + "label": "Size", + "schema": { + "type": "string", + "default": "256Gi" + } + } + ] + } + } + ] + } + }, + { + "variable": "monitoring", + "label": "Monitoring Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enablePodMonitor", + "label": "enablePodMonitor", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "variable": "disableDefaultQueries", + "label": "disableDefaultQueries", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + }, + { + "variable": "pooler", + "label": "Pooler Settings", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "instances", + "label": "Instances", + "schema": { + "type": "int", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": 1 + } + }, + { + "variable": "createRO", + "label": "Create ReadOnly Instance", + "schema": { + "type": "boolean", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": false + } + } + ] + } + }, + { + "variable": "backups", + "label": "Backup Settings (Experimental)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "revision", + "label": "revision", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "retentionPolicy", + "label": "retentionPolicy", + "schema": { + "type": "string", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": "30d" + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of the credentials in the credentials section", + "schema": { + "type": "string", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": "", + "required": true + } + } + ] + } + }, + { + "variable": "recovery", + "label": "Recovery Settings (Experimental)", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "enabled", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "variable": "serverName", + "label": "serverName", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "revision", + "label": "revision", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "method", + "label": "method", + "schema": { + "type": "string", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": "object_store" + } + }, + { + "variable": "backupName", + "label": "backupName", + "schema": { + "type": "string", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": "" + } + }, + { + "variable": "credentials", + "label": "Credentials", + "description": "Name of the credentials in the credentials section", + "schema": { + "type": "string", + "show_if": [ + [ + "enabled", + "=", + true + ] + ], + "default": "", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "variable": "metrics", + "group": "Metrics", + "label": "Prometheus Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "description": "Enable Prometheus Metrics", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "prometheusRule", + "label": "PrometheusRule", + "description": "Enable and configure Prometheus Rules for the App.", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "description": "Enable Prometheus Metrics", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "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": "

Blocky is a DNS proxy, DNS enhancer and ad-blocker for the local network written in Go

\n

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

\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/premium/blocky

\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/premium/blocky/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:

" + }, "15.2.3": { "healthy": true, "supported": true, diff --git a/stable/dell-idrac-fan-controller/6.1.1/.helmignore b/stable/dell-idrac-fan-controller/6.1.1/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/.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/dell-idrac-fan-controller/6.1.1/CHANGELOG.md b/stable/dell-idrac-fan-controller/6.1.1/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/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/dell-idrac-fan-controller/6.1.1/Chart.yaml b/stable/dell-idrac-fan-controller/6.1.1/Chart.yaml new file mode 100644 index 0000000000..146fdb97ff --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/Chart.yaml @@ -0,0 +1,35 @@ +annotations: + truecharts.org/category: utilities + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 'latest' +dependencies: +- name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: Control your Dell PowerEdge fans via IPMI +home: https://truecharts.org/charts/stable/dell-idrac-fan-controller +icon: https://truecharts.org/img/hotlink-ok/chart-icons/dell-idrac-fan-controller.webp +keywords: +- iDrac +- Dell +- fan-controller +kubeVersion: '>=1.24.0-0' +maintainers: +- name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: dell-idrac-fan-controller +sources: +- https://ghcr.io/tigerblue77/dell_idrac_fan_controller +- https://github.com/tigerblue77/Dell_iDRAC_fan_controller_Docker +- https://github.com/truecharts/charts/tree/master/charts/stable/dell-idrac-fan-controller +type: application +version: 6.1.1 diff --git a/stable/dell-idrac-fan-controller/6.1.1/README.md b/stable/dell-idrac-fan-controller/6.1.1/README.md new file mode 100644 index 0000000000..43b1f01394 --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/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/dell-idrac-fan-controller) + +**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/dell-idrac-fan-controller + +## 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/dell-idrac-fan-controller/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/dell-idrac-fan-controller/6.1.1/app-readme.md b/stable/dell-idrac-fan-controller/6.1.1/app-readme.md new file mode 100644 index 0000000000..7cc370e44d --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/app-readme.md @@ -0,0 +1,8 @@ +Control your Dell PowerEdge fans via IPMI + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/dell-idrac-fan-controller](https://truecharts.org/charts/stable/dell-idrac-fan-controller) + +--- + +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/dell-idrac-fan-controller/6.1.1/charts/common-23.0.10.tgz b/stable/dell-idrac-fan-controller/6.1.1/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/dell-idrac-fan-controller/6.1.1/icon-small.webp b/stable/dell-idrac-fan-controller/6.1.1/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..33d236865cbeed418b7ab6310e5a168324fdb950 GIT binary patch literal 818 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 Uw>UFCFC5d>)CDTQ000000JBBgmH+?% literal 0 HcmV?d00001 diff --git a/stable/dell-idrac-fan-controller/6.1.1/ix_values.yaml b/stable/dell-idrac-fan-controller/6.1.1/ix_values.yaml new file mode 100644 index 0000000000..06e0ed2a43 --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/ix_values.yaml @@ -0,0 +1,33 @@ +image: + repository: "ghcr.io/tigerblue77/dell_idrac_fan_controller" + pullPolicy: "IfNotPresent" + tag: "latest@sha256:5184af88c6c03204611d40d4b1c6bc36202762592d16a97236bb4254951d23b0" +service: + main: + enabled: false + ports: + main: + enabled: false +workload: + main: + podSpec: + containers: + main: + probes: + liveness: + enabled: false + readiness: + enabled: false + startup: + enabled: false + env: + IDRAC_HOST: "" + IDRAC_USERNAME: "" + IDRAC_PASSWORD: "" + FAN_SPEED: 5 + CPU_TEMPERATURE_THRESHOLD: 50 + CHECK_INTERVAL: 60 + DISABLE_THIRD_PARTY_PCIE_CARD_DELL_DEFAULT_COOLING_RESPONSE: false +portal: + open: + enabled: false diff --git a/stable/dell-idrac-fan-controller/6.1.1/questions.yaml b/stable/dell-idrac-fan-controller/6.1.1/questions.yaml new file mode 100644 index 0000000000..06935a6f6d --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/questions.yaml @@ -0,0 +1,2261 @@ +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... + +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: env + group: "App Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + - variable: IDRAC_HOST + label: iDrac Host + description: iDRAC's IP address. Default value is "local". + schema: + type: string + default: "" + - variable: IDRAC_USERNAME + label: iDrac Host Name + description: iDrac Username. Default value is "root". + schema: + type: string + default: "" + - variable: IDRAC_PASSWORD + label: iDrac Password + description: iDrac Password. Default password is "calvin". + schema: + type: string + private: true + default: "" + - variable: FAN_SPEED + label: Fan Speed + description: Fan speed parameter can be set as a decimal (from 0 to 100%). Default value is 5(%). + schema: + type: int + min: 0 + max: 100 + default: 5 + - variable: CPU_TEMPERATURE_THRESHOLD + label: CPU Temperature Thershold + description: parameter is the T°junction (junction temperature) threshold beyond which the Dell fan mode defined in your BIOS will become active again (to protect the server hardware against overheat). Default value is 50(°C). + schema: + type: int + default: 50 + - variable: CHECK_INTERVAL + label: Check Interval + description: parameter is the time (in seconds) between each temperature check and potential profile change. Default value is 60(s). + schema: + type: int + default: 60 + - variable: DISABLE_THIRD_PARTY_PCIE_CARD_DELL_DEFAULT_COOLING_RESPONSE + label: Disable 3rd Party PCIE Card Dell Default Cooling Response + description: Boolean that allows to disable third-party PCIe card Dell default cooling response. Default value is false. + schema: + type: boolean + default: false + - 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: 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: 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: 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: 568 + - variable: runAsGroup + label: "runAsGroup" + description: "The groupID this App of the user running the application" + schema: + type: int + default: 568 + # 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/dell-idrac-fan-controller/6.1.1/templates/NOTES.txt b/stable/dell-idrac-fan-controller/6.1.1/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/dell-idrac-fan-controller/6.1.1/templates/common.yaml b/stable/dell-idrac-fan-controller/6.1.1/templates/common.yaml new file mode 100644 index 0000000000..b51394e00a --- /dev/null +++ b/stable/dell-idrac-fan-controller/6.1.1/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} diff --git a/stable/dell-idrac-fan-controller/6.1.1/values.yaml b/stable/dell-idrac-fan-controller/6.1.1/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/dell-idrac-fan-controller/app_versions.json b/stable/dell-idrac-fan-controller/app_versions.json index f3696378ce..15a699f1d8 100644 --- a/stable/dell-idrac-fan-controller/app_versions.json +++ b/stable/dell-idrac-fan-controller/app_versions.json @@ -1,4 +1,3660 @@ { + "6.1.1": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/dell-idrac-fan-controller/6.1.1", + "last_update": "2024-12-21 22:26:05", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "latest_6.1.1", + "version": "6.1.1", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "utilities", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "latest", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "Control your Dell PowerEdge fans via IPMI", + "home": "https://truecharts.org/charts/stable/dell-idrac-fan-controller", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/dell-idrac-fan-controller.webp", + "keywords": [ + "iDrac", + "Dell", + "fan-controller" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "dell-idrac-fan-controller", + "sources": [ + "https://ghcr.io/tigerblue77/dell_idrac_fan_controller", + "https://github.com/tigerblue77/Dell_iDRAC_fan_controller_Docker", + "https://github.com/truecharts/charts/tree/master/charts/stable/dell-idrac-fan-controller" + ], + "type": "application", + "version": "6.1.1" + }, + "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" + } + ], + "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": "env", + "group": "App Configuration", + "label": "Image Environment", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "IDRAC_HOST", + "label": "iDrac Host", + "description": "iDRAC's IP address. Default value is \"local\".", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "IDRAC_USERNAME", + "label": "iDrac Host Name", + "description": "iDrac Username. Default value is \"root\".", + "schema": { + "type": "string", + "default": "" + } + }, + { + "variable": "IDRAC_PASSWORD", + "label": "iDrac Password", + "description": "iDrac Password. Default password is \"calvin\".", + "schema": { + "type": "string", + "private": true, + "default": "" + } + }, + { + "variable": "FAN_SPEED", + "label": "Fan Speed", + "description": "Fan speed parameter can be set as a decimal (from 0 to 100%). Default value is 5(%).", + "schema": { + "type": "int", + "min": 0, + "max": 100, + "default": 5 + } + }, + { + "variable": "CPU_TEMPERATURE_THRESHOLD", + "label": "CPU Temperature Thershold", + "description": "parameter is the T\u00b0junction (junction temperature) threshold beyond which the Dell fan mode defined in your BIOS will become active again (to protect the server hardware against overheat). Default value is 50(\u00b0C).", + "schema": { + "type": "int", + "default": 50 + } + }, + { + "variable": "CHECK_INTERVAL", + "label": "Check Interval", + "description": "parameter is the time (in seconds) between each temperature check and potential profile change. Default value is 60(s).", + "schema": { + "type": "int", + "default": 60 + } + }, + { + "variable": "DISABLE_THIRD_PARTY_PCIE_CARD_DELL_DEFAULT_COOLING_RESPONSE", + "label": "Disable 3rd Party PCIE Card Dell Default Cooling Response", + "description": "Boolean that allows to disable third-party PCIe card Dell default cooling response. Default value is false.", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "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": "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": "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": "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": 568 + } + }, + { + "variable": "runAsGroup", + "label": "runAsGroup", + "description": "The groupID this App of the user running the application", + "schema": { + "type": "int", + "default": 568 + } + }, + { + "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": "

Control your Dell PowerEdge fans via IPMI

\n

This App is supplied by TrueCharts, for more information visit the manual: https://truecharts.org/charts/stable/dell-idrac-fan-controller

\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/dell-idrac-fan-controller

\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/dell-idrac-fan-controller/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:

" + }, "6.1.0": { "healthy": true, "supported": true, diff --git a/stable/prowlarr/17.4.0/.helmignore b/stable/prowlarr/17.4.0/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/prowlarr/17.4.0/.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/prowlarr/17.4.0/CHANGELOG.md b/stable/prowlarr/17.4.0/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/prowlarr/17.4.0/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/prowlarr/17.4.0/Chart.yaml b/stable/prowlarr/17.4.0/Chart.yaml new file mode 100644 index 0000000000..72edec3092 --- /dev/null +++ b/stable/prowlarr/17.4.0/Chart.yaml @@ -0,0 +1,38 @@ +annotations: + truecharts.org/category: media + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 1.28.2.4885 +dependencies: +- name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: Indexer manager/proxy built on the popular arr net base stack to integrate + with your various PVR apps. +home: https://truecharts.org/charts/stable/prowlarr +icon: https://truecharts.org/img/hotlink-ok/chart-icons/prowlarr.webp +keywords: +- prowlarr +- torrent +- usenet +kubeVersion: '>=1.24.0-0' +maintainers: +- name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: prowlarr +sources: +- https://ghcr.io/onedr0p/exportarr +- https://ghcr.io/onedr0p/prowlarr-develop +- https://github.com/Prowlarr/Prowlarr +- https://github.com/k8s-at-home/container-images +- https://github.com/truecharts/charts/tree/master/charts/stable/prowlarr +type: application +version: 17.4.0 diff --git a/stable/prowlarr/17.4.0/README.md b/stable/prowlarr/17.4.0/README.md new file mode 100644 index 0000000000..64bd0cc3b8 --- /dev/null +++ b/stable/prowlarr/17.4.0/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/prowlarr) + +**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/prowlarr + +## 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/prowlarr/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/prowlarr/17.4.0/app-readme.md b/stable/prowlarr/17.4.0/app-readme.md new file mode 100644 index 0000000000..4e201b3174 --- /dev/null +++ b/stable/prowlarr/17.4.0/app-readme.md @@ -0,0 +1,8 @@ +Indexer manager/proxy built on the popular arr net base stack to integrate with your various PVR apps. + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/prowlarr](https://truecharts.org/charts/stable/prowlarr) + +--- + +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/prowlarr/17.4.0/charts/common-23.0.10.tgz b/stable/prowlarr/17.4.0/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/prowlarr/17.4.0/ci/default-values.yaml b/stable/prowlarr/17.4.0/ci/default-values.yaml new file mode 100644 index 0000000000..daba1bd964 --- /dev/null +++ b/stable/prowlarr/17.4.0/ci/default-values.yaml @@ -0,0 +1,3 @@ +metrics: + main: + enabled: true diff --git a/stable/prowlarr/17.4.0/ci/disabledmetrics-values.yaml b/stable/prowlarr/17.4.0/ci/disabledmetrics-values.yaml new file mode 100644 index 0000000000..c54316d241 --- /dev/null +++ b/stable/prowlarr/17.4.0/ci/disabledmetrics-values.yaml @@ -0,0 +1,9 @@ +metrics: + main: + enabled: false + type: "servicemonitor" + endpoints: + - port: metrics + path: /metrics + prometheusRule: + enabled: false diff --git a/stable/prowlarr/17.4.0/dashboard.json b/stable/prowlarr/17.4.0/dashboard.json new file mode 100644 index 0000000000..905280f4b6 --- /dev/null +++ b/stable/prowlarr/17.4.0/dashboard.json @@ -0,0 +1,1612 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 267, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Down" + }, + "1": { + "color": "green", + "index": 0, + "text": "Up" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 0 + }, + "id": 34, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "prowlarr_system_status{instance=~\"${prowlarr_instance}\"}", + "instant": true, + "legendFormat": "Status", + "range": false, + "refId": "A" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Down" + }, + "1": { + "color": "green", + "index": 0, + "text": "Up" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "semi-dark-orange", + "value": 600 + }, + { + "color": "yellow", + "value": 3600 + }, + { + "color": "green", + "value": 86400 + } + ] + }, + "unit": "s", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 0 + }, + "id": 35, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "time() - container_start_time_seconds{container=\"prowlarr\"}", + "instant": true, + "legendFormat": "Uptime", + "range": false, + "refId": "A" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlPu" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Health Issues" + }, + "properties": [ + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "red", + "value": 2 + } + ] + } + }, + { + "id": "color" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Disabled Indexers" + }, + "properties": [ + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + } + }, + { + "id": "color" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 6, + "y": 0 + }, + "id": 37, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": { + "valueSize": 60 + }, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "max(prowlarr_system_health_issues{instance=~\"${prowlarr_instance}\"})", + "hide": false, + "legendFormat": "Health Issues", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "max(prowlarr_indexer_enabled_total{instance=~\"${prowlarr_instance}\"})", + "hide": false, + "legendFormat": "Enabled Indexers", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "max(prowlarr_indexer_total{instance=~\"${prowlarr_instance}\"} - prowlarr_indexer_enabled_total{instance=~\"${prowlarr_instance}\"})", + "hide": false, + "legendFormat": "Disabled Indexers", + "range": true, + "refId": "D" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlPu" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Query Failures" + }, + "properties": [ + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 15 + }, + { + "color": "red", + "value": 100 + } + ] + } + }, + { + "id": "color" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 11, + "y": 0 + }, + "id": 36, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_queries_total{instance=~\"${prowlarr_instance}\"}[$__range]))", + "hide": false, + "instant": true, + "legendFormat": "Queries", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_grabs_total{instance=~\"${prowlarr_instance}\"}[$__range]))", + "hide": false, + "instant": true, + "legendFormat": "Grabs", + "range": false, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_failed_queries_total{instance=~\"${prowlarr_instance}\"}[$__range]))", + "hide": false, + "instant": true, + "legendFormat": "Query Failures", + "range": false, + "refId": "D" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlPu" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Response Time" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Failed Queries" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.1 + }, + { + "color": "red", + "value": 0.2 + } + ] + } + }, + { + "id": "color" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 17, + "y": 0 + }, + "id": 38, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(prowlarr_indexer_average_response_time_ms{instance=~\"${prowlarr_instance}\"})", + "hide": false, + "instant": true, + "legendFormat": "Response Time", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_failed_queries_total{instance=~\"${prowlarr_instance}\"}[$__range])) / sum(prowlarr_indexer_queries_total{instance=~\"${prowlarr_instance}\"})", + "hide": false, + "instant": true, + "legendFormat": "Failed Queries", + "range": false, + "refId": "D" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 604800 + }, + { + "color": "green", + "value": 2592000 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Nearest VIP Expiration" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Disk Used" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 21, + "y": 0 + }, + "id": 39, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "min(prowlarr_indexer_vip_expires_in_seconds)", + "hide": false, + "legendFormat": "Nearest VIP Expiration", + "range": true, + "refId": "D" + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 4 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "max(prowlarr_indexer_average_response_time_ms{instance=~\"${prowlarr_instance}\"}) by (indexer)", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Indexer Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 45, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "expr": "max(increase(prowlarr_user_agent_queries_total{instance=~\"${prowlarr_instance}\"}[$__rate_interval])) by (user_agent)", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "User Agent Queries", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 13 + }, + "id": 29, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": ["percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.3.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_queries_total{instance=~\"${prowlarr_instance}\"}[$__range])) by (indexer)\n", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Queries by Indexer", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 13 + }, + "id": 33, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_indexer_grabs_total{instance=~\"${prowlarr_instance}\"}[$__range])) by (indexer)", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Grabs by Indexer", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 6, + "x": 12, + "y": 13 + }, + "id": 30, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": ["percent"] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.3.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_user_agent_queries_total{instance=~\"${prowlarr_instance}\"}[$__range])) by (user_agent)\n", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Queries by User Agent", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 6, + "x": 18, + "y": 13 + }, + "id": 32, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "pieType": "donut", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(prowlarr_user_agent_grabs_total{instance=~\"${prowlarr_instance}\"}[$__range])) by (user_agent)", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Grabs by User Agent", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Expires In" + }, + "properties": [ + { + "id": "unit", + "value": "s" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 604800 + }, + { + "color": "green", + "value": 2592000 + } + ] + } + }, + { + "id": "custom.cellOptions", + "value": { + "type": "color-text" + } + }, + { + "id": "custom.width", + "value": 150 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Expiration Date" + }, + "properties": [ + { + "id": "unit", + "value": "dateTimeAsLocal" + }, + { + "id": "custom.width", + "value": 250 + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 41, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": ["sum"], + "show": false + }, + "frameIndex": 1, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "indexer" + } + ] + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "prowlarr_indexer_vip_expires_in_seconds{instance=~\"${prowlarr_instance}\"}", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "(time() * 1000) + (prowlarr_indexer_vip_expires_in_seconds{instance=~\"${prowlarr_instance}\"} * 1000)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + } + ], + "title": "VIP Expiration", + "transformations": [ + { + "id": "concatenate", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "__name__": true, + "cluster": true, + "cluster 1": true, + "cluster 2": true, + "endpoint": true, + "endpoint 1": true, + "endpoint 2": true, + "indexer 2": true, + "instance": true, + "instance 1": true, + "instance 2": true, + "job": true, + "job 1": true, + "job 2": true, + "namespace": true, + "namespace 1": true, + "namespace 2": true, + "pod": true, + "pod 1": true, + "pod 2": true, + "prometheus": true, + "prometheus 1": true, + "prometheus 2": true, + "service": true, + "service 1": true, + "service 2": true, + "url": true, + "url 1": true, + "url 2": true + }, + "indexByName": { + "Time": 0, + "Value #A": 12, + "Value #B": 13, + "__name__": 1, + "cluster 1": 2, + "cluster 2": 14, + "endpoint 1": 3, + "endpoint 2": 15, + "indexer 1": 4, + "indexer 2": 16, + "instance 1": 5, + "instance 2": 17, + "job 1": 6, + "job 2": 18, + "namespace 1": 7, + "namespace 2": 19, + "pod 1": 8, + "pod 2": 20, + "prometheus 1": 9, + "prometheus 2": 21, + "service 1": 10, + "service 2": 22, + "url 1": 11, + "url 2": 23 + }, + "renameByName": { + "Value": "Expires In", + "Value #A": "Expires In", + "Value #B": "Expiration Date" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Expires In" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Expiration Date" + }, + "properties": [ + { + "id": "unit", + "value": "dateTimeAsUS" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 42, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": ["sum"], + "show": false + }, + "frameIndex": 1, + "showHeader": true + }, + "pluginVersion": "10.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "editorMode": "code", + "exemplar": false, + "expr": "prowlarr_system_health_issues{instance=~\"${prowlarr_instance}\"}", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "System Health Issues", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "__name__": true, + "cluster": true, + "cluster 1": true, + "cluster 2": true, + "endpoint": true, + "endpoint 1": true, + "endpoint 2": true, + "indexer 2": true, + "instance": true, + "instance 1": true, + "instance 2": true, + "job": true, + "job 1": true, + "job 2": true, + "namespace": true, + "namespace 1": true, + "namespace 2": true, + "pod": true, + "pod 1": true, + "pod 2": true, + "prometheus": true, + "prometheus 1": true, + "prometheus 2": true, + "service": true, + "service 1": true, + "service 2": true, + "source": true, + "type": true, + "url": true, + "url 1": true, + "url 2": true + }, + "indexByName": {}, + "renameByName": { + "Value": "", + "Value #A": "Expires In", + "Value #B": "Expiration Date" + } + } + } + ], + "type": "table" + } + ], + "refresh": "30s", + "revision": 1, + "schemaVersion": 39, + "tags": ["prowlarr", "music", "movies", "tv", "media"], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "prom" + }, + "hide": 0, + "includeAll": false, + "label": "Datasource", + "multi": false, + "name": "DS_PROMETHEUS", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "prom" + }, + "definition": "label_values({__name__=~\"prowlarr_.*\"},instance)", + "hide": 0, + "includeAll": true, + "label": "Prowlarr Instance", + "multi": true, + "name": "prowlarr_instance", + "options": [], + "query": { + "query": "label_values({__name__=~\"prowlarr_.*\"},instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Prowlarr", + "uid": "WURH98Y4k1", + "version": 3, + "weekStart": "" +} diff --git a/stable/prowlarr/17.4.0/icon-small.webp b/stable/prowlarr/17.4.0/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..ac725e78b668b885670972f469e77d4a4d574190 GIT binary patch literal 698 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 USs^`-+!!x`U;f{a2tEJ+0A-v)5C8xG literal 0 HcmV?d00001 diff --git a/stable/prowlarr/17.4.0/ix_values.yaml b/stable/prowlarr/17.4.0/ix_values.yaml new file mode 100644 index 0000000000..3e7573e0ba --- /dev/null +++ b/stable/prowlarr/17.4.0/ix_values.yaml @@ -0,0 +1,111 @@ +image: + repository: "ghcr.io/onedr0p/prowlarr-develop" + tag: "1.28.2.4885@sha256:f4ab000bcd12f61e064ba43c28b4afb7b732fcf157aa183d1bfa238347b73017" + pullPolicy: "IfNotPresent" +exportarrImage: + repository: ghcr.io/onedr0p/exportarr + pullPolicy: IfNotPresent + tag: v2.0.1@sha256:727e7bc8f2f0934a2117978c59f4476b954018b849a010ea6cfb380bd6539644 +securityContext: + container: + readOnlyRootFilesystem: false +service: + main: + ports: + main: + port: 9696 + metrics: + enabled: "{{ .Values.metrics.main.enabled }}" + type: ClusterIP + ports: + metrics: + enabled: true + port: 9697 +workload: + main: + podSpec: + containers: + main: + probes: + liveness: + path: /ping + readiness: + path: /ping + startup: + type: tcp + env: + PROWLARR__SERVER__PORT: "{{ .Values.service.main.ports.main.port }}" + # External | Basic | Forms + PROWLARR__AUTH__METHOD: "" + # DisabledForLocalAddresses | Enabled + PROWLARR__AUTH__REQUIRED: DisabledForLocalAddresses + # PROWLARR__APP__THEME: dark + # PROWLARR__APP__INSTANCENAME: Prowlarr + # PROWLARR__LOG__LEVEL: info + # PROWLARR__UPDATE__BRANCH: develop + exportarr: + enabled: "{{ .Values.metrics.main.enabled }}" + imageSelector: exportarrImage + args: + - prowlarr + probes: + liveness: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + readiness: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + startup: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + env: + INTERFACE: 0.0.0.0 + PORT: "{{ .Values.service.metrics.ports.metrics.port }}" + URL: '{{ printf "http://%v:%v" (include "tc.v1.common.lib.chart.names.fullname" + $) .Values.service.main.ports.main.port }}' + # additional metrics (slow) + # ENABLE_ADDITIONAL_METRICS: false + # enable gathering unknown queue items + # ENABLE_UNKNOWN_QUEUE_ITEMS: false + # enable backfill of historical metrics + # PROWLARR__BACKFILL: false + # Set a date from which to start the backfill + # PROWLARR__BACKFILL_SINCE_DATE: 1970-01-01 + CONFIG: "/config/config.xml" +persistence: + config: + enabled: true + targetSelector: + main: + main: + mountPath: /config + exportarr: + mountPath: /config + readOnly: true +configmap: + dashboard: + enabled: true + labels: + grafana_dashboard: "1" + data: + prowlarr.json: >- + {{ .Files.Get "dashboard.json" | indent 8 }} +metrics: + main: + enabled: true + type: "servicemonitor" + endpoints: + - port: metrics + path: /metrics + targetSelector: metrics + prometheusRule: + enabled: false +portal: + open: + enabled: true diff --git a/stable/prowlarr/17.4.0/questions.yaml b/stable/prowlarr/17.4.0/questions.yaml new file mode 100644 index 0000000000..5cc5b73146 --- /dev/null +++ b/stable/prowlarr/17.4.0/questions.yaml @@ -0,0 +1,3214 @@ +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 + group: App Configuration + label: Image Environment + schema: + additional_attrs: true + type: dict + attrs: + - variable: PROWLARR__AUTHENTICATION_METHOD + label: Auth Method + description: Sets the auth method. + schema: + type: string + default: "" + enum: + - value: "" + description: In-App Setting + - value: External + description: External/None + - value: Basic + description: Basic + - value: Forms + description: Forms + - 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: 9696 + 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 Configuration." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type of Storage + description: Sets the persistence type, Anything other than PVC could break rollback! + schema: + type: string + default: 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: 568 + - variable: runAsGroup + label: "runAsGroup" + description: "The groupID this App of the user running the application" + schema: + type: int + default: 568 + # 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: metrics + group: Metrics + label: Prometheus Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: Main Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Prometheus Metrics + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + + - variable: prometheusRule + label: PrometheusRule + description: Enable and configure Prometheus Rules for the App. + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Prometheus Metrics + schema: + type: boolean + default: false + # TODO: Rule List section + +# - 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/prowlarr/17.4.0/templates/NOTES.txt b/stable/prowlarr/17.4.0/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/prowlarr/17.4.0/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/prowlarr/17.4.0/templates/common.yaml b/stable/prowlarr/17.4.0/templates/common.yaml new file mode 100644 index 0000000000..c6d069061d --- /dev/null +++ b/stable/prowlarr/17.4.0/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} \ No newline at end of file diff --git a/stable/prowlarr/17.4.0/values.yaml b/stable/prowlarr/17.4.0/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/prowlarr/app_versions.json b/stable/prowlarr/app_versions.json index 449abc872b..69f772b04b 100644 --- a/stable/prowlarr/app_versions.json +++ b/stable/prowlarr/app_versions.json @@ -1,4 +1,5372 @@ { + "17.4.0": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/prowlarr/17.4.0", + "last_update": "2024-12-21 22:26:37", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "1.28.0.4862_17.4.0", + "version": "17.4.0", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "media", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "1.28.2.4885", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "Indexer manager/proxy built on the popular arr net base stack to integrate with your various PVR apps.", + "home": "https://truecharts.org/charts/stable/prowlarr", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/prowlarr.webp", + "keywords": [ + "prowlarr", + "torrent", + "usenet" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "prowlarr", + "sources": [ + "https://ghcr.io/onedr0p/exportarr", + "https://ghcr.io/onedr0p/prowlarr-develop", + "https://github.com/Prowlarr/Prowlarr", + "https://github.com/k8s-at-home/container-images", + "https://github.com/truecharts/charts/tree/master/charts/stable/prowlarr" + ], + "type": "application", + "version": "17.4.0" + }, + "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", + "group": "App Configuration", + "label": "Image Environment", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "PROWLARR__AUTHENTICATION_METHOD", + "label": "Auth Method", + "description": "Sets the auth method.", + "schema": { + "type": "string", + "default": "", + "enum": [ + { + "value": "", + "description": "In-App Setting" + }, + { + "value": "External", + "description": "External/None" + }, + { + "value": "Basic", + "description": "Basic" + }, + { + "value": "Forms", + "description": "Forms" + } + ] + } + } + ] + } + }, + { + "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": 9696, + "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 Configuration.", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type of Storage", + "description": "Sets the persistence type, Anything other than PVC could break rollback!", + "schema": { + "type": "string", + "default": "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": 568 + } + }, + { + "variable": "runAsGroup", + "label": "runAsGroup", + "description": "The groupID this App of the user running the application", + "schema": { + "type": "int", + "default": 568 + } + }, + { + "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": "metrics", + "group": "Metrics", + "label": "Prometheus Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "description": "Enable Prometheus Metrics", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "prometheusRule", + "label": "PrometheusRule", + "description": "Enable and configure Prometheus Rules for the App.", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "description": "Enable Prometheus Metrics", + "schema": { + "type": "boolean", + "default": false + } + } + ] + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "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": "

Indexer manager/proxy built on the popular arr net base stack to integrate with your various PVR apps.

\n

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

\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/prowlarr

\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/prowlarr/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:

" + }, "17.3.11": { "healthy": true, "supported": true, @@ -116207,4 +121575,4 @@ "detailed_readme": "
\n

title: README

\n

General Info

\n

TrueCharts can be installed as both normal Helm Charts or as Apps on TrueNAS SCALE.\nHowever only installations using the TrueNAS SCALE Apps system are supported.

\n

For more information about this App, 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

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": "
\n

title: Changelog

\n

for the complete changelog, please refer to the website

\n

Important:

\n

prowlarr-14.3.5 (2024-02-12)

\n

Chore

\n
    \n
  • update container image ghcr.io/onedr0p/prowlarr-develop to v1.13.3.4273@ca264d9 by renovate (#18137)
  • \n
\n

prowlarr-14.3.4 (2024-02-05)

\n

Chore

\n
    \n
  • update container image ghcr.io/onedr0p/prowlarr-develop to 1.13.2.4251@23d16bf by renovate (#17956)
  • \n
\n

prowlarr-14.3.3 (2024-02-05)

\n

Chore

\n
    \n
  • update container image ghcr.io/onedr0p/prowlarr-develop to v1.13.2.4251@1ada8d9 by renovate (#17915)
  • \n
\n

prowlarr-14.3.2 (2024-02-03)

\n

Chore

\n
    \n
  • update container image common to v17.2.30@19ad5ec by renovate (#17804)
  • \n
\n

prowlarr-14.3.1 (2024-01-29)

\n

Chore

\n
    \n
  • update container image ghcr.io/onedr0p/exportarr to v1.6.1@60cf3d4 by renovate (#17725)
  • \n
\n

prowlarr-14.3.0 (2024-01-29)

\n

Chore

\n
    \n
  • update container image ghcr.io/onedr0p/prowlarr-develop to v1.13.0.4217@bbc16bd by renovate (#17694)
  • \n
\n

prowlarr-14.2.7 (2024-01-26)

\n

Chore

\n
    \n
  • update container image common to v17.2.29@d7c41a3 by renovate (#17545)
  • \n
\n

prowlarr-14.2.6 (2024-01-21)

\n

Chore

\n
    \n
  • update container image common to v17.2.28@918b4c5 by renovate (#17478)
  • \n
\n

prowlarr-14.2.5 (2024-01-21)

\n

Chore

\n
    \n
  • update container image common to v17.2.26@24c98f7 by renovate (#17409)
  • \n
\n

prowlarr-14.2.4 (2024-01-21)

\n

Chore

\n
    \n
  • update metadata in chart.yaml (#17457)
  • \n
" } -} +} \ No newline at end of file diff --git a/stable/sabnzbd/20.3.2/.helmignore b/stable/sabnzbd/20.3.2/.helmignore new file mode 100644 index 0000000000..feb7464da6 --- /dev/null +++ b/stable/sabnzbd/20.3.2/.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/sabnzbd/20.3.2/CHANGELOG.md b/stable/sabnzbd/20.3.2/CHANGELOG.md new file mode 100644 index 0000000000..941abb8a21 --- /dev/null +++ b/stable/sabnzbd/20.3.2/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/sabnzbd/20.3.2/Chart.yaml b/stable/sabnzbd/20.3.2/Chart.yaml new file mode 100644 index 0000000000..2db72e60ab --- /dev/null +++ b/stable/sabnzbd/20.3.2/Chart.yaml @@ -0,0 +1,35 @@ +annotations: + truecharts.org/category: media + truecharts.org/max_helm_version: "3.14" + truecharts.org/min_helm_version: "3.11" + truecharts.org/train: stable +apiVersion: v2 +appVersion: 4.4.1 +dependencies: +- name: common + version: 23.0.10 + repository: oci://tccr.io/truecharts + condition: "" + alias: "" + tags: [] + import-values: [] +deprecated: false +description: Free and easy binary newsreader +home: https://truecharts.org/charts/stable/sabnzbd +icon: https://truecharts.org/img/hotlink-ok/chart-icons/sabnzbd.webp +keywords: +- sabnzbd +- usenet +kubeVersion: '>=1.24.0-0' +maintainers: +- name: TrueCharts + email: info@truecharts.org + url: https://truecharts.org +name: sabnzbd +sources: +- https://ghcr.io/onedr0p/exportarr +- https://ghcr.io/onedr0p/sabnzbd +- https://github.com/truecharts/charts/tree/master/charts/stable/sabnzbd +- https://sabnzbd.org/ +type: application +version: 20.3.2 diff --git a/stable/sabnzbd/20.3.2/README.md b/stable/sabnzbd/20.3.2/README.md new file mode 100644 index 0000000000..067e3cb99a --- /dev/null +++ b/stable/sabnzbd/20.3.2/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/sabnzbd) + +**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/sabnzbd + +## 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/sabnzbd/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/sabnzbd/20.3.2/app-readme.md b/stable/sabnzbd/20.3.2/app-readme.md new file mode 100644 index 0000000000..04be527cd6 --- /dev/null +++ b/stable/sabnzbd/20.3.2/app-readme.md @@ -0,0 +1,8 @@ +Free and easy binary newsreader + +This App is supplied by TrueCharts, for more information visit the manual: [https://truecharts.org/charts/stable/sabnzbd](https://truecharts.org/charts/stable/sabnzbd) + +--- + +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/sabnzbd/20.3.2/charts/common-23.0.10.tgz b/stable/sabnzbd/20.3.2/charts/common-23.0.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5eefcb329be559e54998b5f211021daca81c39ef GIT binary patch literal 96939 zcmV)HK)t^oiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvHbK5wwFb>b(`V=T7TN}@7$-2wdIoWy~+mrD#j;&)knLY15 zTV9BSB&;cdLx6HLnSA$O;Y#o-$(HS8R@|+LMFNdRqtWPYG#U<>&xwCY_^*}G&{Xkx6|o0Tb&;o%~q$^{Q)$d0GG@YQ3k^w8jo%( z-MR1Nfxb@|WSIDLPyqmj3{RlLX3@Bg$$~mfba?aguQx2LzyN6ZxJ9x{8R;5Tw%bL z0UBuZDhrKEt6gu@n~lm#GxqLT>rwK50lf&(Ct3hX<$tr$>oqg-zu)fc>~gHWh8`CbmBou zFX0>kHiHb@W6uL)1R{!Dv9LhT1H(@zR6#g_KL1P>C=4SHxgbCx|1Lh;Ad^jUEI<&F zF#=rVif`iQjS#?GRAh9n;t)@^Az$iu1Hhb;syDhZRZTW`;zfMXJ0IrY z$d>@hknh--#xEs+VBut|UL(F@8DazrN4|-NB~@Yg=>&}M??@Nte-A*j(Rh!ug+HC# z#Dy0QD=o|+A3F}B6mTw)g9pV6@q3_@lp453(ET;U3|;w74vM_h44{R>jvoL^4L_bE z5;1DAfO?|=alOn()cghj`ze%YLq5RsdijL=$|M2CQBe0S0gGXUGRWLN0Rm)@X*qJ`)n3 z0ulljQ~5WWAuz$8kqhS7bv<+sLterc)Wbd}IYp(UQ-!QGHc7W*go;wvXAt|fF{Icr-1Z7w1#)@b2jeAhm6#FC!@?zC#41|#2)T=bs-Tit zQ^6Q=79+lSZK|Z#U9o)6P=dC+w?W`70iN(~llv1A^0(8ehXAH}U6y02znAoqIW-a> z-ytEbi5|aDUj^@ez&@TwbKnyf4Y@)hG%G%Tuz#uE4Zu;O(a<#{QwrW@Bmi?l83>3= z0rXwKO-5FGEC4gO;DDhr@MtVXHYohev%EHjbQr6E)rTxZ6H# zPL7%_1be85n$F>2zd7zzDgxmX;xqJ_aqNzV!;jY&ii-l`o}8avt6y~Cm|qp8Cp%Gy z*%BxK6{=oX07bzQ%{oAr5Zr`5GqX6v+*K)*H>OMl#DB{v7)Jgv{YX(b0NvhU{OWy3 zqQH8GpnK(e%WFc|PuN3rNg0}3GEq$OVTc#lLsN7{9q2*nw24)~K!0}aw-h-JnFqs= zOt6QvV36*K>&WM9r}QZC$$e*<5tILc31!Ao;)aO*D08(&$b#HKHU6xvI0W&!H~L@$>K;Ywg_$ zq5ATMm!X1Em^#w&J4Mchr&xi1i2oCn26;?dpy+pP>R>|Yat0q9$cRtpME&2&)vO>e#hxOhuBZKbj;ck z2%TkVy^*U!OkDBO9sde3v+EIe6d*_QMJ(Rp)gf+HKH0|QlSM&3LOU^hBY!5Ukujon z19?V%dDC%!t6#o=`X}k?RW?+ecc31SkWuxg@(zKoU#lq~flymHkk_lAFc?k|6T0so zM&(}FG%ucRHpgx7XYOvs5%Fj1ten#~c#eMO28u8u&;o_a`xy$6Fbc85J6pN={|~^& zn-f*z)HrX2JFSv+=B8Y^w(w9`*|I~u+FW#qPU-PUPXGK-%Afjy@xlrZuEysAQzjJ) zCqypt8HSd3eZHh^soU#er)~99?As|56o3G-ne}rVId_OzFQh~B7qqnAQRIY(CEvYz z1bnc=6M2u^%O9hCR(V*>-vHZjK z=vc1@S^;p2#z;~E%>%YP#Zs#jtItpn;XqcFB?aqBaVzX$1!Dn2k4)(U8(6^bfLB-Q zn2V$N0DKT?*{W8IW4;GI6Y4@C?hukPo1&cZgbW5s}vEn*k${yJm)LMc8awgZgb3oYC;sFj$_DYz+%AgsEOg3?Vd_vkSV1OHC`%~KBI1J$ zNK=h3QqbeJQoT`c)tlWxyVYyxGJ*KY_1?eg0zFaSulvBf>B~3&1h0s4BkJn-H-EtY zQ*SjI&03>VcgVc1`A+TU)wvN+r%T$be_sBsYkHAC00xZ-l{;hTGwXm?SLs%Gx6XZr z!ig|?G!JJBiX96^l-|w}YaShSYK^WyEJW@MvH>?!n%T-QVzUvV!qp!SS42@LIjTy@ z9O<9cxI_Rcy(gioO6Z@}ER1uFUJ96bp93{rC-c5)<9~{&!|m1Och`f3!&c3Jg~PJ^ zuU58K0JuvZ&aqPq7S1Y2xgsZqR3dP!Mrtl(a3mZVPuCs*nN|R}!#*FYp;i#sC*noI z1jTbR0BXq5XG|IPr^8Pt;* zCxJ9&kYT6hPv}!)AX_rSH|NSa@F!;N;d(FP)8l}nCx4l76m2NX#ospabUuC&D@6Ja;VPx6QP7716n5isU`j-0ZI;Y5^?`HRp)Hf`_>$pZ6r#B`%>y^2W?;)N+8 zf0%Etz=;3}PDbZ^y%Q@N@d39xbQ!+ZbE` ze5ui})`Vm&+h-ORclg^Xc%yZVy^3uL#m1qFlEz{VY(bu!_p(yvTVDCN?5q4f$B1hh zlyy=vilL0%OIevFMLl>00_@xY;>QYQkSF&|3&Fw>%R4tN)vo9iF#tV=LgellC@Cyu zNN#2@q^2OP)pP&f$l)gLBqVb%Iyt^Lv-YzqufUb>$#CKjO;9L;paj3-&u5<*R}?&> z#3|o%6sirbfBf^Q+YnB3YrjI;-on{9j6827EPpC2@6<~%`kPjY`O>QB2!!S^5H-xN zOasylp?oyCDA0sg+4knBSD6~&7&@XH|04^}fgZ|GP{Pgqr2BSxb#peVv(K#J6DHlX zGXz~O*ZweZ5755@OA?83!#-uu^RPb!U%r64Jar)=2)};ihGrazT^D{6Ib)<>j*QUiEmoN@T?(g5OxB|fjf3Gsd8aP5N|9HL)pxAK2U1RUt|6-e%> z3rsj#BtSl|KzszqL`KUH&m;Hzr3mN;*yo)L!8j!MRPPN-ghJ>~Q87+65O=PwU&@-u zcR@|P(ZA!KNX1a@TxFa~*K)8h|M0RKalo@$D)=zND&P9>PVG&~Ig=hhT~s z@`8O3sJ4kuv5P_-t;=~R#-Oah0~!#YlCT26Jq$TV+A00HhJg~yrRSb`^ z`74GE6@*u>URA{ZZEB1H9;kvQ4yRpjAJ!W>4yWlHwR?wsw>gGK-F~ava+^)3bp-pJrrYgJ+O7lJ{a)7{ zqh7Cv+{5ls7xkNm%^o`HbvoTvS>#W}M~u!0VXKkUB@LF1db1s4={8aCsMB%}TZay6 zcAAF`)OAs>+3qr5K$qlOE+ zu+f|}$Ee|Unhm#Kil;+dWg)Fbl$Wi^!Uok&{qU&X)ToXR+i243z*eu>>^Mh9hsbHc zNw+!fqUNM^c;p;8%{J;z8jj;Moz~>=sNp)D{umxQeHS{DQdFTAV1EsI%5oNKwi@xE z_Yd1{f823ltJig5520SGKSA9NLWf6P*m5SQ1zX5*`{Qwc+-<{#(}(>=8y>Yf@DLrA zvnF*y$eh_~6jecuqdXL6Q0%li4cPCEyA8MB=^RZQG(H-;ZRo&83muG?((`V-je zjNNgg-$k8X^Kd+IJJ6l<++Hb)chML*%v+73DwvOAYcd{By1ky$>-1d5oxt`Oxko*8 zG@kS)tzPfY9d{1lQMb`>yRCK~9`;*}@nOH!ZuQ5FMtfX};{6n@F}ZmuYrNnf1W|PnA)}-IgqI*r505o);2QskDu z8PrOG6K$;L_zq2A2xkY&-!#IVdZ!c5n*P{nbz2SC>bR&i>9)H^ebh!x)a}7ZbJB** zMyGQG8;y1s9UeOUiPJiC`hD0%?ooT5*Z8(SSkzhy{wc2j;u-k9+j~Yka$#~rDx~-#52RTPg_psgSG$*}AyI;Nk7tVdt>Zm>jxCvcPmX207z>@~Yb zPPf(T!=`iCYqnJ zyGLWU(QcwiuLTcbyXSNdQM23bHJwR&(rfmQ8ofsAXaYOq-lWxa`c0=4VagZ06|S-`f>`60`n-T4ceqsn;E1VgLeUDRvMOJb z<=2JCyIio;A2xeON6kj7+3mC%oz|q?abT;{IUFCt!?BBw+UOAVyAXBx(sk5ojhk@X zZ*-2D{li0qx@%*==?elu;MLUr6^H131VeXIdf(#^O?ky)ipQ{565Bvq1CC8%p|G?X zt!Cq>*)glvVS9Wy?swc?2aVlEe{yux?KV68Zu{u4-Emr6lr|;^b(?MrwtEw>VEU8qM)!9UL|yvUXM?0m>YKQpY=xI^8itA*xqif#djaaa`1q0n5;JRUDG*%F`?^ z7AYTKxCD1-2`HXp4~EHYD!o{qkJK6JO*%M)ICM5p@yi>k5 z;XaUoV!9@HqvNh*6zDz>UdDZZm{YIU_v#AHx$ww^;@Fh%8nGGlK~sa-2Xo#EmDGju zkWBnp)Pmt1asi|og?d5ko9eKFg{ch$im>bWs1N`$Y#oQ`j-$^3^j+yrkxuvYNrjLs zu#4|x?&nTLTuvbak`cb zQ1FWh3a*yaX*H85SB;1`((g|HFBWI(4S$5Cirt6*em7ylM+G?dc6N*m`w(=SqB_tc{%=^H)lj3m}*2j z7e{e8to^wZ3m?u4QOUp&JENOG7ZJnjLXZ8PsrBUMVwC3EI(SFeOoh7&hdQ4_lEL}t z2lAi^fJx5Kyzm||3a}b&c_vHcM4&W6g47f2>9ec)oRC7eW;L5)^BVJL+%E@(j4K2s8djI@>fE7a>Z>`VXThvk;!8&iDHZ-z-tfzpIWmvK#NzKttg6JZKU}nvITFf8 zn$NR9Wt_x~T3TWtmJ+L9r8QA$F}*vxIUc0cpebbN9xg#hBDRk4q{=9k>(05c&)$O9MJAf}Xbo_awX% zhT1#C(d2|sDFC2*2{Y zFSZYUzPTByKW|RVUl$|w*T+-&PJohux~9gH8f9BE7?Tr9pVhV~1sQ|ROe8Q-MluYM z&#uwLIzIdgh!f*FRz@)cGw|wZ;a(e*UZ8_r@MxK&|d;mFR6Xvw-chP4T zrR##%vxhVRRUFarU40l%qz&NGNT1UObVef2-s^Z5)k(k(=ZYO>RqH&o18P8DT$|IinU7wT<8pjaiE=i6`NJ^tvI$Q z|NLasl$3uZ_MFVIf4qR$<49-{&*A5fKD6If?$LNgh%lTMT;f8Z3>9@iodGcgD{>eG z2+jHPh^+%e7t4aEBu@D&9VGcqC?(0Gb;*G5bi6kgVJS7sIv=J+wJB3(8h8lJ#pr5> z@ld|GAonO7DtuI7X`LBu)>h$?y0*{=tydzTN$`aeBFIo80i(?Q<)S(C-AW=eqa;c) zS>twTf~o3_YS8Xd07E!OOytHe8e%BVqG)1;B5|VnCah2yD1G)hfWA!SW{-gQ_73}8 z~!TEfSTnw2mBI4t9$`8RObHqaI(3R6J&ws2_ZD?UTCq8B*+y?=1)!!DgR+FW) z1H`oixOQ<_)0vuCsg`!+yGidtO~tj%?L=WBRBZvh0qDj8j5;9Y!iiIliO)g!rX`ZOT zNv6`IDn(zekP8gOVkpDT-+w$e8Z%j-@IDla_EhQsnHFQcE8F%(eyg&xAfg(oX;{^a zVJf=Bt5wa|--bHXgz2A89r-PdVWP&CsiO|t=TJwbL715|Y0^qljZ;9;0)<>NcHJ8B zX`L6P#yhQdAdw3q-$lwZdWV+98(7eFmH%%=%f|fsG`v*J*TFekqiGI0-MAHj%a^*q zwqES*L*5vl^Yt79M42}3K2X7+`+8q@ADDenZUfozjne*>JLS-K#r~u$2*WrCStg+i zks|_fW5J`Fti;&fXy8Q~!LnpN_2oAc*Ny!NiS6?oD0wO9b^F#|V~>mvxDY!K2N~`T z=|LFzbvjcziYgb2j#>>IM{FkSc}95CK602=ggLE}x+aX+?9OC_kT8xZfPhoafuYEL zrgUAgujnJ0(I||3Zh%J=g*t~bP^a6JN6vD&@>Xt%pML8&C}6j)pYowfw}pk0izvIr zw(?AgbJx8!r}Ok{^qGb57KYPAZOE6G+uUy?Vq+5d?kyjW+aM&Lm$#lcew3gHr>bSa zPHa}xl+v9_dvgqg6=5B#xJ%85#898a=l9D;TWvLqi2WMeGcbf|FGaLIe<+i4l4v@! zhBW03wazM5tsWkG9$3H-OFxC`Cvt^r$|SCpZYYJ~BJef+QfcGlWD-dol1COMrf)J1 z!OBfH!Bd^%T&}?j%lHQ--OM+PuQ^x+^mdZEKZDE>@)yQ%vD~1_3u-#GRHuAg93n@g z)U>3qYIK47M_2)_tPR&C_kI>Ke_IYa z=`vEL9sV7;V*C=*PLjeS@;HM!!6D|#*sNQ1i%LIX52d(%-G+$ASJPBe3GU)dlIE(L z)Tr4fO@!u-TtHDEPMoN7Uayja!WT!2l3IX|<&KIwFeU4BmMYBOgoqCb!wU^w5khpQ zh!nm#046&(H55EdsS2)NKAl~y1vYn%dy73B(6|*^j4DadV^|w0--9iEmI=W zb4t$F-#9G(`P1++&(b#*gs>eXcAkv4_Tr4(|pmnG_A^(C@KM)kK?+)QwoCzzjd(G7KOh5+w zi48KmK>ohOAP6J~H{PY?@5Krbz?nIvsseyMW?8lp=rT{T3>e_qHQ?3Oo(k9M zM5L13FH;?%QjrZpRMQF{3Bg3{!-yM^gj#B+)CaG&iB-k%gXx2OzFhN*m`bzf2U8s| z#|LJHIU`GvKPRrNqF<&WgRRg7>1P!>7ED>*V)5gx*cX|kra^%f&bd#EN^utoUnRzn zqB<~pIzncdJ)$4Mzx1h)f2Cew`;EB!z=0le$JX10JV^2{%kgB+$*EF$(vS%l#+Sb^ z!bf{wFM@`kJ`{U%)S00bF>(%41A#!jG#wV1QVM~o zYr|}qGD92(Iuene6vWtram3Vi5N|8lhDsW_uh>dhD2R7yfguQ{x13F65!nZoE6M=Z z6h2if1zaS2MB=sPvjM2WK>4y&A}I6Qa;gk3j!({hzPdO)yB;2oM!#NNpH?&QHTqdM zlKK*_S?f(Kd+HXgF1Zs+1Oi0!F$y_Li5w`tV|?W1_W-ow^6H8OE=2(G0mc5*Lp7hX zr9y$K8*|9LxMWS)tam72yn=?Rlfx^(63(R<8+)Zydx6UA1Qh=st2BIYK(KKBO0B{_ ziTo!jVwrOiSE@KW={zUH)NN>Q_2p)wcd{LOONWX}$*Qex?>(-rfz>_qwv5z0^hWFA zRjbK3XerY;?Hhclx1~9zwpR5@+A$gta|?ouF3>)41K+wO!Myu`*i4${GWm>#VSA?Cx37;T*!BBFAf*D*OFhA z*2Ey3y`kq>T%3HeJ=a8a<1w_Fw;K=jDIV23{Y~4fDC8DOLDOPl#{81R+n!u1gi&rs zYU)~dH6^I77S%lN(i}8M)QCCkMjVS!0{E}MBU9j^1@iXub3I9K!T_K!B;mf!!m}^; zvkc|-fs4k`bRV!V-udy!^nyc{R}m*MNP9x1ggZGF%TS0sG1gY}Y%KFe$hxmNdCHa> zMhTb6fg>*uJ%9neH36CjuTCt$Cz-`E5w>fKBXJXu@MOuoO6%6LeSP*cgp7pJGM8Dk z5E$`M;A^{dXUYjJxLDdKQpXdkzghC@rqOc~O2_MB87Ujcvy^$QChjECp)SNn_0n#{ z8?IT1^5jcySJc(keE2=YkhmC$L(fCP-8UHUL1w(%*n|F^I?$yyoAeAxkY&6yULY(8 zc=_?-q8^Wox|Bv^CokO8H;U;(iILXrC>4A3KNrAcpV=OxX$3xy$>Kx*7K^_QvHFllhbg z0W#T1gXygUof*2FVRkFHsG8_?_I$3b$cg{Tm;jY@_6{wpM*0gyTz~mZB2wK;ROWAa z_0ieI*~tx1Y;miNpf`J5WpyEwx%O!^e=|ccxE*_Ul%u={4!BN{dHerM6%7$|_XI4_ zNAT12)dy~=i6pk%-kT-MVV{RV=vV1q%kURB~f`)3_2e3{LYIaV?tv2>vC_>3@mqkwr0XmD>isHqFI5 zb*aOf;rY$A-m*gO9=No2MAcC-VH;UaDD%#QP}gldq{V+LEdDjH8N+Z6{iL5Dja34E z!h2BGzyd?a^e7_IS z0{OB}Bw`f1$U3;5aIF9}dIMlnDmMJ&rJW&)wPY9s$Txdna;cRUshjIWxzWTaC$89# zL+cXW7kOmB44DYLv+PFMh={S)FZCH`yCLkyyhp}&$T1!QQN{$c#Jw02>@&eFcy2MS z#HVhyEb{bblbsQ>@J5u6-RK+|Z;2BWOT?~!I%&7tM?h|MSUwa>Xeg2}qA?L8Ro6)d zgyUU~ikP~Jw=~e?4&+vU7>6^NeH?M>-a3O3&-qb% z0BCz~aPZ&q!lJ+ZH!u9RSZ@3tg_geY-^wwfvi|<9{@-dhiX->8xZ60e!f*hzM9AAkL z>t-K5651_i1q|xxZeIZuL(-Q-y6=(<9c!5`#NM)|7>7?0>@5LgV2)iMPiOHV{215( zR2zW*???W>>WW$t^wqtO!fS0z3;;#m#43dKVTQ~WFO4Xl0*PHfuG4S});fDqZ8uzt zel_qxx_xwfxtfJ~9TXomP4d-mMqIc|tj8HIx(cc<-2K&{#%Mx9^ijI59s;sRehsJZ zNaQ=Yy9WUwUc7mbyKgN_AY`sIS8fLpVGDxkSb>&_?4c{-hGpzf%yf{U>#HPG-mpBP zLgh_G5BEkV_8c@6>vWApv^o5IE3=2)I>hH{bhFWD*ebf3o3|XlTjMU*CDz*_kxoCo z(QD66E`FoXqg)9KB9VPrWsp`UWq4uxWcW35F$LD;?dzp06Zs=^u2BRabuqhsy=p&7 zcS?GU^=0uQ7nL{-PW7N;&L%!#NFCPwczrQaJDgTj85jDe@3;aJcUa$9IH;sWRX%r0 z0;$BFo0CXY+%AzqLfA03)b-WX%>&2@A52a~9+{c*0pyVt|K#LxJnY=fNF;V}H>6Np z_eCb!W4lg?7jE8ZUTeGE7O0psf-UOad6n=P_M~3Cx{U3RHP#DE9WXoRZUxP0I;~PNU^kXI~YbvCT9|{syec}^5enRuaz%fYVvX~ z1ggxbFPe49i*?al-452Tsp7Ab!L?xU7F5OMX{H38#P?TAPOjU`o2)LcU&#afc0(xk z%`vGvc(V1CAT-S%{0NSfIi3m;O+*{(xM7b#mjXdTg?wCW@YW1ZIZf-PP8HO_AHsPg zZs3V&!burJwy&yrt?{ny7xu>rq}$m#?dv_G7eY^0-C@lhj>30`3gb zp)`;6v9`fmwiozc>PDr(+w?W&Nxb#I4c>w``DFI+xE?X==`pT? zH!gN;t2KVAT(vo2pR3?CsLIuX+hJ7;qx^dEhBMs*P<5c^aT--mh>OIDJ{0PMed%l7 z6$r6oQ_Zrb>UMQ+FL?gv@A)b|gTCvTENd*D6RGCX+?JF+No2Cpr|9pO*1Er) zXHEN0DPIpV|5n+5txi8<|1}#s`|nvEY5%2Fr}Rlw6+VG|ib96mO)WUv+ThbKc^psP zZZN0-;BhO_oTkej+LNd6zI<6jixbBJ?GIu(Rx(E2jd&m&j0n2;xf>Pn;5wz#b2KT= z2FKazs;SHPs__lJdgIG#Jyp0KU*^FZvO@LEiS@J3EQG2puaEcOfXfx7a&C4c)9_K>{oQ-4SPVoFW!XQ#ZxLapP7NTgZCOj*1Y!?VRqkA!+=2rOnQ#+n1K!kAI5Re|^&R(To4;^}pF~ zr`P{Rx7FLN|IhI};rg#xsC@NT`6KwUPy+{J>>r5iWi?Q9#6Q$SC;-@>U>~#PYGuJ* zF7noO{XKsPmS5AWW#S^>>Nm3D0pP#@j&AI7F3)amk550GUnbsMAOBjm zSf>5nW)Q!VwbGo>f7D7@Mun$eC<|L(Yn|L|eOfL5P3sR8|10Hxv)N6{|8{>T|DWag zX7~Rz+ike}S3GfFYSS%m8T?ka++w1aZn*8-YJZxiNd7MZU#R{QJe|Yf;j;gS)$+g5 zZM2f|zuE7!yF2;+9FNieRdUG*o(io_CHXXpzf459p6Ff#e%-K6p3d(=1_ypg41cFDajq4U2sg8%0cdZqJUrQ1Gvqz7Qd z{O`0H{j~qTv9tf5=P~nNjrEpne?HF?#B%dLWooNB!q7IhenDUtZ$mo)hPE z*JMO!S@wKxnfYui%u;WHWnDeav9Kl2!N#5f+uzXb9X`f)pnre(RR6Nr|I4BpgK{k7xk7$&etKQ-l`b6q zbuaCH$iXT%sjwaGn87gz#Y~y{UfOT5ITpP#EEc^7;sL-<=htVy9$#FT;nOc}uRh+q zyZU%}dOP~~?(*zrq#RFapea|%>o_?wA3sk!zGAmm1;m}!Q9tPyb#9&Jzm;1PIY6wh zE33zU+GMp*SD3F4BCX>jfjPu?AWOW=8+hyUA7CC)_R+_`CCBOZ{Brp5=5}~>tw!YE z1pA=6Urhkd2x)tm^~}_By3ltgc+p?PZbiNls6`=fNw8JO)&5Zh{Y6}(wGDlvT*ZHg zTeO_E+9|1%Ft11AKa~>w9Y3Y|zq(W8srCOxvz^udckw^Z@;ssbuefI;{a@AD>Hq8Q z9Bx&QPiW2YF5$M8)y(pk15z`MzE!BSkVz9KAb%QO-X4Fv`B^NWmLB9HkZ)#t}d&U zRA{=3KJSCqQnlf9G_8oixxV^%b9VdXi@2ddmIlpuOSV9z%J1(=i>B0|8N3D6YWDQe zhDKYd!35Hro>Qz2_EI`t8lx;pHzR-`dG8T4&ru3@D)^JC;D0Vh_U?JmQ>y>V>>7{T z{99xHuiZ%L|IJ>%yYv4)%VYF^ef^}qfX!qle$e)xtX{nLC$54On}o?tx2$Ya_>^qM zy)+5G>!)=7n@da|=K)w{|M%MI_^)QW+1$#oPY* z`~bmS1gW*oBK|a-}PO$e`NrA_i#xocRsn-xtL)P$aChANY*Rv z2b1&E6=9hbj)T5pR%d@ui7SO6Bw{x`1my)P(2GK(CbHTMy&2tFJy$pA-i&TXS0}&l z-vQfkF6@A&$8h0$D5yTuP#r{q`6hfuI7gD zq#brMy8SphyB-aX*Mbr=eHzN~$;sL9=Jxb*v<@=nV)Cq2SZJfg)r&6`H|UsM%b#y< zhPT7(tH1y6?Zx@%=Il})%**{HwS-FB~^j{j{m`#b&r zIUb|`%drM;^u;V(BjHm=Ma%A`i~xXrdE1q~Pi}pyKyj4~pUVR8M*h(FL~>$jM1IO0lP0Utz&v_WnO~`@mv&ce|k%}&#;he$|?dcTkG2vJA8AZ zJ>~)FE-?m(8uU$v)YQ-O7s|m94V~g}>%=f^=a3}p(O6|ctk>U|`>aS_n~jy6seSz_ zqwU{ui${FqHqI5FWyv&(=(pU?F9QUs_c%n;2!?Jo8DL-<Z-{yXAy^9E02Kbr(G4_8%XuM;d>t?Z1A%)lKjJwwt^7&u4jx z&i`|P@*?N{wV2boDKDn4x2hJ3lUkexI$xhvDo8ABk_iA7fuG&^j&Itfsr;0x%!-r$ z_C|QliT`+~Mu98Jxfvhd5XGuSORi?BW@TU;QCDh$SXS#QBeaZ$QE(v2SjUIs8*Aq< zNE6b0ScjI@nc`A%#z0q5G%i_<-2v4+2oEN#Wi>p;@>_#(6|F5zI+xhN>Xa2Zrt=yE z4^X(0;5KpzKF)&3r+Dr8csa$x#dK8#HzTZJwsOf3gWi<1F*oM`S%14UhD5uT6Qo_Z6H>H~fp95kA)x;rKad)D+BheTc_T9+hR9`?`dA};2fXL_Q*tuo0 ziEcz}vz6_paF>78Z5R11Yl^qP|ISzN7S#8FCk z6E(v^wN%qcfZs^jFf~O`RJ8z932BQQj~m$krT!nos!tmK+wNx1|F+vZ|If2LPk8<} zSJ17D{x!9BXMpq00L!hQY(Ae=L9)>E$o(+H3+$mOI^$ACU6QHyoyr4ek3XKC-`xIs zeSULR5==WfyZLy2YX5wH{+x%4M`y$1>*JfN>j9|#SG5Ab`S9lW-No7H_TBNxFK3sh z15ouRY=fLW0Q_=(aWVS!{O086fx645@VsY7Y&d2PWIjCGPvY3-cF&G>);l}eDLOkE zljZj8?W<4%@CESg$bfIG+?N z(n{~n&+g98uJdH{KgWZVZY}kzcvk3tt$wSK-v8_LclzJ6Ji^F2G20y{eDs0R@c0+# zdGfT0<`BMW7no3jb?jXlbzfoO4Sw+t5pq*e1qXmDr2L1_LeXb&t+wzW@-?zviRWlC&UPXu>UDPlz*X-aJc~lmXf9Dp1zE7A?i&RHqugUTE+=q5w*;oyILGuU{VjsoO7fZsW~$t9mZv53`Mb@qIXpEc)%-p|XQ8wrTT&lYCT7F!C4 zt6O>y&7T4%sx~gxMeJr7pem>a#I5RAm-3o=YwYNZgyQvH-mFTp!m~*w{n*mUM#P?A z%@)W(HF-gO{C-{0rCGW}gsnNU>yPg`;%@7WqR$M4KJ?CghQbMS(2%$ZES`n^*T*+V zp;xvh#Lo+@4*JQg5;k7zF|+krFCcc2H5L*f2OczYjfW)Qb}=behd9wD|33(!S@N0xKsvv14@G`(EY3^Y^VB@98+_#;h0 z7z8x71Puwk2V2k}yR!y&*5J2n4Vt;SHG7a+hnWGGL*~pb5^8rjX3uDyq|^|V4LoVf zX6@MLvSFXce*M;L*KgWxeRi8QZLg-M{~<_Wmo`&h%0zv3^YnW%O`pareL<5n*Bo7o zSJf-q0)1}lv$xC1{hdCA_P?>>9`68HY5%u-nf(9F-TmLs@<{vN4ECSf0TA=_njQeF zCokXvFs*Ob2VlT{7fyh92zFk8ofqI+_5v7A-MImFZh)N|VCM$dxdC==fSns)_k7Dw zk^PT+Hz0T$*8dvkzdD)w|JvQ1{r@bF%337{dmGljW}N4<{i#eDB#i%kc}bE;Sefqx zPzi>V$6!rIK-?+IxO$RvR(dGt_h6iBWOt_d&NP2s(>xke#MCVZ&~-yZDO%GiHY=N{ zw?*ZLHy@CYZHkMi^Abwfs`Y>5Vdt?o0IgX6JB@ZTeg99pwOjw6mnVz9TV1PFkC zN=-oZY-_s$W?7Iz>1G+oTlnpz!1`oeKyp4@bka#d3u+}2oY)`Uio>djSFe*@P?Z+Y z!!G|W7cH5VRARvY=~Y4Xr~f&zEv5lsbX=_oUbX$>!gpdS~S@R1H?|qA?16#E_uA5(YItfA6yzzGp#$gMg_+_ zKCLB*PXWpyX9*+s1t`kRqPNSs;GBp#A()VjUE|{p!Bf@j(~}S>ve5!T54a6buF6R~ z#AAV@?X?4ey3O6+L~4gBbiHlNe5aNT69ijWbut5U8e2?j_Y0Ww#@E`U>P%+bd%rDy zkJe4XytNMKLu>!lyr6usEK@F?@KTxNS4%y|a>hc%%4kPgS&OS%tHG|Oc_exWvu9)Ktmd7N#5#qF!|?lPe}Tf}1Us=+lHA$&bIwPvv|$($q-FMb+Awge zS*GgKg>CjmcY3dO<~$h@fZ^jyQE<(bR`SuqM;7wYnL)5Osst0D@GYno=%G#;J z*P?yL@x7(|b3A&pFBKyA(T*2RhCp<{!7I_`%|%+>+@WEWm*lvtoxh(0CId?oHt}t> z=N96RV?>3dQ%NI2qzjn5y{1qOAAIuq#pEv$AL-Dgp2P8MI*0S7Eb>p1cU5~DVR2xy zdHw3-0l@Cb{SEZB&GrMBzZPZ|V3229>!AB=Cr!w2KD5&N`Lu6VLKerD;~7KKSdhDj zdE4E(9bm>v>$Er|%{9bRx`1fVrEzBWzib71b;?sQ7E5*&aayfE=Ca!TO$ZGd?eLkU zIob-0T!h9>mU7iPb^Gyj**!G(k4zpE+y-N$Cvl22|Ejf{t3Ub0h49!g{J(7bDR+w3 z&h?w3Juq-(iE*SN_KgrPoZ93AF5taP#zQ5zwZ#A0^xJ}cDMC8=9rjo5%kUQ>N0rSK z74kKl;%3IIOm5XSMaka5e0iCkMR2FGT~RI$8pp-H)V^1>b`j?e^$oJBvIw`~crLGA zBrO9LI#5$1gwVe*>n5`XsASR~75lwSpAjmYT$3Q4ic_OGsfN2lnK=KP@wB=>F_Y-Iblh5(0KSbu>tk#(Q*>y z)qr4nrrrae$&tpCpF&Ry3UYCwj4(f&QzzzX(K*EMqoWmpstshxOQ|pROcLSa(k~n) zjA7BUV0HMDrp^g(!{^$1K1TzvIyY}Wmg1f>uhZ>WA0@c7+F+$DfcgCeQU1fEERiPCbJ6&RPF z(A7b0z}$r?L0uaK&e#(P1?69g2R)Du`mlNRZl)8Wi?a1uALV6c9!E&#FQmE;3~QO5`e_F*X`X#|7Bf+EXDRjDZl{Nv9c>k&vaGQ(Gh zj?l_ZW=Dx@=$Q)ojPj7=*f@6kw{b0F9kRES6U_dt{G~~#Nh7zdO+X=&=AkYRtUdc# z6A`MF8*kR63EeWOW%#{b)2X**xC1aVK_OWFg$ecn6ZdT=u3 zQgZN*co9h%)Hnq%awS4F42wZZB(*tRR zUIS;^PmB&G`{2y>tC6(gyE0KdX$rcu%L9WWMwcwV`pU14dnVIlQ|I;Y6`R(Xjpru% zM&suxCP&N=53R%Noa_9Ql;S|{y6%9FnxRjUO+|i?O>^fs=uP0SR%nyU^Ki5K_3)d! zU&o9uiEj7#{`b~n6Zhd^W}KIA)5mp_?}BdO%KyKstFm|mm@bv^0({Wq%tCi^H~yZ( z&4r}70=RVhjt!c(c6B=jWFMn9ZH317ZiN_W4au{3%eiPzkF&(+t2<}57ijj5bnAPm zSE}6CWSEYvQrDzRP)9&2Y);f7m)Wt5sy=f|#+Y94_eQKx$}9Y$h|QlX26E zuNeL$dBDmE(9(JFG@wam^M4HmT+-D~6z(voZv*|E$j~*x>G~QVhD*;@h?crDeu5oY zQm12srDVW)nU*)<()_$^=uYVZXH_hpP}TP?4jD`HBpYS zqwQqsy>Pq)`eTB#4(Nn5?>|vR6wrp2)HATpL9rey+Co-eHLiVG;TUk~o)*3N_Jv=M zfNq%M4tsTy4{pjkpBmY@X}jQm44x%W{*taa3Ms|KaBWTqCPQR@;uEGN5)TYMr!<#V z^T@?QUKJgswi)@SEo>()W*3V_96LrPT59_<)Mt_+(k80;t+pVaEhUY#xj1nE~Z!^V^yhdx{-y_Xb#qB87zOg4kdhi z_vAOd{P*5rvycw3KMnSV5occbD?Rd?3}S;78cXfGvLee~eUW||p)3V8jmFw2s{5}O zD@Dqc8i=u~uYAs0X_4TWZ__@K-G@mfX{tMUwjX~`dW0uVy8uOa9bh>0;I2hvm9Vn8 z>I{&jwd=5K5A1^!a`f7*hue&386tlON_kEC5W4QPG zUtae?gEJJj{s!P+Ko>M)R7DhJnGd0Q4?~260DM^u*~6-+=w3#&PXg|5gP$_N8_VPQ zcHF)R16n0+q#8U?1sjkK2S(hA*$=-V1;8mMDm9yr+Wb}24lbN~Ud0$2t!@IL=S<=Q z5(=n_{rI?_a*GMWO*Mv`XaQi2EraD+^^J-GYVd*FOzc`ZB+C+uA_%DLV zB2GY4yqQ^cM#lywSwC*8`%1QmLpLn%ObV#;k5(I#-o%^_Q|j6cam`+IoyoEt`f^=s z#_fDH+e2{u%}?o#ZVd#lEX`&%Vv!w&J4xaSJyUj{{i$&V1Zm{2+Fv~Zvi8x@iTW1| z9ViYcv^s1}hi_CpUqU{*6r(~I@qk;BvqgLO}#rH_i;CG|n~z>AYP#)Yc&T$MhUq81djYJ&UkZDUKk7!;9MRaBHs zK6^}h7zkDAey6eVA0bBBGOuGRB}#yQ==d_)WAzatAM0qy7RgZ{b+q<(c`J%yzwdcv zAEYv_s?mSTv?zOJHe(QkVqg8H!QV-X`R#SRq%`LO)ts-X3KqtwX z^kOP2cp|{CnA*E8bu&GR_Tpb3O5T&VrT#@T$)7%Ol6YxwnfI?dvc#;ap4vP}jAzQw z%tY-Iu!w(mY}5kUF!;LwcXmD(j#8AQh(wr$-y&6!s_%XU0#wB!?cc!iqw>e52L2dkz}w)hrDxP zo%axxZy{&=c##QYRGZezIYqxl2VRx@he%{S~~Si{X|pYyZ!Ru)^%@;8Rv5 z#p%f{J{M$sT_$_HZ>>1{meGRmu0_T}CsaBA`eN$RRastz;Tzq&UIq-dM>PY8Wg{Fi zrA7RCBKfVvhD_1>dQI*gLF|Y9f$&~E|6h^hZoAY2W?Og$d*Y%ka|H?F1a)F#vW|gz9H7FV=_iveJzutUdSA*(~(p)Vk^-=a}G z%4+LG^B?ti0^6abIW+JJ7f7ar?|eGxm@1M-xNeke9(}(!p_z_NKS$i!o5j>8?W>Lk zf#LGoRGn+A57)POz>vaT6iagexg2Jfnwa>%a}TUWx> zlbcr3&`~;6jJL2^rz?xy5L8ZwIYldIZKlrApo7HQZ4&H{sAzjS^{FqI35FSS-I$@ zeq2{>zFu2+I_(1#1;UQk;UUJxvp*_SL}<$U{1un}LSjfD2HFT^n(kSFX~8+^ALUVZ zhi^QtxPw!;eOkLZL~G?FGzJD#RORB$Gihz+SZkIe{l_W<@D3j*j#*OaEmL9Du)15)dSlw!3D>F$PRl!_Vld0zy)z2CrjqZ=`d+_ z#}_Wm4N>i8(_4y@LQrs1kO2jS=bw^Ue&4)@Qx0+6Dr2i13Wqc8q@)eXBqNBAK5}&o zf*B~v9o~;<$V}dLWcs~ro)>S24p~->Gi%}xM&Xz>moVBZ*>?1IMShmX6CW+hA)uSA zCYxHVD?D$y0FF)-1ze)3J9v?9-eZ4=j&_uT-JC3X4L-0FOnQ+^>&5$B@KWC02L_SQ zM=sguk-cZzvf{1*D2@N}KiCN}Ty*>8Z_2F$I{myYK!U>*cc85m4dR^y3>7dsf5VIs zqzR@zn<+ec3f81&P(KUl<_}!i2u20rwBfgi zPkQMHKH7E9Z-6i7mi}-BDG|msI;Kxj#8uk8nLHEad)>60p~qz-JzG39r;41$Q<#ww zi@dA)cZ)yDYk|G;i(nBWr~`lZxg|7)43W93NkWPu>`R5HRgI6Gew5uJSx|Q4I!Pn`B`Gouxd_8NW&3grkUajz${-0o@8@|NW=M+{3zO&qW%ZI6$slP;^N&P~*! zed6q*wcbu}TaG4S&$l3Hz5(mN#QcWmm*wXL4PVt=7;dBV785f9)0-_6^uG7vN$iOX znn6&U7fys(CciqIM8uY=je@6rsgNxP0NNqVy0!3E6FfE6i9uG zyFsLG{dpxH_LGY>WQyocZ?fO*we7Jo5rCXdfA`O^Tt^|Yb#dg1@G>{?c`VqE81pxD zPK893H5`-ZkxwMU7KK12RXMk)UY7z%{#%-K{0+>fMoWdo--A(kcQ%@m?9qmJzKS?! zKW0>h^U%j*Io;y+qR$VaZ~ct{tMF_`LY3e+IEfk5oa2Sv zvrV38DY>a;bO{YNrbdLtF3^jzph$S`(G>8Cqn4oEnUZ|7vFdJQs?+1lE73o4FR5|7 zY&}RdMTBtp=mjczgP1T)NPUXP#l_O2A=S*&kFy<&{)KpBzMjT{eV-H7jX1D*=_9m0 zWx+m`J%4E-T|a*l9ZDxBlNYrR>jxt^${lM30edvtmd_YEfX`j)N`U*f8F9E1WPGy%VQ0LD@bMSaJvR$FeURLW6JJE>RBsV6@Ai^h6lM3n%?FfKj#k7qS8ZH~63 z2dner&6B>_Hdje6-EX)yS@fzNTb9@jc?Bn}fAPQEPyMx_B}_~P)1;rTN9Me9->pvN z(euD^D_*|m%5R5cJqylgCr;SKXn>L^*p=zRo({9EtVc3C)IwBL>SBDh3Lhqso%j-0 z)y-N-DWiA?>Yr1}-4GVfqH25E&X;N5;2}!o^sVv#e(8IP(Ca717&I*+VvJ3aObQJS zn#+X$aqDDZEYxWG6Cw%z7S2)TDl~R^(*6^9QL04OE_fC>( zCe$Rt$4btmsd#;gbx+O$YF^Qy(6zWl$HeMyvjm)Xmkcs9!k;5TcODD#e-d#}1C_dF z%U9{5t}M~#)f@*jXoG5m+p7CGXznEP(zG~)=)XLKHeeGiRTO&#Z}AOx*@XxvL(`qJ z6QL2%9LP8ATuuI__?1HT;7EFx8jRlkj8j-fyYgz+R2O0?_x4^rE$4f$gs&DL(OAyt zO=86VgV&?Rq@ukCE`1$$OogB2oWLYG$9E^I@{8;zrxS%FgyV&$wf{XDB)9pRu`YIE zuk_agbvYrLOctt^uZ3!)cPd2dUX zCet(VcmK}JSI1-FwIk81Uls$<0axEoM7MVfWJ{a}rP7nI$Kr08x2SGBdKl?$rLbjC znIxl8TJZN6gDnHEmwtSJzxcv#wLOSFK>%sBLNw-6AeV=+JTC31Hw;dVy^%B#2Rfnr zEe1d1Tga<+MLph&?&|k48nlW1d1S#n&^Jg%_D0IOTswF$=)+4^rAYIkWT!gA&v}6f zOQvaSbmc$Qul3ZJXru(& zm?>4mJND=JtE^*BjSEmoLh9dj7#(!b;u+8UyYQ!de)l@aGlr%XlrQNW`7Sa@QuiYJWZ>%u`8 z)B>ORGwr=T9k|_&zo7rP^KOERS+~F*JuDAXKB?)3tH`{&=BPIF0@^o8_Y;&sp8Q`H^yY z@u&+Q)_z5La5vm^>*+N$BJJ;SlC9u%H!LTgQ31vaMR#$*OVnRsBda!9OBL@L4ZacP zsVTct$!*zG;Pd~nQ-9YBwiDZzhqkCd*jmY7^iHR3K+<@ScH4mM z)(}t>wW2$r#A%sj@0`}Yf$r@kdQhO`yy_i9_MLF>3E*QhVL}8}J_TsjIsE{9ZodAt z@G6LAfe1flU5Pk0aGK(Ad@PP0MW_ap9q0&weq?fW!gE_S`K3Xrx?=r^F$NB1JKS9< za&wiJDz9UW9H6wnYB@cCc@ejQest7NgD3KVDilC0=UWnGxj&pK!BphumU#*ZyxQx4 zXR2#nzhx~diM8u~&ri&M&mMHYtfy^@q$NX&ABAD9r0cNOp)M+3BoWz`0)D1NVKSb*yJdJ8D#1sU))2UO|1M+*V)HP2ZJ+%DMo$s z^8BE8w)05z^42)uO{es^aD0Q3`F=s)K}lI6TM}++|N#6q>Y9}sn5 zvek!MukY&VKl613>O3fvc4K?xtLtW2a0?Rt#E!NI-pE`Do#d{E(>MWLy1fCHHOjZw zEgdf0DT{$9^;L5Na&z4JT?LQwdiuoOzYsDOCE`{3b3_ z-~Uj%m6`cJ_zvgDfG1)1K3Msk*i8(3t6gtKI9lS?*Yfo_{(6p}z$b4&u8 z=l{UFX~v7b1s*?yN8#L-zdm>~_?~Mo*KWme;h?i8x92aB8U+?V--;UYlg2|Q)Bx_% zHAYLt%rU#!^4vCiqsE!uC_(zUHr<<0lD-)$M2 z@#R&q{kN_#&?JYAFjU7Jm~4D|Sw7er)WDeADMJdx1xRKjT5+Lwtn1?SW=1TW8kKR$ z`NYQ5Glt|(q55@3M&+d=MXm{f^HacIL`bbuklZz>nPBru5#;@kMhb*USmR4|^9>Ge zMAQ<~)iM9Zf1?a_<}yn_D~DDw=Y_PZR0oSu8IPuBDC^xE;n*G(C@e8OzT8}Q@w4rj z8K2^4cp~d6GT6IHgJ2VlWdYc>ksDpgB24vUqjx~I^|P1T<<7ZR$R)r_qeVBnjd5%% zd)fOM;{N+L)qu3I`8MevqAT`Y14Me?|Jb)H1ptq8Vi%8QLRGPdH*~@;Nb;bnB0v|# zpMc6Q0CM#dFnue%In`ETi0EaomlmA7@NC<~w0Qp$dU^Kxr@98;$HgAL!#2VnR_CNC zZUJBX$?>c^_~`MynCsr|;aO-BQ(@Z;_pGk#UyvXAg1&dM#p8FYdvATI$y8L%cqo*fYXA3XxoM4sqN*@U7&5i7y z7n}W5m0L+lXcNfC%=z&Nf|6s+2pTbPa~Px^KQa zQY5*J+k+G>A*8gyA4ueTtEkdmsm_C~?%_wRPRrOhgAYE6Yu6W9~R!h6mR^@-FFsEd_hP1bdZnBB89)|QSWxBx;A*}4N` zWKfcHE6{^Z#;^7*eHnaRgM1%ALW5iK$hksJkOVd#tb=;uA?P@a3iVH1;N3Zm`H$}e z2R@|OD(8;}9wh{Xb?Zbl1SCltvCfLhloUODaT#}6s^saC>$A^8f_6liu222Sk;|1B zKHHXh46eUa(WMyn>oE{oWuQ`=?57Vv`R3RV;7ca(d99u0`XD?AqpJaCv-3!KCtz^u zb$)8u7Q)5XTzrH*(TJ<^n#e<0c%S)S`19_z%B*jUN0gWW@j5{Vv^sk#WeDSDiSQmh=XplLs(RZvrZ5al=0eH%Opw0%w5 zqkT?sCB=rcqme8|KvK4r{G*Au}v1$63I4m;d#i;uHs#1MzDu2Qyd}!>%#K*V?3fd6qkr6UelyM#={HspYZo#BTaLwpOqS}%l?6%3lZU)Eo<#>O z3WPjre%riiO?TrD-Ae+a>}a`F4cyq{?+S7_8<3h2*Y^ScUP5A^&e0=qhq~&p<$hM# zSyJGKiql>zc2;E2??}^pd*Y$vHI*;Ox?>1vSLwpte*-_ei80|xk6$Y7G|a(tJP%wj}$l*|m=&MnlU#Q&**Ds5jAGm~7P z20oYgpkJnzdFY3%mgh10R6nrlWdmZOjf8};YAW-CaLi%RRZX!iKeF-6Tq|nQAccyT z$^E?7*I8A@%F6kdYbQ*(VQgEpwxhf~eIBr2`GK7fM{uf7r@bBueYrxALtj+=uKVS; z_|z(*KU)o}%8RY-?`7_>g>B7u81a~=6x4GI23%!#nYi1+Gvx;7jO3`M`K!U0smujN&!4-9Je03y&09q=&~hXIL*IDltkx zX+g6zPs^?CK`>lnCwY2yV_h!oiB%WJ#D=`OVL36f6cy+^DV&P__?xIxAi18qq9`#U zAdfe!o>X!>|Ll*6Y4Y9jHyAdvPJFp0+0RSTvZboqNK`*m0N@&I^9OX)cI5Q6>g#5Z zecDEypad?#rlv#PLC`<8-0@@T)=X@LpbQUa));v@A)?j3B!32p912xl>rS3=alQHT zDW8UsL&M9T&~=qY5V5z_o_~A@Qjg~C8ipVs;Ap*x;q9%Qscx8IMAyl)8PAUdYt-p}LDx)>sDkmbqZIST%QMF)2$F~5 z*C+&vD;@cpsCmWCL?+E}=<*0%dkwWlJh;S&e~Uh=(!n3GZn97;t9}U{p60uf56%oU z`=h7z?HP&M%CRcEa_9}<*#4v%i$?_1?yi;2Bfc@l@m)st68fSyf#imt=hyT=x*pb- z!p^~SgOkGFK0&A`cJI?c{r#DZpU3oBN=z5Ruk2dkAXJC3TTrhaFo0yr6)5a9Ds(XJ z0ya1EM!%Gk>;pr*2p;x4YoHxe|4e5qm*Ktu0T61d;(Q7sfBap+G$^`nGj~+!s7X{FvMH7Jpb$9!=91j8XjsZHO z^C2M3@f}?_sGiu@WfWLPrehN#JVPS9opM;1ndB`*@6}y+bMBBzXLM)de$CDj+x7wJ zlwqKk;A^L()SD%_YPjwn=$bk|j8c~4Z}{q)qstXL8qtc{#%uvsYX`_(p(3cnZQ6AE zmEuAb;z9ymh9b4ZnG!{_>?%Kgo!5$Xv`lMl2x|2(mX%*HR7D!#x3}yU5og%{HjEGZ zt)eoAXjMx!3j6++l&4XVZ6=6)w~ZH19_|S8t*W3s>V~my1FgF42|HX~5mp^`s|z6C z8N?VH1sO^E2Fav#WpOx4O{>+&y^J}C_AW)R{el0kS};^oQNnRQ3I;b+3LA(h8SL@e zv(HxyxDJPQSXU1ZS@)dc^PQt4LXnP;-kResW+@8>o(G%uWUyi7)3TbepABN+NMNX5 zDT~b-=uU|qVd3?0CsbELaG{-hjGm?J8WC?%TZv(q=y;nQg4rs^-jR!96pW2SLF%Ed zx02zi;1{+FVDm8k6#=9&r1YWnZ`nLH2H7uVc)5%001bK1i)4i?lLK zScrWS1`=tu?fWZ|a;)Ko*~Y1DYjV}&Y??x)csPjw`kD*lE{v#)bcPcVw=s@>n$bT+ zKKVmp5@HM-acRzMa`0^*2mf7#{+IaSlDK+kZkw2Y=N*z{)t zb6Zw8{&`Ehl(Q#=n4GPHb@7nQ&CXO)Jg9s~BC+|rvDGb?MbS)pF6y^IuhGa62Dc_x zjFHZXrayFJx+K8O*rv<0IPQc8=0`xdmPn&;iZ_dtnGEl89H4Gz%VW^`mi90}e{y~R zRDQ}rP3J?2-(zW_!PisraXAVB<5hV8o5Yix$5S}PH0`W6Z$*jCRk_OYV^JsZ&fv4C_ zjDXUUy7_?HKdO;I4ofexAKezRzku7SCn~Ri`c8TvXpK}0`=cB7(IEu%%$&*vGGG(3 z0fG#kxB(9L4!U{LP!Ffz=26%wDu2Bb?O54O|SRFc~{Lj~eNRCQ(K*h9!sM-qv zgB}3|a>+=25qS(^5j$?aoKcX;x#9XA$Q@<*6`*m?T5o3;zwZ>E9EY%l>WL$Z2vLhO zhcB)x7{Q^Cp|Km62HyE?;C zLl&g#5IF{?B1UX3Ly@3F!7v(w%{z!pQ<273MSt?hInzFyzrU#JPv6UZN%CjT5;P_^`6(8U@lVNta8tn%)tKCn>KlHOhDu5VPx_k?s8eGmDo36u zd_t!1ICsdi3BSXS=qw;c8H)y0x%-HHNN1&U*dw==|C3{~Hi2Q&tqpQ4GADcXmbgoA!{P~gkds@N(-OcZ2@ zXd7Vh0D@5MK&W3ab#g?1gql`=&3!22Wa&Iu-(TW-lw;!i5gRO{LEj=}`Lh5O{EHzL zC8T~hCWE^o>&O>=wkeQUtMWI0^T6a~##}0cp>%<6KW8%_bDTIZMd|O@F^zgei9a2zE?uDIzlw|>hGtcUaE@X&{QRt`0hJ2D6JSdah(ZA2BeH4&m;Ps(ywKr7K zs1n#ohv>*|pSV-~@V&K~C3>H{EY77H`L_=rZutK=7Yw5^!?h1+m~&0 z_Y_XjJ@SvgeJrTy+1Z$A5D=Fk-zs5Bs=Hlm39sb}5N zQAL2DBlfW%f)?jKixMyys66-lU_hiJFiMu`HAaqHiNu~qV%(u1C$6qyaRzG?|4*As zQN3t{Sx-+UppLE3xI0t=W2*?Q!#83(fN~!cPrj?_UvNm83FRQjzBl@ zv%m54S(aFGqnb1o3m=AMR&XGgPTfx-gyQYH6m&1?0586|k2^-uhS$to4>i7bYQD!7 zq&UxX0^z@r-p%>tU3qG+zkWi$@>)(!Ew^h6i7^Z*l4J4paLYa zX@2Qn@sKefjaH_AGbVXE#hkX6x5l* zYFK|wvMoE{X$8v4{>rqabj?9B~T3(oq8XE*NFu{7LRP!!hE8Si_d3*~V2;0>q%N%yd~4 z5%A(3cKNU+Qtr`gu5n`etOBW__11FNz_Ez+FfGLx39-6c@QnrV#gPKxL*mVl_^EB| zGcujhAQxrkvo(KLgn-48eG7`W@>Lv;+0S(_)G-cBupKFs>n)_GQxz4KVavPW7@^|) z=MiSbKAez9=}FH(g9b@2C;$sj1Sk{`!-onRudz-|Ud5ltMPsy{60c%o=6V{HK~P>s zS8&4e{#W|i8A4ON(Ts%M4v~K~pp&@r%f#hq^-L^Pv&gy=>7Yh!4E~-?PF5T|Sll@t ze2k@5Ar?3G3A(OAqD5XPXTJomqLC^8vtbWZ@V>Wy09xJL-m2XfCb=N4c>QYnTtBjX zI)4$@j2=II--oQcsz}5g@LG?&3!<*!7RVJ4FVhmkH1>{>@6$uDu_R@K^*#|dpCn(Z z4LfQ8P;sN5H=L_zNvw)N7Kh0VzpZkfKkEEWw^Cc1`kfigq9p8K2MafE=`W}RQdhUobR7SvHqSBElAR>tcORi5n$)@ajCN#7W{iD## z6^YE5uUQj(jgH2;L-1_3sI+~^C>~sTsCnL%*fDBA#23({XhC=`{B`_9d6Oz(EQq|) zLV<=1VClwFw9xJ5$!eK(9Vam6zK(K%)1(s5HHO$oT`K<=SxPdz0Y$kjxG=^B78-yOpS67U_l^TDSA-4z;ov3Kny*|V)C$|(w~ z;hvXcH}dzcFbZWJSRs$_tCQ=!9>XH@ux{IhO|sHm*a`p=5_d{oNJYuCLaAuM`LVLk zyLxbbodT)3-|_`2q=c|$5^PtpuUagtZ9(3r04T(Gq!eTikT2b~P(0Ax!Df3DUet(Xne}A2SCE^0hw^Vq`vqqEShFP#tW4@^F8e0ebduaA zD`;oEddD|}snufs1b&I-fo;Bvh9imEzH?zRwU~@Q*5;Uz0DH3p{>og^6#V=Z*{#LV zk^T)CrbuEweJqRF>^B3E8oz56ER!Qf3f%h^T89~Or}vaCZD<&rCIl6L?{b+J1MYBp zL~->hCYSIePKicvf2A)93v~j%kMIBi`xS;sg3UA}G~bCy_vO_1AT0KyWE<7vP_dG{ z6ZwvN%!T{J!!i)0J6puTfrB7qmjmnl!8J3CxMLuDB=t9@S>AC6RMM?MF1_+>1Y7`j%=yEMxGW3>WC6ZfBWp65OdwI8ct))S1byZRsl0Oav zb*{h5Ik41t^lZ_Y94S?(;YN7k-_w4V!Ri0o)dx;T9b0L-AwF0mtXTKlaQLjMO3!kw zJgied*JUNjL`$dh)S`*xyTb`b{PA?6xi*5u0uN98KDoM zZD3)(yd4ny%FgN#fW%!EP480sb(2P{GT!?aJ9-WZEqG3!;leM9qdo?BUm+NI3Iu5) zzIWTL10CKCpB;Tc?eU@I?ghbYDW>SfS&(Y}WD|zy@s!{0l(j^xNngf~LIn4SMD`pS>E42?Cg(-&BSEx~IQXZh4l7~e%_lHK9 zpf=H>L^o(t3Cp$5`mLB^6tUp>QTkp?>vnA^U-Ftiba9I)qu9b1h_US!gS3S%y8k*TAxejG!mIkZ-tfL{_g~u4 zfbN&BrqY1bd!^e&U#|={cS=`6;tWPq1?P0e1-Y1w-;ueS<_qgwaAW7(Jh2a~bjeJM zM_sEJN%~|t-WDHt{=M+n#+0W^23uVu6xYugwL=iS;RJ&M56fpgwwIKVG>pqnTpv)b z%4}~JF++r0@gA^UmzYmee}m_gc6X9t4H5A1mF?0=KRdvyCRa z_J-(|^#{n{9mH+n{PFvEGb<~*jWS|XkpAvNg*MY=v|kcpA7}=LZ+0wY(A>58F(_-d zc5Mmot&dbmZ4+q|HA}X*f)?02asS;&4U^JdRYHn`LLi(CmA$A1nk!x`*Cv~58_;Eq zc0CV0{P~czez(aF{5>_!acrY{bAxSQFBy`w2#SZQFdk6! zjX{%Hr@i3UPaPwZq}4+y^HmjfzBc{_Cu?y0LwPccNO3#AXv^U-aCE&=q7LG*pHtPw{3lrW@khd(W1S7Of%UI=R(oDv_Wtz)&} z-_NCejXKhw{vanPl5%q<;(KZ0>Uh>h$YNbq6LVgYGncu+W9q$^hu2Lr8isfd773XL zWjeSVt)OPkV*SLxjNW*qMCB8Ja8Jw;4QjZpe&*uU=ZlVI22Ep+U`!9eK0F(-}Za zPm~u0$ zZZe5M9!-{2$=!X4j};Z}M;mlq^! zuOv;)Ps<R_*G z)dr1{)jx{M{@SseJNEm_7_CfiDCT{a_JJP6-7nja6knm$!h=KUW;CZ#N{)!;U-B<> znKRH}C$di3)ibZ92WC(CY}+`>v8#HJGiNZ6F+;f(_+Y!;%$|?V zsJdt8EndcxX>gc3qM~<_S(L`i+zKEbl5vAPnjdrxlY@+~M56#fsK;#Gh7%2G*6D}` z*E{{_ynKR!?OlGL^;JNpFyIynO#k9XUn=t0eJ88(7V1MsX?8~v5qMN z`+(fsll?fAViJ6eA&dZW+;C9N!bvX$7x(`>YW%cd?8dEcH=FC4xJfV-vAsi9SARC7 zi~dY5AoQ?Z1T!eDKZ9f(Sm5I&VR=#;O%a?@nDmK52u$h5z$wV!NjOW7Il6D*X*OL8 z0a66ZpdV@eJm)-@nfdV_we{9r-`U+<1S--HijHR{TIRaad#Llh$jW|f@-v}P z)60!NaF!@5YE>p*V(I1Jx4OHME85MLns?Rmf|aAG5{y}3hHmiB>Yerd8ZSvr+jZRh zbbV)jmK6Ghx9OfjK$HRxAQE%`{{iVh7QdEBRB~cT*XRHkXjaVIF^EtWg`~0o%a$rH zLQk*GPHxV?+5fvadwqR=@fw`}3|?Q{fV2O1etmNdwATL`_`DeEk!SH{68seq7cKua zn63PKf^w9i;X~_+gULVt`G85mT=r&fE*Zk&{ScxE#jtRPxQQZMJVnC(v$#`qx$s>lG>xFs6!E|F-mr24NMq z-Uh8z-Eb2unWF-;2(bj$tcLu{cVpIV4KqcQCZ3{{#X4ivj8{v6&i1zso4X7z0{K2n zui`xX zGh&a3jlM+2iEl7g2#xsCfT2m&H4K0ssTC*W%;_J&_bXUVr zcQ$;A-vMPI-X;N%6oh_DvN#0EI7c|Sy-gucG??cwdk#Vj?je95>2Z*d^nnS4386(W z55ngQ{k#XzK^~t-`NNz$zPW&c9lAu7(}oU@KM>)K}g1egJ~)17nHF zA*EyUYl!`=Ss-f@&^Gp0=9pA@skAQt10@*-y>h}Sa2RH-GVZEYTW`SX&L-14+Tmvvow9HbzSrOLoQK8_S!A+!#w4h&a%6M5d}sDK^>R6>ZuWEn!#%zu^u=t)?|a!f+`JvZ2m1SrUahY#Y-q+PR*aW+X3?aacUO$zv+F zks>5;_)sxD;&Wn>ph*skX@X%)*~3ixbDml8qT@8b@HBawnP<*)oLcwiaVPN=Gm@y7 zLjKX1zx#wlBYIr0gM(%1T72qwJ7%NHoiz@0uCqp>)3O&!pDyRVX)aBfJ(%_!N&c+Y zkyD*ygi%m(uor+}kfMX`E~*UWe^R2*c+vNH@}QN=>`I_}!gM_KD4D!?Y?{(6ej z>wwLn@nUOd@3Fgd3&}l%8Q5mAmT8L)i`aA6L4VKcR#erAY~8vr-mM~vg(s+wG6nOn zB9;+Mm8>m62#LFPH&hWGX?JT`a|QYE{cVV$vY&6uYS~s|m9(c~G59+D)&jaTa$~`* zV#umyywZr-OSYTrm%U_p#+9JKvlhjCOWe-3p%!g>)3`SJ7YD+^3q=BQ6(;qfvx~`W zT)I7A!hfcH5QsLzWdmq2T5f=_w>FenhswcX3G$2#3F6S3ig8s*UTVDId<+=3F*oE+ z&T&x6SHJ-*x=g6Qb(!!w;%BvNwAG65s+lGZb1v~yB2bNL6?3HzTmgshqwoSeItIc2 zyxs2p<=xw@?qA+LdmG=6-)%5z14NeWJb^K{k)Gt36fhi@Do=MLwFJ3FLoHkq7adp& z92;R~vjG?)VvNi2T?D_1v2D*x0N055r`lk!b6Hh;T2bV7Y3AEDPuVi~PW1@X8gq*> ztsC*olo!)FYxBBctVQ-}wqv#lU%Iy3k?=I*4qDfB~SDHznp(P|ASM01Dlm_mRE7Ic$FQ3?Wp|{^`r+yi**Y%_nz7Jg z*vmyRXAFDImQ9-;B@oh=1VD^|6w zFWHNVCA+dkyToPttu5R+mM)rY>DCd`?~1i+^)&N;kDmWw`*6>R|Fyrr_WxhW)6D;Q zDC4X=p5H8nZhA_^Tbto=M5+y6DnwF2+G?#{7PEZOFsm@dtG&LJ2ipv0X`;n>tkXQh z@s*6!_;_9p9osV=DUBQ9WH^l2sUM~&rnKO^C-1d!!Y#t!+$^=D-XbAO^RSzngqf3VwhTR^ z$j4JGC`eGYr~=IxIT>`puTuAC%?t}kkq6LsGe65H$VNnUJ-xpQ&aPdt2Z8Cx z>jYBQ0dSn^0Q_KEcBxPG{>RY>#*-ArKP{RFx=H`Dzi0FR+Xsj1_)jZ&+TZ_K>j5uM z05H9LSvw5|Ko%-(?gx#8&{`YwW`)*4ES4Hthg6Xty8jHk3hy8YL4@)LfCh}Y)c~73 zYzFTyj0qV}FnIxCeoAX^II|;~IEiEKaV&>dT3gt08;$OnjRmZ-xSG(XvO7bzYioWR zZ)FS=I$)N|7S+^@>8`CNzgs?W2KqnuML?7N$Cl0i?d7|Y*p5Pp2@dBeMAS^nT0?Z0VQX;(U`=s^reLa5uk3|I^ zhl?0)Qqo^Rl`W?W@3)lB^_?Y~3QP?+v*uynS2(LmZoO zxneO{d#}POwvtwR*UZ|g(`+2(fzxiSEsYNW-mE%`=nN+)3yTN+G@4eNMyy4z!OZ%^ zS=CcT|4Eo+u;{-Jiy>a<@}~v;-`zU2?|-(p4%hU56_3dOLncLr0iA3fI(aeT&lgXR zg7YZUYL0*}U!I6^oIKM%C|xG-BT;0UQ(20o9k~dqCDjMv;?Z&{fZOKbfr|-wzflnIoXJ%1pdAiGu=@@t^kw$XJ0FSnE0(6dD4`Q*nAKN7 zNHV5UQ&6~d%0-qwuoI_LdNGiOv#Qb7F&$xBT=AW@W+@AXonpiW=oequ3kHG>UF}4U z!#jAMk&EIrLU|xt_MN8IK`w?`YwYI&jgQO-SH`VwB$ar-!G|k2U>Cf?e3Jh;NMIV% zpB{k{6<{-iU^9go*xZYn_$!vN{>>}WHw?KuAjts8>&hty zrj~&G^T=MT==LA9Ngkn%mvWc1rffE?-e#N*P3uhAgQu85duQjzs2oNgJ}$-!pmPTw z8n96>@8E+<%*Bw~16kj@i&`@UbUFGQOS+ z2FXVd$o=ver05wVGstm{F#r zkj5b~c#3(N8P326f29CyM&THyQHY`JiH4%xyl0n*o(|9?i|u$fW*LVoiJiMB?>ygC zZ(pl@`h3v-un9@Bs<~19UeY89>Y|6mc#4BMqQMzrS`YUIlQb23 zT5N#|G#m<8vUeE|bU34u*5nb&ldEJUBrN&j$Ug4aOip|9JO6PRl92~@bsO4v5V+vp zxj`q5p-=_+cz7|Y7@uTdln?Vn<_uB=%XbcVt@y%9^4WAPE#!a7Q$D8tckkfvz}EjB zY^~#etmJXze>&SsQvy(6KZ+uN_hre-fJ*sHmlSj{K|8AjP97Zsdu^FAhFQ#oG+D2w zfOo79IuZ>QjaAYbg`?Ri+QOPgJo6hO+C6ZQ_oKZ`tkVa-oOz4LX!eeX$)i#%&t*8k z7P8tUubfL-%qu9;dGpC~bBRuD6g6qi+o(4nuULOl&|&uiHPX?e%0^9+QLnnDWT4<+ zHnFG_iWrfw1)~|nB5g3OP!mQ8uCH^HX;x#r9|lG73PPg2s+b4LI8dAA3Xw|Sb*x#7 z`S8=jI4~qjIyVo7!uNj`^sY5WW(&6_i9_Hrx5y#I2`wl^NqYza@MD5Wppb3sl`A^c zXqo*I-PcexYjO_g0v;^f)8kSX-CC`r6QkwIQ&m%;2@>pHlr3thr7Ptt4KKgR%~vpc zX~F-$OfY#=`;Wt2C;r3!;rjk>C6B}Zzg(K_hgdp43jfdh@;H})F!NmnvZ?TRB+=qF z(>If9gzad-<#`AWzi&G$uh>9>0lSiG6Up{*ZzuUIh*Lq1gX`1CZyH$v{+Bh3&K00r z(svD5mU6BGjWeL6`D&^Riod*z!9`DoCi*`}KEn8HF(Z(A`oF!kzvIyV!<}{fpOriY z{r{Ox_VTPi;Q4LK6B zX%Z*lX_#ZKqHyFvJ|q`8^RVi@{{8&L`N{j!lgn$%tWiJD6d|#TE3CCwK~%rJ)0sh}T6$1Jkoe`1u?N`h+JV;D_}gggiUy(mnh38jMb#OF7%N^G!E zp%|qlpT|Dj{I|^vssX(DZ#@&4wKH%2TZi)I)yeg5m4NuyYFJLc)rjz#T0@s_&RW_46E4H$)M6;dkn>@n(lPKCj3CBn$#2mTNVLjjo0j#YpbN-dJ3O${NuE_O}?u|nH%jKK7gp6T6x#5XLI8L;w{xF{eosO-l z)iF1$8vLgbTetSYS2%ZSzV*^%oDeHqtE1U#sO{SEF@(7BhSOP|@|u~)v4HYhuBOY| z_44y=0mHkNch&VnW<;^ohRgT9-B8uk{2qr%HeoExR$EgX#4oPSe?PmT=kdu;=P%E1 z&d;v-UX_P#4R@kj63yK3@8{R&KfOGA|KjZT^HbSqKpEknk_GBN1Lp%!OtLJ=h9JaT zGN7}>NOFQ1%e%P+P$3f-be^+!1!RO2z-(&s)@+hdp`8*Xx6msl*$IAwVZkQ2x(K7s zv=oB#2+;1M$n%#hc6bi-Yk(@EqZE zks(BWzNSm6fMLum&o8b(j38!gu~>W0K?(`L2c<}fDLZ?Yp?g3^Aprv{K`?>9TzRN4 z7m{e`iZ-335IzDua{_5gF9LvFW^_FuKlpJXH zYbpUtF;>$8y1okRZI#xof~}}fyD_a_XSsT}Z{=yy|0Uya2(MuZBZB750ori?vvat! zXUG3J+*|wquH-TFe^fSM6RrhvS&k~uSVljDKG5pXvhBhc_zUjUq11JyLW4KU3_w^( z9RX%PWTa@)Q8f<^1?kv!=B?v9r7qGow#VK!R9A$5N<%F#bJ<4ABn2R0tF7!P1o)am zPTs3YOnU{)5l#rw@`ulEQB~rj!Fx9+MkE|A2NeNQ_)yX4T*%y$>HSl_TI(3rFfzS^Dr+P0X(G)yA*{*donWxxRHx zW{HOn&pI`*8spD^Ag0J%ga>Il|I=guqlYMkkC^{^>+sOY|GmEdTg_vf|7x%?TgN+IfOHj_V zM_)$KdCvb4XEY1!}AhLFgKe~ zjgC9ZHfQ^|S7Ts~ppFWk=EVoo$#&X2n4)DHCEvKR9VDi|^h_>Q_)fRPYPEaSDxzG( zuberAmRbaD9hX+!w^Q&LWJwmojDQ`xo5EhXa;C&K^zOg;dPrgX0)57FkJd@s zQ=vlp{9UU%){pfx@qalg$f5y2o8tfM9PZfmU%R_&{%<9Z!T+(zUSjk&2JeSp{zOlf z%=pQSSFo5S5quqv;dAv@$$7ap6RdzKgXbvb8Xo9z^q1EfvSxyT$kNyA^(>p-frUX& zlr*^)4v&mr!Jvge3AtJ@9zQ%17DGr3b(D5W_Md^1EM^uG>_Sg;$qDfzc#B%lW*Y7I zS|$4II<6$f_*LB4dRRDUhf|Ovlc91%k}?4;Ww=Dw@*){4^{Uk~3-L=)ba`l3yN;JQ z=%7tbK`h%`4CizHQ(Lg+tZ=I0T#u{Gv3m8fYqfwYVAic*V->3| zRp86eYuttE^KCF2@(q_&^zO0z}eVV@_Bp*^+=z4$CCZVF8?Gxi&}} z$q~Y&1SkJu;CgO#Mi{J;*(6P8-)l42Jel|H{b%52QZPFpio?EVTb~j=q<+2!2lHiehkNX3ZK)J_kbqcqC5mQ zr*6!WIf2{)1-!8FI5M_0oK?nf{)CYA~x zlY*WwXfP0*``4D7evGG4{^y7C?~9~?YO?>>-92#fKku*eKdt1E`Jbfy+D{=)qUEK5 zlH#+yistd2V6=ZGq1|n@wS?Xvu z{tE(VYUnLsW;%xnNi5@1Sjntfw$4=e63a_RGd$>~a|$x#jH27R_*W%o&A z&vm_lBN%yP1l>4S8k>}L0#PIAfXxkOx}D%F{b%6kFi9!EQr=4o7{(7ERIQiby&SzZ zl`bFW-Vt5Ms6i#zD9q>qEZd`;89m!l6vqCrbX_N8j)sJ9a9hWOlMCz$ewZYbM zaKQ_JM*r_UJO2OS-v0Lb{9nam=>IR-WH0N;r?7qu<-h34vdumiTq^AAs*yCA!VF>@ zfPfxRiTF)dDVgM^83+S#W7&cjS{12k85VgIh@1D0&&bcv!?9IRPqlqU5WHet5=t{b zx;_A1lhI&?5mufviI^|lSsRlGLCSogd<}>-S_pmIvBPEQ}-kFib zxTD20gh>+7O4Tf~?U5*X6xE!0GsMw4Zt(h-N_{yc&&BU@qOfyEV4AO}s`|vvF;TqP znaox6_R2pRA~9|xI{R&?k}XZD$o$O!S24bc#`ji~th{O|>stI=xx;-IfmPbgvXTW( zDE=67USlV%y$XZy8cm*mK`>w%rJBo}Nh}EpYW8&@nl1mRv0^IM@Ru*_G_>rQe4Xru<9i z$cUVwBklzI0>bNnyOivu*VJ2psBNDlS_+C{?u zd$1Qc37p!?1@H7EAECHTv$NPUbQLPC1qSO1S*%}I;IoCia!6!Q0Xc9zd%ikgdy%f& z;N(DT1C;TBVMT*R?%Lp}o_LlYzob_E@RXo6?G(c8Fd7gul?Lc`MnO9?;7b3Hq2~nwGJj3CNPZYjFqsTGkih}?nRKq zFilyslmvr88V>1kW7^%Na0=750Wr%tY84Svo6-v9SW}bQ_yq7H+Y)CVNfEYbzp}1# zQ*5&nGsQ%kdM@3|es5@zwdlr!A0`kJeDnl>D4!gOX!a78{M?K32{!>7!!arzD$DWD zz)({{id8r@Xd()t$vq&<3p*3y*TXL`h#V7VBrnJ=;X%gm?x%i1JAQ0*+45QT@80#pzgw zSuBuc#$99tADBVgD9qv%#vr^!Q|P@gXSrfoS~n3mi=b;}kILQzTONB)w&{~>;>~>~ zRuI@=PKG>x+M?ML_yH%(Lm&p_ek2HtLlTWZ2=b5+SS-m7X5L-d@;FqrL`l^jzJTUC z?hI7*lTSaiJm&-*smnJ*PjzeEb#x?-1__9dvCY9e|h(r{rBxw_b>0BbvEf+`t$SnZ=DS{ zzmMD*Aow4x+UDD{%bQT+h@pL{d?zc8|KX%EDBV-!ozCRH1swv(=f@vc}C!n z321QG1KXYFVDo1x<%${3g$+3S&;z&ia@AoBl8T zSN-2)Tfb1qR;i?ane=ax{x3=YRnq@0QDqZa*hD$W!0iLwLZZyp&K@mv_Ay5p%w!L? zclY2y$Gm@3%gDaQv`CYCQx$~-4pE_}T9(I7prsA}12W5-FvSRjaZKfHO8Wx9O@RiK z6S)sF!kI*F55tU5ZQG~vN>byLBocGz9kh$na!fU zeBv>UeZ;8B+z*TR3Fwf3P49hz!&q;Sj*1NIk^tJP$BYW>TK@XF>WzwAVJYkojE$++ zvyzrjTzumtVeOc!<{mu?_*4u2y+Pb?-_0}UpSuNVh`t9t14VsjBQJHsvtlCCxR)0W z_ib#^x=`OG>G5pRs)=5BroOhS*ZVZ-|Lp_~^V|Y7=>HE7_U!m?+k0F4YyJN!9z*|M zvT4_1+JQ`*vJ~})wU~a0YXPTEOT8R0U5r!$k$_t;1OV|IOomS68%lRW=S&M)&h>Ux z5zS@cHy9TFlJtuz#)9tq%kg|EOr7lus_s_u$6o*P(rO_&3s zsvx^Jmak){TKS1xVZ$gwFg}0nn{cqJJ`+ z)oBCZ?YpWAp327J0_7Y6{nZ-Bvf3<2vL;+CU9I)0+?Xq;+O;&{yQklJ@0NYdJD$+( zr8d0BB~%*W!vZImz)S^&(%w`DhSCa|f;TM9+#B=k^P<&B_L~hfZB%_gL~3oTqnh=p zy_9`AZjp9h0}^x`iGXGBkpsXbJ6ruIO>b?)1*weTG>M>ViMugH>4aM)Zq9bf@`|s} zBqO~9%NQ|gJ6WUR8z%=>-@w;o)9{U)U)d-+skDse0}ul7k|j6cff-nEh%pQ^5#hqT z#2dLHaY`xJ7=gynALt#i!*(-HYD}E zlo(u0VNoQpFl5#AL7vu~@WNITCNE0qp~2 z!HNld4k|?kMpoHPq!odo0^uq^ZIHLfZHwV4yArqxvPCeQb84Hb@qN72x;)?OszTd4 zNPS>xdTezi@C%>IAT^fz;?%zSS^^=Vpsm}u$D$3R z)(l^O3Ub9LX-hpN&(G&_up&|>gVkD5Y4)>Y?MW8ZMj_Zs(LLBqr5BFzzQfI(ED5P( zs_(;$FpI+5B#S}FWB2{XF{{Nal3t(Py#ML^^^5n{XIHe?L77Bv|`6kgb`iB*n|X#|wqPs5PWVz^<@)S~<<_0C&M&jp`T63H*JoF=)p>Dp`u^hg zv#YD~7Zp2v>07*lqh?iuxIm8Noe((oal>ZY&8#s_nQD*0Tl${T_+;82ztx)B84QJX z7N4y5Ub~!4JNR>NE@MvG0A^fZ+Ya*f>bux;)EI37(X(#F5awqeCSl4CwKrMvK~CDd zb2oDzCt31=%I&@$YK(EsJo*_fO_p0qO23(&Ci@Qpi*b_88~K$#P4Qp1xA$%T&;6~n z|K~~`GyiWn*~_^))ByevmxV@umVG^_kA5k2jUmS25MG946o4QoU&!RDrgMa&ir1m) zG>H}LY0zyRp*-4k5GFpGW{jwY)5~nKOeCwfn)BC3$9~vOQ8QcY&q)dc5d16xd)%Ox zXoxSev!XzS@7m9bS5=uKb{3XEr zO0A#AdYaCE?W%h25D*Rap9i}KZvOwRb^Ofij{z1=(&_>!y!k5kb4YiV@#q<-Z+x62YxjqET0zPp@S5A9+R;Spy)Jd_|3{Am#7c@v`T9BK|0uGXoAm|4^jOul5 z6)0(lP`bh*-Eo011OrsuheZr<8sZUn+iyg5BQHnPJ^^2&jEaE2B1~?OlF$MW{FKB= z0a;|!Fm*%hh59~m=WWvz6>BEg#;w72tA4ynShHWxn^@G~+;U;q<|GoFG+>#ppR%@b z=LEyd?VU0naT<0zU}e=)RWg-YPpwC*M7i-;G1-PyO1?Hj&~W98Lr_>5@rRvM&rf+R zK+Yo5dQiTt2mPrkN6H**uW^3r7y8zr$l|qH@BGC}ZnNjUZOueCFyeK_wK9XGCySGQ zq*-CY8Z5^tmu4O!gGriZVrXiZ7ADlta=0gJ1a2gD@0cG0x#OPV?o-Nzs5YIl?#ie+ z>neEZ)`Ov$(aU%h!VVm(@NvumiEfz?s~JfKe5L2~y~vj+4R2=S9XzO&yIs$+>J(FW zm8Am1imT4HbRlG{W}2s|M=|be1}1cI@#=P6l__)_-a&w2h9S$`Nrfg) zaxBk|umCbau3pwN7MJL%-oaXQS47m z|H+D4US;p;BiYudeg=2&!7*6dkh4~De%zL)5ndH8Ro8pw44Tb0-SD-Wv7R0{o==)% zB~m$nrD2?bSc}WP(xA;4$+>!@X$;)HRiodCr6;$jyVz8BP@##~Uc$I(_g1W~PHP>c zIXwMmfO(&BiAym5%(9fblHEc^)#%~QGHvHDN(M<(mo0Q-07*20@pZ)lw>sd(+3Siq zlctre3@;|$MEic6D^RYO1n?OQk^&Qtw$>M1tvo6GUV!Rz1#+#As5WOwG5`s|;vlzG z-Yw5;?=q{v%s#{Dbjd;Gw1bl7upw2hju_)Ky*Bq&k~%YqZRN;$RJ=U)ASvN z<*t4%Jc8L!>i3DJsHP^@uq7~MDQ$!V%rFC-NHHiK2Kb_P^q5pN+K!2b^K+ib(_=iB%DZm^|7d!$e3{L-PpBm`Du7qceJ3)mDVx3&J zo6?4ZG=Iah5cA&~?g)z0hvG<&99oQD)Upcelc4#Tm;Q?k#jTEj2Kv9db+}{E|Gk~V zb^OpQ~c2}ZXkrCgoDD#=p<%aQG%V`ml(avygj_Gn8#+?Du$#8Tgwst3?_NbBL-I?L`eQC3}aYefmiv$ ziS(Lr8+jFp$uhN4CY&-Wi+c;xxbaxsaux+9?`;2lH8=q1R&J$n8+{loHO6}WH68~_ zjXC%XK1>jSHSuYEc4J@r4Q8m%z;sX&P*w-74EE#@;Yuq4`Gmca&Z~WKj(>;2CZi z;8%`io6%Vx!{5&1J^y2vQ+7Cu5{Ucnqcn-`MreZJdG-%(6gnFt(4_xAII!ivoxT0t z_4&VwM}$|s(Iq=Dgc&SYZlRD;otXKOV0@1XZj%TzJSiXs2?4@f8-p+^5XNAVvt0Up z7$-dHt&+wXgeiT^^~xpJlTj>`{wWy%bwrlMOveRwkiEe&c?ENa>0(IAZs-nv@$F@Z zx$~h5Sk=(YHZKd9(?gI6k|wBM5oU6aI=80Xr_%uRu3!p7412;>R5f5aP@;mk0FM5= zy|WuA;ClHa8|r08gycv4{?lncFQqBF(xgbeb&j4+|IgDYbItIKL;3R!h6VR06a!bb zQd^ITfVZKMl40W?@ol6dL;pUCM!XN)Nks2~9Dfnl0HZNfM%xJJtrjrG&jCgt%ySGT zm__a`)FvSSuY52g%EJ`WU3L;b#Fd`z`IZ3i%hp$jU;EtG$_7liLXz=jm zuh|6v^Lczi2@ysZ;&x8a5HW*z#@|C@wHRGKepK(|uVSKx!c@xmqGskC6 z49BC*9m;e69UqRzn!8GAb>8XIg~%U#23yae#`r$cG-8w%OPW9m>W81Y zmJ>(EVyRQMQ9wLNNp+fKwJ)=LXpg%m5QYxZ3B1z0d}P%Hw|tfl7g{kJ-@}q=zuU8X zxSU1PP7?L9tX)Ss=UMxCBF87mI2=OhyM6>%rPDNl89Aq4o>j!E^hDkr5>9sn&(Y5C4ffyb>Pc?ZpOhfe^olmF{U_x1Go0Cd60 z%a>0Ih|#2ocwzXFE&sERqzKD?zz-9MiGUX6lOwRbHD-T|;TRPUM__;JRq_OYG#MvG zx&1A>;P%d|gwcc~*$}+=3DAX(d%YeH zj{Np5=w=|;Fp&+wyLaH<{*8_oDhNmH^yT^clQ%cN9y^8q`b3N^E&KBP_p@U*s{A!w zQ7H&E=zCEzMq5xxSl-T=J&EB%tGmf6UOT_Tn%o4v9b>jQ7-ihYe?{G5_I+8(8;CG8Be znA@1sPvbDjN^`hP+))bwuqX|)HBC-E5O3L#S;4p0HMx9BF+S^xmk?_hgN zyci^MMP$6`vx}eSBHT)5osD#hYHQ;CwTbtuldJQS7eB3pe2YnMCg2jOtBZ@93OX(| zF9ky6Qm5vRPPiFe6_}47@P{;v$4Lgd6J|Wy9R(Yo^g;a+fNrk6Gy3!;U^GyX#ee&^ zWq`yaBoq8s0W(Ho^Y1Kc%S%pTW|TVzU41o|8lXaEzc*t#g-RHy*Rl!`RU~P z%-ZcjS10~e*WWAO@V{QXIy>(36c3C~W0ff#nq;ROkyxvBAByIL@3L6as(XA zwI{hQbG;kCr`>pc@$zaVCn{YW&BrN2=k((0?Akm?nZ}*|=M)tX3-t#peD?a}rJ=KSJyMP;6#>10BsXp%%Sk%EGC^5WI`>-TT2&#qpdygI7@qHN!sii+d^ zYD391=u%1aWcg%G=s2neo+~yUAhxv?oFGP%A_d(pGdk~fCz#Vf&)9znj?535m>@rJ zk>cpjfBExnpLV=2Kd|-lCFnD0gqcBVL{;|k8l?rOS4sHDs!3RN(pt`=+t+Us%}f0W+U@C!em&$wbuLV5&RkD4Ncnk1A86c>MwaJ^PULF%u&99 znByu3ES!c(%1P)0^EChTiPik_Z<0d(JR zqh!oN!GLZotex2(Bhz46sVerLu#-{@vW00{)$Su2>ORub!v0rit><+9YWDxy-`TSL zzqSw8{@<&4nE%%|=KUqFN$Om`{6?(G?`w9KFA31=?`4535F%YKTzRwOgKXUTwDcw$ zwelu2?lbFM$#!?Q4gv*PD=+Y;S*-n@OgtxiZnwQr?oiz4dZl- zVt5=Un9ltpF!yi(f>A~lyHY4y?57+ z@}GeGi1MFq+*U9DF{2%?0O%ET1ms#Vp~B3`RV7NuI#8czX##8`#NIKt)f1~kGq-$@Dq#{bRmsHfH0UvYqQVA%07}a|^ zq?N))jjYlr=PW9Ah#6dh*kK*qD-t_&bKSMrG27FE|7UJg^K<{r@&69D9sYlBXC41< zCC|6W|8sZ8I_}>Wct&u{=UEIt>g+c!%l@kv!_O3paFP-bYz4OLFlWp_%SqGpM2{0@ z*;Ij-VsQ-`$)XmQRl8rl$c)PmXaY#_KnIwSMi7E5Njc+5r{z9LQ~3phw^@?Dv+^&O zV2?o%cxYv_Xwojwq2?o9FPJb7R$q)mOL$-aZP7vNk1HjpMWF$uN2#1Z4G9L(4^Bg@ zp6TcFx-6DogC_buFS~C*nk$N-3t^rBhAx!(m~uay`B-v)&*)yJu+(Ci9Tqnya{2nN z$_#VA=!Up}ZcIRz@ij(@e^X;Mr;2`QTrHo5#d%uuFj@^qtAz}BY<{){|A$dpEW-XZ z=6`VGKX31DZLRsgRXpD!|Hr*8YS=$d2&UP%HwwV!-x$!xiS}IjM%D8`fBws#{c)Zf zLN-r|)X<>1?kZ)EUG1smUenCsunNm!a7ti&oOJd^A>HcW)gjHr-#7r~VQ&l|VyI_l zNOUOQBoARY8;Puoa<-bdg{7bMY_t|X>J7THnv=ft=K7Z6|H3TJQIe7V`!J3Rh%v+q zg#T^K|F^e)XrBMuhlhuI>+^pV52GPxV!lBas0m*r_n%xpJq68^@=s=qs>=MwiQF-7B6pe@{qP|neHnnbW7M^6dh zolmD@w!G=2-t(furh#(<7g_oM=sBN4aDE9AtR;aeb6%m0uaz{pHI+_gwxP=Y=)Dlh zoI>!HBkAOFVx71cRN-#t%3^3pwrUm(9^n!iD!{IWmaan+c517!Zf`NqdVdCOxasDsIoWZAt6do z$}KAa*}!vt_Nc$<5h8ObS}vVs{#Xrv5*9;9=n~a#aP$Itf?4G|dd5T2&~94n|eYT#7n) zw*kIBZ4})8i4)eJlHQxgU$i0K%NC8i{gq=A=Bfj{r1nA`@7lP01}VC?p|*@D{o}F# zwdX(M&HC@WFUAB0@bb;tNK+(x7#Kv+^T#K&M!|j znvi)q&dXh)385HlX0T#x>``q$t@@Puv3ke4@z%lT9k?IC%otV?A^0sX*040;hlbAB z(t~#`SB#{|49>H@s|Lf@X}iNtmvy$WZjLRyMXE@L-4%n;i&;QQeo(q>^NhXLfV~4r z=9}?q#@mbDFeLCkd{`Vc0cdu#{*{^Q@8I$B|15s@!(*PpC+cCs|N#1i!z4_@Cjft0nGzKC=b&@fM4>C%!AxM)u$o4+ZG4M$YkZ9^iy#Orz zCvU@e4Ya8_0>Os*hVOb6VC7#{4EDKR8h z^5w}FvHiu)x`Jd<@J(cmZHU2tVo4SKTlF&_h?RL{ll`SW?au#2w13U^9|s5fPW*@U z`M;WHCFlPFO1~!nq~R@0F+a)q@5-|rfH2Dt;esNsp}nZ7_ISL)g6cwB;&zTgF2}K? zI)F9+;Xoe03j{T)kT63M&SDHQ4)efizfJ*EiwJLCDH`cYNKh6Q54!GWTA^%YE!P~Z z;#%~MAFD#+RdNN|;UB1jN}ehmpQ2-P2t8v@8?f*8W*7o(E|`|f1h;yz*iZknVF5Aj zzZciK^9p|AX_Ei8w|8v&kFCSC|MyCsdRoTULGLzBJqe%+!43Yv95RG7TN9!>woM}X*(!5BS~o~s9584tgS^$tC{jZ zqY5-VI{e`O9W=ILy9<}CiZ1(As?`c_wFi};ELNCoGvLv8db)v&Pi&QNsFb68qQ4g@ zXZ=(?_2<8N!89&P{ zL|EsLZM)x+rfgWuuV=S!cqX8Fu5-)w+CSaO@LM!vnYG(pqF*ce<0EjsPWkK?s@~3K z=`ah4^KC`PWDgY}boNe3>gx8Q#ontEPtt62xYd|>jK<2kHEO{b=n6ak*t823nOuWj zB&)tzq61E#=G*Jt?F%B zzoX`2v0Xx~k?Q{FZY?VMGk3Bv(4)jt&T;8+A^dPGPDyi$Fur>QXp2qt2;@eW1kcJY zn>RI#xVsBM*UUAgW87~Ge1a0SPAv{=Vg6tJsh9s3yZ4n(z5KtuzrE|k|5^M0ujmm9 zVt$w`>GoI1{hnLj@@$>y2Dq*L7XY@qi0m1E-|hm}gZ`3L7H#zbE$(A27mQhjyJ{zp zahNaS15&Au76lz|)haDT3Nw2|Hitw9v~Bi!zD_fy6MhUM9HuO?n zML!1{(}sR_ZP|@+M^i`0n6*tOlpNnA|NB>1iH(~?DRH-0)g6n(a&Q2gb8v8$kD_^Z zGn>8ncCZIfvSLWd5}+zC)8MR65Jj`#<5?HLbjX-%>13F}VnQk$NyS%(sJ4Ze)o#Dr z-0tf5WyUs|9DoVn7Jd2QA>+3ze5u&PmFfS6s-VrQ$|l6-(aJg-sFFKwF}d(cRMfpI zB~ZajDnrIR0ai=+1DcMSDQ99+K$ebHV_KF7P15@ zE2-7Cz_^}%Yd08FA%81l2)&LWX~MM!r9O1p4Y~-GyNH3ww~$7eC`qDU1_O_3xcgkN zdC)17ha|D?I;foW+k(pxfCY#VBn6vmZqbhuV3`eRaaV@Jp?#kqB5e%qN*>fPm&1x{ zg7#dHBgpEGHQVTBXhNc5s`Lv9ZMKucV>?ky5W&JZFvNaYqp;+V_Jb>8&U#3btWhPi z6}G6>`Y@n+Zp}gpOHQk2AzW7Tqecm7ell8*G?Wzi19N`$VXvD0nbKMnscS8&wM4WJ z+9iaxss-L&a9aV~ZA7>_!0W}h9sq7H(6ziZ+zL@%yvw*RL&*!dqaU|74QLT6WxxVm z5;9}=P+>eH10QS35CT3ov$wPuX5meMkMj9>##s>jTHPQM~W!nG5P{>}1 z+p&HXv*OO}H%-C0#X9ex9rd)aqdC%DCb+;b#{W`zqjbkPMl<-x&YttcLb?uh0?Etr z7PtKDjejQqVrx^{fyj3|y&LoZ^M=^cVvBz5@*PY-8cce)P$!3nJvJa;YArx?##AEt zIZOHEh>zz6hH1YXe{$_>PG#7*3C1fvJd zzCpI^*iX}QpSGl$CBAoZx639&n9%JmL9UeTOme36=|f>R0g#zt{xQQjGKF?)^v^iL zAMBYoQ~>4FZgYu80qToRQ{v@Z?^t#qaYRYB2T7Hb?0esAZJsty?foxK3N#jBcXmHf zZubTzaEv-yf;ahp9UR*E-w%#YH}QYh^0Z?1+Bz6&tDyhj7h2=?F<4)VIuQ14kG@Ln z0Jp46qj*#?T6rOi+W9b-az`1jK^uml^sx^1L~^*|0JEF431G}Q?Lg6ul-Xe{>Q=o(I)=K zTAt2iTdsosnZIngmW-=HJMOVZeo}w=1pq-)<$+aI3+{0=M($;jpQZYtl5OZ-V^!L` zdmL$M4t0L4I#{bg@h(6hl@x=LKisCw_}3~b(clbBgW!2(tp){LCvi%3(KRAWi8bk_ zUxLftlvj$|$}7l7wfq%?aEjs(65CrXLL@X>q;GP}6nlDR0om>avo?I871}Y)h|oEnwG@T=+9-yK~IDt6~3zQR<$y#J*7x@@y+ot=V z-s^LaqcQsY9%V5M(Rmz$;2;0^{eK5$slc*_FC@VBQeq!81n7+zEr>+-P6PD4QE-x@ zky(`_eg- zcqsiN@5QoeiqVv*c+olBWv?rrP=m)7%kA87IAUQinh39%XDGOmf0fjt!0h6%MKU| z=&b`v?q$o2^!r=ph83#jI8SF;E77C2bJmQEQCZP*MOf^T=psCxINPv0EWDinY!3~O zrTR53jjZ+1q%g~dce7iRC#XPVh|^u1kOC$ldj6C=%hG5V;}HrU!WaRZfb9(BQ<$Kn z7?iu$6bEW1B1@wR^Xw8fEm8~Zoh^OZ@l!Hr07qUE24GlmJ-7tIvozWvD$qg+u1(l= z$#3~tE_u9M^@VOz=a52 z*88?YRx7Py=!|#V$#}eTJ;jl`=Uh}Yy_1$T-l5*vgA#)svRmI34tRKn9)K9L=&ZMK z*IwQAssr_&hdQf3yC0mNv?hFBEhIMs8+Nz<@Y1&ea=1X#8p>{vJN=ME>oJmKQ+w!SlE4+J?$$~&GDMvr;09%=mR-(nJVYR4(+t`>^ zxTZ-jt{U6+)~Y!e@BRed$*{EoZ`&Ncfiq?%*2QTEW5+IVt1Y5@sBf(6hg&F-CD^RC z4kLeILu%Z8SR2-!lE(dOS8!IEwJut&fL7zB1JMUMwP&iBAmCjNm6NARx0$uBD~(~J z$RBw6Ywk~>&{4kEE?l@7`aQZOD4gYvarv}@hLjjPk9cG-2Ylb6Fy_h~v4xSTfs8Os zLRgq@tDEpouLO2RP;N|S<#bJ#0gz{(M?|wMW|kquV_>g$+N3v()AVkZ zH8QLW=A@Ye(&?+3HcE<<_yO<^OQU6&BbC0~yDsVg-4?A$W;n#@?tCA{*#zzfASg@o zc&7IK0yhjV;h^Uc@(ko?2NHtEJf+PX=9q4s3KMP*VD76SYuQ!YxpkknsqNLt?fwL= z=qxb|@1O|GvO0u{qZ>cBxo|k3svG2~dHdrp$?k-F#rX%b&hAg(g5?GS5RfUm6XI)& z5qjoiQpg-5_Xym>r0|3TcbBN?FynqVBZ+ZG1MNbq97uPcqfweqVNo=1895C&;@GMs zdT({i27zxeLr`KF6EMbel<YDDF#30(8>O?vBSKr)0`MwfStL8YwAEm}Dp`s=-oO2|p1_w7aHpx#j~L(t zOlNU{vlx{qBSY}=GbQ)9h#vr94)G7*qxyamlz`f*TkpI$__OS2YUe+zSS-zI;wKjJ z*!21k$kq)@v38H+7{HjMAi^Yz;RDZND|rad+Dm3xmgWVDz&09#D1X?=XUV`9Belbf z(1x{HVa6eH+(W&B$O3nZ0MBn2@#GD|%1LRVITt8+#fXST#2u#SB{L@3^A<4^Cj5Wp zC1IFHfi>slCTKQ&@b_kk0qq2>7NVA~vq9BsuZppa_@$HNR^pep|L!cL`BF~_JwoGQ z-u33`tYFssN*L6yQT>u>>uKx{J`KGFeD$+fwE)vxJ8-9Yh(5f&E`wTVr>$Diysxnp zG4Yy=tmIbA)p2#c5?fH2sGr*O!%CYQ5l_7(FGD;nc8Htc0jJ{yQPat@2@}(5h0B7N z&|2({iK&-}b;3lgs-OuScIBRMVmI3zF%DqgGa=pPS?lAy|C8t3-A^!%&r4>pU=ZL2 z|IfYSeLMgA-svX)&w3u=>0inN>~KvbbQnccc1!_`V-Y`>EE9b~DNoEb6@V=uLr>I7 z3YGOGZK6QU@*E}faLKRMDd7uYLdOCqi1{-+r(OLGoa&S7@{MkX;Lkt>oA>`~mU4G> z@xS->4^EEk_}?c-oBh9*hiw}^#p~Jnysw3Jy{t<2+62YZA(`y5$lqt6wtGD}1^ZiU zUfRY^j^>!)G+}Kh8{zljE%*xln56}x#a$z0mS?_w-&{RA^tUAqnoT&Et+KcL9OWh0 z+%f1p%YNf;>%r!}-_g$PgV~vk?8hrDh}4`n<{w5UYAdIE2sX(nR`xW|fApD$mA*_0 zl#gJD7Lf)U=>O5do*n<=@Z?|<|6?tW2srjq%rj6E-5?ZZX>^^Tuotf2EV8RKGDIy; z_6XYlL}W2y3609114f2~g&F2qEi02oXqhHxS^i6EM{zPP@9RXZERDLbt;VtSZAOP_ zCznZtKD*`?x}hsA@k|u==F$scj9%K%Yl;DJ<*bGGKaXRILxKtbxz3&N09SrS? zmfq4BhItQQeBuK!!Fm}JWW$!`3bZ7mlgNLHT&MNmvb=@jlHAVUP=*=SofG9!w2M3H z**=Duh`5E!j_5X>Bd+ifW0dj3+6_@3g_}ihIglIlY`iwRt+DQxr54Uwq4=}2Jjq3x zjPQ8Ib!0~0+}ELN6C9i!pS^(smu*GY5a1V7XxP4e03?fXQAnDCU&-p*`16jCns%r> zwX-+y7zOZV&YtsTUNe)coj?b}f#963bR6EX{$fZ9W)=ccZVkc^T-6Vs*VnX;HjifW z+~7ov4-tA`$va+8~J}7kCXphSuK}Dql38X(Ua;|Y0YPW93>ITy&^v}w6CUF zz4mRext{9qwA%kms(>5!|G~a}|8sb-@&8)OQ?>tNt`hFN^>rO>FS|aLT0nEd^Vgfb zzU#U-vfpzqLH=_O@nAuBoDU&?9#I6@T`v%rXt|eSus`^W7&k z=X^mlTzg-u7an+P=u2E~X)C_V&)-~^eEVl5&bVQUY;Bd>cY@IC13}X^QYS?GpoNLcrzn1 z=L?0C4uRnWCV+XxB(o{Xamd5qg^+N4E(>=z1eg5UUmCgo`_8`)nKnemu!jYhrlbHT zhh;4?4Ahc#9VRLa!~E+Ee`XhQ7ee3cGZNF%=HSme)h-&+ejF3wKEkvqGs1F~fQw76 znvZzKnS7Q2oPg_#^Vcr{Nx?m0Xdrhur;Xh zPEdG9X4BmaHq5OKMzk``_Geu4gFuoQ*Zy-GwEN{_EW3cLV3{5QA~y` z*E8e6R5Mu^?#m$^7E@-+Fc^fmwi{r|u;U?^=xczje@--?&QdwUK7 z`MoAV%$5o*s{!!>WpVm2MM)8W;JSbX8qMNsM1Q@2XqqP1T9$(f*vgQ#6~L(i&FO1I zB}W?&T*-L_JK%%7fo5l0oB#-T7#+4Ml^-*~ z<6^j7id&}>jpPfwP=+G@)IREW=Cp+VyMxl3Ae6jT{aAKz?CZJNk!|A1b;kyLhUJ=y zUp=(6XfhDcogJ)N*IX(_ai@bS=Wgo`eEY_QbSE0Ma!D{Px3uw^mRs6~t-DH#t=39F zpMu?;q7`E5+**r^qf1`^F3$9?eIjndJO6x71OJy91eQ7kHlF|X4jld8-bVkomdAVk zlh;df_WKb8%(c{xXnE zMF3&AEVW7ZX?_={u#=mIJ+`jLRGI2)sQq*bDPwc(r=-i0A!+ru%wk`@Xvv3!FQQ&t z@FAy`I#%`M|ELhs>;~yi-Lg5w_4qW<|1vMd5@*0B`hR@v(Et67{m*(H9>+|~H~39W zcP|vbeU`^EgPORf=4z+1z}XWZ4y9*|gp1RSbmfybE5j#1H(lmsbs^tZfx^m5>W+R| zkuHbEg)+I+8dO=)>@`KDK*F{sYl%~;*&L^gGsJ6@frRMP;WUBygC0w0ep6Z%sF*_4 z{rdHT_K=J`K=tF&kMn3x*`Q!*T?E!rO~j3?B6`7zVE73Z)TWac>p3zg}918&3@fHW() zdU@$%B~7pl0JAiDmvO_Nx`A3ZL?x82Q+dl4YaAX`5)7ul%hKrINxQM>j?Mg5bKyaC zY^vt=u59*u`9)UKe_=ek^zBb0{Xf~;x9@*WP7n7t^nV?XLH{r0lrKx{)!KQqlwBJ^ z-((z5;TXNU{U@X1c{*jbOxrao6txjq&1;q4wR4_oLrC2!P(H;8Kkan}MXS6RAm6?{ z*#Sy{WP3XBYY#SF_FYSx&C;Dp91e4or34pg{-C`q;8<(mY8J;=X^cZ2?y4-7sSmt# zQ9L-n6vcy<>V`92R+tnKPMqTGt-pf0bZUiP`VuD5BDfWa-Uqx}(a@RVWkc{4Bshss zQh+1ZIln8QFdw(jLzq>qfGo|69+m)WW@SLm(|9&T>^!?Xs9IxPA#R1xJiSHBU{nL-U?FVf zh@`VTTnY$*E7ephL~+uJ!dZ@s2jOyb)&X@^)qZfO!Kf$rVJ(l+9FQW-aWV!dng2Th zBn6nepWRYv1%-DgV#Q=y2%QJ}!t;XwCG!`v3^H+H~U4HsRL+vLICG)ay z8&FyF@t4WGuemb3?b@O0J9hmVlipUTy{=|S^~&1B;n_U@tKIqkI)nF1sR0_!|A&W; z{&(--^l)?jU&q7G_;RY3GW0Nx&0^6!{`0>YNY843c7h;_!1$YcjoO7%>^Q+cRS$3B z6g|^^b2Y8)4&c;8sgdM;uF|Jb)J$ijc!5xMk!BChD4fWkGD~GU)0)vN zjxF;V$6%GYVmOP-F%RWEKLK zP;1L}t~k2|M$f$~P4?fz8Df6>DJ{`S)#{~aIg+5Vr$$48s{ zpS3*3{m+ZH*FdN_VG;ozn|4`|Fsg{){urddC|QBaX~r>p_8bHk@r)EGe}!{Wn4z^e z>d&5+Dxd|g`MrUvw0rm{A!5o6nN9#%dcIV;(9||9mXOi37+X!#t?&7rC|QzqEj=oK zn+p%;<>!pYooD@PBPc=IW*$J|r^M>Ooca-%q@;MuV=eTY|KuB=1ok0G;&UwITe=Tvn@u^A_1Nq?A~w6) z-NUEkh7$oD(PI1`=~!-tfzwT$8=a{lSB>(^<4n6&EH{c6%}_&$dMB`ekThL{rrF|w!5SdkUig%Y{cSOxK;vTxeEGU#A1aFu}rht|<> zPNjzO6Z?7Q8HC3j)*eplO}IHLmQVHhkBb(FN_BC|^sY1o(9?i8{tvNzG1Yw9$Jq@(Yk)KXA2kSXhQXlzfFygR zl@d>Sz~;_rO_u3R+VkK3(V>(7>u_&F|JU-k^k3dC_rL?HuZ|xN zA5ddh1uqbn@ayLVVpJYFOF?Sn2Xc+9M~~ME;QD$E%z?J?*JKX$^#AJe#rKl`H~PP| zJTCpex_r?G?Z3Kw@u=xOgMSq?pW^qs(EO{*7asCS!D*!Tw9wk*|5`Y!>okyfS>mrp z;%lFJ`p?oJt~&nD{)tQfPdE90*7LaZpQpauZ~(seSHlB1j$JOmlgie*;{07zcSt0E z{Tvke47DNGE8#K>h=F}i)25Pjk5Vwd1a$@DW#2$H&XZy@>J7*6+7>mC7xYf{Qm<_{Qte9P5h6wJO=&0q*D&) zoC7}T;58=2vdq9*NRO5$IOFJ>HQ?#EY~GvMO&CKZJZy(3&%$+B^0fu4$vLuF9LroX z+g6x|y69rH@g@cwEH_Ms1XITTFeGE{)L6iLj0zsu^gNDP3Lh#XTfq$U#_TG#SB{NL zGfSHFvBb!Z9=&4sC-9OU&#(z$no|HFpBxKBB+8dQjxi2V;D16!%5_1l7TX^G^#>eeO!&6hUK;Et38B?jc2uO#<2Co{rvI8 zoErY0;Nqf}7+?+j|8)Pv=KuTqoBXfqdDP8Ak3qnEE9dcYeeYm;XZ?CF-0hs93k2kW z6lfYSZsUzrr9S~}r+rycz&LJOe3p%K7$IKVh$_ZXhU>oa5@rET*^_F-tUpEh7)9pz zeFtF+OD=tG6WGk@%;OUDsA8F!ySFx=nTfy-LCri)_crV-idBW@J%h2#E}*4j(#+y% z{Tn-mnlGf7>R4t?WRWv`;50--DfbMk=T1>sEe=YF57JIq@ zW)ZI3sj&MK_#mVPfY|0BfEVUvIp2){nxll#9zl0nKq_LSQ-J3vL8SCCQ&gEC0i1()hDb83$Dm<4)`U1O!B5g2RuQp&*ezYVU7PiIW>GcFq z8(wWaP6*|R(CS)`GuZkTPQSyH*=R4xB^PXrW^7TUa;Qoya>ClIF0SH|Aac8kJZHg+CMrz zaPohg9B%Ia*YX(j|0<1uoO2*1eOWfpoRRBsZ~|u>Ju?GIDJ%kRbxT1p$N*Qb(uwmc zRXz1@DkI-^XF6L1g>s>s@q5@({n&CS{je9Sb(_N|C^?XCP(DVq!}}Z;$S6?5fwsok ztl?&WE)|vXZa9JDm#beF&(tdWjnEv2i0NdsdzNFczXuNXz`>D`*OeDOk0O4JQJR=L z_QZ8xuTV}fDNqt3?PiC^1)ai-1?c5wFacX?FK`}!AWH9(dzeS(SC;|P4E~d?NFxgJ z7UL{2U#dPEc)?w>5(06ZqrK5CbZn7F1AJvyJB?H6fa+^R=((+dYF9fxg6zBC5!X9f zL&3nYSKoH;c02)5JTT#y6Oq7$OQ$ZiaMfM6RrKm3KJM&R z`%*MZ$}You1Md(ZvmAjWWkIw+P)u+#CIJg?&V+`F*!grrHL!vu1LzN|efq_6B5etQ z-xF)`-bDzTmc9EU0WH+K2#zjcP?ND``heE2lP_gVweHpf9nzu+nc_m%&vr|)Zc9w+ zf~LD#R@?v&fXNdmHf=bEFpksvs~pd9jK=6C31Q5$#Jfc^St{~;3}FUuaf}O$$Ph-6 z+Qr*U(sjz`2uAOc_~Ct;7O!xOxTbwjS$vk9lecL?ix0}S;{t3~6sC&-d<8fu24H_s zTa@2_m1TGOa_16smr9aW(m3maOA|>0GRv|UO;J+7m`i~H*bdVqghs)kTTTdWM@L|P z?{whtt8U{o$a#rQ`Bw|GA@42>^Qv%peDWWrcrMvngi!YKj~R>`+o6o`*98C3P;gL} z55zk2eRQic6O;*@BakNX1DGZFj~U`&FG-y(N;{Z*7|+tYc+ZGwOIkNUF_i@zN;gKu zm27MA;}cM}%CNks2KO*22-6ARBm$5no(KQWbFja6a0J2$1D_syXGuxjKG8y-*qy%R zLdr#23F|OU@4@YSQx~=qEczspz0;UsLkf36Sv-!~wXP+u?AAo=@-$3(QmfzrrmzSn^{JK` zhR`YnlTC7cV_7&QQ$2t-)&2JEi73Uc4*a{HQ`g}X-l5B+c$dFT(~3DSo6|ex8HyS( zXQ}4uIp4Q$Pu#ao#9}Q_ahHJ&YvLG-`xZ~<;N#5`Uln&af@;xb_@8HuVu@#1#`+w3 zY#f_*5Up|pZ~{IGFm8ehdS`aU<6U>_i`8lBOw3kY?jI|CkCo*IqxMBgtLks?FFD`Bz@b1gtBQnI7I)}AkJvaQ+5eS+vpO@=ZWYYB%{(}C)6u? zs_B1@*pZ7%c}p1pHpPE9JhbD#ot_+Q;y!dGSU``K>|3Mgo8)WB zz~!;Fk?Kc0!!QZD5PV}CCS_HrlDkuS-CIRz7V${A_Ozk<{Xyne7raGtcA2iJ4PHSU z&+?TdXEsLT(FXLApV{Mc`vPTg`an;%fo|Feg6jenXf%ttq2rFNyWFNLU!q3!>y1HC z_;{a|+=mgj$7Wn31Pg@U8b$f-OBB2xDqv6dHbs`Rn2Cb z-FJf=-0Js)_>jzTgyDK@aX~Q7X51@3;Qi80cE{N)7+3-o`a^-{7@5-Mbxyd&m1HC*k4fKaX$s;q6ffkKliv>>r){ z=l*E_=y2~ax;;Rjc!ttDKY;4~SDf&TKKSPgHalm}!Jb~% z3=VAq>vNQ|N*ENFPOt=I(NJ&_Hrtd?@3ks8n(E(;P+fl8(o+sNOrbn4TV3`NhuUhh z(M3+o>vIkKiZXn1p92_0`{uiyRRyQ68O(w)synpU4nZAIq*wUiLRa^-4l0J&#@=~c zn9c3CxyykCn5KjlzBb7QC#;YVJWhD{H^`9m@hQ0(f}dvv`1o{w1MX2?ma2-fsDo8^ z-6N2=k@J>+YUIBO%+XbzhKTFZD}KRV?=%sEh# zzO)GFTS<>s3iOYrcR|qC&H59^dcm+<^8BFICYAM9>7Z*^JfYuGBWl}T9rLOz|2=qF zHT^G8KE(-h{QV_|A-Y02W+9={Bs1hq@*(K3XFQT5Fj#$_L?*BRH2&7_$+Tpi;Gc2gX$1g4jtGnhocat<;M%gpOD zFd7}yb;rW_>91NSvGw9>VF@+#KaEii#WGkb19$`dKi=DO?*9(=H}rokk4gW_DPNk@ zmrXrh!mf{@Z!)em?q>R10U_7AGc~>1hn8f!geOa*YG8b%dr2silH1=AccKk8V}|@-rp{2|&Q&n%FVqZHsw@&9W^!a!!@0xXx{4E>C-Q+NK$(l{MITxU6g(M6h&B8NCB2f<*(R6SYUkLp z?Li%i#o>()iOV`u`1$${-JgN|Cx8Y1`!yl3z+{BsZH&&8ZT5Nca1S4t6u|NF-&E!a zN*9kIPIo6MDVQ9*ruqpQBhp;W0g-5oqVuiCJ%}_qYglOUy zunbwPY-y!^W?kS;1q{+fc(}t=)hDvxu39qt+M?Yn9*^Rmwqvfw%Rc`6)@v6X2id@CLO0fKBE%8DLZ*J7|k)T!8!U&mVi z@yl~&H3W;HHYe;uBK%B;`XP%ej+6L7NMSGx5g~8V2oWZcX?A`Rcg7*kUzvs9>?-Fl{K+#Qw zWPY0?cvm6!R&E3;<%(v#P}z!jJp!f;fMu-nv78fjETRW8dNeXddBbz@%!qVx{HQv( z37l=LWxK4tD`>oU7=Z0@0k*gGnmNj1970lx;`;+{mNJXZ!6+Ku!#rUY%#G`gtvy;? z%d_+Q`TMt*Z-3z$Hw|axh9X29E|`gyI8ha;ABO^cYS_Y?&}~ZH ztyay()S=~5ss9&jWA~GiJy(_g;rMXR_W#*C+TZwpuH`ZG{}*hk-@r`V1oU$ePP6WB<=BQ`ZU|qvO1&D9~JC3fGaqv@5r^D&x9w7 zA1*uC2fv(PM%c1;iEpsmApQ@LIEOYfEKd{NfYD>)YA^C74^P; ztCAqvsCe$JUW3F4jpPZ+2+B&&P0Z3-Yfeb1th{Nvtla7RrR^k+?a-z*pfJZfYK1$a z|7r|4rb_xK4J1ocxg=Dt((D%~ZP;adrG@u;%&n8`DrG@^ zJ|u3$2W<>~yKM1OE_i8UE|$O3yap{U&{Wx2vmd$@l}z?mao5M(hAM9HTJUt%9rGk{ z54OI$PT6Y)i^D=f8D4#`%v=HQ1JSdV_w?ft3pN$94#m1L^q$xFzxaL8!`Y z@k(bxMp;AXFuu5whw-_U=wY8OWD5%&N@Zn!B;}Z_K95>M@*PIiH{VfI%IOnGu5vWO zpFyx2lae1l6~QvSuZ`j%P(>SnNO^G z7l7auj*<3>{tQ5HorZTTC73>829O?S2Xj!C_pC`vcxJFg4jg(r9sOuUIx+*4g%2LG z5iZXwIklW}=U8B1KzyYjnf3IqKb9EVEdNO}juqzrIn-&TDU5g9~6^*j4jV9Tf_9+>dX{y=C z?oZ$v{|lX|R7g1*qtE+$4B@-^?%TIlza6~T-8X%w^gtt~!fSu$KW~`U>!?IOKq8bA(<6WU;lYqS`54YsdmqY?g$B94uhyH~p(c7NG@ zv-{s*2cYo~?Ef-&2JBLJ_X_WRz`MWT-8Xpmzp*NdY2m9F;sjhK1sbCq-~`-06jb)$ zW%dq^XrY&%vot|TAzvRJp_73vGgR}^l9SRgmO49S7lXhkjpOv5;z17B$5|CNII`+Q z6wO&cEVbYbnlkyrw`lCUjxsST)Yi z1W7R>)=7Lzv~^aYJ94!=j0K5WMz4#R)A5#WY@~E!M^-Uqc|mKD|0-*O7jB7 z3(dUVfHTONnXiNh|B)=V1pi1n_V0;h>Od3Ek`A((22MO{2aZ^!@ho9?ggyW)J4eTg z(Seb*CInXcr&{t~fr#f>BNW0}F}X%ONQcK%m3@DKNtn)2{!n4e>JCG1)c{rhV0dl0 zNUChO1jlK*{N!z%j=P-<$9m%eoWA6hEm_0XvW?7Yh+oEPC?h}d(>3$k;$IkvFKyR$ z6hN8P^H=c4EG-adybG4rg?}V9qodo@9#lNzHT>Lpg5nJ2!zsK&mr3z1f19QmU%f4m z!v24m6eu6TP>sQSTiW$`(d`eU>-NMV8Ww4;n|c~AwSJcANU#`DkpF5i1o1PR!0f!- zJAC=-o5?DtHbPml+#4n*OmnlPE&m>qI(8P)Ksj9WZdY%I>62Px*6n*VI#YHK7eDvk@L-Uje2(&kaLB7R^xj(8n2d<6XUsGm zBk#;B*oh(Ng2zf(Wi$O(ky}>e|Gj^@cf9ZTe;;i0e`|RR`md(CUoKD=`{%Lo0&Og- z=Lo_=W-)@s>vD>wpl;?48}H7IcjrRhow|A|j?;S-U5n*gDvHB+MhcXF$Y-SZd6q=% z?oxSs1|W#i`-I8^=U10O8SXEjToH%pJPgxWQhZ47P!bHQ@k>WB~RZ--6n0pC<7G(_)Lpm~J~mIde{Bj{6z`;DoHo zA3@hDaE}Qaz!A;{Fk;GKUyZP(9ktYzqJvO07dhcWbjDZOhk0s*YCy_SR4XsRbXOO$%3 z#FD7>wAcsC-d$QjfG_z4hp|VQJ?SXTOA0jvziFiifH{(;xp&5Glu2V9v*tFA)7^z0 z|1N7U2$cj^GM;OJ?do&6_ARQE5$ybAN zfeCq!iC3kJoi|=|%qr$8&4JEexT8>PX;eU9Y zW802YwQvJw?5O@xHr{&t4h8^_ZJZe}adKmh0A~0%3S@bE$7q>)TXQ?;?OF7FDMEjD8Ynp!d^y=v`R3(aW;1QDKNlIDg;F5dBTxW9W*q%pvcDOR`U zZ*qdP`LVs=n6OO`u|x3ltNvnXjfWQE@>p19_ULzEUcCUvo7{$k^CpxlOi2 z4jf7ya#JzhJ@Th7{HN&48_d#B6#IgIN^~p}b@C}`9r2T6<;M>E$&LXmF*-N#Y8On< zqlG9#fQoWv%s>nE6*^-rPGIX3ghv3fqX#ZR{_fC&Db!RD!Im~Ke~Og$ozEL9#8@BG>g#`C571M<<&1mwg~dL zQp_6t=itYan_m3U>zr&6H_gWsq{^RPmi=Hh%yt(Wioy`XwMbFkATiHC6 z0(CViNs;Do%pe#hr9fRHKG$SduR*)5f!C@ti4P~^ix^@n!jK$7LqwqV*YuK$6?_r0 zF1g4Q(m$1!L-oAjQOiEf^q*@TRv7>H_~7`&iT``FzoGx@cntb~&8E6v7Eo!@@YuLO zckSDvW`A`Gw*?e!9Pmxf7jMoNzT|5(L(<@<|7MikCe7y}-m+J;QSGsH0$oEME%eTl^2sUbKVW z698g(i(!7ip8x=pBrRC4qOA79TL2tE%HaV%K0~T78(Ty^s{p53U~*1HRts){a7K!B`kF1B zrG_hwi_9LM0lfo>1O15QTP57Q!yj^^QD&^3|Eh5>H*Dc@^j*j9$ZNA?f?!-s9?i@;2h13P-WYu0(?+*&~Pkl z+)UL2>KIJ31Zdd7`Cv;Nm3={|m>FD&zbQ`6=Mcy6mU;C};pblys9xxkC~P0@c)Prv z9lr^NM)I~yX`Y zd~CIgze!52HJlS@T4KAy0>lWC!my?6u(9=(NawpUvXEyin*+cKAHV#c<21*`!$k}U zSwip^Pt*PX-kz2J@nC=dkZ5%WDjn!^P?ri~42XR+h^zXd_H_!Kc zy!1c6h2iceCerJ!pNqzUYoPy!r~9`4XYX`x6aQx|k9GggrW=U)2Cpd%9;G>;3t}0K z5Up?dj{jH|0q=i4zfkr7yFY;|m=i>#>ob6213Y6#?Qnv^J3`qAt;TOn2s`{zNjZ5C z08K%&eSsG-eKS|Hea2oHch$;>BUu8c=$T!C9nze;Yomm5wkELIu&w@{*St(-xvGr* zhA5$jN+)88auhO4XE~n2+_jsRkoJ2+oz$G#)T`Z}z~u*@ElNi=RC_OFwR$r3meLp!u!-Nj|qT$6T1>4;$%VKi2ZN|@1q?3j@hOyeU5aaME)~8HS#~1F*d*a5uoY*@95O_|2jE6-1vX3 z?)sbw3b|(L>>hRBdcUnXLmo@uPPZRw=J=k~SKWywj*79)r zPxs7~P!{)N1J3rE&_DmC8IEkRebd5UGu~_g3$wjs!#i- zq8y)w@+t=;L7(4A`(f5t2ouVxC7ez7Fzy8VFxKrdf{8(liI{f_`k3U^~M1j=>NgqffN7dWbb4{|JU)b zg)iei^g{VXypZ+|Ki&L$MDs13d&<&&&mQ@`1w-8?2U?1*#EPNAoDF!_po(-3LlgDT+n zN#e9xwaVKhs8(;5HxmzwZ$ngXrs;yl0a7toBkpGb^9MVjgV&qf?6Gbz+rG#HEG~z~ zMadWSuxTKAQh1i}{ti6^t^7UyT*sQt)AFg{|BN8)eu7bixtIKTNn1P10uB8CL5oWl%pg>&nOFl+=z-cBhjhVYA0$`qpdHcp(vz}hnCWR8#bg9 zn4?Iz0xoOU$xpMwO%(8^ndh812TGT+4CP8Gi{^-aEAA0Wz;qTDIE%%M8pnReCA5Ux zv{F^C8^RZw;#7IEHVtCOae5155U?qWZ(V;;e}$naKZH>vO~kAj(9Y(UBY-{^C{JMg zA%~+84uzA76bVrQ(p>&}orW-e24KY3qK0Njv=!-5Ay_h_zt4cR@1E7SKG7vYK`|DW z#LRG(;5o_(8Wy8nmTO^$L$-rif+J_PDl9R*0%DxP=w}$iBt-e;Rm~^YURFx2k`ij3 z&dfo_tp5yH?b+UtQf$0Ui%FYYi#T)avemTz9VStXtRBHO!O1vAg9cM!tCq)Nv@tq> z*@VyB))q@0BwFax(jBn=+5`o#pm2?b{YoN=Skt(bzS*|pG}$Xh*>g7=a(kzTfNe>n zy3LTgGOH3#R5#Jb6xk^$x=#^lJ4Z4Wer9J*t;0-<>BX6M9$T3%motSkk8ynm8fOin z^y>>)+lx7PTSqrThWn61G{Sd%%Wws6wxtZ$lc=_&{3TJbp#0?HhF+Bs!xYL12`7jOdcmY9GE!wX`RBbweY{Wo`9DkZ)!Y9Z z9Uj>B|EGI<$D8y2Iv$I6T&3zbwH&u#D`$a2{>o1B9mu|by=U{Bts=~>^0Y|9G}c2L z6k#R^r=p*pU^(I*nt~>>MOm^E1KQyaW%;UW=S+a)^YRqzWJF~e7~Z|$aW<9rryLD! zl8eHk1m(iA5|AA{Pav}6g$3~UCF20wde0nY26 zU$Q9Afc5W6^6trr7IfuJKBnhFG-W@U4jFD`oD|~k3Lv#%w*j>*?g3b9OT@L+-dM_# z8qkeq*Z{1#@eD)FMVmp$!k!_hcEkYG@AlwpO)%j7%S7s(^!2Lk4r?XIFJ8@)efCp+ zu&SC#Nj!%ltpiS8+8utZxV=f4m?O;#k$8iSoWB!&i1)I`uV9vCNTm5JCz_YiCjP68 z+N;{sylb_J&s4c0t=xj>56>OvTQO0A*S(lswi$D2;;>R3q}{N|>MYE@>`o~x?c}g^ zN{T5?-fCotEwl=Kp;po}tnFAImfr4SI)QSCTp2LI)%$&vv+Ex>@O?6di)#JlkX+J8Z0Z#%GuThtY zIDK^P8M6NLC_q7_d33;l2t4|6W6`QWtE>}w&DEx*aL;6df!k7kXN1O;4Jk zs1%f?;Le)JY9#kM;PtG-vYi{xDZwwQ%ae{x+_)NN7F8;9j8TXY_>PF?&N3oQTeb9X z(>hf4ly;g_*-|%JXZ3Fa>RV#I1SXy>QziO8u~&q(X*^bwz9Gx4sLpI62af3h!1z+f z1BiJk*ROAl(o-(sUQ^S?&Uf*!kyD^K*~nLh-A)}-s%J@Z$R4iLFHfp=a+S(xr^b@J zNadBsoXzU6N!C!z;;JjyBC~=a(c~Ueq8~?)6!OWFH6o? zd%9KaBXGR@Zls1G3nvScobRpLYxUIXf5pF4sJ~z-uy#L%T!-@sXYDn@4fY=_*thBb zad>pN(f_XHvFtxWsiNzH6^5n0Z_RcfrV5zZgLF9*X@K{k1+K|gRpR^GwM(A8g`(tmU!xzc#&nPynsD$3_DT(0jfMa>#&=c2{vf zL9a5n@fZ?`hA6AtZt}b>%XYRXDyx>RwsZnZRKOZj zEKkRt(N!%u%p=*CzntLYrU~vAD_OS`s}|$s)%+-6|C|K&x^Y$-@5Qsq7RPDVHO5-- z8S}6g>=Y)z{8RWicIE%s>^8<^@-{8rBN#oLM^TOlsm~MCbpG3S^gkyDoA}@Bc`W{4 zHNCyuj8?S$*yMxiarAo-+!7tp4!pOgx;NBqn#Lw)sseLhoeH&1p0{eC#&}h4?6FY5 zzxLCW{u4w9PLuP|2q(B`cMNQx|A%`gHvK<3I^4v6UCU$9|7$+IK+bO;bl+MskB!_r z;IH~rXmx0kYbf6~DEmY?Tiu6IQZWCEw`qc!&V8yct+nn)KWjK0<#N4e1(5gnXZ6F+ ze`*NkIME;4Ck-v;*qUaB(?sW#!m15J(Wq%YBW9<-Q zZP9?w&|7_!UfbfQ$LG1y%*SboJ8pY>)lbo~L}|A!kFMg&K(576oWkOS9u0A#{tX;= z1l4?+bLUps!`=XFkG0?badNb`=hj|umGY@olW0wnT*ERP;m19&!vSy|V%4~PGNqT|6OM&B+C4Y?uh>M|NHxn{ny^n zCjakR9!vgHE}DQ&crVglhQh~d31&mz*9pIP$k17d?I%@dZARqRtXlaBiX2Z%g*lUF zYFuLaGWOy94)nX*%PUPWJp^Atf|Cd(1vqf^`7Qk^dO3~=6qWGofesKXw;Pu0d#Ot~ zf7ct~;1NF^`G2`FI|u+x`v22|L!18}Z1VrC=dt*I8Ev6o0iawrk5U5A!S721*s%P+ z5XqydeF53#X_r`~QQZlM~1O|73IiTgy{H|LOd$h6C{EG>@1E=;3wxy6Tlt zEId}fY$ob_7kzO}^vWzcp)s#|guogJg<0m-V;g?l-?`H<571Z0bvnyK^d2T-ZfRZht-|hlA#cye zz@=B9fBsPfgzqn=Eg+(FykXINMv&2_zBwmTTKV^8#KmFt9|3#X^G1~nE!w?bjCXMPH zyc?b-{=av6Z1MlSz0(caM@Ryj&BHe0g#&qC zu708r5A4qhh(C4bX{~2FJ&*p$bO3ie!|bApOX(k^N1*<)CW?qOPiWb8+cdInb3UJP zcKA3qaU*=l-Xj?Op5p?&OF|Uz-;}q%fyqOleYSto;#X-@hC9$5(+D+qT{<3= ztd28+dLPQC#Bfa0;JE=PDe{MA2THlnbVo`T2nL(&=n5HPq-w&Svrlpo8_}>6>3kmjh0&^rj(m(0Zn%1WXVJ}3+ zwN_HH9C}Y?A|b*05G}J$QosU-L;kfqrPHa)5iAgZV3y!NW(Z7R62<7582v6A*1zQ_ zMv$N#m}NWjG@eZn^V<-Y2mH<7Sw+@!shfC8{_QCVe4q&I`o1vK>L1u#XFpZm|FM1lPwD?g|G$=p-~Ye)xi9+9 zSIlFl{}dse>AxKMpPK&fu89FK6M3WW-QB12-KTSLxM^kygX)3?4;XMbk~Bis1stPm z6y~USk47AlL^?eB!RG}?1_iY0?&Cej@bInt{A2Q(2KvwcxQHPkom{?+r-A+-AD-Cv zzx(@pdmH+{jz_!yz2=h**ldH69xTZatR?hAT?e&^&z)`8bt3-A8KXw2mZ=uiMm z1lSQs6E-B1FVg2H0D_$WLLvF4wKGDtH9$5uijICjchE?C}|Z@jZMXddoHtHu}sK%&tlkHFFYV6WB(8bJ49= zdsc#l#h5M=X2F%xjz9e!+>(SCk8}J&p*~XW%=RRJk z6)+WvRwP}z%C@{cIp97A!9Rk31c9lK6nLghX{)WSNokPaH#BHifR0sP-Tk{3RH0q# zEZo9JHI5r&&8Vw+UxJYutg*>iY_MKK1ymZlR`=&!0aaRW#w6Y);3B=n5bXTF;6)C{ zX)?lO0%lo6B~o{v0WwKvG2P}kj=?SBTkRPbr8z*Kv7k;_MgU3ajt^l1ST-Y+gb3h5 zH+Gb(h*>be2T6C9&>A6Q}9jECYdLD|i1vhB)1w?*|~bHr7ZG zEC`#qswmfw*UE?A^Hfy+`SEODn0il(h!V`Zk-lb`L;5Ss~07H(8;vWq-V* z*AMZuKmYxsB zjFZT=U;Z89;#Hcz!a1Qr1er})F6PVW6h#=;qnqnZX{$IH(}r84+^uOrxG3J8h8MxT z21PBPgwm_arV0}#x^A^-ssVP0U$43ZHE zs5lZ59DrbwlHv*$lK=#S-BSf12wA$IDa-;8L}<=Z6bD(J{*#eqn}<}g1qzRVsxFhU zzE*VNPb+q$_o6QwhPO>L&g8H~+@BTSe>D@Ez_R$)Axks_TorAVvj zRqLsqnO0#_YitoF>S3T-i;G)0N3eiAdYKO`{*ptFH8Ypus|Ih?l?YI>ebA^!s)2@z z%!@)p>vn~PPso4cB+?h%Z%mxIPGCkRDc!`X_kw@AprU4n)n|`T>vpjfSTXD_t5Eb_ z17^3CXm5RP|9p*N6c%Z2Ut&j|A&Xid$#}gM*dsV!^Arw^P&C?fqlZ?cee?frn97Ymr*EHnMZ;$hG8ffqE}vB^TrIIQD~5OIp<#n4fM`*i7;usHGN`g3VyLHWi3kP?jCO$x zSV=W=OJS8bqU7Akn(K&?yjOEZO(g5402}pR>!*YKcm3w))yRJ*`$w+)xAFg4%VWxa zy*mQ@wdB7g+y?$U^56BFpR43Qxx7{`|ACbG32R`yDu3%Ur89KmJOQ+pH>0Lzq+ar`weJkj@%BUWI9-oZbfYrZ_jM`TI zGZog|gz(kXd)X=8mXl9?)kP79zs5Sf0Yvo{xgx{8Q#U z1l-2`nAG22ed;8ZAcuneA6!`TzF!Pweym;mOG+|NB~=4is?ZX25+|p+>X> zPLqyis8+QucBnQXaP1<^#``l!HQVierC_wh0|_+q8=uLw?6;jF=bY z;#oe8F&h+!zRFx3%SHnN?gkww{$j1Uz}LVXdeBcHAqobrLpsYM#;2%&5%c0`2Dy1@Sor68lq_37Oenga zflxX?XKBP=ikWgaC+WtzMfbBcW!*HXZ*~t9>DTyQ$VVQloQh=?yDc8R zmo0buv(;H;LJ0rBD+mJqm)Kqk8fR!$3XBdTJoluua0lv3d{GU-b1+U zLJ|ur{8qD!k7c)Yp) zS<7Rb|CrxHLD#GydeIfo!x^xKK3jyj{84`(EX$p-Gu$mCrp=Ey`N`O3FnItlE>O-d zx6&LCm|#v#eyG!Bi7H78D$kSJX;MZ68)`qTB2@>@FCvfSqfn{_<2ZJKni54$w z=P5nQw>w*mW^pVI6Dp>d27am8+AUG^}ekI2Xb#xh^&`sdOwutxJN zjDjqUv)^5jdkHqX5l%}FLgTzCrChxpeOEH;w&Gzn4{ec??{X`OEZbEDyu-;D;G{@Z z+D~a6mqgt3?U^Px%6&(v1wDtrWK8R;d$E+L%)FQ|m2{R8f^TD_;@zn+Ym3ufd~E%3 zq;wBU>zrb(`-F4~apH=#HQ)rsSGTdM*l(poPzJ=SS{c$k)mAiAgEjY|C?vS`wSm4U zXg6S#r&DfOS$c&MR1`QF6H5M2LS{KFouGRbViXe)vKAt6KS2qAdQEy-DoMI=p1p@HGRPxms6Vw4{qklD1ltkIb>yGG}%jY_~3&u8;T z=SOQ=Pm*nMlFc>FpY3Uu|LF;6rSkvb-hoH{KibIu>v%l!KeXll>kNfG$^R9{>Bn>L zQx2kwWL|mCV~TSN$ZTJHxyCe|W!ZsOQK@N2o@lDMvqlkn`6SPpqW|i*i@>8eIbf5I zxbYK%Nd&EyNdows@VNVIjB3aZO0*;g-@ZL5f2mwCLo1hzD-AWNyLyaxUV$678|>!U z2!^#lw~?bbmemn5u|wT*d6dga711gzVU%^v4Ef}`)-Ngb4jt**1f~VfJL`V69*jvC z4(dWPYuly7BVCLXEqo#vf>`k~bA;BJ-*&HNmfoY0*`3HtQQM=IpaN$2mpq+i{Js2T zC!^TNb$`*vEC0<39PfUDvm(t!I*0cK3D6LxEF(pgfl)eDL=RYTaig#^)FnU-^xx&4#?(+(3{04S{* z89ymfFiGQx%aUbFysnwQnl1ff?ysAn#N$->DkJHq1jm*q- zsEphw9G7UKtIccCzb0*l?$?z#&UwAO^)nDAm0(Woti--JigD6akV>xkeM@XbkfRCu49wfdzme zzk%SmW)~Bhb&6x{AV>qZ?`qhOi(U*rF_6#fC&a+dm=VqsI+JJMztY<$*0p&sLGg4* zCcBd~y$jAjmZKeGxlSajdK_wyXek6!sAI1oPppla6U4FbhMK(d-UK8u$N>O zhK$@jyG5fkM?35-Qv~BQdB%RxwSl51SsGo7TlyR^r(bT`eg@v6Im({^cJPOot^|Gr z{5KzW;1skyci?sff^~_xk(L4`KKVOg1!cU$QV;?tqKGzx(~I_3p*_#iw__y?p=v^2JN*)2nyCzkT^$yflvG0#%>cDedLwB8OJ@ zF`nYW05;5KXW(FOZ*Qu-oT6z;@p|wJR;W&I^*&-eM+qWEQ+$!5&nVQ}Pp4CuI71F$ zVZGTcrrGWU!MK<_lz2xl!fWV7tINQgoA2V0o9qQ%sg3qQ*bmHfDsUZ3_a6-)TmrX*^`b>;ifd&uhwgxs|FuW`}uQ zF0$y%FiWH1i10&y9gt&h38S0mbtUWJY=fqpLQe497Rt0no`YcLy}y-;zPTBJTA~KW zwgKRxr_*=CGSzngmBzk&(HGaZZ`PKe4`+nWx3)e50 zKXj;_`rzwV0sAY)UghPi0r8B`H>?d0puD<{Ko0sD__)RYx@oQgM+IeIADf0-(Nxf3 zs^2M+(J;~U0Md1$OM0~UG|$eSj+yGJiBG-= zIS?K^YE}{6@o<>c#@HFLzZovReLHgo(rS;`z_C86VG~y8Y*%JvrU@ zf3D>*?*CbCWZ~lTyIjrU7QLkgSYI@OVQ_SnqYUP#RIG}INlLexy2h6aj;Ua1li(Ij z;G6!sgfkj_z_;|K+yd}q2$>0dIggXYvSz~m~;3m6CLG;W%QO6!9b zB+405H{*wrrkM~p#0LbS5x`HusL#L$O6*2490N>vbTnoUffI0Xx%+E^3-AGvLQl5J zQj6qMP)uM^wuy-pi{b|`MhVKH=Bs6kF5Ki#ms>7m!V>ca+NG!}vxykqj#^l{hiagd zeVWc8;K-IRv$sBTxQ;x_GoL$s`uvtgmco$Nuz23e^0Y`pez*-LMUffZPg24bWw3v6 zI@}xX4fl=DS(@|DM@NU|2Xz->m5(kiU%clno*oSMPiUjN`zJ;zG7rsCr$#BiF{j*N z=8eR8^iRrvxdzr6zCOg~AlORM2z|nt8B~ss#I%cMuS&aUbBs>-zyBL~xvs;uWs6gZs-vG9eubh}li=n0lhhaP;1 zF+&u_Q67p?nXGnj&7 zLsH?(EY_lG*P4EM*l7Yq{^7Hor}bTX9&4=6?Q-q!KaA1Z?Ha^jgmY5-UC=}s#8XFs z3dKocmNaWfsf(Kox@_k;*xu%aG>Sr7rkt9d9atvE#t@rYi!T1uH`bBI@qh!u;$vE6 zJub)|bxAoUsr@u?Q;8j|H%e29d#R?iN-IYYv1WwQhrs06aIE9OrIQ> zM09-@Xq*d|BjeYw$RQfxJA096VKzLu&t+T+5r)~{qLO0x3fREv$Me@`o(N!UAHus;{zCxd4Ry$341b`f3%)L+=2OfV~9u##|)^9szmxuC-iO zOP7pH!ASou{c-fhyEOYBd)`((-tyH!5|&xAA1Bu?V^9C@+l zg>|do9`xJW!y@iLLn$>%b5?!G(;jjk7y6qHfeLA`K$nEfkSHc3oQv|SL)Uv4S+o3+ zq@@UQj{rN#7AZY=0U;(?f+Y*gR?F9f9B|F6x0F#tXYFMai*t+KDn$c17!Pz-jGne~ zN-3$xwq3De9yS6b|M1cm)`G_b$R71`x8#D`RpRGL9LAiW3VMi>YiHng6J2LN&5IUt zDhS9t_;=6Z9m4o82&~kj!pz$;C@^gXm1jcMsQHr=vs0hsucm>zy#^_(J z27hlh>S|pvyDryq!7{qxSyu7{UI!xk$7dr(ap-B-j|5-I?o7v=L4z_~+3l+VDy#j9 z0e%H6MABD4(!4m2vk9yc1XsIu7Fj)>WzzwNlAlo7ecR}mub8i(NUw_=C*y%B%bW9{ z>=+H^Btou7ICUn!CCy_jiyG>O$wxx!rl*ciG37BOJ zTsjUzxux?4XVGeVlNE5KUN+k2{2%U+c0C)hlrLuuWpk9pkV}VR7`DV+g^}mpx2;>O zl<_@_#~8eRW@{LGebEX)dmnkj!0R#r==WLLofy|L2c^C_5USxoDT#SWm}S4_all6` zepzq_zQL&4e@{sfh?Px$(=q{{2~|e4!d5){Ee5FVjmnEUy4ICpz>je2{^L9~_x}-w z<0K^o4&S8FG9kbk{QnP}_+JNm`v_I3UU{0!pw)e+{7$RVN}h01xIk0#A-!O+ zNtHvGb%?LHfigC^oyg5-*phr?7Ccrs@DI#7@L1`(XiWT`YcRs-4{x<}?V@W3_FzDE2C>E%!&+bmH-`|pAq1=T`_w%wn= zPAOVuROSp z{(sJ3!lDT-$pV__|LKVn|Lx##6aQl^PYe35mcjpJ?_HN8xs66a|L&*2wyE$?OZM>2 zjX9w&mLe&M{$@B_l9E1sT7?W&p}V1}E|dW@Ic-ZDevOSd=jHq)Cvd9*P^eqqIG09* z6IF6UaE?M@?(D%RU6)#veO24C%%WUK z-B`W{d|uw);_wh;@kOUyE^iNpV)VtA@*S9R6CQFzWo0aAj>rTt05#X#kv&nzMBs-o zk^H@YUm+(Pl4?bT1*$??*s#_sFx&yJlo>Vr-=uGNjoB*S|LpDWpX~Yk|M>WH!~fS& zn)$z224V@^lM5X2?lJ(TDG}}cfaO+1lGlX;s%#?jnS|P?L??Om>U5TN1`~(j6pu`7 z#_yybvHVxcn>2t+r-EsL#^iCSz~EXm<(L+u*9hL}^A=RHb4%vja)e(Pn~IlE416;> z-R-SJV@fJ9ZHz`AZmHq_+E?mV%foU$G0@2WkG=SR2mAY{oBN-&lu|5sD|?E0Aajl= z@A?cBNlzl}XK1l@0gE{SOGMR>^(L?BaZ5MSi)<~xsp_7(E`P4_Y%aK(gHatn1|5v$ zS`o7&oYWBNAoJ+89|@=yeKUyLx-;bzd^QbVSqUZED(h07>GlrW&ta;ZhKl0ffqY_7 zZ3?m=Z5aOtU)u2hG#jm0|1a5pPL4MGe=VgA{}&6OEB_a3CdB{656lj0DuD;szxa+? z@PE-;sJftgZ1FeqJV0dZCjZ6 zO;-YrPTu9Lw_HXnIn)ig?bDWeTndt=k8n*o;x8xhu_SRKL1h5x? z=eYFpON)*l$2ieJxt?&6$QbHR6mw~ES8pmIwWHcj2o?2V3ikbFx|92B!4zP|+-SJ0 zc%oTkhy*ctQrjRA3tBpH2|BEX^3ug7rjCTXUHQ>kg|wc>S8E|L+k*d35T`g=A^$(w zJ1X)2js1T;rH%ft7eGh8Zotm8qM^?GyQv0fdM$kqFcA0?~nzscDfNm0HO1mhFK1esYS z0~KCO=W%7zEF+Yocu@8z4!ww5B0sD-&nSuYB0;G?%-dkU@;v37eay62PgYxy_Te6g zTJV1{k*l=-9PA$)Y~nvYQ&Aojim&SA3OF5sflkXTLyIsg(u7RD!;_{_4!X&BOiz zV(~c9D=^$DN=rLTT|w8>rKS-|N)33=7^Pu{Bb z{^v(;HWt4CDk%G8u7L6`wY~%@2BGpAsQg^hilttjUU$gPI7kp=+!=9|ob16L^s0!P z&m&GYOq*6rJ-GiLNy27n^zzpTM&m`Je>B^FO7S1}Pfiav_y21twfkSM zgMnNI?lTUGv=*=a<>(ZPWWm#wH0HdP{kK(3#o`w=WY~7QmX6b3<{9d{>eD&QV1)S$ z{P9Q6`S40+*sZEs!;$PJcbrf-Lgxw8sl*Hx|A#WRP}7!J&!Px1_J+iWeFd@#=d8W_5;@o?l#cga)=J{Mh=v3DVb)S!N^ty z&af?zjKqUs-qy8*7~v4w%dX-rLnr460qwDHdQ^~Qw+_Z(E}KA%{i=>A1*BvjDok`@ z;#4J-uB8!JU3}!QHZ6uQ1W$<1d|;H^W+*C_fD)O-aCueaH&tioR~Qz*u20O?^M9t) zkk!WjJJ>ro_Wgek4>#xkwUk!;UoV4CfaOC=ISyPQ>l679CdmVg-d*S<)C0SjYuB*j zFS&|$&bRFEU)8rL>D?CpZVA4sw$0cID}j5+=rAI7+v*{4YI!yu7xh;S?dnFR1gr^D zZM*V7>3mUv+Wxm!)+x${1FO$pTcw$*Jc@;me2*lVPS9NnGd3pNA+F-53K};jyU()J z%m2b#Vuk*{2giqdCI8?3&HK-_lveV;SO&`r0bCtVvE;6*E=7MJ$=xiC>?pS>Nq1$$ zTJW=I^h;s?;`U_sSj1}52{cGQOYs&B4V}~TdQr0sVrxL43p7y z_-rcjtTQIKa7Esk3e0swSLrfn0dO{6b+X>v^G|oD5BdU#3fWydD!DRGve_HN$0W8^ z?Ri2{)Cc_wOi{%9pl?(O|8CF5kOT6s-71&6)x@U5KeD%&xV&-4)$d>plh!Ky^~b0} z1?B$}dKeS(?&YsAo?yl>NpI03Mo&K=%2aayPRc;j{r}N{pa1RP_~2wC|JPA!<-cAB zgNkL~C<7IBq};FitwBxr{h(}t_J`)}ZC8I~X%x=7i{RJOG)}a6#{BilZ0m~3 zR(9^cPYDm)pjV)q(nQsr(xd{3s4_Qv;~gYx=s%QEC^goZGDh>PB6ad&Xq7~KWEqUw zG?w*B5DK$Wu%S%4tE-BCzY4HaXBfh_EOi(NX5r4|FL z0?5yZAvLdpC+R<7hUJB8H5T>rA~;Bfs7lEZMpFE~2o{PMnbIh5xge3`KhK4u%)up4 z7LhEkEC1*$6*j#4`Aa?jUx)pF|KzY7|LgQ*lmBlmr4|2Qul+x4m(NXqKPsXECU2aA zpAE@hJciQR*;mYCLY)MCA!EKI<(1A%S2EEDTpPGC{HuKSeKT_Ds1N#+DOdm8uDc0P zuz8c^ztb>O+d?0IsTdZ=LaM3R>V6-f2?<;V)b_+QTfwB3t`8C%d3JJxz3cebQZ4Th z#HwgH{DHfLoUWSgX~D0n`U%v6(_yB~5FB`Z+1&RuPbxY8Y?V5sca?^iXY&-h(IGaJ zDYD$JdNXAEu2#VDd*5LIoGvzuMq%@mliRIxm3L<_cAO+vG!)idTDOs?ciXI-@qjt1 zec$ZHYnof7U$>xM$A*%Ys8ZmQ)?GxHj}ZkwPigWCAQb$pA=ONuPAXgQum{4&i_E3- z)U62a;&dt;W2DqyGy9IQ%&ydS=4}AWpZSUrsP2QZ*)7@;31#)YSzx!?riAu=l&#jZ zKdW>Hrw8>n*PXl2QEzaBWv)cH1h$hfxpk&)e)3QYuE}H$Nn+ZrVu@BT9H01r(Ck3| z>hyqi9k6Uk-RUnHKNtChm8v`SdD}G-za@=c_F?ZlnKCXNajp%&jr*YgWhpdE$&6Nd z>!LnuU3cIgHA^E{oE}v}P22W-LPNBz;YOWLk}gZKj+KT=^^c{<6jy^1ot;v2LlPX7 z0%T_DYuzBrdIE@qfSuXClF#=0p#KfTNhtb`J24uY18p9S+v(C;X33>kccimw?oP}E z@@Tx+v=kuRdAWQKrMKGU->3KyCMf0YC&z&~&+J(JTFcyc1kXD;Ce$qYyS6{shO2E$ z13)-^B#{&p!P#puLfQ!S3y_EcV*0QbsQZ1)h}m{?&a_rhGTR&9HNN(%Ig-ApPPA&4Z@lq z1d%DfLlH@178<}n za8}b>xA7bU$;Y`(1H3~s@UshX{mO8@Qc7nxzpr`~;*`szef;F85BkG|K=H5bc@|Z> zzKa8C3UJEN2+?I6O1+M?8><%y2QP5StH)=5r9&{H2y#SKWW>EWhM~n8uIc@#srQF_ zEA4)Q7*l;eTtnvrgYnOg-Shs#DE0UM`7EvU{r}O?zJLFJu*v_sp3>(2-?{X+E*8!2 zExf;WJ?GZ&?OhJ0?i4R8IiD(>Ma%9+)u&Kd#riNe(17AEYnH#yjlxz(Wfkkg+(2DU ztlGHWLNCWHM~2E5ZH>=Js-L!1Hfg%|+y=h`PVof%4pN-PDCOXw6S1z(d(GoJr(W>x zZed!q|7A51x`KZXQH$1{{rraL4kak!LS)PUKxeE~yc)GbM+ zN4ONZ-x|nqE4QZQGg2qQ@?VFXe)(%eN%|XkxXVzqviCoS2m8mR_dh3_`2TAuGM?=@ zCFx(u0}#_}rS3e3Nuu&|nC0=R_s@UU@hcN<-dZ+wY|F`VQv9J#0lL;Ja6d*s`~h_2 zIg_3&8bitly`r691}qw*c$y&9%={(JF`|=TNazIe9l#I*W6m@7>g7w64xaEkoS_)Q z0imOp;;)yY`k)5{(r8L4N~4*P+Gj~Zo_4@Dgg)SS2M`KwQI^064S2&gdsOXZa1%^1qY>Z;?8+njmDB=*OF6ey$mQ7{knBg>O z0$tQ>2mVlk=a6!ojxG?46P%)433!_c6$U0C*1w3+Wm;_*5}LP^v-BHz5C>MwfsoUP z<#Q5C?Ly^&O=o~2$cRTrij#rXLjFNgJ*Va`DVyB-CTP+9fA;|RKlK6xG32nFpG@zZ{n_U`g8`yyV{HOO!->YGf*jKx> zFCbOzLl0cIngw%TcBy9fc>t@cT0jp~JgJI3=R*wFv%sC~?I|kdoa-QidI9|LNAEZC zaG&#Z09b~iLX~R4;1^-;zXPp$9c|)HJ$q@;|6+(HBxQ&%q5(G9e-8Ic`TtJ#Ht+w| zQlz4HA!qpx@#SfN&ca!<4oJ}>W|*XPDiKLyskPw<-XU&jLgHUgXl{TK74uLjLlkl} znkg`O=ko8O)s!IxM(Tn9y~j*yK^cjeI@qS@36K=AK^Jwz8_8uWB&GwtMq<8OqV$#| z2~J1fXEEeRO4RU3d%`MI$rpT63G>d3vQYYF`bA+uqOA<&SN9>BJxbl6KGgor(vYNz zMQCwDS=pvPf$zUh;UmNed`JZRc5UvabR;t^Dtn;)`z!Z)r!xuWfu;MoJQX&Ofm<0= z-n?`pOZCzsNPcK0MOLdOqHHVr46QZGFHQ0vWeJ&0P`Zc$&?Ns)kA3^k{@(s3{?l5D zlK=TEFHr$-R?gZr04dp-FZIp$!CJJ0VpP|mCV1ohoO%L^q;rHDF+vZ$0I=^GHp*fJ z^i6d)$v^?+D^JDHpR4W_mS8@yQ16wEC&h{raxSmCOdW}Bw4;r7v~2CDLH;j%_w%P_ z`G0h9dgA+k9PI(THbcp8@;|JlNGZS6yPxN|_YoqP42MA}P7$XVG4Ozfgd#A3^qsn$ zz)W6GD1)zim2jf&ekNIhRQMh((ix^G4qmM!v*L0^%5ro2!Nz2o#NYt|I!&d74_xMC zkisNE31$<8Y69Qm$#fDx83HaKLoP2;M)(n>@|Glk21Xn|qLO)8Oc)-DF_QkUQ}qIG2xU4^898G|l2mu4p2~Gu9#QcANN0>}e zp5Qnm49oV~$8-R$hBEPwx)Rzc?v)rw(IcV-v>3!wMWgauk=I8&(H%V-azww;lk^JQ z-@gw101~l?)KDaNh~zaD83HKxiR|tevSPB)dlXIOc)idMs?XKBL4Z*3ja*#YvJY~_ z4KYe$K{`Wxr;0cLhswDWNu(MV+X0x1rYON9ETocl$DMLAfgDFrtil)x-0=YXI2H>* zgTP|_i)F8W7ND5yUo?vn1V&RxVagF=-~}3t1_CEc@IMe`+u#W&i9j?aDWL*%sWa15 zbw^`+BI#dv4QZjl5S{r4qNITGfFd$MrS57d08b_;#*m|ArpF8Oe5iCX@*Dw7vN7CE z&?8EudW0DuX)-fi0uM78j1f_$rdXxwmZaR@zjh~Qh#;R*InL?dY7`>B2!a)R6(Z9c4lk_T$(R&pC4ZP4g;I>#ye>0yu9Sv4>nQ8H? zmRh~l!c**RSgvkw|FS~$-X$QQ;ky#X)7R`DExr9%U0}LPq;z}ftQhMYRV;(P3#WV` zXs@aQLW*T5Q%AOlhIU{7_@h_JAUz~iyvn*6J=pV|IGuDy0pTN~Jcp%H*xPVp?ptPQ z(El?MuRQCtg1{^!Zw#{RdKB9(n1mzJjgXCw~j{xwSfd^*3Zs{WQ9K3X@JG88NG zS{iEw>W0Lf#HH*&dns5gN&onxrvtE@MG={%JWsz>J&a<*l^e}NA!Vw|kn^A3>!adUOi64}kw#UhBVZq8dGy1F@^7ZDpnif$+o zr}S$lPx=a4+ETkdlW8_ur3`rT&y|LDA%d)xLg zq*X}{cRLZ4QA}js-$l5NB&-B!apF=E=PxW4WllD%f-%+brEa8hl97arW_KAyFg_UUxBZhczM8GK67B0Ra(Gr5Xx;1u(7rz`H4 zw%u`Bt*J|Gc8|(vyztJ^V9fF_?U~QX+SFkGVH|QaoF)r-fH%GW+dC@xf9;=c-v6zo zNMp~Pp5>)_fO|{lbMyeShF~2oV5JfNaD2r#j$q4l1XCt~{3uyUp8a7s)bFm?XDox1 zW0{oXlXe;_x>=;)(_b2h$?I*r>NlmL)a!pm;-5Se#1Gw5LN)pS?;rc`{|-+MHvWHW zDNg){Vs4ii1>%Qt68jY>e7={3XzaOG=;o?j(7(@iqbSubx#-z$6khG_;Rb$~C&yM* z5`ONCm#hH<*32q(0N?tePp>6O?w%7h4*SqGzcdf_ctLrdcf<|n(`1ctg|`0e zitV@Qh4iKFmrwY$VmrrSfvuO<#S(L(m}@v41+|Sdr=_EWZfC*R5 zf8xvk!=wF;{9i}$-~TUL0SGLbPhA5DcKL%<0gA`^D^~%ERkqOq+UWq{5!)yMo3gCZ zUjEN#`~Oo5`G0V@=gI$r(}T_XpS6_y{r{2$|Hkg$;#KZaZT?P|J%hjVTglpAYFTHm zcPg7ynC6wL{baR4wv~*u-eq%K05qQe zj}Ob||Bd`#ODXw(E?Ez-d=ft!3qVDmKUfpM`fdU2g|@K)w6XzI4cW#BuqjI@?d8Au z*xd-wB>#^Nj(qvQx3{_fUrUkV{YO2u;A_Zmv}_e1qj&=8%oc@PlA&~o$x()3J3w8f zm}42O%y>3gUQJtL$Zk}7!N2{?I^yR``P4pke>T9sC4f943JfteYzos60$VAZpdGN4 z*APNo=fugsS<*pJJS^a0rlXDJpbP1gkASJ+9r$GGdRv$mHsih{Jo?s^a$lbL`nm5} zbJp^l44ElkA#KbrocG*LFg(jjhkH-TGf&EEWG)RY(j?mxYvnx3YrOmtoTafd4SJas z(-4>lQ^)Q6%P(c5KT(yB5k)HG97Qmm0hq(}mynCXTBkN}`>1Y>>Dx4!$sx>v>hN(I zS-&(r-WZj4M`)DVAK&#b+@ilvF+~7!NuA&I9ii!RNYJS5T_=zZmi5 zaDayWe|)%i;K%>l+u!7WUrUku|22WJP*)PbRImrua?7h->1yJ?p@@TM$~c+Gq|8H{ zAhrV_)1YF2Q>~>BW^j@;KS0n#4bXc|;eD3$osbQC4*tuOO{o=j7-Wd*1mO%=VLqTx z(Il;&3R3?zSilt!+2A*!KyNv?-@tbWNc2ht6gY(XBD9^K&fdHRh*CmXGdevw=EX+e z940(HOGY?UDaPNx>;>CyKa`PdCCyOPW2rHi_*GE?8S8|_Y1smk3Xj(b1=9ig8ev~e z;0S@6X_9C(-MUhW2-u=C@|8BwK@+>7b3;J3z;^rf*?A`n^Z`aK;9kDxh^8TgAq? zOJT;wq}x{1VRdxV&bYb{n2WIOxZ!j}QAbR=O$+GXLXMu`44mCufm<@=-L?xAE!v>@ zj!^s$AypWeM-p$@iCe*@CI>;qi$0)QEgfvI!Bc6zJVzm=|AugM?$CX zrWq6sn{mFpLmXs;iglQ)6g#=?6aUwZ{EbPo&e_e)_qVUROr~fXBw}*_Tvn+(|A`a& zk_v^xwclTM>SCmN&Z-5`P)e836jScyC5 z7=`G_VAj+K_Q92(=7gmBx7Z{%YI~k48J%8!32q=|2qc(sg#~6ZMLs8ii=9i230MV~DtzkN2Sg-ByDA+MfN{Jl zw#N`qb+hDO85wN@#xY6RK(tj&^E*@fPBloMY-+Xahoby?H2!dN-AtQcmN90MjJ{9l zW0tD>)ZLZ@K4xhf%2LGHm=NB1=uE?|183UR5_hIJYYaJjfDC~rh`DW%<3zo9-`_hZ+y4(X?|;`)nzTBt)-JatVz_f5~T79oeN%5<%z?RWwb!OW zb-0P{hU|Yof=MDy8U6F?n{WH!2Jg_U5BhQxwXc5RJ$f!fHUJ1BlFeMFQSWWZWXkvj zLfN^fxRsBLSNmGeigDfig6)c`yI-)rHEoJ`my$cAl0VCzTta>o5EEPOU|g@!8A?~cocdBNde;&rz77Lbt@bFpeu;A>^$_$e<|XH=X+w5kO!CyhET<- zH;KWEMlwSNxl>4e(##;KsNyjwP#J1D0oLI7M2AN(htjvZ<>OXC_J@ROe+@z31pY=S zm}VmiV`VJ}x$IhFqpQA=?Mj}z_ir!Wz5+1fQ<-*0+f-Ba5_yE?d z)zRiT)jbh1%uJgC*>3ivZ;3O1b29@=;Ao=qi*qK2*es9e@$s1~2nK&AGlFpfueT-SgXI*cb_t4d7aw*wWp>G3S40Jb+^Ykd`3td zsd7s_wNTyXP}vK4GMBzy_ul!F&`PWIztYo3^uwrkp_vFi(M*|9$$E?2$($N3Y}8xj`}Oy^(+P5!_8rTD-5rze~I zziTN%N$5HLU&d%q?*!Hq5Z8HOY&gfuFTuCwF^N!I;sP53kOf~UxF*|i25pX0u|{1* ze<+&;?wX}qHO`<8uJP(C1>ZMEFs-y1pBh2R+ebtxj*(ER#BZXVtFyW6FUK-)T9<5k zg_2j$)wi4YK1`M7JPQ=)zm-#|;N{wyoSFhpJFApZ236DG)!pXi?xQNz{NHosUqB6P zy8k=bKlbfE`=^`uuWKpl{ckBYjyl_p+E4?e_!Zyyy?!c)n(X+a`k0)+{bnAR)fPkja)vpOyNuo=3azsNJ`X*2_HFBYqMsE8Se5yPVt z$%sBrguYWV|AhHC2Vz?GeOIZHWo1Ft*C6bs_^L)_72+zz+z7Ie>FJ~QqpMhYwTrKl z51sUU$V_Z0TanRE>m{H92t|w}k4P#LGEqY5`Gf0|S8%Up=R14D_+)SEEC}}d89y6B zu`JxRhM6=#8b+tXTVc*re>nj;kqy21Xgv%+q+`>9M;f!@+aJ?3rwyQ+>)aC5`YYJl zN2}}Sipbm}rP8XLBg(HBnhyNMD=8L;PVCd7EI7FCYeWl+(n`%o{~di3$=cu9 zj^4WnrR5FYwCT%#Z!Q8q{8DZI(SfH|Z~r;iJ31-Ze>U&`)>BIHe+&y z`W!zOUcYS+cj@@8UiP2Gu}TLSLDni%%+RO5$Qp1vP0G4=?SSP?=`=wB!hMt0Mq+=y zrCR=LhyNRyyJI0OpvnL9@W7YDn98~MMEQu6f@bl9El&be zI8146E}&Wb(8cldhQy#C9O&_@bN&pC_YxgILyN7`jd&J6e0o7+T252TDe80$zPada ze!|@b@?v+p;RVp{2DZ(XTH|eO-5`auiZ0_-Y`OB#Eb$6BD04nF-_Jia=zo;MCA|J_ z)c=l7j*fl%|Iz-&|8p%xF;tbob9pMCO5E8|%TtXk>%iMInE^UY6#*m#cjsrXFTE62 zeuQ)UUS`@m*BSO~70uJ{RHyC40s2!(Z&<2kSF77e0;-x-X%2GWsu~%EK~}2P5h@kA zdR0!2SC!*fmHsAM)!u2?93L~?!@>*2ZDx`wwwN9}S>hn>{EFjuFr;Ln9{!hyDDuMj z0+ez(D-Vw9f0eIDKcj?`h$Q{IX9JjJH~On`32}e>jxZMjp2uR8}okl$T%qys?=jtYp)W|5M(^oZ%$=1))P0XT@Z=S86 z*xzG&n_YO%Xd1N3`2!WM&G)boQR`rZ`7n0@-`;sApTrUy3kJ?_uh+HkkZB(g&>IAo zDEwcU&TU;@;8TXKNsO*;LVkY^-}QDe=x?PYM!({$A9Bkp;5NAAx#XBM+|?{c{%q^> z{Tx-_LiHTGiup_?!&~M3 z-{HxLpa1dn^!Rk6|F5Gck*B8`$hltD+kdlwB;W0N8gSdL!P;vhbnL$NHdxVHEzQ=d zj|Dbyos7TE#MWDV?S3xR-s_BPH%qVG^b@rCHq1`r%zU0^UiGW9Ha@oK35%JEUFO)* zL|nTI*ZWi_e~R0BS{&*Zddy^Vt0kI?U2*jh8H#K4zsG1f>0cZ4zk`FrlK=Pd>E`}_ zJwUyF@wPIGJ)ppb}>+>@yWd#MDRI;L3y*_5uTc$QqkKeyo#4$Ja9TX zPavLzjCLW-Nc5#_!mHDWYS;?ngu)RLJZ+E`$B57@JLa~kiEn*NQm1r*s`tZ;Lyn`s zCzVT5zFDdGtsi5in5X})vW`eKI_FwTa$y%g*$l#ajN1X(BT1$c)Rdmt86PiSrqf?G zdGKwrzB+sN=4)_%ch%+9roCp^JqybMuPIXRlr&N(Z&7SO2)WT-@VJKJ{%{Ch!3z{t8tet+grW*lq(3 zrYYe{YIrcMU*-Yq++a=_qUA2@HEeza{R}epL}(nWW`1nO9)3+Nr_zQSlL^FWscvaa z6;mv)WkFvx?1MoNkN+|mw0h6gE`nP@O88N<_2jIISENJM#4E19xm$!+q(k;RydoX4 zW$}s-s5u5(CC3f2ns$8(?Sta?1$r0&tbPi1)xWv}rC0$sKlsa~(Jt}0P}1^Z0_?67 zf;H5S6^s6+>&{}tejv%+EREcBN_J~~&U_>Z6ZO1sBj$5J-(WPlEDo9I?~9%@tLH`& zF<>;RG%A}q-Z|5B|Bg&)=%}fWnYy(&Vg{_ny2CMIe9b);DCh0+1rnzK#TL8uyQ~rt z>ddz@6hY3Q0au)&^{<_yu9zM-9qVlDC12V0=vp5m9el+(@`rP5(yZCs+#E#P4mlOOH7Z8fqd=m|`)yMiT+&0g(;4LBD($m`*u(3geo+SeJKz*g zG&%j3{q08j0#ZJ-y4wYkDlNov&Eh0u7Fo++R*u z+qO@$T2N^YhEQyI=qF@~2;~{Khbf z5M#B??=H`8FYhfV9td@Y2!U`%sgoS&c8n>lr?LzPs!J3xsWGtd$zCEL(L; z%d+wdwkv*_OHk&ZA%|)XDH;~;xbJWp_d)-*7#~|71AUm`Zz-8(g%UP+fYH0@1M26T zEvLE)cXfPxrSIONVc(~)ogpFgwdSm`OxILtF<;=g=4|Ha1l^@DV`EZ(_7Rl=XCJ3| z&AHUQT~ZC1ZWubP8kE)gvG}!Y=GC{9-%OK4sa(L22gKhYOoohrs#vKa3ZNAh;zo}Y zxAUF+!znW*qQbYf%8jLapkm9FB_SIvy8T+vE4LKOfE zvxwn9+%I*ox2nsE132a5JH!|!X~nM>m__6f(OHN?wYpyXkS`b)xME!3u4dkwnx)>; ztmu};bsa z#OG3K^glA?XekO{WBlK}Qv9ET!;_8vw~kVZ|9>l{eJRoZK_wW?zJ${(#*z6yfR`C5nkx4_LE@L$o}Hr&76fmH?bl{oqit}elQ zO>^)&NO2mYl!LvXSe>RSe1c6xj@>`uI|qF0e7|A+iCTsQ1*BI_X9ZBVdX9@Av)J2R1)192 zZi7rxc}MY7pPotcl*qfOo@$Qjbx&32`7ehwC1p{0m11tBPZ~(R^eh@`({$D7sq@cS z?W}duT3>z%E@hQ~5~3El08{{>h>_$GNu5B(GOdjhTz!idb_SCcx**wsun~G2`(`(F zi{tb_UEr8oLLE62bEf*s3CM|T=*>r~(|^=gh-NEvIR+?Bzl4X@HA=c#U7wJat|j?K zP5_D&8q`u{qLqyOuiPf;J9kpOdzjuh?$doaPyy zoK}}JIb*!8r%Ua ze2%(hho#zmmJq`>X`OT})viU>2PZ7oGTjC2LG7k$SuH<7*Ma((X_}SK*^gkJ%xfQn zE5U+VsIwN@si1Y6??X@ZU=#lVW_oa?)5os^SL=Un5Rg^c|4xqfef!`3;n7C_TSo~* zE?Jrq=!b#mqz3wpSFZ?qqhP6mmGN-astvmIb-Rc!1B$iOLmT${M{5b~8s6wb)&kq=e~Xv_oAkfa z6aW5qfB*1sqyMd=1ej-(CxKnQ5;%`RFbHAY>R`z{7}y>kgkIR$SmsFrU( zqjpp`K1Qur%8MGEQCN`3v!opVdu!2~V6}HtEOA3|Itm07uhZ`Gc6y#7d!81_18t{A zR5Ti<*p0$ER=N;iT)J=XmUsulIJ3eDdnup7)q$&Vj;wd!7@8LEq{0V5X|}_+Tn6@%)gF zRj0FpX;oIM@_3ZKZq2Cxe*-)AV|CPd1r;e?5%hB*lq}_4I(QumFp^mgM-H^=_ORFVu7Z6QI+L^RiHd`fOe)ZI+mwaF zOv{?_$QLh^pRwe#hQtd1qL;w%Ze6D+#L&nD%K!HFo6P!frqAUrqXZ zN&kD4Lh$9UIK@jz{?H=-&t571!|}<J_X|K_H|kxlQ% z2=w)G?i=fsy;&3dKp~yYt4}I&24Xdez0j;gIt_~bfQN;Cr@CY-JX`8pkr&9(W@;OX zfvITsf=nrIP<^0ltR#?+1s6W&h9pP5j5T6emi9VEZ$pz{u+dZTy!u{fML-;uMTgG69Iv z{Mtba0?fdaO<|JEKm=1Tmf?{B9CAc~;5#@S8R;^lWCCEC^L%yHfn$k>%4~EXB9x*i zu_eb@LERHh67YaP1{p)KP{I0~`~)XSe?duO)_orga%s~fY>GCPwE`wd!PQ?V;=o|r zwnN~d8B_-Pazw@7k3tjQUi%i7d$oRj-4HaB!_!Mr4RG%s5KDOf-!$!fv>*jIe+i8R5*AJtNYE$;IU! z#4cn@pr#VMO_Le;SwZ^+$f=89D$Z2Kn-Qm=n0$4f91#wF{(}9|56rx4GM(?DV^e~q zf&b$P9HE#161RjuTi4efnd?LuENusWV zyPgb!bgi8Kdsw^40Kf6Va=-&Jh0js0hT&)5GCk2m~( zEv5M$JzoHG@O{;|hTj*^8S};qs{&QT1pfD_ZC2R8DIgZmIEFZ-yD>p0Gy6CA>F>K_$Z_OY|TUE znQUVt>fcz9w1G&@Ty7v@W9f8IWge0~2mOr&Xf>sY{}Vc=(Z?!H{$B@&dw%}6lhaN9 zkF}IW{;wB6CF3{$wti-hQNij5#b1_)*y5Ay&aUPq0dv|oeA8(u$*b~$b#e4%RfjQ_ zS&5chqUx2BUc~n9E$C8+OR`GVzb=U$Lc?-L6N{74c3 zrJAi*U|NMoxI@dz4Z6YHJ6#OBApi>-ctiQCw4v9Xs?9m=Q!btO|D4CbM*olF!%h6J zXDZ$J|5{l8C&~5~V);vF_ZwEfDXM7xKNzEAf=4N#X!$rA`2XJVq4)l0|KN0Q!~fS( z{tRv)=ZK~PxhF;EC4;g z=-o5}L!2Pi`*OgZvfh`22l%e{<$zDbzX`>o-k1Mh@6X@|NHLi*aCLFXdV`FT-%!MR z0~{mxQdOtqx8C59MI=TqKL(De_y6mw^ULeI%hlkh-~apj$EEy#`^U!{|F5-_ucr*B zh%s<{*Py&Fj31aU-Jucv+>^p#_Lz8@oSPp3!*)?na9?T8(K`Ck|y zGLWna^zj!J*@EJSDJPU^a443!M_yHc>!0hmV&9=;0_4ZuSsY`*KwtvCX9#>tVai{D zpU70k?U*v8qmF6tPlUb$I0YFc@iY<*cK~D{A?YY+O$Xvv%w-5nOi{#>8DMf~VjZ={ zCNQJq5yvQ;Is*VQ9O4MW1W=R_hB=|L9S}hd6EXsXYQTe>dYCW*Ch#2s8O4u~qYAha z603NDf{}6}dt9Pc4nd@cV5b6-qxe+?uwC%=G>sD}W|VDN zP)8_;G0PG-Gr?4xRZ%q}n2%rJbQ{2w@G+uh1#y(dVhs=qTzV^q)&$>ySq3RexdsBr z5Da026ReVMiSE86v;s;-$%M#iE>`d`1AL5W3^GVLMhxI^`bPjBF-g=?ks-Puoa}|{a!jJBz_kN3s(=6Mf9e|l{@4H77W-YC=3olmW+?4x7-pcr zcjO5@BDy1+I=o9oqC$@-k_z7tC&41Cb*?Jl$QdbJ|x9?=O?6Ko_97$b@vW?&>( zKa+u&#H^^H;Y5zpj^dGm-Kxl}F_Ih=Kcb%4&`jv5F=k32A*r1z&YO~S*V}43lBF~4 z1HlS&p(wexYz|Wpl2AJ;gwc*rX(yP=4V~bLU}`-V+o0FG91c+=w~NmDV(rp={SL{L z@-cvEiXRbWkmf0phL|!Avgt#Dqh!|0*CELJt9bzgEJKlyBtU@3IfTE$)%q1nvzM>h zr!kJkVoQLCOb}B@?d=hqC#u$@1lSXGxtLyq)nzq1c??qBO2RSQL>v+*98s8!dn!7V z0EJV?#Ry&v1v*+edv;K}NtVnCW=+xGre3D7b(bKf!{612h0?X#$EOB*wB# z8%}MQy&R^DKdx2KLh{elo>Tisj7&sQ#eSHy0}hGc5_+BX?6H^Gl-ykcxtv?EP|{iT z=D}$|r!b(UID}J9gbol1iP+0`rb1^k0k^GD1N6R={eejWq$1YSGs?pJSjY$qRKCF_ z*N{UF)0q|$GUVUPmUa{*WJCZN7A#%pGWMQi;Du55)lki>GY4z{2AR-kDPm$hX&w`6 z9WEz&TXfjVn<@G(dxx9UIb$@?(0lxkToZZ~KzB)hq`t>DvefHyytf$ZI z7vRUYxBm&Q?!e9M+aInjE-%2_>)zS5&~nc1z}20Q@L!+ZUEK|Ilef3vyUW|luYUp; zS9j;H&#vCwfwR}I!H;LRw`bS)SC@C-?D_(nzrDV=y1#mReYexQ{I8qa%ey=9_7+^d zxp{qcd9eeouFqe8e{psFEqL+c)%|yGzrP2suijkUpNTfxHng|j^xj>QC}lw-#Vlj`e56i=#X$f2U;jT-Iu$3m_A1w=)(s?!A%d%l zB}!C~OT$!)nXc8Sc6$1pDJEaghJx0>B# zG2vIe-u?jG6Rnxd#MqTp1NrIOo7dn6&EyXTds0rOGmt=zsNw$dY$krlC9jHV%j9H0 zj)htzCnN+d0P9ICH8FxkdogGe1XHG9Gkt_9x@Q<&sTUEHN45u)M`o3rNwgeMI8lUE z!3z;ApgA-TfTN-2gIZ{)E=ek6ESXCGMya1dZ4Nk)vx2ag-&f!T+%ABnHax{{$vW`Ez^asjBiyWsZgv-3HCiDm|b20TAW2G9+O z*&I-ANNgaStH{l|O8%Gi^AL~Tz{~}Ze=d3yQN(>(#kagh1QP@<-%GPv0V7rrfkZlY|7_d{&xTX0RR74S$ib_@CyLQ*0jC= literal 0 HcmV?d00001 diff --git a/stable/sabnzbd/20.3.2/icon-small.webp b/stable/sabnzbd/20.3.2/icon-small.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8488d587d1287fd21ad1b3b6f45d2b851595f13 GIT binary patch literal 720 zcmV;>0x$hiNk&G<0ssJ4MM6+kP&il$0000G0000V0018V06|PpNTL7$00DqwZQJqa z4O-jkxPVlyQe^|_y$dJXvCR#nvMXC-eB&u2f@s<%byK?oo^y?+v)SyueQ1R@s^24( zdrJdN{=W$SR1-}B{}hD!Po2;l`%k&s_aCgKS$)i04W|7^Y>WWr(?{&o0KWSVW&a7h zALjTl&zH}ZyVtG=2QEeckg8rLV_h|Dj)zL00ICsC9nc?85(sd+_2~y!U?3?p|hu?BP?5cH{|eZ?RbX_x0J?&|sN^ zu+;qMb>gPkdD&*lkc3xEGx*Q$;x}@P}tHXhY-|3@76yvf@ zZU6D;F-Py-Fcg))ub9;(TI+r!RJPJV|A_ECFZ^a-dGNp4JB|FscEVw3x|L(ogyb}f z8Z2>S7N-y$WZ1b3?ED@(&I~8KCsn0AlJPt;vRoI?*nPjZLQ)4xNIa-~a$N CqG%@o literal 0 HcmV?d00001 diff --git a/stable/sabnzbd/20.3.2/icon.webp b/stable/sabnzbd/20.3.2/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..27476e86f9c5cc9457f30449083445e10f55bfc4 GIT binary patch literal 1960 zcmV;Z2Uqw~Nk&GX2LJ$9MM6+kP&il$0000G0001$005N$06|PpNEQPC00EFjZQI#M zZ_^ZG+xFVFZQHi_%eHOXwrzWNY_|EbjJDsq-i?R}02%eg`^{dv&SbBh-6fwMzCqS) z)X7)T@g_X_#qm*Ytl}7tk=N3A6Q6der-S0GE8NWBO@8vx{CcJN_D?6K&luOtS!ofI za(D`6_wxSlzyJRGg@Iuu%r%t`ef(GnnXj-`UJ_PbVW2_IutHuETCtyLiwxU-Ou|dA z2@SXhXOD?Lx~^XVEoiFFy_3zOGUeK|(h#)r9goiEGwr&*;1PPi%To86$Da zHzZ)>{ghr$IeZxIHuu_}f({b1(Mw(Hun`*>n~SQ!vGqYCE;6>(w*mmKPN$6o4_wBM zCa&{(FWydZzGqI3*rm-D-m9gx7*@y$l}F*_&aAL12aGsKm|`WY#aSMQ=?mS2wY`9ocK>YG>KslQp2A6)T{$Rm zofd-m6xqCrj~2fD zN~>duT;$!n!a(0@+p>r}By({Ips;<7ty!{=lw~C?Xv8?z*d8YX_hw}UJD@USTW@c? zbniA)wr1!ADqXvSDN-eFYp7EJwRO!-5NXJcS~{S(%BjUIgB01v>p7@s28?Iht7+mA zk2Z2+fbNXr!1JkM;t#a4V}SN*m!TIkgk>CQr&9p}UHaV?cDu6@8gJ@vEH^Mib}fJaTp@FUNoqn{rcT-3MKD|RO z9hgd1P&goD1ONcgApo5LDwY7206u{*lt-l^q9HYZc{rdD2~FFp__I)NpDo36z%aRd zdw2he=OyVo<^%RS_5EqBxdU%U)rNMiLoK{c%^o^jYiKW^RGkLz zZk2W7`6x0i2c&yKdQ6WtJ!sli044;#9~~!TOb4G-MMFft_QvJEn12$vQg16@E;_)7 z8P(4{j!$+DCal{*-RjPBQCzxcfRETkJb9B+%$NZF`XC-~)m_B8Hzgp6uVGdJ*Q{@U z@M;Tr;b%^k-%)G;5tIUwIWiIOcIA+fYoUn!b}$TN1v5@Quxfrk`Pn~Lqcvm8J)lh` z0~1W^=xSx{?+k=>KfwXP{a=NaeLC1xM2}=d@o0?UB}_$1L|i>ih7h44sA?{=WqWvt zu_?xi8b?iww7L$X?U`5 zRP0r*tN<84V}S+x!^TX?49B)#5Wgp+BL`vZaP~@jG7*}$ahfhRLI!3FpggM`sVKw| zt*^iGzDqDy=nnRII2Vwh@n*U(?!#_WYw0I(>!~Q=@MsR7ZR+&{IB?0y4cL;Td!{Y> z`TgnNGV@%S30Y0P!?DSTFvR#@(6UAAjx!to9fM9D1Crto?|7yVM(z?_P7e#xfJWfe z6R?;%L|En};gedm5{Fh6`}N+Q14RjhUy-9%&gu1-P?mXj5=MFudyJoBP~<3KW3l## zr4QDrXF6BVJ@9a+6?u7y<2f}s<(Ry*4=m^vx$v7w(gzZo?Yz6!-)Ec*C#({7DQ1AEz-UDYnT56g8aQ@rj6dfFrB-Pc2>bu#yi<*KL*^KSnT&XlS zjBn?)!d2mh?u%9Wr(2=TBq=MOe*aN@}^8*`e4BQQ}P9~S5N zqj{{cFg5}T$a5-O)B1>_am+iuMGfqmLtDS&qw`zLp#$9luQC67*Uc$*R~z4+aI4$t z-U3}NupYkvFG=Em_J2AXL_2Ex)6m%0ew?-wd-Vg%;T4@fnhUAIXX@8L_D}GIfd5r>`EGqu*EKhh)QLs@kAlpf|j38kCH!r$TuX7V?3Km&gO0000TsK)XD literal 0 HcmV?d00001 diff --git a/stable/sabnzbd/20.3.2/ix_values.yaml b/stable/sabnzbd/20.3.2/ix_values.yaml new file mode 100644 index 0000000000..cf71e35b59 --- /dev/null +++ b/stable/sabnzbd/20.3.2/ix_values.yaml @@ -0,0 +1,90 @@ +image: + repository: "ghcr.io/onedr0p/sabnzbd" + pullPolicy: "IfNotPresent" + tag: "4.4.1@sha256:4188d3c29c53de1018edcfd5dc2d0a0c7955b9a239b91ff6c859626abd3494dc" +exportarrImage: + repository: ghcr.io/onedr0p/exportarr + pullPolicy: IfNotPresent + tag: v2.0.1@sha256:727e7bc8f2f0934a2117978c59f4476b954018b849a010ea6cfb380bd6539644 +service: + main: + ports: + main: + port: 10097 + metrics: + enabled: true + type: ClusterIP + targetSelector: exportarr + ports: + metrics: + enabled: true + port: 8990 + targetSelector: exportarr +workload: + main: + podSpec: + containers: + main: + env: + SABNZBD__HOST_WHITELIST_ENTRIES: "" + SABNZBD__PORT: "{{ .Values.service.main.ports.main.port }}" + exportarr: + enabled: "{{ .Values.metrics.main.enabled }}" + type: Deployment + strategy: RollingUpdate + replicas: 1 + podSpec: + containers: + exportarr: + primary: true + enabled: true + imageSelector: exportarrImage + args: + - sabnzbd + probes: + liveness: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + readiness: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + startup: + enabled: true + type: http + path: /healthz + port: "{{ .Values.service.metrics.ports.metrics.port }}" + env: + INTERFACE: 0.0.0.0 + PORT: "{{ .Values.service.metrics.ports.metrics.port }}" + URL: '{{ printf "http://%v:%v" (include "tc.v1.common.lib.chart.names.fullname" + $) .Values.service.main.ports.main.port }}' + APIKEY: "{{ .Values.metrics.main.apiKey }}" +persistence: + config: + enabled: true + targetSelector: + main: + main: + mountPath: /config + exportarr: + exportarr: + mountPath: /config + readOnly: true +metrics: + main: + enabled: false + type: "servicemonitor" + endpoints: + - port: metrics + path: /metrics + targetSelector: metrics + # Required for exportarr + apiKey: "" + +portal: + open: + enabled: true diff --git a/stable/sabnzbd/20.3.2/questions.yaml b/stable/sabnzbd/20.3.2/questions.yaml new file mode 100644 index 0000000000..952622ac87 --- /dev/null +++ b/stable/sabnzbd/20.3.2/questions.yaml @@ -0,0 +1,3197 @@ +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 + group: "App Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: + - variable: SABNZBD__HOST_WHITELIST_ENTRIES + label: "HostName Whitelist" + description: "If you use a reverse proxy, you might need to enter your hostname's here (comma seperated)" + schema: + type: string + default: "" + - 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: 10097 + 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 Configuration." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: Type of Storage + description: Sets the persistence type, Anything other than PVC could break rollback! + schema: + type: string + default: 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: 568 + - variable: runAsGroup + label: "runAsGroup" + description: "The groupID this App of the user running the application" + schema: + type: int + default: 568 + # 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: metrics + group: Metrics + label: Prometheus Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: Main Metrics + schema: + additional_attrs: true + type: dict + attrs: + - variable: enabled + label: Enabled + description: Enable Prometheus Metrics + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + + - variable: apiKey + label: "Sabnzbd API key" + description: "Can be found in the Bazarr settings" + schema: + type: string + default: "" + required: true +# - 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/sabnzbd/20.3.2/templates/NOTES.txt b/stable/sabnzbd/20.3.2/templates/NOTES.txt new file mode 100644 index 0000000000..efcb74cb77 --- /dev/null +++ b/stable/sabnzbd/20.3.2/templates/NOTES.txt @@ -0,0 +1 @@ +{{- include "tc.v1.common.lib.chart.notes" $ -}} diff --git a/stable/sabnzbd/20.3.2/templates/common.yaml b/stable/sabnzbd/20.3.2/templates/common.yaml new file mode 100644 index 0000000000..b51394e00a --- /dev/null +++ b/stable/sabnzbd/20.3.2/templates/common.yaml @@ -0,0 +1 @@ +{{ include "tc.v1.common.loader.all" . }} diff --git a/stable/sabnzbd/20.3.2/values.yaml b/stable/sabnzbd/20.3.2/values.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/sabnzbd/app_versions.json b/stable/sabnzbd/app_versions.json index 0c9f1f669b..4c22e36757 100644 --- a/stable/sabnzbd/app_versions.json +++ b/stable/sabnzbd/app_versions.json @@ -1,4 +1,5342 @@ { + "20.3.2": { + "healthy": true, + "supported": true, + "healthy_error": null, + "location": "/home/runner/_work/catalog/catalog/stable/sabnzbd/20.3.2", + "last_update": "2024-12-21 22:26:42", + "required_features": [ + "definitions/timezone", + "normalize/interfaceConfiguration", + "definitions/certificate", + "definitions/interface" + ], + "human_version": "4.4.1_20.3.2", + "version": "20.3.2", + "chart_metadata": { + "annotations": { + "truecharts.org/category": "media", + "truecharts.org/max_helm_version": "3.14", + "truecharts.org/min_helm_version": "3.11", + "truecharts.org/train": "stable" + }, + "apiVersion": "v2", + "appVersion": "4.4.1", + "dependencies": [ + { + "name": "common", + "version": "23.0.10", + "repository": "oci://tccr.io/truecharts", + "condition": "", + "alias": "", + "tags": [], + "import-values": [] + } + ], + "deprecated": false, + "description": "Free and easy binary newsreader", + "home": "https://truecharts.org/charts/stable/sabnzbd", + "icon": "https://truecharts.org/img/hotlink-ok/chart-icons/sabnzbd.webp", + "keywords": [ + "sabnzbd", + "usenet" + ], + "kubeVersion": ">=1.24.0-0", + "maintainers": [ + { + "name": "TrueCharts", + "email": "info@truecharts.org", + "url": "https://truecharts.org" + } + ], + "name": "sabnzbd", + "sources": [ + "https://ghcr.io/onedr0p/exportarr", + "https://ghcr.io/onedr0p/sabnzbd", + "https://github.com/truecharts/charts/tree/master/charts/stable/sabnzbd", + "https://sabnzbd.org/" + ], + "type": "application", + "version": "20.3.2" + }, + "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", + "group": "App Configuration", + "label": "Image Environment", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "SABNZBD__HOST_WHITELIST_ENTRIES", + "label": "HostName Whitelist", + "description": "If you use a reverse proxy, you might need to enter your hostname's here (comma seperated)", + "schema": { + "type": "string", + "default": "" + } + } + ] + } + }, + { + "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": 10097, + "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 Configuration.", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "type", + "label": "Type of Storage", + "description": "Sets the persistence type, Anything other than PVC could break rollback!", + "schema": { + "type": "string", + "default": "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": 568 + } + }, + { + "variable": "runAsGroup", + "label": "runAsGroup", + "description": "The groupID this App of the user running the application", + "schema": { + "type": "int", + "default": 568 + } + }, + { + "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": "metrics", + "group": "Metrics", + "label": "Prometheus Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "main", + "label": "Main Metrics", + "schema": { + "additional_attrs": true, + "type": "dict", + "attrs": [ + { + "variable": "enabled", + "label": "Enabled", + "description": "Enable Prometheus Metrics", + "schema": { + "type": "boolean", + "default": false, + "show_subquestions_if": true, + "subquestions": [ + { + "variable": "apiKey", + "label": "Sabnzbd API key", + "description": "Can be found in the Bazarr settings", + "schema": { + "type": "string", + "default": "", + "required": true + } + } + ] + } + } + ] + } + } + ] + } + }, + { + "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": "

Free and easy binary newsreader

\n

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

\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/sabnzbd

\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/sabnzbd/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:

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