From 341ec4213ec870a86d89cc84c411dbaaa491de25 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 11 Apr 2023 18:35:53 +0300 Subject: [PATCH] NAS-121200 / 23.10 / Add adguard-home to community train (#1061) * Add adguard-home to community train * add GUI * fix versions * update wording * remove uneeded values * update description * add a note * add descriptions and bump common --- .../ix-dev/community/adguard-home/Chart.lock | 6 + .../ix-dev/community/adguard-home/Chart.yaml | 25 +++ .../ix-dev/community/adguard-home/README.md | 12 ++ .../community/adguard-home/app-readme.md | 12 ++ .../adguard-home/charts/common-1.0.3.tgz | Bin 0 -> 54259 bytes .../adguard-home/ci/basic-values.yaml | 7 + .../ix-dev/community/adguard-home/item.yaml | 4 + .../community/adguard-home/questions.yaml | 181 ++++++++++++++++++ .../adguard-home/templates/NOTES.txt | 1 + .../adguard-home/templates/_adguard.tpl | 105 ++++++++++ .../adguard-home/templates/_portal.tpl | 12 ++ .../adguard-home/templates/common.yaml | 9 + .../community/adguard-home/upgrade_strategy | 31 +++ .../ix-dev/community/adguard-home/values.yaml | 28 +++ 14 files changed, 433 insertions(+) create mode 100644 library/ix-dev/community/adguard-home/Chart.lock create mode 100644 library/ix-dev/community/adguard-home/Chart.yaml create mode 100644 library/ix-dev/community/adguard-home/README.md create mode 100644 library/ix-dev/community/adguard-home/app-readme.md create mode 100644 library/ix-dev/community/adguard-home/charts/common-1.0.3.tgz create mode 100644 library/ix-dev/community/adguard-home/ci/basic-values.yaml create mode 100644 library/ix-dev/community/adguard-home/item.yaml create mode 100644 library/ix-dev/community/adguard-home/questions.yaml create mode 100644 library/ix-dev/community/adguard-home/templates/NOTES.txt create mode 100644 library/ix-dev/community/adguard-home/templates/_adguard.tpl create mode 100644 library/ix-dev/community/adguard-home/templates/_portal.tpl create mode 100644 library/ix-dev/community/adguard-home/templates/common.yaml create mode 100755 library/ix-dev/community/adguard-home/upgrade_strategy create mode 100644 library/ix-dev/community/adguard-home/values.yaml diff --git a/library/ix-dev/community/adguard-home/Chart.lock b/library/ix-dev/community/adguard-home/Chart.lock new file mode 100644 index 0000000000..f6cdf0a11f --- /dev/null +++ b/library/ix-dev/community/adguard-home/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.3 +digest: sha256:1a090020cfa582aff29906320874ffe9b543fcc6c2423c281f434514f2653e02 +generated: "2023-04-06T19:01:50.673798323+03:00" diff --git a/library/ix-dev/community/adguard-home/Chart.yaml b/library/ix-dev/community/adguard-home/Chart.yaml new file mode 100644 index 0000000000..3698135643 --- /dev/null +++ b/library/ix-dev/community/adguard-home/Chart.yaml @@ -0,0 +1,25 @@ +name: adguard-home +description: Free and open source, powerful network-wide ads & trackers blocking DNS server. +annotations: + title: AdGuard Home +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 'v0.107.26' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ +dependencies: + - name: common + repository: file://../../../common + version: 1.0.3 +home: https://github.com/AdguardTeam/AdGuardHome +icon: https://github.com/AdguardTeam/AdGuardHome/raw/master/doc/adguard_home_darkmode.svg +sources: + - https://github.com/AdguardTeam/AdGuardHome + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/adguard-home + - https://hub.docker.com/r/adguard/adguardhome +keywords: + - dns + - adblock diff --git a/library/ix-dev/community/adguard-home/README.md b/library/ix-dev/community/adguard-home/README.md new file mode 100644 index 0000000000..24a6191698 --- /dev/null +++ b/library/ix-dev/community/adguard-home/README.md @@ -0,0 +1,12 @@ +# AdGuard Home + +During the setup wizard, AdGuard Home presents an option to select on which port the web interface will be available. +(Defaults to 80. Which is a privileged port and also usually the TrueNAS SCALE UI uses that port) +Because of that, App will force the webUI to listen to port 30000 (or the port selected by user in the TrueNAS SCALE UI). + +If you select a different port in the wizard, the Dashboard will not work initially but +after a couple of minutes container will automatically restart and the Dashboard will +be available on the port you selected on the TrueNAS SCALE UI. + +> - AdGuard runs as `root` user. +> - AdGuard runs with host networking enabled. diff --git a/library/ix-dev/community/adguard-home/app-readme.md b/library/ix-dev/community/adguard-home/app-readme.md new file mode 100644 index 0000000000..24a6191698 --- /dev/null +++ b/library/ix-dev/community/adguard-home/app-readme.md @@ -0,0 +1,12 @@ +# AdGuard Home + +During the setup wizard, AdGuard Home presents an option to select on which port the web interface will be available. +(Defaults to 80. Which is a privileged port and also usually the TrueNAS SCALE UI uses that port) +Because of that, App will force the webUI to listen to port 30000 (or the port selected by user in the TrueNAS SCALE UI). + +If you select a different port in the wizard, the Dashboard will not work initially but +after a couple of minutes container will automatically restart and the Dashboard will +be available on the port you selected on the TrueNAS SCALE UI. + +> - AdGuard runs as `root` user. +> - AdGuard runs with host networking enabled. diff --git a/library/ix-dev/community/adguard-home/charts/common-1.0.3.tgz b/library/ix-dev/community/adguard-home/charts/common-1.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9b2580e5d1085f7844307e814892f625a2bd7d5c GIT binary patch literal 54259 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 r + The configuration for DHCP is done in the AdGuard Home WebUI + schema: + type: boolean + default: false + + - variable: adguardStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: work + label: AdGuard Home Data Storage + description: The path to store AdGuard Home work. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: work + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: conf + label: AdGuard Home Configuration Storage + description: The path to store AdGuard Home configuration + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: conf + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + label: "" + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for AdGuard Home. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for AdGuard Home. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/adguard-home/templates/NOTES.txt b/library/ix-dev/community/adguard-home/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/adguard-home/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/adguard-home/templates/_adguard.tpl b/library/ix-dev/community/adguard-home/templates/_adguard.tpl new file mode 100644 index 0000000000..98b3adbf19 --- /dev/null +++ b/library/ix-dev/community/adguard-home/templates/_adguard.tpl @@ -0,0 +1,105 @@ +{{- define "adguard.workload" -}} +workload: + adguard: + enabled: true + primary: true + type: Deployment + podSpec: + # Host network is pretty much a requirement for apps like this. + # Because NodePort can't bind ports like 53(DNS) or 67(DHCP) + # and the majority of devices do not have option to change the port. + hostNetwork: true + containers: + adguard: + enabled: true + primary: true + imageSelector: image + # Args are copied from the official docker image + # So we can also specify the port. + # If we dont specify the port here, AdGuardHome + # will start initially at port 3000 and after + # the setup wizard is completed it will switch + # to user specified port. + args: + - --no-check-update + - --host + - "0.0.0.0" + - --config + - /opt/adguardhome/conf/AdGuardHome.yaml + - --work-dir + - /opt/adguardhome/work + - --port + - {{ .Values.adguardNetwork.webPort | quote }} + # Setup wizard shows an option to select the port that AdGuardHome + # Web UI will listen on. If the user selects anything other than the `webPort`, + # container will reload its new configuration and listen to the user specified port. + # But user won't have access to it because the port is not exposed. Few seconds later + # probes will kill the container and restart it with the correct `webPort` port. + securityContext: + # FIXME: It might be able to run rootless, probably blocked by: + # https://github.com/AdguardTeam/AdGuardHome/issues/4681 + runAsNonRoot: false + runAsUser: 0 + runAsGroup: 0 + capabilities: + add: + - NET_BIND_SERVICE + {{ if .Values.adguardNetwork.enableDHCP }} + - NET_RAW + {{ end }} + # FIXME: Switch to exec probe after this issue is solved, also note that healthcheck + # is only available on "edge" tag, as of 27/03/2023 + # https://github.com/AdguardTeam/AdGuardHome/issues/3290#issuecomment-1485451976 + probes: + liveness: + enabled: true + type: http + path: / + port: {{ .Values.adguardNetwork.webPort }} + readiness: + enabled: true + type: http + path: / + port: {{ .Values.adguardNetwork.webPort }} + startup: + enabled: true + type: http + path: / + port: {{ .Values.adguardNetwork.webPort }} + {{/* # FIXME: Disabled until it can run as non-root + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.ipfsRunAs.user + "GID" .Values.ipfsRunAs.group + "type" "install") | nindent 8 }} + */}} + +{{/* Persistence */}} +persistence: + work: + enabled: true + type: {{ .Values.adguardStorage.work.type }} + datasetName: {{ .Values.adguardStorage.work.datasetName | default "" }} + hostPath: {{ .Values.adguardStorage.work.hostPath | default "" }} + targetSelector: + adguard: + adguard: + mountPath: /opt/adguardhome/work + {{/* # FIXME: See above + 01-permissions: + mountPath: /mnt/directories/work + */}} + conf: + enabled: true + type: {{ .Values.adguardStorage.conf.type }} + datasetName: {{ .Values.adguardStorage.conf.datasetName | default "" }} + hostPath: {{ .Values.adguardStorage.conf.hostPath | default "" }} + targetSelector: + adguard: + adguard: + mountPath: /opt/adguardhome/conf + {{/* # FIXME: See above + 01-permissions: + mountPath: /mnt/directories/conf + */}} +{{- end -}} diff --git a/library/ix-dev/community/adguard-home/templates/_portal.tpl b/library/ix-dev/community/adguard-home/templates/_portal.tpl new file mode 100644 index 0000000000..cce8ce8915 --- /dev/null +++ b/library/ix-dev/community/adguard-home/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "adguard.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: / + port: {{ .Values.adguardNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/adguard-home/templates/common.yaml b/library/ix-dev/community/adguard-home/templates/common.yaml new file mode 100644 index 0000000000..c0da7005d8 --- /dev/null +++ b/library/ix-dev/community/adguard-home/templates/common.yaml @@ -0,0 +1,9 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "adguard.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "adguard.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/adguard-home/upgrade_strategy b/library/ix-dev/community/adguard-home/upgrade_strategy new file mode 100755 index 0000000000..ca1d31c97f --- /dev/null +++ b/library/ix-dev/community/adguard-home/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'v[0-9]+\.[0-9]+\.[0-9]+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/adguard-home/values.yaml b/library/ix-dev/community/adguard-home/values.yaml new file mode 100644 index 0000000000..296e86c8fa --- /dev/null +++ b/library/ix-dev/community/adguard-home/values.yaml @@ -0,0 +1,28 @@ +image: + repository: adguard/adguardhome + tag: v0.107.26 + pullPolicy: IfNotPresent + +resources: + limits: + cpu: 4000m + memory: 8Gi + +adguardNetwork: + webPort: 30000 + enableDHCP: false + +# FIXME: See _adguard.tpl +# adguardRunAs: +# user: 568 +# group: 568 + +adguardStorage: + work: + type: ixVolume + hostPath: "" + datasetName: work + conf: + type: ixVolume + hostPath: "" + datasetName: conf