From 9f6e0866336671a2ae405098a6d31b784f29a838 Mon Sep 17 00:00:00 2001 From: Ween Jiann Date: Mon, 29 Mar 2021 22:20:33 +0800 Subject: [PATCH] Added Redis to Chart (#312) * Added redis to chart * Add snappdf config * Updated configmap * Updated appVersion --- charts/invoiceninja/Chart.lock | 11 ++-- charts/invoiceninja/Chart.yaml | 8 ++- charts/invoiceninja/README.md | 41 ++++++++++-- charts/invoiceninja/templates/_helpers.tpl | 64 +++++++++++++++++++ charts/invoiceninja/templates/configmap.yaml | 33 +++++++++- charts/invoiceninja/templates/deployment.yaml | 39 ++++++++++- charts/invoiceninja/templates/secret.yaml | 21 ++++++ charts/invoiceninja/values.yaml | 62 +++++++++++++++++- 8 files changed, 261 insertions(+), 18 deletions(-) diff --git a/charts/invoiceninja/Chart.lock b/charts/invoiceninja/Chart.lock index 58439af..6127b4a 100644 --- a/charts/invoiceninja/Chart.lock +++ b/charts/invoiceninja/Chart.lock @@ -1,12 +1,15 @@ dependencies: - name: common repository: https://charts.bitnami.com/bitnami - version: 1.4.1 + version: 1.4.2 - name: nginx repository: https://charts.bitnami.com/bitnami version: 8.8.0 - name: mariadb repository: https://charts.bitnami.com/bitnami - version: 9.3.5 -digest: sha256:d809702ee601a8a0019defb9ee3fc5a5b5332968e1038cca8b44d5332b14a275 -generated: "2021-03-23T00:33:02.690189+08:00" + version: 9.3.6 +- name: redis + repository: https://charts.bitnami.com/bitnami + version: 12.9.0 +digest: sha256:008659600506cbc8dd5c9b8e96ce81430e4d8582368646469aa17a37441f5bbc +generated: "2021-03-29T18:41:17.978475+08:00" diff --git a/charts/invoiceninja/Chart.yaml b/charts/invoiceninja/Chart.yaml index 9db2e80..afbba79 100644 --- a/charts/invoiceninja/Chart.yaml +++ b/charts/invoiceninja/Chart.yaml @@ -13,11 +13,11 @@ type: application # 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. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.0 +version: 0.2.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 5.1.30 +appVersion: 5.1.32 keywords: - invoiceninja home: https://github.com/lwj5/invoiceninja-chart @@ -37,6 +37,10 @@ dependencies: name: mariadb repository: https://charts.bitnami.com/bitnami version: 9.3.x + - condition: redis.enabled + name: redis + repository: https://charts.bitnami.com/bitnami + version: 12.9.x maintainers: - email: lwj5@hotmail.com name: lwj5 diff --git a/charts/invoiceninja/README.md b/charts/invoiceninja/README.md index 530587b..875b0ae 100644 --- a/charts/invoiceninja/README.md +++ b/charts/invoiceninja/README.md @@ -78,6 +78,12 @@ The following table shows the configuration options for the Invoiceninja helm ch | `serviceAccountName` | Name of a service account for the Invoiceninja pods | `default` | | `debug` | Turn on debug mode on Invoiceninja | `false` | | `appKey` | Laravel Application Key | _random 32 character alphanumeric string_ | +| `logChannel` | Name of log channel to use | `nil` | +| `broadcastDriver` | Name of broadcast driver to use | `nil` | +| `cacheDriver` | Name of cache driver to use | `nil` | +| `sessionDriver` | Name of session driver to use | `nil` | +| `queueConnection` | Name of queue connection to use | `nil` | +| `snappdf` | Use snappdf instead of Phantom JS PDF generation | `true` | | `extraEnvVars` | Extra environment variables to be set on Invoiceninja container | `{}` | | `extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars | `nil` | | `extraEnvVarsSecret` | Name of existing Secret containing extra env vars | `nil` | @@ -150,15 +156,36 @@ The following table shows the configuration options for the Invoiceninja helm ch | `persistence.storage.size` | PVC Storage Request | `5Gi` | | `persistence.storage.dataSource` | PVC data source | `{}` | +### Redis parameters + +| Parameter | Description | Default | +| --------------------------------- | -------------------------------------------- | ------- | +| `redis.enabled` | If external redis is used, set it to `false` | `true` | +| `redis.password` | Redis password | `nil` | +| `redis.usePassword` | Use redis password | `false` | +| `externalRedis.host` | Host of the external redis | `nil` | +| `externalRedis.port` | Port of the external redis | `6379` | +| `externalRedis.password` | Password for the external redis | `nil` | +| `externalRedis.databases.default` | Database to use by default | `0` | +| `externalRedis.databases.cache` | Database to use by cache | `1` | + +> See [Dependencies](#dependencies) for more. + ### Database parameters -| Parameter | Description | Default | -| --------------------------- | ------------------------------------ | ----------------------------------------- | -| `mariadb.enabled` | Deploy MariaDB container(s) | `true` | -| `mariadb.auth.rootPassword` | Password for the MariaDB `root` user | _random 10 character alphanumeric string_ | -| `mariadb.auth.database` | Database name to create | `invoiceninja` | -| `mariadb.auth.username` | Database user to create | `invoiceninja` | -| `mariadb.auth.password` | Password for the database | _random 10 character alphanumeric string_ | +| Parameter | Description | Default | +| --------------------------------- | ------------------------------------------- | ----------------------------------------- | +| `mariadb.enabled` | Deploy MariaDB container(s) | `true` | +| `mariadb.auth.rootPassword` | Password for the MariaDB `root` user | _random 10 character alphanumeric string_ | +| `mariadb.auth.database` | Database name to create | `invoiceninja` | +| `mariadb.auth.username` | Database user to create | `invoiceninja` | +| `mariadb.auth.password` | Password for the database | _random 10 character alphanumeric string_ | +| `externalDatabase.host` | Host of the external database | `nil` | +| `externalDatabase.user` | Existing username in the external db | `invoiceninja` | +| `externalDatabase.password` | Password for the above username | `nil` | +| `externalDatabase.database` | Name of the existing database | `invoiceninja` | +| `externalDatabase.port` | Database port number | `3306` | +| `externalDatabase.existingSecret` | Name of the database existing Secret Object | `nil` | > See [Dependencies](#dependencies) for more. diff --git a/charts/invoiceninja/templates/_helpers.tpl b/charts/invoiceninja/templates/_helpers.tpl index 2c12012..4b1c6a6 100644 --- a/charts/invoiceninja/templates/_helpers.tpl +++ b/charts/invoiceninja/templates/_helpers.tpl @@ -28,6 +28,15 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this {{- printf "%s-%s" .Release.Name "nginx" | 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). +*/}} +{{- define "invoiceninja.redis.fullname" -}} +{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + + {{/* Create the name of the service account to use */}} @@ -125,3 +134,58 @@ Return the MariaDB Secret Name {{- printf "%s" (include "invoiceninja.mariadb.fullname" .) -}} {{- end -}} {{- end -}} + +{{/* +Return the Redis Hostname +*/}} +{{- define "invoiceninja.redisHost" -}} +{{- if .Values.redis.enabled }} + {{- printf "%s-%s" (include "invoiceninja.redis.fullname" .) "master" | trunc 63 | trimSuffix "-" -}} +{{- else -}} + {{- printf "%s" .Values.externalRedis.host -}} +{{- end -}} +{{- end -}} + +{{/* +Return the Redis Port +*/}} +{{- define "invoiceninja.redisPort" -}} +{{- if .Values.redis.enabled }} + {{- printf "6379" -}} +{{- else -}} + {{- printf "%d" (.Values.externalRedis.port | int ) -}} +{{- end -}} +{{- end -}} + +{{/* +Return the Redis Database +*/}} +{{- define "invoiceninja.redisDatabase" -}} +{{- if .Values.redis.enabled }} + {{- printf "0" -}} +{{- else -}} + {{- printf "%s" .Values.externalRedis.databases.default -}} +{{- end -}} +{{- end -}} + +{{/* +Return the Redis Database +*/}} +{{- define "invoiceninja.redisCacheDatabase" -}} +{{- if .Values.redis.enabled }} + {{- printf "1" -}} +{{- else -}} + {{- printf "%s" .Values.externalRedis.databases.cache -}} +{{- end -}} +{{- end -}} + +{{/* +Return the Redis Secret Name +*/}} +{{- define "invoiceninja.redisSecretName" -}} +{{- if .Values.externalRedis.existingSecret -}} + {{- printf "%s" .Values.externalRedis.existingSecret -}} +{{- else -}} + {{- printf "%s" (include "invoiceninja.redis.fullname" .) -}} +{{- end -}} +{{- end -}} diff --git a/charts/invoiceninja/templates/configmap.yaml b/charts/invoiceninja/templates/configmap.yaml index 18350b1..08a8f49 100644 --- a/charts/invoiceninja/templates/configmap.yaml +++ b/charts/invoiceninja/templates/configmap.yaml @@ -12,10 +12,41 @@ metadata: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} {{- end }} data: + {{- if .Values.nginx.ingress.enabled }} + APP_URL: "http://{{ .Values.nginx.ingress.hostname }}/" + {{- else }} APP_URL: "http://{{ include "common.names.fullname" . }}/" + {{- end }} APP_DEBUG: {{ .Values.debug | quote }} - MULTI_DB_ENABLED: "false" DB_HOST1: {{ include "invoiceninja.databaseHost" . | quote }} DB_PORT1: {{ include "invoiceninja.databasePort" . | quote }} DB_USERNAME1: {{ include "invoiceninja.databaseUser" . | quote }} DB_DATABASE1: {{ include "invoiceninja.databaseName" . | quote }} + {{- if not (empty .Values.logChannel) }} + LOG_CHANNEL: {{ .Values.logChannel | quote }} + {{- end }} + {{- if not (empty .Values.broadcastDriver) }} + BROADCAST_DRIVER: {{ .Values.broadcastDriver | quote }} + {{- else if or .Values.redis.enabled (not (empty .Values.externalRedis.host)) }} + BROADCAST_DRIVER: redis + {{- end }} + {{- if not (empty .Values.cacheDriver) }} + CACHE_DRIVER: {{ .Values.cacheDriver | quote }} + {{- else if or .Values.redis.enabled (not (empty .Values.externalRedis.host)) }} + CACHE_DRIVER: redis + {{- end }} + {{- if not (empty .Values.sessionDriver) }} + SESSION_DRIVER: {{ .Values.sessionDriver | quote }} + {{- else if or .Values.redis.enabled (not (empty .Values.externalRedis.host)) }} + SESSION_DRIVER: redis + {{- end }} + {{- if not (empty .Values.queueConnection) }} + QUEUE_CONNECTION: {{ .Values.queueConnection | quote }} + {{- else if or .Values.redis.enabled (not (empty .Values.externalRedis.host)) }} + QUEUE_CONNECTION: redis + {{- end }} + PHANTOMJS_PDF_GENERATION: {{ not .Values.snappdf | quote}} + REDIS_HOST: {{ include "invoiceninja.redisHost" . | quote }} + REDIS_PORT: {{ include "invoiceninja.redisPort" . | quote }} + REDIS_DB: {{ include "invoiceninja.redisDatabase" . | quote }} + REDIS_CACHE_DB: {{ include "invoiceninja.redisCacheDatabase" . | quote }} diff --git a/charts/invoiceninja/templates/deployment.yaml b/charts/invoiceninja/templates/deployment.yaml index 04ce738..00d21d5 100644 --- a/charts/invoiceninja/templates/deployment.yaml +++ b/charts/invoiceninja/templates/deployment.yaml @@ -54,6 +54,36 @@ spec: {{- end }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + initContainers: + - name: wait-db + image: {{ include "invoiceninja.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: + - /bin/sh + - -cx + - | + COUNTER=0; + while [ $COUNTER -lt 120 ]; do + if mysqladmin ping -h "$DB_HOST1" -P $DB_PORT1 --silent; then + exit 0; + fi; + let COUNTER=COUNTER+1; + echo "Waiting for DB ($DB_HOST1:$DB_PORT1)" + sleep 2; + done; + echo "Did NOT see a database after 240 secs!"; + exit 1; + securityContext: + {{- toYaml .Values.containerSecurityContext | nindent 12 }} + {{- if .Values.resources }} + resources: {{- toYaml .Values.resources | nindent 12 }} + {{- end }} + envFrom: + - configMapRef: + name: {{ include "common.names.fullname" . }} + {{- if .Values.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} + {{- end }} containers: - name: {{ .Chart.Name }} securityContext: @@ -98,13 +128,18 @@ spec: name: {{ include "common.tplvalues.render" (dict "value" .Values.extraEnvVarsSecret "context" $) }} {{- end }} env: - - name: IS_DOCKER - value: "true" - name: DB_PASSWORD1 valueFrom: secretKeyRef: name: {{ include "invoiceninja.databaseSecretName" . }} key: mariadb-password + {{- if not (and .Values.redis.enabled (not .Values.redis.usePassword)) }} + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "invoiceninja.redisSecretName" . }} + key: redis-password + {{- end }} {{- if .Values.extraEnvVars }} {{- include "common.tplvalues.render" (dict "value" .Values.extraEnvVars "context" $) | nindent 12 }} {{- end }} diff --git a/charts/invoiceninja/templates/secret.yaml b/charts/invoiceninja/templates/secret.yaml index 4f15f80..d170719 100644 --- a/charts/invoiceninja/templates/secret.yaml +++ b/charts/invoiceninja/templates/secret.yaml @@ -16,6 +16,27 @@ type: Opaque data: mariadb-password: {{ .Values.externalDatabase.password | b64enc | quote }} {{- end }} + +--- +{{- if not (or .Values.redis.enabled .Values.externalDatabase.existingSecret) }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "invoiceninja.redis.fullname" . }} + labels: + {{- include "common.labels.standard" $ | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + annotations: + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +type: Opaque +data: + redis-password: {{ .Values.externalRedis.password | b64enc | quote }} +{{- end }} + --- apiVersion: v1 kind: Secret diff --git a/charts/invoiceninja/values.yaml b/charts/invoiceninja/values.yaml index 719d4af..c0d6baa 100644 --- a/charts/invoiceninja/values.yaml +++ b/charts/invoiceninja/values.yaml @@ -18,7 +18,7 @@ image: registry: docker.io repository: invoiceninja/invoiceninja - tag: 5.1.31 + tag: 5.1.32 ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images ## @@ -38,6 +38,30 @@ debug: false ## appKey: "" +## Name of log channel to use +## +logChannel: "" + +## Name of broadcast driver to use +## +broadcastDriver: "" + +## Name of cache driver to use +## +cacheDriver: "" + +## Name of session driver to use +## +sessionDriver: "" + +## Name of queue connection to use +## +queueConnection: "" + +## Use local or Phantom JS PDF generation +## +snappdf: true + ## String to partially override fullname template (will maintain the release name) ## # nameOverride: @@ -306,6 +330,40 @@ autoscaling: targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80 +## Redis chart configuration +## ref: https://github.com/bitnami/charts/blob/master/bitnami/redis/values.yaml +## +redis: + enabled: true + usePassword: false + cluster: + enabled: false + +## External Redis Configuration +## +## All of these values are only used when redis.enabled is set to false +## +externalRedis: + ## Redis host + ## + host: "" + ## Redis port number + ## + port: 6379 + ## Redis password + ## + password: "" + ## Use existing secret (ignores previous password) + ## must contain key `redis-password` + ## NOTE: When it's set, the `externalRedis.password` parameter is ignored + ## + # existingSecret: + ## Redis databases + ## + databases: + default: "0" + cache: "1" + ## MariaDB chart configuration ## ref: https://github.com/bitnami/charts/blob/master/bitnami/mariadb/values.yaml ## @@ -333,7 +391,7 @@ mariadb: externalDatabase: ## Database host ## - host: localhost + host: "" ## non-root Username for Invoiceninja Database ## user: invoiceninja