diff --git a/.env b/.env deleted file mode 100644 index d2d7b10..0000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -REACT_APP_API_URL=https://oas-api.initdevelopment.com/api/v1 -EXTEND_ESLINT=true \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9d70429..27f16a3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ # misc .DS_Store +.env .env.local .env.development.local .env.test.local @@ -25,3 +26,9 @@ yarn-error.log* .eslintcache cypress/videos/ + +# Helm dependencies +deployment/helmchart/charts/ + +# Helm values +deployment/helmchart/values-local.yaml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 93c1dda..a1ed1b8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,8 +13,8 @@ build-project: script: - echo "Building app" - yarn install - # - echo "REACT_APP_API_URL=https://oas-api.initdevelopment.com/api/v1" > .env - # - echo "EXTEND_ESLINT=true" >> .env + - echo "REACT_APP_API_URL=/api/v1" > .env + - echo "EXTEND_ESLINT=true" >> .env - yarn build - mv build web-build - echo "Build successful" diff --git a/deployment/helmchart/.helmignore b/deployment/helmchart/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/deployment/helmchart/.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/deployment/helmchart/Chart.lock b/deployment/helmchart/Chart.lock new file mode 100644 index 0000000..c76e835 --- /dev/null +++ b/deployment/helmchart/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: https://charts.bitnami.com/bitnami + version: 1.10.0 +digest: sha256:d6f283322d34efda54721ddd67aec935f1bea501c7b45dfbe89814aed21ae5dc +generated: "2021-09-30T16:27:06.738339948+02:00" diff --git a/deployment/helmchart/Chart.yaml b/deployment/helmchart/Chart.yaml new file mode 100644 index 0000000..3ffebdf --- /dev/null +++ b/deployment/helmchart/Chart.yaml @@ -0,0 +1,25 @@ +annotations: + category: Dashboard +apiVersion: v2 +appVersion: 0.1.1 +dependencies: + - name: common + repository: https://charts.bitnami.com/bitnami + tags: + - bitnami-common + version: 1.x.x +description: A Helm chart for deploying the Stackspin Dashboard to Kubernetes +engine: gotpl +home: https://open.greenhost.net/openappstack/dashboard-frontend/ +icon: https://open.greenhost.net/openappstack/dashboard-frontend/-/blob/master/public/assets/logo.svg +keywords: + - stackspin + - dashboard +maintainers: + - email: info@openappstack.net + name: Stackspin +name: stackspin-dashboard +sources: + - https://open.greenhost.net/openappstack/dashboard-frontend/ + - https://open.greenhost.net/openappstack/dashboard-backend/ +version: 0.1.0 diff --git a/deployment/helmchart/templates/_helpers.tpl b/deployment/helmchart/templates/_helpers.tpl new file mode 100644 index 0000000..c05dc41 --- /dev/null +++ b/deployment/helmchart/templates/_helpers.tpl @@ -0,0 +1,134 @@ + +{{/* +Create the name of the service account to use +*/}} +{{- define "dashboard.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "common.names.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Return the proper container image registry secret names +*/}} +{{- define "dashboard.imagePullSecrets" -}} +{{ include "common.images.pullSecrets" (dict "images" (list .Values.image) "global" .Values.global) }} +{{- end -}} + +{{/* +Return true if a secret object for backend should be created +*/}} +{{- define "backend.createSecret" -}} +{{- if or (not .Values.backend.existingSecret) (and (not .Values.backend.smtp.existingSecret) .Values.backend.smtp.password .Values.backend.smtp.enabled) }} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Return the backend secret name +*/}} +{{- define "backend.secretName" -}} +{{- if .Values.backend.existingSecret }} + {{- printf "%s" .Values.backend.existingSecret -}} +{{- else -}} + {{- printf "%s-backend" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return the backend SMTP secret name +*/}} +{{- define "backend.smtp.secretName" -}} +{{- if .Values.backend.smtp.existingSecret }} + {{- printf "%s" .Values.backend.smtp.existingSecret -}} +{{- else -}} + {{- printf "%s-backend" (include "common.names.fullname" .) -}} +{{- end -}} +{{- end -}} + +{{/* +Return true if backend SMTP uses password authentication +*/}} +{{- define "backend.smtp.password.enabled" -}} +{{- if and (or .Values.backend.smtp.password .Values.backend.smtp.existingSecret) .Values.backend.smtp.enabled }} + {{- true -}} +{{- end -}} +{{- end -}} + +{{/* +Get the user defined LoadBalancerIP for this release +Note, returns 127.0.0.1 if using ClusterIP. +*/}} +{{- define "frontend.serviceIP" -}} +{{- if eq .Values.frontend.service.type "ClusterIP" -}} +127.0.0.1 +{{- else -}} +{{- .Values.frontend.service.loadBalancerIP | default "" -}} +{{- end -}} +{{- end -}} + +{{/* +Gets the host to be used for this application. +If not using ClusterIP, or if a host or LoadBalancerIP is not defined, the value will be empty +*/}} +{{- define "frontend.host" -}} +{{- $host := .Values.frontend.host | default "" -}} +{{- default (include "frontend.serviceIP" .) $host -}} +{{- end -}} + +{{/* +Service name for the backend service +*/}} +{{- define "backend.serviceName" -}} + {{ include "common.names.fullname" . }}-backend +{{- end -}} + +{{/* +Service name for the frontend service +*/}} +{{- define "frontend.serviceName" -}} + {{ include "common.names.fullname" . }}-frontend +{{- end -}} + +{{/* +Get the user defined LoadBalancerIP for this release +Note, returns 127.0.0.1 if using ClusterIP. +*/}} +{{- define "backend.serviceIP" -}} +{{- if eq .Values.backend.service.type "ClusterIP" -}} +127.0.0.1 +{{- else -}} +{{- .Values.backend.service.loadBalancerIP | default "" -}} +{{- end -}} +{{- end -}} + +{{/* +Gets the host to be used for this application. +If not using ClusterIP, or if a host or LoadBalancerIP is not defined, the value will be empty +*/}} +{{- define "backend.host" -}} +{{- $host := .Values.backend.host | default "" -}} +{{- default (include "backend.serviceIP" .) $host -}} +{{- end -}} + +{{/* +Return the proper frontend image name +*/}} +{{- define "frontend.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.frontend.image "global" .Values.global) }} +{{- end -}} +{{/* +Return the proper backend image name +*/}} +{{- define "backend.image" -}} +{{ include "common.images.image" (dict "imageRoot" .Values.backend.image "global" .Values.global) }} +{{- end -}} + +{{/* +Return the proper Storage Class +*/}} +{{- define "dashboard.storageClass" -}} +{{- include "common.storage.class" (dict "persistence" .Values.persistence "global" .Values.global) -}} +{{- end -}} diff --git a/deployment/helmchart/templates/backend-service.yaml b/deployment/helmchart/templates/backend-service.yaml new file mode 100644 index 0000000..fe6b59f --- /dev/null +++ b/deployment/helmchart/templates/backend-service.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "backend.serviceName" . }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if or .Values.backend.service.annotations .Values.commonAnnotations}} + annotations: + {{- if .Values.backend.service.annotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.backend.service.annotations "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 4 }} + {{- end }} + {{- end }} +spec: + type: {{ .Values.backend.service.type }} + {{- if (or (eq .Values.backend.service.type "LoadBalancer") (eq .Values.backend.service.type "NodePort")) }} + externalTrafficPolicy: {{ .Values.backend.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if (and (eq .Values.backend.service.type "LoadBalancer") (not (empty .Values.backend.service.loadBalancerIP))) }} + loadBalancerIP: {{ .Values.backend.service.loadBalancerIP }} + {{- end }} + {{- if (and (eq .Values.backend.service.type "LoadBalancer") .Values.backend.service.loadBalancerSourceRanges) }} + loadBalancerSourceRanges: + {{ toYaml .Values.backend.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + ports: + - name: http + port: {{ .Values.backend.service.port }} + targetPort: backend-http + {{- if (and (or (eq .Values.backend.service.type "NodePort") (eq .Values.backend.service.type "LoadBalancer")) (not (empty .Values.backend.service.nodePorts.http))) }} + nodePort: {{ .Values.backend.service.nodePorts.http }} + {{- else if eq .Values.backend.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.backend.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.backend.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + selector: {{- include "common.labels.matchLabels" . | nindent 4 }} diff --git a/deployment/helmchart/templates/configmaps.yaml b/deployment/helmchart/templates/configmaps.yaml new file mode 100644 index 0000000..2fa47b0 --- /dev/null +++ b/deployment/helmchart/templates/configmaps.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "common.names.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 }} +data: + SECRET_KEY: {{ .Values.backend.secretKey }} + FLASK_APP: app.py + FLASK_ENV: {{ .Values.backend.flaskEnv }} + # Probably needed in the future: + # ADMIN_BACKEND_USERNAME: {{ .Values.backend.username | quote }} + # ADMIN_BACKEND_EMAIL: {{ .Values.backend.email | quote }} + # {{- if .Values.backend.smtp.enabled }} + # ADMIN_BACKEND_SMTP_HOST: {{ .Values.backend.smtp.host | quote }} + # ADMIN_BACKEND_SMTP_PORT: {{ .Values.backend.smtp.port | quote }} + # {{- if .Values.backend.smtp.user }} + # ADMIN_BACKEND_SMTP_USER: {{ .Values.backend.smtp.user | quote }} + # {{- end }} + # {{- if .Values.backend.smtp.protocol }} + # ADMIN_BACKEND_SMTP_PROTOCOL: {{ .Values.backend.smtp.protocol | quote }} + # {{- end }} + # {{- if .Values.backend.smtp.auth }} + # ADMIN_BACKEND_SMTP_AUTH: {{ .Values.backend.smtp.auth | quote }} + # {{- end }} + # {{- end }} diff --git a/deployment/helmchart/templates/deployment.yaml b/deployment/helmchart/templates/deployment.yaml new file mode 100644 index 0000000..d630bae --- /dev/null +++ b/deployment/helmchart/templates/deployment.yaml @@ -0,0 +1,199 @@ +apiVersion: {{ template "common.capabilities.deployment.apiVersion" . }} +kind: Deployment +metadata: + name: {{ template "common.names.fullname" . }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + component: dashboard + {{- 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 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }} + component: dashboard + {{- if .Values.updateStrategy }} + strategy: {{- toYaml .Values.updateStrategy | nindent 4 }} + {{- end }} + template: + metadata: + labels: {{- include "common.labels.standard" . | nindent 8 }} + component: dashboard + {{- if .Values.podLabels }} + {{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.podAnnotations }} + annotations: {{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }} + {{- end }} + spec: + {{- include "dashboard.imagePullSecrets" . | nindent 6 }} + {{- if .Values.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: {{- include "common.tplvalues.render" (dict "value" .Values.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAffinityPreset "context" $) | nindent 10 }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.podAntiAffinityPreset "context" $) | nindent 10 }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.nodeAffinityPreset.type "key" .Values.nodeAffinityPreset.key "values" .Values.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- if .Values.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" (dict "value" .Values.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.tolerations "context" $) | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "dashboard.serviceAccountName" . }} + securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} + initContainers: + {{- if .Values.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.initContainers "context" $) | nindent 8 }} + {{- end }} + containers: + - name: frontend + securityContext: {{- toYaml .Values.frontend.containerSecurityContext | nindent 12 }} + image: {{ template "frontend.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if .Values.frontend.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.frontend.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.frontend.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.frontend.args "context" $) | nindent 12 }} + {{- end }} + env: + {{- if .Values.frontend.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.frontend.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + envFrom: + - configMapRef: + name: {{ include "common.names.fullname" . }} + {{- if .Values.frontend.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.frontend.extraEnvVarsCM }} + {{- end }} + {{- if .Values.frontend.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.frontend.extraEnvVarsSecret }} + {{- end }} + ports: + - name: frontend-http + containerPort: 80 + protocol: TCP + {{- if .Values.frontend.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: / + port: frontend-http + initialDelaySeconds: {{ .Values.frontend.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.frontend.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.frontend.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.frontend.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.frontend.livenessProbe.failureThreshold }} + {{- else if .Values.frontend.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.frontend.customLivenessProbe "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.frontend.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: / + port: frontend-http + initialDelaySeconds: {{ .Values.frontend.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.frontend.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.frontend.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.frontend.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.frontend.readinessProbe.failureThreshold }} + {{- else if .Values.frontend.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.frontend.customReadinessProbe "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.frontend.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.frontend.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.frontend.resources }} + resources: {{- toYaml .Values.frontend.resources | nindent 12 }} + {{- end }} + - name: backend + securityContext: {{- toYaml .Values.backend.containerSecurityContext | nindent 12 }} + image: {{ template "backend.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy | quote }} + {{- if .Values.backend.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.backend.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.backend.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.backend.args "context" $) | nindent 12 }} + {{- end }} + env: + - name: ADMIN_PANEL_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "backend.secretName" . }} + key: backend-password + {{- if (include "backend.smtp.password.enabled" .) }} + - name: ADMIN_PANEL_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: {{ include "backend.smtp.secretName" . }} + key: smtp-password + {{- end }} + {{- if .Values.backend.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.backend.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + envFrom: + - configMapRef: + name: {{ include "common.names.fullname" . }} + {{- if .Values.backend.extraEnvVarsCM }} + - configMapRef: + name: {{ .Values.backend.extraEnvVarsCM }} + {{- end }} + {{- if .Values.backend.extraEnvVarsSecret }} + - secretRef: + name: {{ .Values.backend.extraEnvVarsSecret }} + {{- end }} + ports: + - name: backend-http + containerPort: 5000 + protocol: TCP + {{- if .Values.backend.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: / + port: backend-http + initialDelaySeconds: {{ .Values.backend.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.backend.livenessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.backend.livenessProbe.timeoutSeconds }} + successThreshold: {{ .Values.backend.livenessProbe.successThreshold }} + failureThreshold: {{ .Values.backend.livenessProbe.failureThreshold }} + {{- else if .Values.backend.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.backend.customLivenessProbe "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.backend.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: / + port: backend-http + initialDelaySeconds: {{ .Values.backend.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.backend.readinessProbe.periodSeconds }} + timeoutSeconds: {{ .Values.backend.readinessProbe.timeoutSeconds }} + successThreshold: {{ .Values.backend.readinessProbe.successThreshold }} + failureThreshold: {{ .Values.backend.readinessProbe.failureThreshold }} + {{- else if .Values.backend.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.backend.customReadinessProbe "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.backend.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.backend.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.backend.resources }} + resources: {{- toYaml .Values.backend.resources | nindent 12 }} + {{- end }} + {{- if .Values.sidecars }} + {{- include "common.tplvalues.render" (dict "value" .Values.sidecars "context" $) | nindent 8 }} + {{- end }} + volumes: + {{- if .Values.extraVolumes }} + {{- include "common.tplvalues.render" (dict "value" .Values.extraVolumes "context" $) | nindent 8 }} + {{- end }} diff --git a/deployment/helmchart/templates/frontend-service.yaml b/deployment/helmchart/templates/frontend-service.yaml new file mode 100644 index 0000000..35d5860 --- /dev/null +++ b/deployment/helmchart/templates/frontend-service.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "frontend.serviceName" . }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if or .Values.frontend.service.annotations .Values.commonAnnotations}} + annotations: + {{- if .Values.frontend.service.annotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.frontend.service.annotations "context" $) | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 4 }} + {{- end }} + {{- end }} +spec: + type: {{ .Values.frontend.service.type }} + {{- if (or (eq .Values.frontend.service.type "LoadBalancer") (eq .Values.frontend.service.type "NodePort")) }} + externalTrafficPolicy: {{ .Values.frontend.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if (and (eq .Values.frontend.service.type "LoadBalancer") (not (empty .Values.frontend.service.loadBalancerIP))) }} + loadBalancerIP: {{ .Values.frontend.service.loadBalancerIP }} + {{- end }} + {{- if (and (eq .Values.frontend.service.type "LoadBalancer") .Values.frontend.service.loadBalancerSourceRanges) }} + loadBalancerSourceRanges: + {{ toYaml .Values.frontend.service.loadBalancerSourceRanges | nindent 4 }} + {{- end }} + ports: + - name: http + port: {{ .Values.frontend.service.port }} + targetPort: frontend-http + {{- if (and (or (eq .Values.frontend.service.type "NodePort") (eq .Values.frontend.service.type "LoadBalancer")) (not (empty .Values.frontend.service.nodePorts.http))) }} + nodePort: {{ .Values.frontend.service.nodePorts.http }} + {{- else if eq .Values.frontend.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.frontend.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.frontend.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + selector: {{- include "common.labels.matchLabels" . | nindent 4 }} diff --git a/deployment/helmchart/templates/ingress.yaml b/deployment/helmchart/templates/ingress.yaml new file mode 100644 index 0000000..d5e957c --- /dev/null +++ b/deployment/helmchart/templates/ingress.yaml @@ -0,0 +1,66 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: {{ template "common.capabilities.ingress.apiVersion" . }} +kind: Ingress +metadata: + name: {{ template "common.names.fullname" . }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if or .Values.ingress.annotations .Values.ingress.certManager .Values.commonAnnotations }} + annotations: + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} + {{- if .Values.ingress.annotations }} + {{- toYaml .Values.ingress.annotations | nindent 4 }} + {{- end }} + {{- if .Values.ingress.certManager }} + kubernetes.io/tls-acme: "true" + {{- end }} + {{- end }} +spec: + {{- if or .Values.ingress.tls .Values.ingress.extraTls }} + tls: + {{- if .Values.ingress.tls }} + - hosts: + - {{ .Values.ingress.hostname }} + secretName: {{ printf "%s-tls" .Values.ingress.hostname }} + {{- end }} + {{- if .Values.ingress.extraTls }} + {{- toYaml .Values.ingress.extraTls | nindent 4 }} + {{- end }} + {{- end }} + rules: + {{- if .Values.ingress.hostname }} + - host: {{ .Values.ingress.hostname }} + http: + paths: + - path: {{ .Values.ingress.path }} + {{- if eq "true" (include "common.ingress.supportsPathType" .) }} + pathType: {{ .Values.ingress.pathType }} + {{- end }} + backend: {{- include "common.ingress.backend" (dict "serviceName" (include "frontend.serviceName" .) "servicePort" "frontend-http" "context" $) | nindent 14 }} + # Forward API calls to the back-end container + - path: {{ .Values.ingress.path }}api/v1 + {{- if eq "true" (include "common.ingress.supportsPathType" .) }} + pathType: {{ .Values.ingress.pathType }} + {{- end }} + backend: {{- include "common.ingress.backend" (dict "serviceName" (include "backend.serviceName" .) "servicePort" "backend-http" "context" $) | nindent 14 }} + {{- end }} + {{- range .Values.ingress.extraHosts }} + - host: {{ .name }} + http: + paths: + - path: {{ default "/" .path }} + {{- if eq "true" (include "common.ingress.supportsPathType" $) }} + pathType: {{ default "ImplementationSpecific" .pathType }} + {{- end }} + backend: {{- include "common.ingress.backend" (dict "serviceName" (include "frontend.serviceName" $) "servicePort" "frontend-http" "context" $) | nindent 14 }} + - path: {{ default "/" .path }}api/v1 + {{- if eq "true" (include "common.ingress.supportsPathType" $) }} + pathType: {{ default "ImplementationSpecific" .pathType }} + {{- end }} + backend: {{- include "common.ingress.backend" (dict "serviceName" (include "backend.serviceName" .) "servicePort" "backend-http" "context" $) | nindent 14 }} + {{- end }} +{{- end }} diff --git a/deployment/helmchart/templates/pvc.yaml b/deployment/helmchart/templates/pvc.yaml new file mode 100644 index 0000000..2fc1a39 --- /dev/null +++ b/deployment/helmchart/templates/pvc.yaml @@ -0,0 +1,24 @@ +# Disabled by default because the current dashboard does not need persistence +{{- if and (include "frontend.host" .) .Values.persistence.enabled (not .Values.persistence.existingClaim) }} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "common.names.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 }} +spec: + accessModes: + - {{ .Values.persistence.accessMode | quote }} + resources: + requests: + storage: {{ .Values.persistence.size | quote }} + {{ include "dashboard.storageClass" . }} + {{- if .Values.persistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.persistence.selector "context" $) | nindent 4 }} + {{- end -}} +{{- end }} diff --git a/deployment/helmchart/templates/secrets-admin-panel.yaml b/deployment/helmchart/templates/secrets-admin-panel.yaml new file mode 100644 index 0000000..969b210 --- /dev/null +++ b/deployment/helmchart/templates/secrets-admin-panel.yaml @@ -0,0 +1,23 @@ +{{- if (include "backend.createSecret" .) }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "backend.secretName" . }} + 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: + {{- if and (.Values.backend.password) (not .Values.backend.existingSecret) }} + backend-password: {{ .Values.backend.password | b64enc | quote }} + {{- else if not .Values.backend.existingSecret }} + backend-password: {{ randAlphaNum 10 | b64enc | quote }} + {{- end }} + {{- if and (.Values.backend.smtp.password) (.Values.backend.smtp.enabled) (not .Values.backend.smtp.existingSecret) }} + smtp-password: {{ .Values.backend.smtp.password | b64enc | quote }} + {{- end }} +{{- end }} diff --git a/deployment/helmchart/templates/serviceaccount.yaml b/deployment/helmchart/templates/serviceaccount.yaml new file mode 100644 index 0000000..3efda4e --- /dev/null +++ b/deployment/helmchart/templates/serviceaccount.yaml @@ -0,0 +1,19 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "dashboard.serviceAccountName" . }} + labels: {{- include "common.labels.standard" . | nindent 4 }} + {{- if .Values.commonLabels }} + {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} + {{- end }} + {{- if or .Values.serviceAccount.annotations .Values.commonAnnotations }} + annotations: + {{- if .Values.serviceAccount.annotations }} + {{- toYaml .Values.serviceAccount.annotations | nindent 4 }} + {{- end }} + {{- if .Values.commonAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.commonAnnotations "context" $) | nindent 4 }} + {{- end }} + {{- end }} +{{- end -}} diff --git a/deployment/helmchart/templates/tls-secrets.yaml b/deployment/helmchart/templates/tls-secrets.yaml new file mode 100644 index 0000000..090ce7c --- /dev/null +++ b/deployment/helmchart/templates/tls-secrets.yaml @@ -0,0 +1,19 @@ +{{- if .Values.ingress.enabled }} +{{- range .Values.ingress.secrets }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .name }} + 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: kubernetes.io/tls +data: + tls.crt: {{ .certificate | b64enc }} + tls.key: {{ .key | b64enc }} +{{- end }} +{{- end }} diff --git a/deployment/helmchart/values-local.yaml.example b/deployment/helmchart/values-local.yaml.example new file mode 100644 index 0000000..6be3f17 --- /dev/null +++ b/deployment/helmchart/values-local.yaml.example @@ -0,0 +1,12 @@ +# Values you will likely want to override. See values.yaml for their meanings + +frontend: + host: dashboard.oas.example.com + +backend: + secretKey: My random secret key + +ingress: + enabled: true + certManager: true + hostname: dashboard.oas.example.com diff --git a/deployment/helmchart/values.yaml b/deployment/helmchart/values.yaml new file mode 100644 index 0000000..a9df735 --- /dev/null +++ b/deployment/helmchart/values.yaml @@ -0,0 +1,679 @@ +## @section Global parameters +## Global container image parameters +## Please, note that this will override the image parameters, including dependencies, configured to use the global value +## Current available global container image parameters: imageRegistry, imagePullSecrets and storageClass + +## @param global.imageRegistry Global container image registry +## @param global.imagePullSecrets Global container registry secret names as an array +## @param global.storageClass Global StorageClass for Persistent Volume(s) +## +global: + imageRegistry: "" + ## E.g. + ## imagePullSecrets: + ## - myRegistryKeySecretName + ## + imagePullSecrets: [] + storageClass: "" + +## @section Common parameters + +## @param kubeVersion Force target Kubernetes version (using Helm capabilities if not set) +## +kubeVersion: "" +## @param nameOverride String to partially override dashboard.fullname template (will maintain the release name) +## +nameOverride: "" +## @param fullnameOverride String to fully override dashboard.fullname template +## +fullnameOverride: "" +## @param commonLabels Labels to be added to all deployed resources +## +commonLabels: {} +## @param commonAnnotations Annotations to be added to all deployed resources +## +commonAnnotations: {} + + + +## @section Stackspin parameters + +## @param imagePullSecrets Specify docker-registry secret names as an array +## +image: + imagePullSecrets: [] + +## Admin frontend configuration parameters +## ref: https://open.greenhost.net/openappstack/dashboard-frontend +## +frontend: + ## Admin frontend image version + ## ref: https://hub.docker.com/r/bitnami/frontend/tags/ + ## @param image.registry Stackspin image registry + ## @param image.repository Stackspin image repository + ## @param image.tag Stackspin image tag + ## @param image.pullPolicy Stackspin image pull policy + ## @param image.pullSecrets Stackspin image pull secrets + ## @param image.debug Specify if debug logs should be enabled + ## + image: + registry: open.greenhost.net:4567 + repository: openappstack/admin-frontend/admin-frontend + tag: 0.1.1 + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + ## @section Service parameters + + ## Kubernetes service configuration. For minikube, set this to NodePort, elsewhere use LoadBalancer or ClusterIP + ## + service: + ## @param service.type Kubernetes Service type + ## + type: ClusterIP + ## @param service.port Service HTTP port + ## + port: 80 + ## @param service.nodePort Node Ports to expose + ## + nodePort: "" + ## @param service.loadBalancerIP Use loadBalancerIP to request a specific static IP + ## + loadBalancerIP: "" + ## @param service.externalTrafficPolicy Enable client source IP preservation + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param service.annotations Service annotations + ## + annotations: {} + ## @param service.loadBalancerSourceRanges Limits which cidr blocks can connect to service's load balancer + ## Only valid if service.type: LoadBalancer + ## + loadBalancerSourceRanges: [] + ## @param service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param service.nodePorts.http Kubernetes http node port + ## Example: + ## nodePorts: + ## http: + ## + nodePorts: + http: "" + ## @param frontend.extendEslint Whether to read .eslint.json rules + extendEslint: false + ## @param frontend.host Stackspin host to create application URLs (include the port if =/= 80) + ## + host: "" + ## @param frontend.command Custom command to override image cmd + ## + command: [] + ## @param frontend.args Custom args for the custom command + ## + args: [] + ## @param frontend.containerSecurityContext Container security context specification + ## Example: + ## capabilities: + ## drop: + ## - ALL + ## readOnlyRootFilesystem: true + ## runAsNonRoot: true + ## runAsUser: 1000 + ## + containerSecurityContext: {} + ## Stackspin container's resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-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:'. + ## @param frontend.resources.limits The resources limits for the container + ## @param frontend.resources.requests The requested resources for the container + ## + resources: + ## Example: + ## limits: + ## cpu: 100m + ## memory: 128Mi + limits: {} + ## Examples: + ## requests: + ## cpu: 100m + ## memory: 128Mi + requests: {} + ## Stackspin extra options for liveness probe + ## WARNING: Stackspin installation process may take up some time and + ## setting inappropriate values here may lead to pods failure. + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes + ## @param frontend.livenessProbe.enabled Enable/disable livenessProbe + ## @param frontend.livenessProbe.initialDelaySeconds Delay before liveness probe is initiated + ## @param frontend.livenessProbe.periodSeconds How often to perform the probe + ## @param frontend.livenessProbe.timeoutSeconds When the probe times out + ## @param frontend.livenessProbe.failureThreshold Minimum consecutive failures for the probe + ## @param frontend.livenessProbe.successThreshold Minimum consecutive successes for the probe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## Stackspin extra options for readiness probe + ## WARNING: Stackspin installation process may take up some time and + ## setting inappropriate values here may lead to pods failure. + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes + ## @param frontend.readinessProbe.enabled Enable/disable readinessProbe + ## @param frontend.readinessProbe.initialDelaySeconds Delay before readiness probe is initiated + ## @param frontend.readinessProbe.periodSeconds How often to perform the probe + ## @param frontend.readinessProbe.timeoutSeconds When the probe times out + ## @param frontend.readinessProbe.failureThreshold Minimum consecutive failures for the probe + ## @param frontend.readinessProbe.successThreshold Minimum consecutive successes for the probe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param frontend.customLivenessProbe Custom liveness probe to execute (when the main one is disabled) + ## + customLivenessProbe: {} + ## @param frontend.customReadinessProbe Custom readiness probe to execute (when the main one is disabled) + ## + customReadinessProbe: {} + ## @param frontend.extraEnvVars An array to add extra env vars + ## For example: + ## extraEnvVars: + ## frontend: + ## - name: ADMIN_PANEL_ELASTICSEARCH_URL + ## value: test + ## + extraEnvVars: [] + ## @param frontend.extraEnvVarsCM Array to add extra configmaps + ## + extraEnvVarsCM: [] + ## @param frontend.extraEnvVarsSecret Array to add extra environment variables from a secret + ## + extraEnvVarsSecret: "" + ## @param frontend.extraVolumeMounts Additional volume mounts (used along with `extraVolumes`) + ## Example: Mount CA file + ## extraVolumeMounts + ## - name: ca-cert + ## subPath: ca_cert + ## mountPath: /path/to/ca_cert + ## + extraVolumeMounts: [] +## Admin backend configuration parameters +## ref: https://open.greenhost.net/openappstack/dashboard-backend +## +backend: + ## Admin frontend image version + ## ref: https://hub.docker.com/r/bitnami/frontend/tags/ + ## @param image.registry Stackspin image registry + ## @param image.repository Stackspin image repository + ## @param image.tag Stackspin image tag + ## @param image.pullPolicy Stackspin image pull policy + ## @param image.pullSecrets Stackspin image pull secrets + ## @param image.debug Specify if debug logs should be enabled + ## + image: + registry: open.greenhost.net:4567 + repository: openappstack/admin-backend/admin-backend + tag: 0.1.0 + ## Specify a imagePullPolicy + ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' + ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images + ## + pullPolicy: IfNotPresent + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + ## e.g: + ## pullSecrets: + ## - myRegistryKeySecretName + ## + pullSecrets: [] + + ## Kubernetes service configuration. For minikube, set this to NodePort, elsewhere use LoadBalancer or ClusterIP + ## + service: + ## @param service.type Kubernetes Service type + ## + type: ClusterIP + ## @param service.port Service HTTP port + ## + port: 80 + ## @param service.nodePort Node Ports to expose + ## + nodePort: "" + ## @param service.loadBalancerIP Use loadBalancerIP to request a specific static IP + ## + loadBalancerIP: "" + ## @param service.externalTrafficPolicy Enable client source IP preservation + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param service.annotations Service annotations + ## + annotations: {} + ## @param service.loadBalancerSourceRanges Limits which cidr blocks can connect to service's load balancer + ## Only valid if service.type: LoadBalancer + ## + loadBalancerSourceRanges: [] + ## @param service.extraPorts Extra ports to expose (normally used with the `sidecar` value) + ## + extraPorts: [] + ## @param service.nodePorts.http Kubernetes http node port + ## Example: + ## nodePorts: + ## http: + ## + nodePorts: + http: "" + + + ## @param backend.reactAppApiUrl URL to the dashboard-backend API + apiUrl: "/api/v1" + + ## Variables for future use {{{ + + ## @param backend.username Admin user of the application + ## + username: user + ## @param backend.password password. WARNING: Minimum length of 10 characters + ## Defaults to a random 10-character alphanumeric string if not set + ## + password: "" + ## @param backend.existingSecret Name of an existing secret containing the password (ignores previous password) + ## The secret should contain the following key: + ## backend-password + ## + existingSecret: "" + ## @param backend.email Admin user email of the application + ## + email: user@example.com + + ## Admin panel SMTP settings + ## @param backend.smtp.enabled Enable/disable SMTP + ## @param backend.smtp.host SMTP host name + ## @param backend.smtp.port SMTP port number + ## @param backend.smtp.user SMTP account user name + ## @param backend.smtp.password SMTP account password + ## @param backend.smtp.protocol SMTP protocol (Allowed values: tls, ssl) + ## @param backend.smtp.auth SMTP authentication method + ## @param backend.smtp.existingSecret Name of an existing Kubernetes secret. The secret must have the following key configured: `smtp-password` + ## + smtp: + enabled: false + host: "" + port: "" + user: "" + password: "" + protocol: "" + auth: "" + existingSecret: "" + + ## End variables for future use }}} + + ## @param backend.flaskEnv Overridable flask env for debugging + flaskEnv: production + + ## @param backend.secretKey Flask secret for generating JWT tokens + # secretKey: OVERRIDE_ME + + ## @param backend.command Custom command to override image cmd + ## + command: [] + ## @param backend.args Custom args for the custom command + ## + args: [] + ## @param backend.containerSecurityContext Container security context specification + ## Example: + ## capabilities: + ## drop: + ## - ALL + ## readOnlyRootFilesystem: true + ## runAsNonRoot: true + ## runAsUser: 1000 + ## + containerSecurityContext: {} + ## Stackspin container's resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-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:'. + ## @param backend.resources.limits The resources limits for the container + ## @param backend.resources.requests The requested resources for the container + ## + resources: + ## Example: + ## limits: + ## cpu: 100m + ## memory: 128Mi + limits: {} + ## Examples: + ## requests: + ## cpu: 100m + ## memory: 128Mi + requests: {} + ## Stackspin extra options for liveness probe + ## WARNING: Stackspin installation process may take up some time and + ## setting inappropriate values here may lead to pods failure. + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes + ## @param backend.livenessProbe.enabled Enable/disable livenessProbe + ## @param backend.livenessProbe.initialDelaySeconds Delay before liveness probe is initiated + ## @param backend.livenessProbe.periodSeconds How often to perform the probe + ## @param backend.livenessProbe.timeoutSeconds When the probe times out + ## @param backend.livenessProbe.failureThreshold Minimum consecutive failures for the probe + ## @param backend.livenessProbe.successThreshold Minimum consecutive successes for the probe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## Stackspin extra options for readiness probe + ## WARNING: Stackspin installation process may take up some time and + ## setting inappropriate values here may lead to pods failure. + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes + ## @param backend.readinessProbe.enabled Enable/disable readinessProbe + ## @param backend.readinessProbe.initialDelaySeconds Delay before readiness probe is initiated + ## @param backend.readinessProbe.periodSeconds How often to perform the probe + ## @param backend.readinessProbe.timeoutSeconds When the probe times out + ## @param backend.readinessProbe.failureThreshold Minimum consecutive failures for the probe + ## @param backend.readinessProbe.successThreshold Minimum consecutive successes for the probe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + successThreshold: 1 + ## @param backend.customLivenessProbe Custom liveness probe to execute (when the main one is disabled) + ## + customLivenessProbe: {} + ## @param backend.customReadinessProbe Custom readiness probe to execute (when the main one is disabled) + ## + customReadinessProbe: {} + ## @param backend.extraEnvVars An array to add extra env vars + ## For example: + ## extraEnvVars: + ## backend: + ## - name: ADMIN_PANEL_ELASTICSEARCH_URL + ## value: test + ## + extraEnvVars: [] + ## @param backend.extraEnvVarsCM Array to add extra configmaps + ## + extraEnvVarsCM: [] + ## @param backend.extraEnvVarsSecret Array to add extra environment variables from a secret + ## + extraEnvVarsSecret: "" + ## @param backend.extraVolumeMounts Additional volume mounts (used along with `extraVolumes`) + ## Example: Mount CA file + ## extraVolumeMounts + ## - name: ca-cert + ## subPath: ca_cert + ## mountPath: /path/to/ca_cert + ## + extraVolumeMounts: [] + +## @param replicaCount Number of Stackspin & Sidekiq replicas +## (Note that you will need ReadWriteMany PVCs for this to work properly) +## +replicaCount: 1 +## @param extraVolumes Array of extra volumes to be added deployment. Requires setting `extraVolumeMounts` +## Example: Add secret volume +## extraVolumes: +## - name: ca-cert +## secret: +## secretName: ca-cert +## items: +## - key: ca-cert +## path: ca_cert +## +extraVolumes: [] +## @param sidecars Attach additional sidecar containers to the pod +## Example: +## sidecars: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +sidecars: [] +## @param initContainers Additional init containers to add to the pods +## +## e.g. +## initContainers: +## - name: your-image-name +## image: your-image +## imagePullPolicy: Always +## ports: +## - name: portname +## containerPort: 1234 +## +initContainers: [] +## @param serviceAccount.create Whether the service account should be created +## @param serviceAccount.annotations Annotations to add to the service account +## @param serviceAccount.name Name to be used for the service account +## +serviceAccount: + create: false + annotations: {} + ## If not set and create is true, a name is generated using the fullname template + ## + name: "" +## @param podSecurityContext Pod security context specification +## Example: +## fsGroup: 2000 +## +## +podSecurityContext: {} +## @param hostAliases Add deployment host aliases +## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ +## +hostAliases: [] +## Enable persistence using Persistent Volume Claims +## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ +## +persistence: + ## @param persistence.enabled Whether to enable persistence based on Persistent Volume Claims + ## + enabled: false + ## @param persistence.storageClass dashboard & sidekiq 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) + ## + storageClass: "" + ## @param persistence.existingClaim Use a existing PVC which must be created manually before bound + ## + existingClaim: "" + ## @param persistence.accessMode PVC Access Mode (RWO, ROX, RWX) + ## + accessMode: ReadWriteOnce + ## @param persistence.size Size of the PVC to request + ## + size: 10Gi + ## @param persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template) + ## selector: + ## matchLabels: + ## app: my-app + selector: {} +## @param updateStrategy.type Update strategy type. Only really applicable for deployments with RWO PVs attached +## If replicas = 1, an update can get "stuck", as the previous pod remains attached to the +## PV, and the "incoming" pod can never start. Changing the strategy to "Recreate" will +## terminate the single previous pod, so that the new, incoming pod can attach to the PV +## Example: +## updateStrategy: +## type: RollingUpdate +## rollingUpdate: +## maxSurge: 25% +## maxUnavailable: 25% +updateStrategy: + type: RollingUpdate +## @param podAnnotations Additional pod annotations +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ +## +podAnnotations: {} +## @param podLabels Additional pod labels +## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +## +podLabels: {} +## @param podAffinityPreset Pod affinity preset. Allowed values: soft, hard +## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## +podAffinityPreset: "" +## @param podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard` +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity +## +podAntiAffinityPreset: soft +## Node affinity preset +## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity +## @param nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard` +## @param nodeAffinityPreset.key Node label key to match Ignored if `affinity` is set. +## @param nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set. +## +nodeAffinityPreset: + type: "" + ## E.g. + ## key: "kubernetes.io/e2e-az-name" + ## + key: "" + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] +## @param affinity Affinity for pod assignment +## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity +## Note: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set +## +affinity: {} +## @param nodeSelector Node labels for pod assignment. +## Ref: https://kubernetes.io/docs/user-guide/node-selection/ +## +nodeSelector: {} +## @param tolerations Tolerations for pod assignment. +## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ +## +tolerations: [] + + +## @section Volume Permissions parameters (currently disabled because there is +## no persistence in the app) + +## Init containers parameters: +## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup +## values from the securityContext section. +## +volumePermissions: + ## @param volumePermissions.enabled Enable init container that changes volume permissions in the data directory (for cases where the default k8s `runAsUser` and `fsUser` values do not work) + ## + enabled: false + ## Init containers' resource requests and limits + ## ref: http://kubernetes.io/docs/user-guide/compute-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:'. + ## @param volumePermissions.resources.limits The resources limits for the init container + ## @param volumePermissions.resources.requests The requested resources for the init container + ## + resources: + ## Example: + ## limits: + ## cpu: 100m + ## memory: 128Mi + limits: {} + ## Examples: + ## requests: + ## cpu: 100m + ## memory: 128Mi + requests: {} + +## @section Ingress parameters + +## Ingress parameters +## +ingress: + ## @param ingress.enabled Enable ingress controller resource + ## + enabled: false + ## @param ingress.certManager Add annotations for cert-manager + ## + certManager: false + ## @param ingress.hostname Default host for the ingress resource + ## + hostname: dashboard.local + ## @param ingress.apiVersion Force Ingress API version (automatically detected if not set) + ## + apiVersion: "" + ## @param ingress.path Ingress path + ## + path: / + ## @param ingress.pathType Ingress path type + ## + pathType: ImplementationSpecific + ## @param ingress.annotations Ingress annotations done as key:value pairs + ## For a full list of possible ingress annotations, please see + ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md + ## + ## If certManager is set to true, annotation kubernetes.io/tls-acme: "true" will automatically be set + ## + annotations: {} + ## @param ingress.tls Enable TLS configuration for the hostname defined at ingress.hostname parameter + ## TLS certificates will be retrieved from a TLS secret with name: {{- printf "%s-tls" .Values.ingress.hostname }} + ## You can use the ingress.secrets parameter to create this TLS secret or relay on cert-manager to create it + ## + tls: false + ## @param ingress.extraHosts The list of additional hostnames to be covered with this ingress record. + ## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array + ## extraHosts: + ## - name: dashboard.local + ## path: / + extraHosts: [] + ## @param ingress.extraTls The tls configuration for additional hostnames to be covered with this ingress record. + ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls + ## extraTls: + ## - hosts: + ## - dashboard.local + ## secretName: dashboard.local-tls + extraTls: [] + ## @param ingress.secrets If you're providing your own certificates, please use this to add the certificates as secrets + ## key and certificate should start with -----BEGIN CERTIFICATE----- or + ## -----BEGIN RSA PRIVATE KEY----- + ## + ## name should line up with a tlsSecret set further up + ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set + ## + ## It is also possible to create and manage the certificates outside of this helm chart + ## Please see README.md for more information + ## Example: + ## - name: dashboard.local-tls + ## key: + ## certificate: + secrets: [] diff --git a/package.json b/package.json index bc82c95..9d03a86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "open-app-stack", - "version": "0.1.0", + "name": "stackspin-dashboard", + "version": "0.1.1", "private": true, "dependencies": { "@craco/craco": "^6.2.0",