From b8ae72d0a33a4ddc27bdc5cafd99337da0e990a7 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Thu, 16 Mar 2023 18:06:54 +0200 Subject: [PATCH 1/5] Add ipfs to community train --- library/ix-dev/community/ipfs/Chart.lock | 6 + library/ix-dev/community/ipfs/Chart.yaml | 26 +++ library/ix-dev/community/ipfs/README.md | 7 + library/ix-dev/community/ipfs/app-readme.md | 7 + .../community/ipfs/charts/common-1.0.0.tgz | Bin 0 -> 53559 bytes .../community/ipfs/ci/basic-values.yaml | 9 + .../community/ipfs/ci/extra-env-values.yaml | 16 ++ .../community/ipfs/ci/hostNet-values.yaml | 11 + library/ix-dev/community/ipfs/item.yaml | 5 + library/ix-dev/community/ipfs/questions.yaml | 219 ++++++++++++++++++ .../ix-dev/community/ipfs/templates/NOTES.txt | 1 + .../ipfs/templates/_configuration.tpl | 60 +++++ .../ix-dev/community/ipfs/templates/_ipfs.tpl | 146 ++++++++++++ .../community/ipfs/templates/_portal.tpl | 12 + .../community/ipfs/templates/common.yaml | 10 + library/ix-dev/community/ipfs/values.yaml | 29 +++ 16 files changed, 564 insertions(+) create mode 100644 library/ix-dev/community/ipfs/Chart.lock create mode 100644 library/ix-dev/community/ipfs/Chart.yaml create mode 100644 library/ix-dev/community/ipfs/README.md create mode 100644 library/ix-dev/community/ipfs/app-readme.md create mode 100644 library/ix-dev/community/ipfs/charts/common-1.0.0.tgz create mode 100644 library/ix-dev/community/ipfs/ci/basic-values.yaml create mode 100644 library/ix-dev/community/ipfs/ci/extra-env-values.yaml create mode 100644 library/ix-dev/community/ipfs/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/ipfs/item.yaml create mode 100644 library/ix-dev/community/ipfs/questions.yaml create mode 100644 library/ix-dev/community/ipfs/templates/NOTES.txt create mode 100644 library/ix-dev/community/ipfs/templates/_configuration.tpl create mode 100644 library/ix-dev/community/ipfs/templates/_ipfs.tpl create mode 100644 library/ix-dev/community/ipfs/templates/_portal.tpl create mode 100644 library/ix-dev/community/ipfs/templates/common.yaml create mode 100644 library/ix-dev/community/ipfs/values.yaml diff --git a/library/ix-dev/community/ipfs/Chart.lock b/library/ix-dev/community/ipfs/Chart.lock new file mode 100644 index 00000000000..0557966f3f4 --- /dev/null +++ b/library/ix-dev/community/ipfs/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.0 +digest: sha256:f90dc95623b075f1d9ec4c4ba12464e2e789176ce7282a3aede37222201763b6 +generated: "2023-03-09T22:30:24.240799718+02:00" diff --git a/library/ix-dev/community/ipfs/Chart.yaml b/library/ix-dev/community/ipfs/Chart.yaml new file mode 100644 index 00000000000..f719df02c7d --- /dev/null +++ b/library/ix-dev/community/ipfs/Chart.yaml @@ -0,0 +1,26 @@ +name: ipfs +description: Interplanetary Filesystem - the Web3 standard for content-addressing, interoperable with HTTP +annotations: + title: IPFS +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '0.18.1' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.0 +home: https://ipfs.tech/ +icon: https://avatars.githubusercontent.com/u/10536621 +sources: +- https://github.com/ipfs/kubo +- https://github.com/truenas/charts/tree/master/community/ipfs +- https://ipfs.tech/ +keywords: +- storage +- ipfs +- kubo diff --git a/library/ix-dev/community/ipfs/README.md b/library/ix-dev/community/ipfs/README.md new file mode 100644 index 00000000000..6de151ae84c --- /dev/null +++ b/library/ix-dev/community/ipfs/README.md @@ -0,0 +1,7 @@ +# IPFS + +[Interplanetary Filesystem](https://ipfs.tech) - the Web3 standard for content-addressing, interoperable with HTTP + +> On every application start, a container will be launched with **root** privileges. This is required +> in order to apply the correct permissions to the ipfs directories. Afterward, the `ipfs` container +> will run as a **non**-root user (Default: `568`). diff --git a/library/ix-dev/community/ipfs/app-readme.md b/library/ix-dev/community/ipfs/app-readme.md new file mode 100644 index 00000000000..6de151ae84c --- /dev/null +++ b/library/ix-dev/community/ipfs/app-readme.md @@ -0,0 +1,7 @@ +# IPFS + +[Interplanetary Filesystem](https://ipfs.tech) - the Web3 standard for content-addressing, interoperable with HTTP + +> On every application start, a container will be launched with **root** privileges. This is required +> in order to apply the correct permissions to the ipfs directories. Afterward, the `ipfs` container +> will run as a **non**-root user (Default: `568`). diff --git a/library/ix-dev/community/ipfs/charts/common-1.0.0.tgz b/library/ix-dev/community/ipfs/charts/common-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..bf8b31f25f0e801099ce251e7ee6ea6d09e68177 GIT binary patch literal 53559 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

dZXz>QK4cAydG#ST|WHu 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 G`UU_5%e>eC literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/ipfs/ci/basic-values.yaml b/library/ix-dev/community/ipfs/ci/basic-values.yaml new file mode 100644 index 00000000000..aecb56a0b45 --- /dev/null +++ b/library/ix-dev/community/ipfs/ci/basic-values.yaml @@ -0,0 +1,9 @@ +ipfsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + datasetName: data + staging: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/staging + datasetName: staging diff --git a/library/ix-dev/community/ipfs/ci/extra-env-values.yaml b/library/ix-dev/community/ipfs/ci/extra-env-values.yaml new file mode 100644 index 00000000000..c42e4c58925 --- /dev/null +++ b/library/ix-dev/community/ipfs/ci/extra-env-values.yaml @@ -0,0 +1,16 @@ +ipfsConfig: + additionalEnvs: + - name: GOLOG_LOG_LEVEL + value: debug + - name: GOLOG_LOG_FMT + value: json + +ipfsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + datasetName: data + staging: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/staging + datasetName: staging diff --git a/library/ix-dev/community/ipfs/ci/hostNet-values.yaml b/library/ix-dev/community/ipfs/ci/hostNet-values.yaml new file mode 100644 index 00000000000..f7e86da851c --- /dev/null +++ b/library/ix-dev/community/ipfs/ci/hostNet-values.yaml @@ -0,0 +1,11 @@ +ipfsStorage: + data: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/data + datasetName: data + staging: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/staging + datasetName: staging +ipfsNetwork: + hostNetwork: true diff --git a/library/ix-dev/community/ipfs/item.yaml b/library/ix-dev/community/ipfs/item.yaml new file mode 100644 index 00000000000..d9e30f48eab --- /dev/null +++ b/library/ix-dev/community/ipfs/item.yaml @@ -0,0 +1,5 @@ +icon_url: https://avatars.githubusercontent.com/u/10536621 +categories: + - storage + - ipfs + - kubo diff --git a/library/ix-dev/community/ipfs/questions.yaml b/library/ix-dev/community/ipfs/questions.yaml new file mode 100644 index 00000000000..a7d44ff127c --- /dev/null +++ b/library/ix-dev/community/ipfs/questions.yaml @@ -0,0 +1,219 @@ +groups: + - name: IPFS Configuration + description: Configure IPFS + - name: User and Group Configuration + description: Configure User and Group for IPFS + - name: Network Configuration + description: Configure Network for IPFS + - name: Storage Configuration + description: Configure Storage for IPFS + - name: Resources Configuration + description: Configure Resources for IPFS + +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: ipfsConfig + label: "" + group: IPFS Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for IPFS. + 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: ipfsRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that IPFS will run as. + schema: + type: int + min: 1 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that IPFS will run as. + schema: + type: int + min: 1 + default: 568 + required: true + + - variable: ipfsNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: apiPort + label: API Port + description: The port for the IPFS API (And WebUI). + schema: + type: int + default: 30000 + min: 9000 + max: 65535 + required: true + - variable: swarmPort + label: Swarm Port + description: The port for the IPFS Swarm. Both TCP and UDP + schema: + type: int + default: 30001 + min: 9000 + max: 65535 + required: true + - variable: gatewayPort + label: Gateway Port + description: The port for the IPFS Gateway. + schema: + type: int + default: 30002 + 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: ipfsStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: data + label: IPFS Data Storage + description: The path to store IPFS data. + schema: + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path + - value: ixVolume + description: ixVolume + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: data + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: staging + label: IPFS Staging Storage + description: The path to store IPFS staging storage. + schema: + type: dict + attrs: + - variable: type + label: Type + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path + - value: ixVolume + description: ixVolume + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: staging + $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 qBittorrent. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for qBittorrent. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/ipfs/templates/NOTES.txt b/library/ix-dev/community/ipfs/templates/NOTES.txt new file mode 100644 index 00000000000..ba4e01146c0 --- /dev/null +++ b/library/ix-dev/community/ipfs/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/ipfs/templates/_configuration.tpl b/library/ix-dev/community/ipfs/templates/_configuration.tpl new file mode 100644 index 00000000000..ff782816ef7 --- /dev/null +++ b/library/ix-dev/community/ipfs/templates/_configuration.tpl @@ -0,0 +1,60 @@ +{{- define "ipfs.configuration" -}} +{{/* Default Swarm Addresses https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesswarm */}} +{{ $swarmAddressesList := (list + (printf "/ip4/0.0.0.0/tcp/%v" .Values.ipfsNetwork.swarmPort) + (printf "/ip6/::/tcp/%v" .Values.ipfsNetwork.swarmPort) + (printf "/ip4/0.0.0.0/udp/%v/quic" .Values.ipfsNetwork.swarmPort) + (printf "/ip4/0.0.0.0/udp/%v/quic-v1" .Values.ipfsNetwork.swarmPort) + (printf "/ip4/0.0.0.0/udp/%v/quic-v1/webtransport" .Values.ipfsNetwork.swarmPort) + (printf "/ip6/::/udp/%v/quic" .Values.ipfsNetwork.swarmPort) + (printf "/ip6/::/udp/%v/quic-v1" .Values.ipfsNetwork.swarmPort) + (printf "/ip6/::/udp/%v/quic-v1/webtransport" .Values.ipfsNetwork.swarmPort) +) }} + +{{ $swarmAddresses := printf "[ \"%s\" ]" (join "\", \"" $swarmAddressesList) }} + +{{/* Default API Address https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesapi */}} +{{ $apiAddresses := printf "/ip4/0.0.0.0/tcp/%v" .Values.ipfsNetwork.apiPort }} +{{/* Default Gateway Address https://github.com/ipfs/kubo/blob/master/docs/config.md#addressesgateway */}} +{{ $gatewayAddresses := printf "/ip4/0.0.0.0/tcp/%v" .Values.ipfsNetwork.gatewayPort }} +{{ $allowOrigins := "[ \"*\" ]" }} +{{ $allowMethods := "[ \"PUT\", \"POST\" ]" }} + + +{{/* Configmaps */}} +configmap: + config-script: + enabled: true + data: + init-config.sh: | + #!/bin/sh + set -e + + if [ ! -f /data/ipfs/config ]; then + # Create the IPFS config file + echo "Initializing IPFS" + ipfs init + fi + + # Configure the Addresses.API + echo "Configuring the Addresses.API to {{ $apiAddresses }}" + ipfs config Addresses.API {{ $apiAddresses }} + + # Configure the Addresses.Gateway + echo "Configuring the Addresses.Gateway to {{ $gatewayAddresses }}" + ipfs config Addresses.Gateway {{ $gatewayAddresses }} + + # Configure the Addresses.Swarm + echo "Configuring the Addresses.Swarm to {{ $swarmAddresses | squote }}" + ipfs config Addresses.Swarm --json {{ $swarmAddresses | squote }} + + # Configure the API.HTTPHeaders.Access-Control-Allow-Origin + echo "Configuring the API.HTTPHeaders.Access-Control-Allow-Origin to {{ $allowOrigins | squote }}" + ipfs config API.HTTPHeaders.Access-Control-Allow-Origin --json {{ $allowOrigins | squote }} + + # Configure the API.HTTPHeaders.Access-Control-Allow-Methods + echo "Configuring the API.HTTPHeaders.Access-Control-Allow-Methods to {{ $allowMethods | squote }}" + ipfs config API.HTTPHeaders.Access-Control-Allow-Methods --json {{ $allowMethods | squote }} + + echo "Finished configuring IPFS" +{{- end -}} diff --git a/library/ix-dev/community/ipfs/templates/_ipfs.tpl b/library/ix-dev/community/ipfs/templates/_ipfs.tpl new file mode 100644 index 00000000000..aa5fc915026 --- /dev/null +++ b/library/ix-dev/community/ipfs/templates/_ipfs.tpl @@ -0,0 +1,146 @@ +{{- define "ipfs.workload" -}} +workload: + ipfs: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.ipfsNetwork.hostNetwork }} + containers: + ipfs: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.ipfsRunAs.user }} + runAsGroup: {{ .Values.ipfsRunAs.group }} + {{ with .Values.ipfsConfig.additionalEnvs }} + env: + {{ range $env := . }} + {{ $env.name }}: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: exec + command: + - ipfs + - dag + - stat + # https://github.com/ipfs/kubo/blob/8f638dcbcd875ecff92021e4b62d0af8848022ce/Dockerfile#L116 + - /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn + readiness: + enabled: true + type: exec + command: + - ipfs + - dag + - stat + - /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn + startup: + enabled: true + type: exec + command: + - ipfs + - dag + - stat + - /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "UID" .Values.ipfsRunAs.user "GID" .Values.ipfsRunAs.group "type" "init") | nindent 8 }} + # "zz" prefix is used to ensure this container runs after the permissions container + zz-init-config: + enabled: true + type: init + imageSelector: image + securityContext: + runAsUser: {{ .Values.ipfsRunAs.user }} + runAsGroup: {{ .Values.ipfsRunAs.group }} + command: /init-config.sh + resources: + limits: + memory: 512Mi + cpu: 1000m +{{/* Service */}} +service: + ipfs: + enabled: true + primary: true + type: NodePort + targetSelector: ipfs + ports: + api: + enabled: true + primary: true + port: {{ .Values.ipfsNetwork.apiPort }} + nodePort: {{ .Values.ipfsNetwork.apiPort }} + targetSelector: ipfs + ipfs-swarm: + enabled: true + type: NodePort + targetSelector: ipfs + ports: + swarm-tcp: + enabled: true + primary: true + port: {{ .Values.ipfsNetwork.swarmPort }} + nodePort: {{ .Values.ipfsNetwork.swarmPort }} + targetSelector: ipfs + swarm-udp: + enabled: true + primary: true + port: {{ .Values.ipfsNetwork.swarmPort }} + nodePort: {{ .Values.ipfsNetwork.swarmPort }} + protocol: udp + targetSelector: ipfs + ipfs-gateway: + enabled: true + type: NodePort + targetSelector: ipfs + ports: + ipfs-gateway: + enabled: true + primary: true + port: {{ .Values.ipfsNetwork.gatewayPort }} + nodePort: {{ .Values.ipfsNetwork.gatewayPort }} + targetSelector: ipfs + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.ipfsStorage.data.type }} + datasetName: {{ .Values.ipfsStorage.data.datasetName | default "" }} + hostPath: {{ .Values.ipfsStorage.data.hostPath | default "" }} + targetSelector: + ipfs: + ipfs: + mountPath: /data/ipfs + permissions: + mountPath: /mnt/directories/data + zz-init-config: + mountPath: /data/ipfs + staging: + enabled: true + type: {{ .Values.ipfsStorage.staging.type }} + datasetName: {{ .Values.ipfsStorage.staging.datasetName | default "" }} + hostPath: {{ .Values.ipfsStorage.staging.hostPath | default "" }} + targetSelector: + ipfs: + ipfs: + mountPath: /export + permissions: + mountPath: /mnt/directories/export + config-script: + enabled: true + type: configmap + objectName: config-script + defaultMode: "0755" + targetSelector: + ipfs: + zz-init-config: + mountPath: /init-config.sh + readOnly: true + subPath: init-config.sh + +{{- end -}} diff --git a/library/ix-dev/community/ipfs/templates/_portal.tpl b/library/ix-dev/community/ipfs/templates/_portal.tpl new file mode 100644 index 00000000000..b167f0f42bc --- /dev/null +++ b/library/ix-dev/community/ipfs/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "ipfs.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: /webui + port: {{ .Values.ipfsNetwork.apiPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/ipfs/templates/common.yaml b/library/ix-dev/community/ipfs/templates/common.yaml new file mode 100644 index 00000000000..e147b95383b --- /dev/null +++ b/library/ix-dev/community/ipfs/templates/common.yaml @@ -0,0 +1,10 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "ipfs.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "ipfs.configuration" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "ipfs.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/ipfs/values.yaml b/library/ix-dev/community/ipfs/values.yaml new file mode 100644 index 00000000000..7902e5aa4bb --- /dev/null +++ b/library/ix-dev/community/ipfs/values.yaml @@ -0,0 +1,29 @@ +image: + repository: ipfs/kubo + pullPolicy: IfNotPresent + tag: v0.18.1 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +ipfsConfig: + additionalEnvs: [] +ipfsNetwork: + apiPort: 30000 + swarmPort: 30001 + gatewayPort: 30002 + hostNetwork: false +ipfsRunAs: + user: 568 + group: 568 +ipfsStorage: + data: + type: ixVolume + hostPath: "" + datasetName: data + staging: + type: ixVolume + hostPath: "" + datasetName: staging From b2391bee468c75bbaab6e3566bc009beb93b1941 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Thu, 16 Mar 2023 20:51:57 +0200 Subject: [PATCH 2/5] run chown before config and only once --- library/ix-dev/community/ipfs/templates/_ipfs.tpl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/library/ix-dev/community/ipfs/templates/_ipfs.tpl b/library/ix-dev/community/ipfs/templates/_ipfs.tpl index aa5fc915026..69a6d44a23e 100644 --- a/library/ix-dev/community/ipfs/templates/_ipfs.tpl +++ b/library/ix-dev/community/ipfs/templates/_ipfs.tpl @@ -47,9 +47,12 @@ workload: - stat - /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn initContainers: - {{- include "ix.v1.common.app.permissions" (dict "UID" .Values.ipfsRunAs.user "GID" .Values.ipfsRunAs.group "type" "init") | nindent 8 }} + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.ipfsRunAs.user + "GID" .Values.ipfsRunAs.group + "type" "install") | nindent 8 }} # "zz" prefix is used to ensure this container runs after the permissions container - zz-init-config: + 02-init-config: enabled: true type: init imageSelector: image @@ -116,7 +119,7 @@ persistence: ipfs: ipfs: mountPath: /data/ipfs - permissions: + 01-permissions: mountPath: /mnt/directories/data zz-init-config: mountPath: /data/ipfs @@ -129,7 +132,7 @@ persistence: ipfs: ipfs: mountPath: /export - permissions: + 01-permissions: mountPath: /mnt/directories/export config-script: enabled: true From 2fbb2b00456c5401586e9cb014fb97f90f055082 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Thu, 16 Mar 2023 21:11:39 +0200 Subject: [PATCH 3/5] fix selector --- library/ix-dev/community/ipfs/templates/_ipfs.tpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ix-dev/community/ipfs/templates/_ipfs.tpl b/library/ix-dev/community/ipfs/templates/_ipfs.tpl index 69a6d44a23e..0f9120bf782 100644 --- a/library/ix-dev/community/ipfs/templates/_ipfs.tpl +++ b/library/ix-dev/community/ipfs/templates/_ipfs.tpl @@ -51,7 +51,7 @@ workload: "UID" .Values.ipfsRunAs.user "GID" .Values.ipfsRunAs.group "type" "install") | nindent 8 }} - # "zz" prefix is used to ensure this container runs after the permissions container + # "02" prefix is used to ensure this container runs after the permissions container 02-init-config: enabled: true type: init @@ -121,7 +121,7 @@ persistence: mountPath: /data/ipfs 01-permissions: mountPath: /mnt/directories/data - zz-init-config: + 02-init-config: mountPath: /data/ipfs staging: enabled: true @@ -141,7 +141,7 @@ persistence: defaultMode: "0755" targetSelector: ipfs: - zz-init-config: + 02-init-config: mountPath: /init-config.sh readOnly: true subPath: init-config.sh From 25a9b7b08983ee48ee7669ee8bed1bb11383f4d4 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Fri, 17 Mar 2023 14:52:26 +0200 Subject: [PATCH 4/5] update readme(s) --- library/ix-dev/community/ipfs/README.md | 6 +++--- library/ix-dev/community/ipfs/app-readme.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/library/ix-dev/community/ipfs/README.md b/library/ix-dev/community/ipfs/README.md index 6de151ae84c..fc9b3ad9961 100644 --- a/library/ix-dev/community/ipfs/README.md +++ b/library/ix-dev/community/ipfs/README.md @@ -2,6 +2,6 @@ [Interplanetary Filesystem](https://ipfs.tech) - the Web3 standard for content-addressing, interoperable with HTTP -> On every application start, a container will be launched with **root** privileges. This is required -> in order to apply the correct permissions to the ipfs directories. Afterward, the `ipfs` container -> will run as a **non**-root user (Default: `568`). +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the ipfs directories. +> Afterward, the `ipfs` container will run as a **non**-root user (Default: `568`). diff --git a/library/ix-dev/community/ipfs/app-readme.md b/library/ix-dev/community/ipfs/app-readme.md index 6de151ae84c..fc9b3ad9961 100644 --- a/library/ix-dev/community/ipfs/app-readme.md +++ b/library/ix-dev/community/ipfs/app-readme.md @@ -2,6 +2,6 @@ [Interplanetary Filesystem](https://ipfs.tech) - the Web3 standard for content-addressing, interoperable with HTTP -> On every application start, a container will be launched with **root** privileges. This is required -> in order to apply the correct permissions to the ipfs directories. Afterward, the `ipfs` container -> will run as a **non**-root user (Default: `568`). +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the ipfs directories. +> Afterward, the `ipfs` container will run as a **non**-root user (Default: `568`). From 782f0c7f0cd275e61352250f7388551c59b57c93 Mon Sep 17 00:00:00 2001 From: Stavros kois Date: Fri, 17 Mar 2023 14:53:23 +0200 Subject: [PATCH 5/5] add update strategy --- .../ix-dev/community/ipfs/upgrade_strategy | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100755 library/ix-dev/community/ipfs/upgrade_strategy diff --git a/library/ix-dev/community/ipfs/upgrade_strategy b/library/ix-dev/community/ipfs/upgrade_strategy new file mode 100755 index 00000000000..13d38b0f3c8 --- /dev/null +++ b/library/ix-dev/community/ipfs/upgrade_strategy @@ -0,0 +1,26 @@ +#!/usr/bin/python3 +import json +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + version = semantic_versioning(image_tags[key]) + if not version: + return {} + + return { + 'tags': {key: f'v{version}'}, + 'app_version': f'v{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)))