From a4177f09dc0acea8611d771e809f01c5f4aad7a3 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Wed, 30 Aug 2023 14:19:06 +0300 Subject: [PATCH] NAS-123672 / 24.04 / add `joplin` to `community` apps (#1471) * add `joplin` to `community` apps * add storage and service * add more boilerplat * add some test values * add values * update readme * add basic ui * add initialmeta * add todo * render config * use 1001 * fix probes * reduce permissiosn * fix portal * remove todo * bump common * simplify probe header * add deafult creds * remove redundant values * update wording --- library/ix-dev/community/joplin/Chart.lock | 6 + library/ix-dev/community/joplin/Chart.yaml | 25 +++ library/ix-dev/community/joplin/README.md | 11 + library/ix-dev/community/joplin/app-readme.md | 11 + .../community/joplin/charts/common-1.1.0.tgz | Bin 0 -> 61695 bytes .../community/joplin/ci/basic-values.yaml | 10 + .../community/joplin/ci/hostNet-values.yaml | 11 + library/ix-dev/community/joplin/item.yaml | 9 + library/ix-dev/community/joplin/metadata.yaml | 8 + .../ix-dev/community/joplin/questions.yaml | 207 ++++++++++++++++++ .../community/joplin/templates/NOTES.txt | 1 + .../joplin/templates/_configuration.tpl | 29 +++ .../community/joplin/templates/_joplin.tpl | 71 ++++++ .../joplin/templates/_persistence.tpl | 31 +++ .../community/joplin/templates/_portal.tpl | 25 +++ .../community/joplin/templates/_postgres.tpl | 6 + .../community/joplin/templates/_service.tpl | 26 +++ .../community/joplin/templates/common.yaml | 13 ++ .../ix-dev/community/joplin/upgrade_info.json | 1 + .../ix-dev/community/joplin/upgrade_strategy | 31 +++ library/ix-dev/community/joplin/values.yaml | 47 ++++ 21 files changed, 579 insertions(+) create mode 100644 library/ix-dev/community/joplin/Chart.lock create mode 100644 library/ix-dev/community/joplin/Chart.yaml create mode 100644 library/ix-dev/community/joplin/README.md create mode 100644 library/ix-dev/community/joplin/app-readme.md create mode 100644 library/ix-dev/community/joplin/charts/common-1.1.0.tgz create mode 100644 library/ix-dev/community/joplin/ci/basic-values.yaml create mode 100644 library/ix-dev/community/joplin/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/joplin/item.yaml create mode 100644 library/ix-dev/community/joplin/metadata.yaml create mode 100644 library/ix-dev/community/joplin/questions.yaml create mode 100644 library/ix-dev/community/joplin/templates/NOTES.txt create mode 100644 library/ix-dev/community/joplin/templates/_configuration.tpl create mode 100644 library/ix-dev/community/joplin/templates/_joplin.tpl create mode 100644 library/ix-dev/community/joplin/templates/_persistence.tpl create mode 100644 library/ix-dev/community/joplin/templates/_portal.tpl create mode 100644 library/ix-dev/community/joplin/templates/_postgres.tpl create mode 100644 library/ix-dev/community/joplin/templates/_service.tpl create mode 100644 library/ix-dev/community/joplin/templates/common.yaml create mode 100644 library/ix-dev/community/joplin/upgrade_info.json create mode 100755 library/ix-dev/community/joplin/upgrade_strategy create mode 100644 library/ix-dev/community/joplin/values.yaml diff --git a/library/ix-dev/community/joplin/Chart.lock b/library/ix-dev/community/joplin/Chart.lock new file mode 100644 index 0000000000..ab870c6b40 --- /dev/null +++ b/library/ix-dev/community/joplin/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.1.0 +digest: sha256:752ce76025f5b61094bd2b18ca11693eb9d26d0dde4eb2e63cd2330cbffe9e73 +generated: "2023-08-24T18:43:23.380249283+03:00" diff --git a/library/ix-dev/community/joplin/Chart.yaml b/library/ix-dev/community/joplin/Chart.yaml new file mode 100644 index 0000000000..046e27b7d6 --- /dev/null +++ b/library/ix-dev/community/joplin/Chart.yaml @@ -0,0 +1,25 @@ +name: joplin +description: Joplin is an open source note-taking app. Capture your thoughts and securely access them from any device +annotations: + title: Joplin +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 2.12.1-beta +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.1.0 +home: https://joplinapp.org/ +icon: https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/LinuxIcons/256x256.png +sources: + - https://github.com/laurent22/joplin + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/joplin + - https://hub.docker.com/r/joplin/server/ +keywords: + - notes diff --git a/library/ix-dev/community/joplin/README.md b/library/ix-dev/community/joplin/README.md new file mode 100644 index 0000000000..465075c91a --- /dev/null +++ b/library/ix-dev/community/joplin/README.md @@ -0,0 +1,11 @@ +# Joplin + +[Joplin](https://joplinapp.org) is an open source note-taking app. Capture your thoughts and securely access them from any device + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. diff --git a/library/ix-dev/community/joplin/app-readme.md b/library/ix-dev/community/joplin/app-readme.md new file mode 100644 index 0000000000..465075c91a --- /dev/null +++ b/library/ix-dev/community/joplin/app-readme.md @@ -0,0 +1,11 @@ +# Joplin + +[Joplin](https://joplinapp.org) is an open source note-taking app. Capture your thoughts and securely access them from any device + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `postgres` directories. +> Afterward, the `postgres` container will run as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `postgres` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `postgres` data directories. diff --git a/library/ix-dev/community/joplin/charts/common-1.1.0.tgz b/library/ix-dev/community/joplin/charts/common-1.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ccc20d3039f1f3bed23c1cb3cedb0964d214ed31 GIT binary patch literal 61695 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 literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/joplin/ci/basic-values.yaml b/library/ix-dev/community/joplin/ci/basic-values.yaml new file mode 100644 index 0000000000..d537894cbc --- /dev/null +++ b/library/ix-dev/community/joplin/ci/basic-values.yaml @@ -0,0 +1,10 @@ +joplinNetwork: + webPort: 31000 + +joplinStorage: + pgData: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgData + pgBackup: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgBackup diff --git a/library/ix-dev/community/joplin/ci/hostNet-values.yaml b/library/ix-dev/community/joplin/ci/hostNet-values.yaml new file mode 100644 index 0000000000..c14b819c0e --- /dev/null +++ b/library/ix-dev/community/joplin/ci/hostNet-values.yaml @@ -0,0 +1,11 @@ +joplinNetwork: + webPort: 31000 + hostNetwork: true + +joplinStorage: + pgData: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgData + pgBackup: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/pgBackup diff --git a/library/ix-dev/community/joplin/item.yaml b/library/ix-dev/community/joplin/item.yaml new file mode 100644 index 0000000000..57b880c20b --- /dev/null +++ b/library/ix-dev/community/joplin/item.yaml @@ -0,0 +1,9 @@ +icon_url: https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/LinuxIcons/256x256.png +categories: + - productivity +screenshots: + - https://joplinapp.org/images/home-top-img-2x.webp + - https://joplinapp.org/images/multimedia-notes-img.png + - https://joplinapp.org/images/save-web-img.png +tags: + - notes diff --git a/library/ix-dev/community/joplin/metadata.yaml b/library/ix-dev/community/joplin/metadata.yaml new file mode 100644 index 0000000000..1bfd02fc01 --- /dev/null +++ b/library/ix-dev/community/joplin/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: joplin + groupName: joplin + gid: 1001 + uid: 1001 + description: Joplin can run as a non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/joplin/questions.yaml b/library/ix-dev/community/joplin/questions.yaml new file mode 100644 index 0000000000..f15aa85850 --- /dev/null +++ b/library/ix-dev/community/joplin/questions.yaml @@ -0,0 +1,207 @@ +groups: + - name: Joplin Configuration + description: Configure Joplin + - name: Network Configuration + description: Configure Network for Joplin + - name: Storage Configuration + description: Configure Storage for Joplin + - name: Resources Configuration + description: Configure Resources for Joplin + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: joplinConfig + label: "" + group: Joplin Configuration + schema: + type: dict + attrs: + - variable: baseUrl + label: Base URL + description: | + The base URL for Joplin.
+ Examples:
+ https://joplin.example.com + http://192.168.1.100:30062 + schema: + type: uri + default: "" + required: true + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Joplin. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: joplinNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Joplin Web UI. + schema: + type: int + default: 30062 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: joplinStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: pgData + label: Joplin Postgres Data Storage + description: The path to store Joplin Postgres Data. + 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: pgData + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: pgBackup + label: Joplin Postgres Backup Storage + description: The path to store Joplin Postgres Backup. + 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: pgBackup + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Joplin. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Joplin. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true diff --git a/library/ix-dev/community/joplin/templates/NOTES.txt b/library/ix-dev/community/joplin/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/joplin/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/joplin/templates/_configuration.tpl b/library/ix-dev/community/joplin/templates/_configuration.tpl new file mode 100644 index 0000000000..5b2aec6441 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_configuration.tpl @@ -0,0 +1,29 @@ +{{- define "joplin.configuration" -}} + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "joplin" -}} + {{- $dbName := "joplin" -}} + + {{- $dbPass := randAlphaNum 32 -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- end -}} + + {{/* Temporary set dynamic db details on values, + so we can print them on the notes */}} + {{- $_ := set .Values "joplinDbPass" $dbPass -}} + {{- $_ := set .Values "joplinDbHost" $dbHost -}} + + {{- $dbURL := (printf "postgres://%s:%s@%s:5432/%s?sslmode=disable" $dbUser $dbPass $dbHost $dbName) }} + +secret: + postgres-creds: + enabled: true + data: + POSTGRES_USER: {{ $dbUser }} + POSTGRES_DB: {{ $dbName }} + POSTGRES_PASSWORD: {{ $dbPass }} + POSTGRES_HOST: {{ $dbHost }} + POSTGRES_URL: {{ $dbURL }} +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/_joplin.tpl b/library/ix-dev/community/joplin/templates/_joplin.tpl new file mode 100644 index 0000000000..1a5211aae9 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_joplin.tpl @@ -0,0 +1,71 @@ +{{- define "joplin.workload" -}} +workload: + joplin: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.joplinNetwork.hostNetwork }} + containers: + joplin: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + readOnlyRootFilesystem: false + env: + APP_PORT: {{ .Values.joplinNetwork.webPort }} + APP_BASE_URL: {{ .Values.joplinConfig.baseUrl }} + DB_CLIENT: pg + POSTGRES_PORT: 5432 + POSTGRES_HOST: + secretKeyRef: + name: postgres-creds + key: POSTGRES_HOST + POSTGRES_DATABASE: + secretKeyRef: + name: postgres-creds + key: POSTGRES_DB + POSTGRES_USER: + secretKeyRef: + name: postgres-creds + key: POSTGRES_USER + POSTGRES_PASSWORD: + secretKeyRef: + name: postgres-creds + key: POSTGRES_PASSWORD + {{ with .Values.joplinConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: {{ .Values.joplinNetwork.webPort }} + path: /api/ping + httpHeaders: + Host: '{{ .Values.joplinConfig.baseUrl | trimPrefix "https://" | trimPrefix "http://" | trimSuffix "/" }}' + readiness: + enabled: true + type: http + port: {{ .Values.joplinNetwork.webPort }} + path: /api/ping + httpHeaders: + Host: '{{ .Values.joplinConfig.baseUrl | trimPrefix "https://" | trimPrefix "http://" | trimSuffix "/" }}' + startup: + enabled: true + type: http + port: {{ .Values.joplinNetwork.webPort }} + path: /api/ping + httpHeaders: + Host: '{{ .Values.joplinConfig.baseUrl | trimPrefix "https://" | trimPrefix "http://" | trimSuffix "/" }}' + initContainers: + {{- include "ix.v1.common.app.postgresWait" (dict "name" "postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/_persistence.tpl b/library/ix-dev/community/joplin/templates/_persistence.tpl new file mode 100644 index 0000000000..280a05a7ff --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_persistence.tpl @@ -0,0 +1,31 @@ +{{- define "joplin.persistence" -}} +persistence: + postgresdata: + enabled: true + type: {{ .Values.joplinStorage.pgData.type }} + datasetName: {{ .Values.joplinStorage.pgData.datasetName | default "" }} + hostPath: {{ .Values.joplinStorage.pgData.hostPath | default "" }} + targetSelector: + # Postgres pod + postgres: + # Postgres container + postgres: + mountPath: /var/lib/postgresql/data + # Postgres - Permissions container + permissions: + mountPath: /mnt/directories/postgres_data + postgresbackup: + enabled: true + type: {{ .Values.joplinStorage.pgBackup.type }} + datasetName: {{ .Values.joplinStorage.pgBackup.datasetName | default "" }} + hostPath: {{ .Values.joplinStorage.pgBackup.hostPath | default "" }} + targetSelector: + # Postgres backup pod + postgresbackup: + # Postgres backup container + postgresbackup: + mountPath: /postgres_backup + # Postgres - Permissions container + permissions: + mountPath: /mnt/directories/postgres_backup +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/_portal.tpl b/library/ix-dev/community/joplin/templates/_portal.tpl new file mode 100644 index 0000000000..b26c6cae49 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_portal.tpl @@ -0,0 +1,25 @@ +{{- define "joplin.portal" -}} + {{ $prot := "http" }} + {{ if hasPrefix "https://" .Values.joplinConfig.baseUrl }} + {{ $prot = "https" }} + {{ end }} + {{ $host := "$node_ip" }} + {{ $port := .Values.joplinNetwork.webPort }} + {{ with .Values.joplinConfig.baseUrl }} + {{ $host = . | trimPrefix "http://" | trimPrefix "https://" | trimSuffix "/" }} + {{ if contains ":" $host }} + {{ $port = (split ":" $host)._1 }} + {{ $host = (split ":" $host)._0 }} + {{ end }} + {{ end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + port: {{ $port | quote }} + path: "/" + protocol: {{ $prot }} + host: {{ $host }} +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/_postgres.tpl b/library/ix-dev/community/joplin/templates/_postgres.tpl new file mode 100644 index 0000000000..0c050b6ca0 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_postgres.tpl @@ -0,0 +1,6 @@ +{{- define "postgres.workload" -}} +workload: +{{- include "ix.v1.common.app.postgres" (dict "secretName" "postgres-creds" + "resources" .Values.resources + "ixChartContext" .Values.ixChartContext) | nindent 2 }} +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/_service.tpl b/library/ix-dev/community/joplin/templates/_service.tpl new file mode 100644 index 0000000000..2ddc561a33 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/_service.tpl @@ -0,0 +1,26 @@ +{{- define "joplin.service" -}} +service: + joplin: + enabled: true + primary: true + type: NodePort + targetSelector: joplin + ports: + webui: + enabled: true + primary: true + port: {{ .Values.joplinNetwork.webPort }} + nodePort: {{ .Values.joplinNetwork.webPort }} + targetSelector: joplin + postgres: + enabled: true + type: ClusterIP + targetSelector: postgres + ports: + postgres: + enabled: true + primary: true + port: 5432 + targetPort: 5432 + targetSelector: postgres +{{- end -}} diff --git a/library/ix-dev/community/joplin/templates/common.yaml b/library/ix-dev/community/joplin/templates/common.yaml new file mode 100644 index 0000000000..b85d295bd4 --- /dev/null +++ b/library/ix-dev/community/joplin/templates/common.yaml @@ -0,0 +1,13 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "joplin.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "joplin.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "joplin.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "joplin.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "joplin.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/joplin/upgrade_info.json b/library/ix-dev/community/joplin/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/joplin/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/joplin/upgrade_strategy b/library/ix-dev/community/joplin/upgrade_strategy new file mode 100755 index 0000000000..e455e68fbf --- /dev/null +++ b/library/ix-dev/community/joplin/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'\d+\.\d+\.\d+-beta') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t.strip("-beta"): 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/joplin/values.yaml b/library/ix-dev/community/joplin/values.yaml new file mode 100644 index 0000000000..a74371ff61 --- /dev/null +++ b/library/ix-dev/community/joplin/values.yaml @@ -0,0 +1,47 @@ +image: + repository: joplin/server + pullPolicy: IfNotPresent + tag: 2.12.1-beta + +resources: + limits: + cpu: 4000m + memory: 8Gi + +joplinConfig: + baseUrl: http://localhost:30063 + additionalEnvs: [] + +joplinNetwork: + webPort: 30063 + hostNetwork: false + +joplinStorage: + pgData: + type: ixVolume + datasetName: pgData + pgBackup: + type: ixVolume + datasetName: pgBackup + +notes: + custom: | + ## Default Credentials + - Username: `admin@localhost` + - Password: `admin` + + ## Database + You can connect to the database using the pgAdmin App from the catalog + +

+ Database Details + + - Database: `joplin` + - Username: `joplin` + - Password: `{{ .Values.joplinDbPass }}` + - Host: `{{ .Values.joplinDbHost }}.{{ .Release.Namespace }}.svc.cluster.local` + - Port: `5432` + +
+ {{- $_ := unset .Values "joplinDbPass" }} + {{- $_ := unset .Values "joplinDbHost" }}