diff --git a/dev/helm/.helmignore b/dev/helm/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/dev/helm/.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/dev/helm/Chart.lock b/dev/helm/Chart.lock new file mode 100644 index 00000000..7289185d --- /dev/null +++ b/dev/helm/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: postgresql + repository: https://kubernetes-charts.storage.googleapis.com/ + version: 6.5.0 +digest: sha256:e94b0117531082cb4efc287999abf5c5f7d58fecb8127251c20a7f0fc2ea65da +generated: "2020-04-21T18:55:53.994556-07:00" diff --git a/dev/helm/Chart.yaml b/dev/helm/Chart.yaml index bee62aa6..d81bd456 100644 --- a/dev/helm/Chart.yaml +++ b/dev/helm/Chart.yaml @@ -1,7 +1,11 @@ -apiVersion: v1 -name: Wiki.js -version: 2.0.0 -appVersion: 2.0.0 +apiVersion: v2 +name: wiki +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +version: 2.0.1 +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. +AppVersion: latest description: The most powerful and extensible open source Wiki software. keywords: - wiki @@ -10,6 +14,20 @@ keywords: - docs - reference - editor +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application +dependencies: + - name: postgresql + version: 6.5.0 + repository: https://kubernetes-charts.storage.googleapis.com/ + condition: postgresql.enabled home: https://wiki.js.org icon: https://github.com/Requarks/wiki/raw/master/client/static/favicons/android-chrome-192x192.png sources: @@ -18,4 +36,7 @@ maintainers: - name: Nicolas Giard email: github@ngpixel.com url: https://github.com/NGPixel + - name: James Greenhill + email: james@fuziontech.net + url: https://github.com/fuziontech engine: gotpl diff --git a/dev/helm/README.md b/dev/helm/README.md index b3c43d86..86cc5223 100644 --- a/dev/helm/README.md +++ b/dev/helm/README.md @@ -1,2 +1,138 @@ -# Work in progress -##### Do not use! +
+ +Wiki.js + +[![Release](https://img.shields.io/github/release/Requarks/wiki.svg?style=flat&maxAge=3600)](https://github.com/Requarks/wiki/releases) +[![License](https://img.shields.io/badge/license-AGPLv3-blue.svg?style=flat)](https://github.com/requarks/wiki/blob/master/LICENSE) +[![Backers on Open Collective](https://opencollective.com/wikijs/all/badge.svg)](https://opencollective.com/wikijs) +[![Downloads](https://img.shields.io/github/downloads/Requarks/wiki/total.svg?style=flat)](https://github.com/Requarks/wiki/releases) +[![Docker Pulls](https://img.shields.io/docker/pulls/requarks/wiki.svg)](https://hub.docker.com/r/requarks/wiki/) +[![Build status](https://dev.azure.com/requarks/wiki/_apis/build/status/build)](https://dev.azure.com/requarks/wiki/_build/latest?definitionId=9) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=wiki&metric=alert_status)](https://sonarcloud.io/dashboard?id=wiki) +[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=wiki&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=wiki) +[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=wiki&metric=security_rating)](https://sonarcloud.io/dashboard?id=wiki) +[![Standard - JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) +[![Chat on Slack](https://img.shields.io/badge/slack-requarks-CC2B5E.svg?style=flat&logo=slack)](https://wiki.requarks.io/slack) +[![Twitter Follow](https://img.shields.io/badge/follow-%40requarks-blue.svg?style=flat&logo=twitter)](https://twitter.com/requarks) +[![Subscribe to Newsletter](https://img.shields.io/badge/newsletter-subscribe-yellow.svg?style=flat&logo=mailchimp)](https://wiki.js.org/newsletter) + +##### A modern, lightweight and powerful wiki app built on NodeJS + +
+ +- **[Official Website](https://wiki.js.org/)** +- **[Documentation](https://docs.requarks.io/)** + +

Donate

+ +
+ +Wiki.js is an open source project that has been made possible due to the generous contributions by community [backers](https://wiki.js.org/about). If you are interested in supporting this project, please consider [becoming a sponsor](https://github.com/users/NGPixel/sponsorship), [becoming a patron](https://www.patreon.com/requarks), donating to our [OpenCollective](https://opencollective.com/wikijs), via [Paypal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FLV5X255Z9CJU&source=url) or via Ethereum (`0xe1d55c19ae86f6bcbfb17e7f06ace96bdbb22cb5`). + + [![Become a Sponsor](https://img.shields.io/badge/donate-github-ea4aaa.svg?style=popout&logo=github)](https://github.com/users/NGPixel/sponsorship) + [![Become a Patron](https://img.shields.io/badge/donate-patreon-orange.svg?style=popout&logo=patreon)](https://www.patreon.com/requarks) + [![Donate on OpenCollective](https://img.shields.io/badge/donate-open%20collective-blue.svg?style=popout&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNTZweCIgaGVpZ2h0PSIyNTZweCIgdmlld0JveD0iMCAwIDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxnPjxwYXRoIGQ9Ik0yMDkuNzY1MTQ0LDEyOC4xNDk5NzkgQzIwOS43NjUxNDQsMTQ0LjE2MzMgMjA0Ljg2NDM4MSwxNTkuNDg5ODkgMTk2LjQ5ODc0NywxNzIuNzI1MDcyIEwyMjkuOTQ1Njc1LDIwNi4xNzE5OTkgQzI0Ni42ODIxMDUsMTgzLjg1Njc1OSAyNTUuNzI5MzA3LDE1Ni43MTUxNTIgMjU1LjcyOTMwNywxMjguODIxMTAyIEMyNTUuNzI5MzA3LDk5LjU1Njk5MTcgMjQ1Ljk3NDYwMyw3My4wNzEwMjA3IDIyOS4yNTg5NDQsNTEuNDg1ODEyOCBMMTk2LjQ4MzE0LDg0LjIxNDc5NCBDMjA1LjEyMjU2MSw5Ny4yMjI0NjgzIDIwOS43MzY5MDcsMTEyLjQ4NzgxIDIwOS43NDk1MzcsMTI4LjEwMzE1NiBMMjA5Ljc2NTE0NCwxMjguMTQ5OTc5IFoiIGZpbGw9IiNCOEQzRjQiPjwvcGF0aD48cGF0aCBkPSJNMTI3LjUxMzQ4NCwyMTAuMzU0ODE2IEM4Mi4xNDYwODcyLDIxMC4yNjg5NTggNDUuMzg3NTA5NCwxNzMuNTE3MzU4IDQ1LjI5MzAzOTMsMTI4LjE0OTk3OSBDNDUuMzYxNzUwMiw4Mi43NjQzMTM4IDgyLjEyNzg0ODcsNDUuOTg0MjU3IDEyNy41MTM0ODQsNDUuODk4MzE4NiBDMTQ0LjI0NDc1Miw0NS44OTgzMTg2IDE1OS41NzEzNDIsNTAuNzk5MDgxNyAxNzIuMTE5NzkyLDU5LjE2NDcxNTQgTDIwNC44NjQzODEsMjYuMzg4OTExNiBDMTgyLjU0MzY1LDkuNjY2NjUxMjkgMTU1LjQwMzQyOSwwLjYzMDg2MzI5OCAxMjcuNTEzNDg0LDAuNjM2NDk0NDAzIEM1Ny4xMjM1NDM3LDAuNjM2NDk0NDAzIDAsNTcuNzYwMDM4MSAwLDEyOC4xNDk5NzkgQzAsMTk4LjUwODcwNCA1Ny4xMjM1NDM3LDI1NS42NjM0NjMgMTI3LjUxMzQ4NCwyNTUuNjYzNDYzIEMxNTUuNTM3MzUyLDI1NS43NDA4NzYgMTgyLjc3NTk4OSwyNDYuNDA4NTEgMjA0Ljg2NDM4MSwyMjkuMTYxODg0IEwxNzEuNDE3NDU0LDE5NS43MzA1NjQgQzE1OS41NTU3MzQsMjA1LjQ4NTI2OCAxNDQuMjYwMzU5LDIxMC4zNTQ4MTYgMTI3LjUxMzQ4NCwyMTAuMzU0ODE2IEwxMjcuNTEzNDg0LDIxMC4zNTQ4MTYgWiIgZmlsbD0iIzdGQURGMiI+PC9wYXRoPjwvZz48L3N2Zz4=)](https://opencollective.com/wikijs) + [![Donate via Paypal](https://img.shields.io/badge/donate-paypal-blue.svg?style=popout&logo=paypal)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FLV5X255Z9CJU&source=url) + [![Donate via Ethereum](https://img.shields.io/badge/donate-ethereum-999.svg?style=popout&logo=ethereum&logoColor=CCC)](https://etherscan.io/address/0xe1d55c19ae86f6bcbfb17e7f06ace96bdbb22cb5) + [![Donate via Bitcoin](https://img.shields.io/badge/donate-bitcoin-ff9900.svg?style=popout&logo=bitcoin&logoColor=CCC)](https://checkout.opennode.com/p/2553c612-f863-4407-82b3-1a7685268747) + [![Buy a T-Shirt](https://img.shields.io/badge/buy-t--shirts-teal.svg?style=popout&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4Igp3aWR0aD0iMjQiIGhlaWdodD0iMjQiCnZpZXdCb3g9IjAgMCAxOTIgMTkyIgpzdHlsZT0iIGZpbGw6IzAwMDAwMDsiPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGZvbnQtZmFtaWx5PSJub25lIiBmb250LXdlaWdodD0ibm9uZSIgZm9udC1zaXplPSJub25lIiB0ZXh0LWFuY2hvcj0ibm9uZSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0wLDE5MnYtMTkyaDE5MnYxOTJ6IiBmaWxsPSJub25lIj48L3BhdGg+PGcgZmlsbD0iIzFhYmM5YyI+PGcgaWQ9InN1cmZhY2UxIj48cGF0aCBkPSJNOTYsMGMtMTUuMjE4NzUsMCAtMjQuNjg3NSwzLjY1NjI1IC0yNS41LDRsLTIyLjUsNy4yNWMtMTAuNDA2MjUsMy4xODc1IC0xOS4wOTM3NSw5LjQzNzUgLTI1LjUsMTguMjVsLTIyLjUsNDIuNWwyNy4yNSwxNi43NWwxMi43NSwtMjR2MTE5LjI1YzAsNC40MDYyNSAyNS4wNjI1LDggNTYsOGMzMC45Mzc1LDAgNTYsLTMuNTkzNzUgNTYsLTh2LTExOS4yNWwxMi43NSwyNGwyNy4yNSwtMTYuNzVsLTIyLjUsLTQyLjVjLTYuNDA2MjUsLTguODEyNSAtMTUuMTU2MjUsLTE1LjA2MjUgLTI0Ljc1LC0xOC4yNWwtMjIuMjUsLTcuMjVjLTAuMTg3NSwwIC0xLjAzMTI1LDEuMzEyNSAtMiwyLjc1bDEuMjUsLTIuNWMwLDAgLTkuODQzNzUsLTQuMjUgLTI1Ljc1LC00LjI1ek05Niw4YzExLjQwNjI1LDAgMTguNDM3NSwyLjI1IDIxLDMuMjVjLTQuNDY4NzUsNS43NSAtMTEuNDA2MjUsMTIuNzUgLTIxLDEyLjc1Yy05LjQwNjI1LDAgLTE2LjQwNjI1LC03LjA2MjUgLTIwLjc1LC0xMi43NWMyLjg3NSwtMS4wNjI1IDkuODc1LC0zLjI1IDIwLjc1LC0zLjI1eiI+PC9wYXRoPjwvZz48L2c+PC9nPjwvc3ZnPg==)](https://wikijs.threadless.com) + +
+ +## Introduction + +This chart bootstraps a Wiki.js deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +It also optionally packages the [PostgreSQL](https://github.com/kubernetes/charts/tree/master/stable/postgresql) as the database but you are free to bring your own. + +## Prerequisites + +- PV provisioner support in the underlying infrastructure (with persistence storage enabled) if you want data persistance + +## Installing the Chart + +To install the chart with the release name `my-release` run the following from this (`helm`) directory: + +```console +$ helm install --name my-release . +``` + +The command deploys Wiki.js on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +$ helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +> **Warning**: Persistant Volume Claims for the database are not deleted automatically. They need to be manually deleted + +```console +$ kubectl delete pvc/data-wiki-postgresql-0 +``` + +## Configuration + +The following table lists the configurable parameters of the Wiki.js chart and their default values. + +| Parameter | Description | Default | +| ------------------------------- | ------------------------------- | ---------------------------------------------------------- | +| `image.repository` | Wiki.js image | `requarks/wiki` | +| `image.tag` | Wiki.js image tag | `latest` | +| `imagePullPolicy` | Image pull policy | `IfNotPresent` | +| `replicacount` | Amount of wiki.js service pods to run | `1` | +| `resources.limits` | wiki.js service resource limits | `{cpu: 500m, memory: 500Mi}` | +| `resources.requests` | wiki.js service resource requests | `{cpu: 300m, memory: 300Mi}` | +| `nodeSelector` | Node labels for wiki.js pod assignment | `{}` | +| `affinity` | Affinity settings for wiki.js pod assignment | `{}` | +| `schedulerName` | Name of an alternate scheduler for wiki.js pod | `nil` | +| `tolerations` | Toleration labels for wiki.jsk pod assignment | `[]` | +| `ingress.enabled` | Enable ingress controller resource | `false` | +| `ingress.annotations` | Ingress annotations | `{}` | +| `ingress.hostname` | URL to address your Wiki.js installation | `wiki.local` | +| `ingress.tls` | Ingress TLS configuration | `[]` | +| `postgresql.enabled` | Deploy postgres server (see below) | `true` | +| `postgresql.postgresqlDatabase` | Postgres database name | `wiki` | +| `postgresql.postgresqlUser` | Postgres username | `postgres` | +| `postgresql.postgresqlHost` | External postgres host | `nil` | +| `postgresql.postgresqlPassword` | External postgres password | `nil` | +| `postgresql.postgresqlPort` | External postgres port | `5432` | +| `postgresql.persistence.enabled` | Enable postgres persistence using PVC | `true` | +| `postgresql.persistence.existingClaim` | Provide an existing `PersistentVolumeClaim` for postgres | `nil` | +| `postgresql.persistence.storageClass` | Postgres PVC Storage Class (example: `nfs`) | `nil` | +| `postgresql.persistence.size` | Postgers PVC Storage Request | `10Gi` | + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +$ helm install --name my-release \ + --set postgresql.persistence.enabled=false \ + . +``` + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, + +```console +$ helm install --name my-release -f values.yaml . +``` + +> **Tip**: You can use the default [values.yaml](values.yaml) + +## PostgresSQL + +By default, PostgreSQL is installed as part of the chart. To use an external PostgreSQL server set `postgresql.enabled` to `false` and then set `postgresql.postgresqlHost` and `postgresql.postgresqlPassword`. The other options (`postgresql.postgresqlDatabase`, `postgresql.postgresqlUser` and `postgresql.postgresqlPort`) may also want changing from their default values. + +## Persistence + +Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube. +See the [Configuration](#configuration) section to configure the PVC or to disable persistence. + +## Ingress + +This chart provides support for Ingress resource. If you have an available Ingress Controller such as Nginx or Traefik you maybe want to set `ingress.enabled` to true and choose an `ingress.hostname` for the URL. Then, you should be able to access the installation using that address. diff --git a/dev/helm/charts/postgresql-6.5.0.tgz b/dev/helm/charts/postgresql-6.5.0.tgz new file mode 100644 index 00000000..acc79962 Binary files /dev/null and b/dev/helm/charts/postgresql-6.5.0.tgz differ diff --git a/dev/helm/requirements.yaml b/dev/helm/requirements.yaml deleted file mode 100644 index 16900131..00000000 --- a/dev/helm/requirements.yaml +++ /dev/null @@ -1,5 +0,0 @@ -dependencies: - - name: postgresql - version: 3.18.4 - repository: https://kubernetes-charts.storage.googleapis.com/ - condition: postgresql.enabled diff --git a/dev/helm/templates/NOTES.txt b/dev/helm/templates/NOTES.txt new file mode 100644 index 00000000..5199428e --- /dev/null +++ b/dev/helm/templates/NOTES.txt @@ -0,0 +1,21 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "wiki.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "wiki.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "wiki.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "wiki.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 +{{- end }} diff --git a/dev/helm/templates/_helpers.tpl b/dev/helm/templates/_helpers.tpl new file mode 100644 index 00000000..40af2a9e --- /dev/null +++ b/dev/helm/templates/_helpers.tpl @@ -0,0 +1,108 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "wiki.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 "wiki.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 "wiki.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "wiki.labels" -}} +helm.sh/chart: {{ include "wiki.chart" . }} +{{ include "wiki.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "wiki.selectorLabels" -}} +app.kubernetes.io/name: {{ include "wiki.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "wiki.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "wiki.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- 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). +*/}} +{{- define "wiki.postgresql.fullname" -}} +{{- if .Values.postgresql.fullnameOverride -}} +{{- .Values.postgresql.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{ printf "%s-%s" .Chart.Name "postgresql"}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres host +*/}} +{{- define "wiki.postgresql.host" -}} +{{- if .Values.postgresql.enabled -}} +{{- template "wiki.postgresql.fullname" . -}} +{{- else -}} +{{- .Values.postgresql.postgresqlHost | quote -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres secret +*/}} +{{- define "wiki.postgresql.secret" -}} +{{- if .Values.postgresql.enabled -}} +{{- template "wiki.postgresql.fullname" . -}} +{{- else -}} +{{- template "wiki.fullname" . -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres secretKey +*/}} +{{- define "wiki.postgresql.secretKey" -}} +{{- if .Values.postgresql.enabled -}} +"postgresql-password" +{{- else -}} +{{- default "postgresql-password" .Values.postgresql.existingSecretKey | quote -}} +{{- end -}} +{{- end -}} diff --git a/dev/helm/templates/deployment.yaml b/dev/helm/templates/deployment.yaml new file mode 100644 index 00000000..7611db99 --- /dev/null +++ b/dev/helm/templates/deployment.yaml @@ -0,0 +1,75 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "wiki.fullname" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "wiki.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "wiki.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "wiki.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: DB_TYPE + value: postgres + - name: DB_HOST + value: {{ template "wiki.postgresql.host" . }} + - name: DB_PORT + value: "{{ default "5432" .Values.postgresql.postgresqlPort }}" + - name: DB_NAME + value: {{ default "wiki" .Values.postgresql.postgresqlDatabase }} + - name: DB_USER + value: {{ default "wiki" .Values.postgresql.postgresqlUser }} + - name: DB_PASS + valueFrom: + secretKeyRef: + {{- if .Values.postgresql.existingSecret }} + name: {{ .Values.postgresql.existingSecret }} + {{- else }} + name: {{ template "wiki.postgresql.secret" . }} + {{- end }} + key: {{ template "wiki.postgresql.secretKey" . }} + ports: + - name: http + containerPort: 3000 + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: http + readinessProbe: + httpGet: + path: /healthz + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/dev/helm/templates/ingress.yaml b/dev/helm/templates/ingress.yaml index 01d60ffb..0b08134d 100644 --- a/dev/helm/templates/ingress.yaml +++ b/dev/helm/templates/ingress.yaml @@ -1,39 +1,41 @@ -{{- if .Values.ingress.enabled }} -{{- range .Values.ingress.hosts }} +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "wiki.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} apiVersion: extensions/v1beta1 +{{- end }} kind: Ingress metadata: - name: {{ template "wiki.fullname" $ }} + name: {{ $fullName }} labels: - app: {{ template "wiki.name" $ }} - chart: {{ template "wiki.chart" $ }} - release: {{ $.Release.Name | quote }} - heritage: {{ $.Release.Service | quote }} + {{- include "wiki.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} annotations: - {{- if .tls }} - ingress.kubernetes.io/secure-backends: "true" - {{- end }} - {{- if .certManager }} - kubernetes.io/tls-acme: "true" - {{- end }} - {{- range $key, $value := .annotations }} - {{ $key }}: {{ $value | quote }} - {{- end }} + {{- toYaml . | nindent 4 }} + {{- end }} spec: - rules: - - host: {{ .name }} - http: - paths: - - path: {{ default "/" .path }} - backend: - serviceName: {{ template "wiki.fullname" $ }} - servicePort: 80 -{{- if .tls }} +{{- if .Values.ingress.tls }} tls: - - hosts: - - {{ .name }} - secretName: {{ .tlsSecret }} -{{- end }} ---- + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ . }} + backend: + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} {{- end }} diff --git a/dev/helm/templates/secrets.yaml b/dev/helm/templates/secrets.yaml deleted file mode 100644 index 66241deb..00000000 --- a/dev/helm/templates/secrets.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "wiki.fullname" . }} - labels: - app: {{ template "wiki.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -type: Opaque -data: - db-user: {{ .Values.postgresql.postgresUser | b64enc | quote }} - db-password: {{ .Values.postgresql.postgresPassword | b64enc | quote }} diff --git a/dev/helm/templates/service.yaml b/dev/helm/templates/service.yaml index 1bf029bb..567282e7 100644 --- a/dev/helm/templates/service.yaml +++ b/dev/helm/templates/service.yaml @@ -1,32 +1,15 @@ apiVersion: v1 kind: Service metadata: - name: {{ template "wiki.fullname" . }} + name: {{ include "wiki.fullname" . }} labels: - app: {{ template "wiki.name" . }} - chart: {{ template "wiki.chart" . }} - release: {{ .Release.Name | quote }} - heritage: {{ .Release.Service | quote }} + {{- include "wiki.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} - {{- if .Values.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if (or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort")) }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy | quote }} - {{- end }} ports: - - name: http - port: {{ .Values.service.port }} - targetPort: http - {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePorts.http)))}} - nodePort: {{ .Values.service.nodePorts.http }} - {{- end }} - - name: https - port: {{ .Values.service.httpsPort }} - targetPort: https - {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePorts.https)))}} - nodePort: {{ .Values.service.nodePorts.https }} - {{- end }} + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http selector: - app: {{ template "wiki.name" . }} + {{- include "wiki.selectorLabels" . | nindent 4 }} diff --git a/dev/helm/templates/serviceaccount.yaml b/dev/helm/templates/serviceaccount.yaml new file mode 100644 index 00000000..7f6c8917 --- /dev/null +++ b/dev/helm/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "wiki.serviceAccountName" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end -}} diff --git a/dev/helm/templates/tests/test-connection.yaml b/dev/helm/templates/tests/test-connection.yaml new file mode 100644 index 00000000..2d0887d4 --- /dev/null +++ b/dev/helm/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "wiki.fullname" . }}-test-connection" + labels: + {{- include "wiki.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test-success +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "wiki.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/dev/helm/values.yaml b/dev/helm/values.yaml index 2a5ec42c..e4149df7 100644 --- a/dev/helm/values.yaml +++ b/dev/helm/values.yaml @@ -1,41 +1,104 @@ -## +# Default values for wiki. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: requarks/wiki + pullPolicy: IfNotPresent + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: wiki.local + paths: ["/"] + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +nodeSelector: {} + +tolerations: [] + +affinity: {} + ## Configuration values for the postgresql dependency. ## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md +## postgresql: - ## ## Use the PostgreSQL chart dependency. - ## Set to false if bringing your own PostgreSQL. + ## Set to false if bringing your own PostgreSQL, and set secret value postgresql-uri. + ## enabled: true + ### PostgreSQL User to create. ## - ## If you are bringing your own PostgreSQL, you should set postgresHost and - ## also probably service.port, postgresUser, postgresPassword, and postgresDatabase - ## postgresHost: - ## - ## PostgreSQL port - service: - port: 5432 - ## PostgreSQL User to create. - postgresUser: wiki - ## - ## PostgreSQL Password for the new user. - ## If not set, a random 10 characters password will be used. - postgresPassword: wikijsrocks - ## + postgresqlUser: postgres ## PostgreSQL Database to create. - postgresDatabase: wiki ## + postgresqlDatabase: wiki ## Persistent Volume Storage configuration. ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes + ## persistence: - ## ## Enable PostgreSQL persistence using Persistent Volume Claims. + ## enabled: true + ## concourse data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) ## - ## Persistant class - # storageClass: classname + # storageClass: "-" + ## Persistent Volume Access Mode. ## - ## Access mode: accessMode: ReadWriteOnce + ## Persistent Volume Storage Size. ## - ## Requested size: - size: 10Gi + size: 8Gi