From 9633226c549a7e7a1581a235bf9b314c3d2a8fa5 Mon Sep 17 00:00:00 2001 From: sonicaj Date: Wed, 12 Apr 2023 10:28:30 +0000 Subject: [PATCH] Update catalog information --- catalog.json | 29 +- charts/ix-chart/2304.0.0/.helmignore | 23 + charts/ix-chart/2304.0.0/Chart.lock | 6 + charts/ix-chart/2304.0.0/Chart.yaml | 20 + charts/ix-chart/2304.0.0/README.md | 117 ++++ charts/ix-chart/2304.0.0/app-readme.md | 4 + .../2304.0.0/charts/common-2207.0.0.tgz | Bin 0 -> 4975 bytes charts/ix-chart/2304.0.0/ci/test-values.yaml | 46 ++ charts/ix-chart/2304.0.0/questions.yaml | 647 ++++++++++++++++++ charts/ix-chart/2304.0.0/templates/NOTES.txt | 2 + .../2304.0.0/templates/_containers.tpl | 77 +++ .../ix-chart/2304.0.0/templates/_helpers.tpl | 71 ++ .../2304.0.0/templates/_networking.tpl | 30 + .../ix-chart/2304.0.0/templates/_volumes.tpl | 51 ++ .../ix-chart/2304.0.0/templates/_workload.tpl | 183 +++++ .../templates/external-interfaces.yaml | 9 + .../ix-chart/2304.0.0/templates/service.yaml | 20 + .../ix-chart/2304.0.0/templates/workload.yaml | 14 + charts/ix-chart/item.yaml | 2 + community/gitea/1.0.0/Chart.lock | 6 + community/gitea/1.0.0/Chart.yaml | 25 + community/gitea/1.0.0/README.md | 15 + community/gitea/1.0.0/app-readme.md | 15 + community/gitea/1.0.0/charts/common-1.0.3.tgz | Bin 0 -> 54261 bytes community/gitea/1.0.0/ci/basic-values.yaml | 16 + community/gitea/1.0.0/ci/https-values.yaml | 103 +++ community/gitea/1.0.0/ix_values.yaml | 44 ++ community/gitea/1.0.0/questions.yaml | 315 +++++++++ community/gitea/1.0.0/templates/NOTES.txt | 1 + .../gitea/1.0.0/templates/_configuration.tpl | 60 ++ community/gitea/1.0.0/templates/_gitea.tpl | 123 ++++ community/gitea/1.0.0/templates/_portal.tpl | 21 + community/gitea/1.0.0/templates/_postgres.tpl | 50 ++ community/gitea/1.0.0/templates/common.yaml | 11 + community/gitea/item.yaml | 4 + 35 files changed, 2155 insertions(+), 5 deletions(-) create mode 100644 charts/ix-chart/2304.0.0/.helmignore create mode 100644 charts/ix-chart/2304.0.0/Chart.lock create mode 100644 charts/ix-chart/2304.0.0/Chart.yaml create mode 100644 charts/ix-chart/2304.0.0/README.md create mode 100644 charts/ix-chart/2304.0.0/app-readme.md create mode 100644 charts/ix-chart/2304.0.0/charts/common-2207.0.0.tgz create mode 100644 charts/ix-chart/2304.0.0/ci/test-values.yaml create mode 100644 charts/ix-chart/2304.0.0/questions.yaml create mode 100644 charts/ix-chart/2304.0.0/templates/NOTES.txt create mode 100644 charts/ix-chart/2304.0.0/templates/_containers.tpl create mode 100644 charts/ix-chart/2304.0.0/templates/_helpers.tpl create mode 100644 charts/ix-chart/2304.0.0/templates/_networking.tpl create mode 100644 charts/ix-chart/2304.0.0/templates/_volumes.tpl create mode 100644 charts/ix-chart/2304.0.0/templates/_workload.tpl create mode 100644 charts/ix-chart/2304.0.0/templates/external-interfaces.yaml create mode 100644 charts/ix-chart/2304.0.0/templates/service.yaml create mode 100644 charts/ix-chart/2304.0.0/templates/workload.yaml create mode 100644 charts/ix-chart/item.yaml create mode 100644 community/gitea/1.0.0/Chart.lock create mode 100644 community/gitea/1.0.0/Chart.yaml create mode 100644 community/gitea/1.0.0/README.md create mode 100644 community/gitea/1.0.0/app-readme.md create mode 100644 community/gitea/1.0.0/charts/common-1.0.3.tgz create mode 100644 community/gitea/1.0.0/ci/basic-values.yaml create mode 100644 community/gitea/1.0.0/ci/https-values.yaml create mode 100644 community/gitea/1.0.0/ix_values.yaml create mode 100644 community/gitea/1.0.0/questions.yaml create mode 100644 community/gitea/1.0.0/templates/NOTES.txt create mode 100644 community/gitea/1.0.0/templates/_configuration.tpl create mode 100644 community/gitea/1.0.0/templates/_gitea.tpl create mode 100644 community/gitea/1.0.0/templates/_portal.tpl create mode 100644 community/gitea/1.0.0/templates/_postgres.tpl create mode 100644 community/gitea/1.0.0/templates/common.yaml create mode 100644 community/gitea/item.yaml diff --git a/catalog.json b/catalog.json index 605d517f31..f28b03aef3 100644 --- a/catalog.json +++ b/catalog.json @@ -9,13 +9,13 @@ "healthy": true, "healthy_error": null, "location": "/__w/charts/charts/charts/ix-chart", - "latest_version": "2212.0.1", + "latest_version": "2304.0.0", "latest_app_version": "v1", - "latest_human_version": "v1_2212.0.1", - "last_update": "2022-12-19 11:37:56", + "latest_human_version": "v1_2304.0.0", + "last_update": "2023-04-11 15:36:44", "name": "ix-chart", "recommended": false, - "title": "Ix-chart", + "title": "ix-chart", "icon_url": null }, "home-assistant": { @@ -415,7 +415,7 @@ "latest_version": "1.0.0", "latest_app_version": "v0.107.26", "latest_human_version": "v0.107.26_1.0.0", - "last_update": null, + "last_update": "2023-04-11 15:36:31", "name": "adguard-home", "recommended": false, "title": "AdGuard Home", @@ -440,6 +440,25 @@ "title": "Vaultwarden", "icon": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/src/static/images/vaultwarden-icon.png", "icon_url": null + }, + "gitea": { + "app_readme": "

Gitea

\n

Gitea - Git with a cup of tea

\n
\n

When application is installed, a container will be launched with root privileges.\nThis is required in order to apply the correct permissions to the gitea directories.\nAfterward, the gitea container will run as a non-root user (Default: 568).\nSame applies to the postgres container. This will run afterwards as a non-root user (999).\nOn each upgrade, a container will be launched with root privileges in order to apply the correct\npermissions to the postgres backups directory. Container that performs the backup will run as a non-root user (999) afterwards.\nKeep in mind the permissions on the backup directory will be changed to 999:999 on every update.\nBut will only be changed once for the gitea and postgres data directories.

\n
\n

On initial startup a setup wizard will be launched with settings for database, ports, path, and domain prefilled.\nKeep them as they are, fill anything you want in the optional settings section and click on Install Gitea.

", + "categories": [ + "git", + "gitea" + ], + "description": "Gitea - Git with a cup of tea", + "healthy": true, + "healthy_error": null, + "location": "/__w/charts/charts/community/gitea", + "latest_version": "1.0.0", + "latest_app_version": "1.19.0", + "latest_human_version": "1.19.0_1.0.0", + "last_update": null, + "name": "gitea", + "recommended": false, + "title": "Gitea", + "icon_url": "https://gitea.com/assets/img/logo.svg" } }, "enterprise": { diff --git a/charts/ix-chart/2304.0.0/.helmignore b/charts/ix-chart/2304.0.0/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/charts/ix-chart/2304.0.0/.helmignore @@ -0,0 +1,23 @@ +# 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 +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/ix-chart/2304.0.0/Chart.lock b/charts/ix-chart/2304.0.0/Chart.lock new file mode 100644 index 0000000000..ec58a2a0f5 --- /dev/null +++ b/charts/ix-chart/2304.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common/2207.0.0 + version: 2207.0.0 +digest: sha256:a301ba0f99ec1e08a60a7f0a0320aa02d225993572f2f056f09520f06df88b37 +generated: "2023-03-23T16:05:17.17021698+02:00" diff --git a/charts/ix-chart/2304.0.0/Chart.yaml b/charts/ix-chart/2304.0.0/Chart.yaml new file mode 100644 index 0000000000..1394d9169b --- /dev/null +++ b/charts/ix-chart/2304.0.0/Chart.yaml @@ -0,0 +1,20 @@ +name: ix-chart +description: A Helm chart for deploying simple workloads Kubernetes +annotations: + title: ix-chart +type: application +version: 2304.0.0 +apiVersion: v2 +appVersion: v1 +kubeVersion: ">=1.16.0-0" +maintainers: + - name: truenas + url: https://www.truenas.com/ +dependencies: + - name: common + repository: file://../../../common/2207.0.0 + version: 2207.0.0 +home: https://www.truenas.com/ +icon: https://www.ixsystems.com/wp-content/uploads/2021/06/ix_logo_200x47.png +keywords: [] +sources: [] diff --git a/charts/ix-chart/2304.0.0/README.md b/charts/ix-chart/2304.0.0/README.md new file mode 100644 index 0000000000..ed5e97a908 --- /dev/null +++ b/charts/ix-chart/2304.0.0/README.md @@ -0,0 +1,117 @@ +# iX Chart + +iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster. +It provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload. + +This chart will deploy a docker image as a kubernetes workload allowing user to configure the workload deployment / management. + +## Introduction + +iX-chart is designed for simple single docker image deployments. + +## Configuration + +The following table lists the configurable parameters of the iX chart and +their default values. + +| Parameter | Description | Default | +|:-------------------------------|:----------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------| +| `workloadType` | Specify type of workload to deploy | `Deployment` | +| `cronSchedule` | Specify schedule for cronjob if `workloadType` is `CronJob`. | `{"minute": "5", "hour": "*", "dom": "*", "month": "*", "dow": "*"}` | +| `image.repository` | The image repository to pull from | `debian` | +| `image.tag` | The image tag to pull from | `latest` | +| `image.pullPolicy` | Image pull policy | `IfNotPresent` | +| `updateStrategy` | Upgrade Policy | `RollingUpdate` | +| `jobRestartPolicy` | Restart Policy for job type workload ( only applicable if `workloadType` is `Job`/`CronJob` | `OnFailure` | +| `containerCommand` | Commands to execute inside container overriding image CMD default | `null` | +| `containerArgs` | Specify arguments for container command | `null` | +| `containerEnvironmentVariables`| Container Environment Variables | `null` | +| `externalInterfaces` | Add external interfaces in the pod | `null` | +| `dnsPolicy` | Specify DNS Policy for pod | `Default` | +| `dnsConfig` | Specify custom DNS configuration which will be applied to the pod | `{"nameservers": [], "searches": []}` | +| `hostNetwork` | Use host network for workload ( similar to docker host networking ) | `false` | +| `hostPortsList` | Specify ports of host and workload to forward traffic from host port to workload port. | `null` | +| `portForwardingList` | Specify ports of node and workload to forward traffic from node port to workload port | `null` | +| `hostPathVolumes` | Specify host paths to be used as hostpath volumes for the workload | `null` | +| `volumes` | Specify `ix_volumes` | `null` | +| `livenessProbe` | Configure Liveness Probe for workload | `null` | +| `gpuConfiguration` | Allocate GPU to workload ( if available ) | `{}` | + + +## Persistence + +Chart release iX chart offers 2 ways to have persistent storage: + +1) `hostPathVolumes` +2) `volumes` + +For (1), they are kubernetes host path volumes which the user can assign to the workload with RO/RW permissions. + +(2) is a host path volume as well but it operates differently then (1) in terms of where it lives and how it's lifecycle is tied to the chart release. +For (2), users specify where they would like persistent storage in the workload and a dataset name ( it should be unique per each chart release ), based on this input, +system will create a dataset and then use it as a host path volume for the workload. During upgrades, snapshot will be taken for these volumes and on rollback users can subsequently +restore the snapshots hence the data. +When a chart release will be deleted, all (2) volumes data will be deleted unlike (1) ( until of course they are not in the chart release's dataset path ). + +## Recommended Persistence Configuration Examples + +The following is a recommended configuration example for creating ix volumes + +``` +"volumes": [ + { + "datasetName": "ix_volume1", + "mountPath": "/mount_test1" + }, + { + "datasetName": "ix_volume2", + "mountPath": "/mount_test2" + } +] + +``` + +`mountPath` refers to the path inside the pod. + +--- + +The following is a recommended configuration example for `hostPathVolumes` + +``` +"hostPathVolumes": [ + { + "hostPath": "/mnt/pool/test_dir", + "mountPath": "/test_dir", + "readOnly": true + }, + { + "hostPath": "/mnt/pool/test_file", + "mountPath": "/test_file", + "readOnly": true + } +] +``` + +## External Interfaces Configuration Examples + +``` +"externalInterfaces": [ + { + "hostInterface": "ens3", + "ipam": {"type": "dhcp"} + }, + { + "hostInterface": "br0", + "ipam": { + "type": "static", + "staticIPConfigurations": ["192.168.0.120/24"], + "staticRoutes": [ + {"destination": "0.0.0.0/0", "gateway": "192.168.0.1"} + ] + } + } +] +``` + +The first entry in the above configuration example will add an external interface in the pod using macvlan with `ipam` being set to `dhcp`. +Second entry will add an external interface in the pod using `bridge` and using static IP configuration for the external interface. diff --git a/charts/ix-chart/2304.0.0/app-readme.md b/charts/ix-chart/2304.0.0/app-readme.md new file mode 100644 index 0000000000..ab8d09d1e6 --- /dev/null +++ b/charts/ix-chart/2304.0.0/app-readme.md @@ -0,0 +1,4 @@ +# iX-Chart + +iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster. +It provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload. diff --git a/charts/ix-chart/2304.0.0/charts/common-2207.0.0.tgz b/charts/ix-chart/2304.0.0/charts/common-2207.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e02da8d7cbd542c0a819b24a6fa0e6c8ac651e78 GIT binary patch literal 4975 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 + "Kubernetes internal DNS will be prioritised and resolved first. If the domain does not resolve with internal + kubernetes DNS, the DNS query will be forwarded to the upstream nameserver inherited from the node. This is + useful if the workload needs to access other service(s)/workload(s) using kubernetes internal DNS." + - value: "ClusterFirstWithHostNet" + description: "For Pods running with hostNetwork and wanting to prioritise internal kubernetes DNS should make use of this policy." + - value: "None" + description: "Ignore DNS settings from the Kubernetes cluster" + - variable: dnsConfig + label: "DNS Configuration" + group: "Networking" + description: "Specify custom DNS configuration which will be applied to the pod" + schema: + type: dict + attrs: + - variable: nameservers + label: "Nameservers" + schema: + default: [] + type: list + items: + - variable: nameserver + label: "Nameserver" + schema: + type: string + - variable: searches + label: "Searches" + schema: + default: [] + type: list + items: + - variable: search + label: "Search Entry" + schema: + type: string + - variable: options + label: "DNS Options" + schema: + type: list + items: + - variable: optionsEntry + label: "Option Entry Configuration" + schema: + type: dict + attrs: + - variable: name + label: "Option Name" + schema: + type: string + required: true + - variable: value + label: "Option Value" + schema: + type: string + required: true + + - variable: hostNetwork + label: "Provide access to node network namespace for the workload" + group: "Networking" + schema: + type: boolean + default: false + show_if: [["externalInterfaces", "=", []]] + + - variable: hostPortsList + label: "Specify host ports for the workload" + description: "Only use host ports if scaling of a workload is not required" + group: "Networking" + schema: + show_if: [["updateStrategy", "=", "Recreate"]] + type: list + hidden: true + items: + - variable: hostPortConfiguration + label: "Host Port Configuration" + schema: + type: dict + attrs: + - variable: containerPort + label: "Container Port" + schema: + type: string + required: true + - variable: hostPort + label: "Host Port" + schema: + type: string + required: true + + - variable: portForwardingList + label: "Specify Node ports to forward to workload" + group: "Port Forwarding" + description: "Specify ports of node and workload to forward traffic from node port to workload port" + schema: + type: list + show_if: [["hostNetwork", "=", false]] + items: + - variable: portForwarding + label: "Port Forwarding Configuration" + schema: + type: dict + attrs: + - variable: containerPort + label: "Container Port" + schema: + type: int + required: true + - variable: nodePort + label: "Node Port" + schema: + type: int + required: true + min: 9000 + max: 65535 + - variable: protocol + label: "Protocol" + schema: + type: string + default: "TCP" + enum: + - value: "TCP" + description: "TCP Protocol" + - value: "UDP" + description: "UDP Protocol" + + # Storage Options + # Host path based volumes + - variable: hostPathVolumes + label: "Host Path Volumes" + group: "Storage" + schema: + type: list + items: + - variable: hostPathConfiguration + label: "Host Path Configuration" + schema: + type: dict + attrs: + - variable: hostPath + label: "Host Path" + schema: + type: hostpath + required: true + - variable: mountPath + label: "Mount Path" + description: "Path where host path will be mounted inside the pod" + schema: + type: path + required: true + - variable: readOnly + label: "Read Only" + schema: + type: boolean + default: false + + - variable: emptyDirVolumes + label: "Memory Backed Volumes" + description: "Mount memory based temporary volumes for fast access i.e consuming /dev/shm" + group: "Storage" + schema: + type: list + items: + - variable: emptyDirVolume + label: "Memory Backed Volume" + schema: + type: dict + attrs: + - variable: mountPath + label: "Mount Path" + description: "Path where temporary path will be mounted inside the pod" + schema: + type: path + required: true + + # Volumes + - variable: volumes + label: "Volumes" + group: "Storage" + schema: + type: list + items: + - variable: volume + label: "Volume" + schema: + type: dict + $ref: + - "normalize/ixVolume" + attrs: + - variable: mountPath + label: "Mount Path" + description: "Path where the volume will be mounted inside the pod" + schema: + type: path + required: true + - variable: datasetName + label: "Dataset Name" + schema: + type: string + required: true + + # Pod Probes + # Liveness Probe + - variable: livenessProbe + label: "Liveness Probe" + description: "Configure Liveness Probe" + group: "Health Check" + schema: + hidden: true + type: dict + default: null + "null": true + attrs: + - variable: command + label: "Liveness command" + description: "Specify a command to determine liveness of pod" + schema: + type: list + required: true + items: + - variable: commandArg + label: "Command Arg" + schema: + type: string + - variable: initialDelaySeconds + label: "Seconds Delay" + description: "Seconds to delay the first liveness probe" + schema: + type: int + default: 5 + - variable: periodSeconds + label: "Period Seconds" + description: "Specify number of seconds to run liveness probe" + schema: + type: int + default: 10 + + # Specify GPU configuration + - variable: gpuConfiguration + label: "GPU Configuration" + group: "Resource Reservation" + schema: + type: dict + $ref: + - "definitions/gpuConfiguration" + attrs: [] + + - variable: tty + label: "Enable TTY" + description: "Determines whether containers in a pod runs with TTY enabled. By default pod has it disabled." + group: "Workload Details" + schema: + type: boolean + default: false + + - variable: stdin + label: "Enable STDIN" + description: "Determines whether containers in a pod runs with stdin enabled. By default pod has it disabled." + group: "Workload Details" + schema: + type: boolean + default: false + + - variable: securityContext + label: "Security Context" + group: "Workload Details" + schema: + type: dict + attrs: + - variable: privileged + label: "Privileged Mode" + description: "Determines if any container in a pod can enable privileged mode. By default a container is not allowed to access any devices on the host, but a 'privileged' container is given access to all devices on the host. This allows the container nearly all the same access as processes running on the host." + schema: + type: boolean + default: false + - variable: capabilities + label: "Capabilities" + description: "With Linux capabilities, you can grant certain privileges to a process without granting all the privileges of the root user." + schema: + type: list + items: + - variable: capability + description: "Add Capability" + label: "Add Capability" + schema: + type: string + - variable: enableRunAsUser + label: "Configure Container User and Group ID" + description: "Configure security context runAsUser and runAsGroup variables" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: runAsUser + label: "Run Container As User" + description: "Configure user id for container." + schema: + type: int + default: 568 + - variable: runAsGroup + label: "Run Container As Group" + description: "Configure group id for container." + schema: + type: int + default: 568 + + + - variable: enableResourceLimits + label: "Enable Pod resource limits" + group: "Resource Limits" + schema: + type: boolean + default: false + - variable: cpuLimit + label: "CPU Limit" + description: "CPU resource limit allow plain integer values with suffix m(milli) e.g 1000m, 100." + group: "Resource Limits" + schema: + type: string + show_if: [["enableResourceLimits", "=", true]] + valid_chars: "^\\d+(?:\\.\\d+(?!.*m$)|m?$)" + default: "4000m" + - variable: memLimit + label: "Memory Limit" + group: "Resource Limits" + description: "Memory limits is specified by number of bytes. Followed by quantity suffix like E,P,T,G,M,k and Ei,Pi,Ti,Mi,Gi,Ki can also be used. e.g 129e6, 129M, 128974848000m, 123Mi" + schema: + type: string + show_if: [["enableResourceLimits", "=", true]] + valid_chars: "^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$" + default: "8Gi" diff --git a/charts/ix-chart/2304.0.0/templates/NOTES.txt b/charts/ix-chart/2304.0.0/templates/NOTES.txt new file mode 100644 index 0000000000..c3b3453e34 --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/NOTES.txt @@ -0,0 +1,2 @@ +1. Get the application URL by running these commands: + diff --git a/charts/ix-chart/2304.0.0/templates/_containers.tpl b/charts/ix-chart/2304.0.0/templates/_containers.tpl new file mode 100644 index 0000000000..e07bb9160c --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/_containers.tpl @@ -0,0 +1,77 @@ +{{/* +Container Command +*/}} +{{- define "containerCommand" }} +{{- if .Values.containerCommand }} +command: + {{- range .Values.containerCommand }} + - {{ . | quote}} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Container Args +*/}} +{{- define "containerArgs" }} +{{- if .Values.containerArgs }} +args: + {{- range .Values.containerArgs }} + - {{ . | quote}} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Container Environment Variables +*/}} +{{- define "containerEnvVariables" }} +{{- if .Values.containerEnvironmentVariables }} +env: + {{- range .Values.containerEnvironmentVariables }} + - name: {{ .name | quote }} + value: {{ .value | quote }} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Container Liveness Probe +*/}} +{{- define "containerLivenssProbe" }} +{{- if .Values.livenessProbe }} +livenessProbe: + exec: + command: + {{ toYaml .Values.livenessProbe.command | indent 16 }} + initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.periodSeconds }} +{{- end }} +{{- end }} + +{{/* +Container Ports +*/}} +{{- define "containerPorts" }} +{{- if or .Values.portForwardingList .Values.hostPortsList }} +ports: + {{- range $index, $config := .Values.portForwardingList }} + - containerPort: {{ $config.containerPort }} + {{- end }} + {{- range $index, $config := .Values.hostPortsList }} + - containerPort: {{ $config.containerPort }} + hostPort: {{ $config.hostPort }} + {{- end }} +{{- end }} +{{- end }} + +{{/* +Container Resource Configuration +*/}} +{{- define "containerResourceConfiguration" }} +{{- if .Values.gpuConfiguration }} +resources: + limits: + {{- toYaml .Values.gpuConfiguration | nindent 4 }} +{{- end }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/_helpers.tpl b/charts/ix-chart/2304.0.0/templates/_helpers.tpl new file mode 100644 index 0000000000..3d22e96fac --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/_helpers.tpl @@ -0,0 +1,71 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ix-chart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ix-chart.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ix-chart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "ix-chart.labels" -}} +helm.sh/chart: {{ include "ix-chart.chart" . }} +{{ include "ix-chart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "ix-chart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ix-chart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "ix-chart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "ix-chart.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + + +{{/* +Convert cron schema object to cron format +*/}} +{{- define "cronExpression" }} +{{- printf "%s %s %s %s %s " .minute .hour .dom .month .dow }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/_networking.tpl b/charts/ix-chart/2304.0.0/templates/_networking.tpl new file mode 100644 index 0000000000..417397f10b --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/_networking.tpl @@ -0,0 +1,30 @@ +{{/* +DNS Configuration +*/}} +{{- define "dnsConfiguration" }} +dnsPolicy: {{ .Values.dnsPolicy }} +{{- if .Values.dnsConfig }} +dnsConfig: + {{- toYaml .Values.dnsConfig | nindent 2 }} +{{- end }} +{{- end }} + + +{{/* +Get configuration for host network +*/}} +{{- define "hostNetworkingConfiguration" -}} +{{- $host := default false .Values.hostNetwork -}} +{{- if or .Values.externalInterfaces (eq $host false) -}} +{{- print "false" -}} +{{- else -}} +{{- print "true" -}} +{{- end -}} +{{- end -}} + +{{/* Validate portal port */}} +{{- if .Values.enableUIPortal }} + {{- if and (not .Values.hostNetwork) (lt .Values.portalDetails.port 9000) }} + {{- fail (printf "Port (%d) is too low. Minimum allowed port is 9000." .Values.portalDetails.port) }} + {{- end }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/_volumes.tpl b/charts/ix-chart/2304.0.0/templates/_volumes.tpl new file mode 100644 index 0000000000..6e8aab21d6 --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/_volumes.tpl @@ -0,0 +1,51 @@ +{{/* +Volumes Configuration +*/}} +{{- define "volumeConfiguration" }} +{{- if or .Values.ixVolumes .Values.hostPathVolumes .Values.emptyDirVolumes }} +volumes: +{{ $host_p := list }} +{{- range $index, $hostPathConfiguration := .Values.hostPathVolumes }} + - name: ix-host-path-{{ $.Release.Name }}-{{ $index }} + hostPath: + path: {{ $hostPathConfiguration.hostPath }} + {{ $host_p = mustAppend $host_p $hostPathConfiguration.hostPath }} +{{- end }} +{{- range $index, $hostPathConfiguration := .Values.ixVolumes }} +{{ $dsName := base $hostPathConfiguration.hostPath }} + - name: ix-host-volume-{{ $.Release.Name }}-{{ $dsName }} + hostPath: + path: {{ $hostPathConfiguration.hostPath }} + {{ $host_p = mustAppend $host_p $hostPathConfiguration.hostPath }} +{{- end }} +{{ include "common.storage.hostPathsValidation" $host_p }} +{{- range $index, $emptyDirConfiguration := .Values.emptyDirVolumes }} + - name: ix-emptydir-volume-{{ $.Release.Name }}-{{ $index }} + emptyDir: + medium: Memory +{{- end }} +{{- end }} +{{- end }} + + +{{/* +Volume Mounts Configuration +*/}} +{{- define "volumeMountsConfiguration" }} +{{- if or .Values.hostPathVolumes .Values.ixVolumes .Values.emptyDirVolumes }} +volumeMounts: + {{- range $index, $hostPathConfiguration := .Values.hostPathVolumes }} + - mountPath: {{ $hostPathConfiguration.mountPath }} + name: ix-host-path-{{ $.Release.Name }}-{{ $index }} + readOnly: {{ $hostPathConfiguration.readOnly }} + {{- end }} + {{- range $index, $hostPathConfiguration := .Values.volumes }} + - mountPath: {{ $hostPathConfiguration.mountPath }} + name: ix-host-volume-{{ $.Release.Name }}-{{ $hostPathConfiguration.datasetName }} + {{- end }} + {{- range $index, $emptyDirConfiguration := .Values.emptyDirVolumes }} + - mountPath: {{ $emptyDirConfiguration.mountPath }} + name: ix-emptydir-volume-{{ $.Release.Name }}-{{ $index }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/_workload.tpl b/charts/ix-chart/2304.0.0/templates/_workload.tpl new file mode 100644 index 0000000000..6b7903c99d --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/_workload.tpl @@ -0,0 +1,183 @@ +{{/* +Check if workload type is a deployment +*/}} +{{- define "workloadIsDeployment" }} +{{- if eq .Values.workloadType "Deployment" }} +{{- true -}} +{{- else }} +{{- false -}} +{{- end }} +{{- end }} + +{{/* +Check if workload type is a cronjob +*/}} +{{- define "workloadIsCronJob" }} +{{- if eq .Values.workloadType "CronJob" }} +{{- true -}} +{{- else }} +{{- false -}} +{{- end }} +{{- end }} + +{{/* +Get API Version based on workload type +*/}} +{{- define "apiVersion" -}} +{{- if eq (include "workloadIsDeployment" .) "true" }} +{{- printf "apps/v1" }} +{{- else if eq (include "workloadIsCronJob" .) "true" }} +{{- printf "batch/v1beta1" }} +{{- else }} +{{- printf "batch/v1" }} +{{- end }} +{{- end }} + + +{{/* +Get Restart policy based on workload type +*/}} +{{- define "restartPolicy" -}} +{{- if eq (include "workloadIsDeployment" .) "true" }} +{{- print "Always" }} +{{- else }} +{{- printf "%s" .Values.jobRestartPolicy }} +{{- end }} +{{- end }} + + +{{/* +Pod specification +*/}} +{{- define "podSepc" }} +restartPolicy: {{ template "restartPolicy" . }} +hostNetwork: {{ template "hostNetworkingConfiguration" . }} +containers: +- name: {{ .Chart.Name }} + {{ include "common.resources.limitation" . | nindent 2 }} + {{- include "volumeMountsConfiguration" . | indent 2}} + tty: {{ .Values.tty }} + stdin: {{ .Values.stdin }} + securityContext: + privileged: {{ .Values.securityContext.privileged }} + {{ if .Values.securityContext.enableRunAsUser }} + runAsUser: {{ .Values.securityContext.runAsUser }} + runAsGroup: {{ .Values.securityContext.runAsGroup }} + {{ end }} + {{ if .Values.securityContext.capabilities }} + capabilities: + add: {{ toYaml .Values.securityContext.capabilities | nindent 8 }} + {{ end }} + {{ if .Values.ci }} + livenessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 1 + readinessProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 5 + successThreshold: 2 + startupProbe: + httpGet: + path: / + port: 80 + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 2 + failureThreshold: 60 + successThreshold: 1 + {{ end }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- include "containerCommand" . | indent 2 }} + {{- include "containerArgs" . | indent 2 }} + {{- include "containerEnvVariables" . | indent 2 }} + {{- include "containerLivenssProbe" . | indent 2 }} + {{- include "containerPorts" . | indent 2 }} + {{- include "containerResourceConfiguration" . | indent 2 }} +{{- include "volumeConfiguration" . }} +{{- include "dnsConfiguration" . }} +{{- end }} + + +{{/* +Annotations for workload +*/}} +{{- define "workloadAnnotations" }} +rollme: {{ randAlphaNum 5 | quote }} +{{- if .Values.ixExternalInterfacesConfigurationNames }} +k8s.v1.cni.cncf.io/networks: {{ join ", " .Values.ixExternalInterfacesConfigurationNames }} +{{- end }} +{{- end }} + + +{{/* +Metadata for workload +*/}} +{{- define "commonMetadataWorkload" }} +labels: + {{- include "ix-chart.selectorLabels" . | nindent 2 }} +annotations: + {{- include "workloadAnnotations" . | nindent 2 }} +{{- end }} + +{{/* +Deployment Spec +*/}} +{{- define "deploymentSpec" }} +strategy: + {{- if and (eq .Values.updateStrategy "RollingUpdate") .Values.hostPortsList }} + {{- fail "RollingUpdate is not allowed when host ports are specified" }} + {{- else if and (eq .Values.updateStrategy "RollingUpdate") .Values.hostNetwork }} + {{- fail "RollingUpdate is not allowed when host network is enabled" }} + {{- end }} + type: {{ .Values.updateStrategy }} +selector: + matchLabels: + {{- include "ix-chart.selectorLabels" . | nindent 4 }} +template: + metadata: + {{ include "commonMetadataWorkload" . | nindent 4 }} + spec: + {{- include "podSepc" . | indent 4 }} +{{- end }} + + +{{/* +Job Spec Common +*/}} +{{- define "jobSpecCommon" }} +metadata: + {{ include "commonMetadataWorkload" . | nindent 4 }} +spec: + {{- include "podSepc" . | indent 2 }} +{{- end }} + + +{{/* +Job Spec +*/}} +{{- define "jobSpec" }} +template: +{{ include "jobSpecCommon" . | nindent 2 }} +{{- end }} + +{{/* +CronJob Spec +*/}} +{{- define "cronJobSpec" }} +schedule: {{ include "cronExpression" .Values.cronSchedule | quote }} +jobTemplate: + spec: + {{ include "jobSpec" . | nindent 4 }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/external-interfaces.yaml b/charts/ix-chart/2304.0.0/templates/external-interfaces.yaml new file mode 100644 index 0000000000..f68c46f6b1 --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/external-interfaces.yaml @@ -0,0 +1,9 @@ +{{- range $index, $iface := .Values.ixExternalInterfacesConfiguration }} +--- +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: ix-{{ $.Release.Name }}-{{ $index }} +spec: + config: '{{ $iface }}' +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/service.yaml b/charts/ix-chart/2304.0.0/templates/service.yaml new file mode 100644 index 0000000000..4b0237d016 --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/service.yaml @@ -0,0 +1,20 @@ +{{- if and (.Values.portForwardingList) (eq (include "hostNetworkingConfiguration" .) "false") }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ix-chart.fullname" . }} + labels: + {{- include "ix-chart.labels" . | nindent 4 }} +spec: + type: NodePort + ports: + {{- range $index, $config := .Values.portForwardingList }} + - port: {{ $config.containerPort }} + targetPort: {{ $config.containerPort }} + protocol: {{ $config.protocol }} + nodePort: {{ $config.nodePort }} + name: ix-{{ $.Release.Name }}-{{ $config.nodePort }}-{{ $index }} + {{- end }} + selector: + {{- include "ix-chart.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/charts/ix-chart/2304.0.0/templates/workload.yaml b/charts/ix-chart/2304.0.0/templates/workload.yaml new file mode 100644 index 0000000000..98df32b18a --- /dev/null +++ b/charts/ix-chart/2304.0.0/templates/workload.yaml @@ -0,0 +1,14 @@ +apiVersion: {{ template "apiVersion" . }} +kind: {{ .Values.workloadType }} +metadata: + name: {{ include "ix-chart.fullname" . }} + labels: + {{- include "ix-chart.labels" . | nindent 4 }} +spec: + {{- if eq (include "workloadIsDeployment" .) "true" }} + {{ include "deploymentSpec" . | nindent 2 }} + {{- else if eq (include "workloadIsCronJob" .) "true" }} + {{ include "cronJobSpec" . | nindent 2 }} + {{- else }} + {{ include "jobSpec" . | nindent 2 }} + {{- end }} diff --git a/charts/ix-chart/item.yaml b/charts/ix-chart/item.yaml new file mode 100644 index 0000000000..2a60e83cc4 --- /dev/null +++ b/charts/ix-chart/item.yaml @@ -0,0 +1,2 @@ +categories: + - generic diff --git a/community/gitea/1.0.0/Chart.lock b/community/gitea/1.0.0/Chart.lock new file mode 100644 index 0000000000..368806ac9f --- /dev/null +++ b/community/gitea/1.0.0/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.3 +digest: sha256:1a090020cfa582aff29906320874ffe9b543fcc6c2423c281f434514f2653e02 +generated: "2023-04-06T19:00:01.577717432+03:00" diff --git a/community/gitea/1.0.0/Chart.yaml b/community/gitea/1.0.0/Chart.yaml new file mode 100644 index 0000000000..7a0dc4a9f7 --- /dev/null +++ b/community/gitea/1.0.0/Chart.yaml @@ -0,0 +1,25 @@ +name: gitea +description: Gitea - Git with a cup of tea +annotations: + title: Gitea +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '1.19.0' +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://gitea.io/en-us +icon: https://gitea.com/assets/img/logo.svg +sources: + - https://gitea.io/en-us + - https://github.com/truenas/charts/tree/master/community/gitea + - https://docs.gitea.io/en-us/install-with-docker-rootless +keywords: + - git + - gitea diff --git a/community/gitea/1.0.0/README.md b/community/gitea/1.0.0/README.md new file mode 100644 index 0000000000..cdafc2be65 --- /dev/null +++ b/community/gitea/1.0.0/README.md @@ -0,0 +1,15 @@ +# Gitea + +[Gitea](https://gitea.io/en-us) - Git with a cup of tea + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `gitea` directories. +> Afterward, the `gitea` container will run as a **non**-root user (Default: `568`). +> Same applies to the `postgres` container. This will run afterwards 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 `gitea` and `postgres` data directories. + +On initial startup a setup wizard will be launched with settings for database, ports and root url prefilled. +Keep them as they are, fill the Administration section and click on `Install Gitea`. diff --git a/community/gitea/1.0.0/app-readme.md b/community/gitea/1.0.0/app-readme.md new file mode 100644 index 0000000000..543f31c8d2 --- /dev/null +++ b/community/gitea/1.0.0/app-readme.md @@ -0,0 +1,15 @@ +# Gitea + +[Gitea](https://gitea.io/en-us) - Git with a cup of tea + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `gitea` directories. +> Afterward, the `gitea` container will run as a **non**-root user (Default: `568`). +> Same applies to the `postgres` container. This will run afterwards 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 `gitea` and `postgres` data directories. + +On initial startup a setup wizard will be launched with settings for `database`, `ports`, `path`, and `domain` prefilled. +Keep them as they are, fill anything you want in the optional settings section and click on `Install Gitea`. diff --git a/community/gitea/1.0.0/charts/common-1.0.3.tgz b/community/gitea/1.0.0/charts/common-1.0.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b193efa527227a4724168165103078e9522b3e54 GIT binary patch literal 54261 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 z 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 + 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: data + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: config + label: Gitea Configuration Storage + description: The path to store Gitea configuration storage. + 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: config + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: pgData + label: Gitea Postgres Data Storage + description: The path to store Gitea 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: Gitea Postgres Backup Storage + description: The path to store Gitea 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 + label: "" + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Gitea. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for Gitea. + schema: + type: string + default: 8Gi + required: true diff --git a/community/gitea/1.0.0/templates/NOTES.txt b/community/gitea/1.0.0/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/community/gitea/1.0.0/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/community/gitea/1.0.0/templates/_configuration.tpl b/community/gitea/1.0.0/templates/_configuration.tpl new file mode 100644 index 0000000000..eb52c13499 --- /dev/null +++ b/community/gitea/1.0.0/templates/_configuration.tpl @@ -0,0 +1,60 @@ +{{- define "gitea.configuration" -}} + + {{ if not (hasPrefix "http" .Values.giteaNetwork.rootURL) }} + {{ fail "Gitea - Expected [Root URL] to have the following format [http(s)://(sub).domain.tld(:port)] or [http://IP_ADDRESS:port]" }} + {{ end }} + + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-postgres" $fullname) -}} + {{- $dbUser := "gitea" -}} + {{- $dbName := "gitea" -}} + + {{- $dbPass := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-postgres-creds" $fullname)) -}} + {{- $dbPass = ((index .data "POSTGRES_PASSWORD") | b64dec) -}} + {{- end -}} + + {{ $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 }} + + gitea-creds: + enabled: true + data: + GITEA__database__DB_TYPE: postgres + GITEA__database__PASSWD: {{ $dbPass }} + GITEA__database__HOST: {{ $dbHost }} + GITEA__database__NAME: {{ $dbName }} + GITEA__database__USER: {{ $dbUser }} +configmap: + gitea-config: + enabled: true + data: + {{ $protocol := "http" }} + GITEA__server__HTTP_PORT: {{ .Values.giteaNetwork.webPort | quote }} + GITEA__server__SSH_PORT: {{ .Values.giteaNetwork.sshPort | quote }} + GITEA__server__SSH_LISTEN_PORT: {{ .Values.giteaNetwork.sshPort | quote }} + GITEA__server__ROOT_URL: {{ .Values.giteaNetwork.rootURL | quote }} + {{ if .Values.giteaNetwork.certificateID }} + {{ $protocol = "https" }} + GITEA__server__CERT_FILE: /etc/certs/gitea/public.crt + GITEA__server__KEY_FILE: /etc/certs/gitea/private.key + {{ end }} + GITEA__server__PROTOCOL: {{ $protocol }} + +{{ with .Values.giteaNetwork.certificateID }} +scaleCertificate: + gitea-cert: + enabled: true + id: {{ . }} +{{ end }} + +{{- end -}} diff --git a/community/gitea/1.0.0/templates/_gitea.tpl b/community/gitea/1.0.0/templates/_gitea.tpl new file mode 100644 index 0000000000..48528ca6f0 --- /dev/null +++ b/community/gitea/1.0.0/templates/_gitea.tpl @@ -0,0 +1,123 @@ +{{- define "gitea.workload" -}} +workload: + gitea: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.giteaNetwork.hostNetwork }} + containers: + gitea: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.giteaRunAs.user }} + runAsGroup: {{ .Values.giteaRunAs.group }} + envFrom: + - secretRef: + name: gitea-creds + - configMapRef: + name: gitea-config + {{ with .Values.giteaConfig.additionalEnvs }} + env: + {{ range $env := . }} + {{ $env.name }}: {{ $env.value }} + {{ end }} + {{ end }} + probes: + {{ $protocol := "http" }} + {{ if .Values.giteaNetwork.certificateID }} + {{ $protocol = "https" }} + {{ end }} + liveness: + enabled: true + type: {{ $protocol }} + path: /api/healthz + port: {{ .Values.giteaNetwork.webPort }} + readiness: + enabled: true + type: {{ $protocol }} + path: /api/healthz + port: {{ .Values.giteaNetwork.webPort }} + startup: + enabled: true + type: {{ $protocol }} + path: /api/healthz + port: {{ .Values.giteaNetwork.webPort }} + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.giteaRunAs.user + "GID" .Values.giteaRunAs.group + "type" "install") | nindent 8 }} + {{- include "ix.v1.common.app.postgresWait" (dict "name" "postgres-wait" + "secretName" "postgres-creds") | nindent 8 }} +{{/* Service */}} +service: + gitea: + enabled: true + primary: true + type: NodePort + targetSelector: gitea + ports: + webui: + enabled: true + primary: true + port: {{ .Values.giteaNetwork.webPort }} + nodePort: {{ .Values.giteaNetwork.webPort }} + targetSelector: gitea + ssh: + enabled: true + port: {{ .Values.giteaNetwork.sshPort }} + nodePort: {{ .Values.giteaNetwork.sshPort }} + targetSelector: gitea + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.giteaStorage.data.type }} + datasetName: {{ .Values.giteaStorage.data.datasetName | default "" }} + hostPath: {{ .Values.giteaStorage.data.hostPath | default "" }} + targetSelector: + gitea: + gitea: + mountPath: /var/lib/gitea + 01-permissions: + mountPath: /mnt/directories/data + config: + enabled: true + type: {{ .Values.giteaStorage.config.type }} + datasetName: {{ .Values.giteaStorage.config.datasetName | default "" }} + hostPath: {{ .Values.giteaStorage.config.hostPath | default "" }} + targetSelector: + gitea: + gitea: + mountPath: /etc/gitea + 01-permissions: + mountPath: /mnt/directories/config + gitea-temp: + enabled: true + type: emptyDir + targetSelector: + gitea: + gitea: + mountPath: /tmp/gitea + {{ if .Values.giteaNetwork.certificateID }} + cert: + enabled: true + type: secret + objectName: gitea-cert + defaultMode: "0600" + items: + - key: tls.key + path: private.key + - key: tls.crt + path: public.crt + targetSelector: + gitea: + gitea: + mountPath: /etc/certs/gitea + readOnly: true + {{ end }} +{{- end -}} diff --git a/community/gitea/1.0.0/templates/_portal.tpl b/community/gitea/1.0.0/templates/_portal.tpl new file mode 100644 index 0000000000..40b65bf575 --- /dev/null +++ b/community/gitea/1.0.0/templates/_portal.tpl @@ -0,0 +1,21 @@ +{{- define "gitea.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: / + port: {{ .Values.giteaNetwork.webPort | quote }} + {{ if or (hasPrefix "https://" .Values.giteaNetwork.rootURL) .Values.giteaNetwork.certificateID }} + protocol: https + {{ else }} + protocol: http + {{ end }} + {{- $host := "$node_ip" -}} + {{ with .Values.giteaNetwork.rootURL }} {{/* Trim protocol and trailing slash */}} + {{ $host = (. | trimPrefix "https://" | trimPrefix "http://" | trimSuffix "/") }} + {{ $host = mustRegexReplaceAll "(.*):[0-9]+" $host "${1}" }} + {{ end }} + host: {{ $host }} +{{- end -}} diff --git a/community/gitea/1.0.0/templates/_postgres.tpl b/community/gitea/1.0.0/templates/_postgres.tpl new file mode 100644 index 0000000000..572de99d99 --- /dev/null +++ b/community/gitea/1.0.0/templates/_postgres.tpl @@ -0,0 +1,50 @@ +{{- define "postgres.workload" -}} +workload: +{{- include "ix.v1.common.app.postgres" (dict "secretName" "postgres-creds" + "resources" .Values.resources + "ixChartContext" .Values.ixChartContext) | nindent 2 }} + +{{/* Service */}} +service: + postgres: + enabled: true + type: ClusterIP + targetSelector: postgres + ports: + postgres: + enabled: true + primary: true + port: 5432 + targetSelector: postgres + +{{/* Persistence */}} +persistence: + postgresdata: + enabled: true + type: {{ .Values.giteaStorage.pgData.type }} + datasetName: {{ .Values.giteaStorage.pgData.datasetName | default "" }} + hostPath: {{ .Values.giteaStorage.pgData.hostPath | default "" }} + targetSelector: + # Postgres pod + postgres: + # Postgres container + postgres: + mountPath: /var/lib/postgresql/data + # Permissions container + permissions: + mountPath: /mnt/directories/postgres_data + postgresbackup: + enabled: true + type: {{ .Values.giteaStorage.pgBackup.type }} + datasetName: {{ .Values.giteaStorage.pgBackup.datasetName | default "" }} + hostPath: {{ .Values.giteaStorage.pgBackup.hostPath | default "" }} + targetSelector: + # Postgres backup pod + postgresbackup: + # Postgres backup container + postgresbackup: + mountPath: /postgres_backup + # Permissions container + permissions: + mountPath: /mnt/directories/postgres_backup +{{- end -}} diff --git a/community/gitea/1.0.0/templates/common.yaml b/community/gitea/1.0.0/templates/common.yaml new file mode 100644 index 0000000000..848673f428 --- /dev/null +++ b/community/gitea/1.0.0/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "gitea.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "gitea.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "postgres.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "gitea.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/community/gitea/item.yaml b/community/gitea/item.yaml new file mode 100644 index 0000000000..63e3805dd8 --- /dev/null +++ b/community/gitea/item.yaml @@ -0,0 +1,4 @@ +icon_url: https://gitea.com/assets/img/logo.svg +categories: + - git + - gitea