You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2022/08/24 12:43:32 UTC

[hop] branch master updated: HOP-4162

This is an automated email from the ASF dual-hosted git repository.

hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/master by this push:
     new 78ad10803b HOP-4162
     new ea8584e1db Merge pull request #1658 from joeriheyvaerts/master
78ad10803b is described below

commit 78ad10803b5e879d084d92081e9480bdb5d7a115
Author: joeri <jo...@know.bi>
AuthorDate: Wed Aug 24 13:27:10 2022 +0200

    HOP-4162
---
 helm/README.md                                     |  60 +++++--
 helm/hop-server/templates/_helpers.tpl             |  91 ----------
 helm/hop-server/values.yaml                        | 135 ---------------
 helm/{hop-server => hop}/.helmignore               |   0
 helm/{hop-server => hop}/Chart.yaml                |   4 +-
 helm/hop/templates/_helpers/_helpers.tpl           | 159 +++++++++++++++++
 .../templates/hop-server/server-config.yaml}       |  10 +-
 .../templates/hop-server/server-deployment.yaml}   |  42 +++--
 helm/hop/templates/hop-server/server-ingress.yaml  |  52 ++++++
 .../templates/hop-server/server-service.yaml}      |  14 +-
 helm/hop/templates/hop-web/web-deployment.yaml     |  58 +++++++
 helm/hop/templates/hop-web/web-ingress.yaml        |  52 ++++++
 .../templates/hop-web/web-service.yaml}            |  14 +-
 .../templates/tests/test-connection.yaml           |   8 +-
 helm/hop/values.yaml                               | 188 +++++++++++++++++++++
 15 files changed, 607 insertions(+), 280 deletions(-)

diff --git a/helm/README.md b/helm/README.md
index fec6a06a7a..e8d9e4e709 100644
--- a/helm/README.md
+++ b/helm/README.md
@@ -19,31 +19,63 @@ under the License.
 
 A **Hop Helm chart** supporting **long-lived** setups.
 
-## Variables
-
 You can provide values for the following variables in the values.yaml file:
 
+## Variables hop server
+
 Variable    | Required    | Description
 ---	|----	|---
-replicaCount | Yes | Number of replicas
-image.tag | Yes | Hop release
-image.env | No | Extra environnement variables, e.g. `HOP_SERVER_METADATA_FOLDER`
-service.type | Yes | Expose via Nodeport or Loadbalancer
-service.port | Yes | Port of the service
-service.targetPort | Yes | Port of the pod(s)
-hop.user | Yes | Username for hop-server
-hop.port | Yes | The port for hop server
+server.enabled | Yes | Enable Hop server
+server.replicaCount | Yes | Number of replicas
+server.image.name | Yes | Hop server Image
+server.image.tag | Yes | Hop release
+server.image.env | No | Extra environnement variables, e.g. `HOP_SERVER_METADATA_FOLDER`
+server.service.type | Yes | Expose via Nodeport, Loadbalancer or ClusterIP
+server.service.port | Yes | Port of the service
+server.service.targetPort | Yes | Port of the pod(s)
+server.service.name | Yes | Port name
+server.hop.user | Yes | Username for hop-server
+server.hop.port | Yes | The port for hop server
+server.ingress.enabled | Yes | Enable ingress
+server.ingress.className | No | Ingress class name
+server.ingress.annotation | No | Arbitrary metadata
+server.ingress.path | Yes | Path rule
+server.ingress.pathType | Yes | Type of path, e.g. Prefix, ImplementationSpecific or Exact
+server.ingress.hosts | Yes | List of hosts
+server.nameOverride | No | Override Chart resource name
+server.fullnameOverride | No | Override full resource name
 
-## How to run Hop server via helm on kubernetes
+## Variables hop web
+
+Variable    | Required    | Description
+---	|----	|---
+web.enabled | Yes | Enable Hop web
+web.replicaCount | Yes | Number of replicas
+web.image.name | Yes | Hop web Image
+web.image.tag | Yes | Hop web release
+web.service.type | Yes | Expose via Nodeport, Loadbalancer or ClusterIP
+web.service.port | Yes | Port of the service
+web.service.targetPort | Yes | Port of the pod(s)
+web.service.name | Yes | Port name
+web.ingress.enabled | Yes | Enable ingress
+web.ingress.className | No | Ingress class name
+web.ingress.annotation | No | Arbitrary metadata
+web.ingress.path | Yes | Path rule
+web.ingress.pathType | Yes | Type of path, e.g. Prefix, ImplementationSpecific or Exact
+web.ingress.hosts | Yes | List of hosts
+web.nameOverride | No | Override Chart resource name 
+web.fullnameOverride | No | Override full resource name
+
+## How to run Hop via helm on kubernetes
 
 Create a secret for the hop server
 
 ```bash
-kubectl create secret generic hop-server --from-literal=pass=admin
+kubectl create secret generic <release name>-server --from-literal=pass=admin
 ```
 
 install the helm hop-server chart:
 
 ```bash
-helm install  hop-server hop-server/
-```
+helm install  <release name> hop
+```
\ No newline at end of file
diff --git a/helm/hop-server/templates/_helpers.tpl b/helm/hop-server/templates/_helpers.tpl
deleted file mode 100644
index 6ae4817cbd..0000000000
--- a/helm/hop-server/templates/_helpers.tpl
+++ /dev/null
@@ -1,91 +0,0 @@
-{{/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
-*/}}
-
-{{/*
-Expand the name of the chart.
-*/}}
-{{- define "hop.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 "hop.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 "hop.chart" -}}
-{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
-{{- end }}
-
-{{/*
-Common labels
-*/}}
-{{- define "hop.labels" -}}
-helm.sh/chart: {{ include "hop.chart" . }}
-{{ include "hop.selectorLabels" . }}
-{{- if .Chart.AppVersion }}
-app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
-{{- end }}
-app.kubernetes.io/managed-by: {{ .Release.Service }}
-{{- end }}
-
-{{/*
-Selector labels
-*/}}
-{{- define "hop.selectorLabels" -}}
-app.kubernetes.io/name: {{ include "hop.name" . }}
-app.kubernetes.io/instance: {{ .Release.Name }}
-{{- end }}
-
-{{/*
-Create the name of the service account to use
-*/}}
-{{- define "hop.serviceAccountName" -}}
-{{- if .Values.serviceAccount.create }}
-{{- default (include "hop.fullname" .) .Values.serviceAccount.name }}
-{{- else }}
-{{- default "default" .Values.serviceAccount.name }}
-{{- end }}
-{{- end }}
-
-{{/*
-Function to format extra environment variables
-*/}}
-{{- define "helpers.list-extra-env-variables"}}
-{{- range $key, $val := .Values.image.env }}
-- name: {{ $key }}
-  value: {{ $val | quote }}
-{{- end }}
-{{- end }}
diff --git a/helm/hop-server/values.yaml b/helm/hop-server/values.yaml
deleted file mode 100644
index d882319f16..0000000000
--- a/helm/hop-server/values.yaml
+++ /dev/null
@@ -1,135 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Default values for hop.
-# This is a YAML-formatted file.
-# Declare variables to be passed into your templates.
-
-## @param replicaCount number of replicas for the statefulset
-replicaCount: 1
-
-## @section Image
-## @param image.name Image name
-## @param image.pullPolicy Image pull policy
-## @param image.tag Visit: [Image tag](https://hub.docker.com/r/apache/hop/tags?page=1&ordering=last_updated)
-## @param image.env Environment variables
-image:
-  name: docker.io/apache/hop
-  pullPolicy: IfNotPresent
-  # Overrides the image tag
-  tag: "latest"
-  env:
-    # HOP_SERVER_METADATA_FOLDER: "/files/projects/my-project/metadata"
-    # HOP_CONFIG_FOLDER: "/files/config"
-    # HOP_ENVIRONMENT_NAME: "my-project-env"
-    # HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS: "/files/projects/my-project/main-config.json,/files/projects/my-project/extra-config.json"
-    # HOP_PROJECT_NAME: "my-project"
-    # HOP_PROJECT_FOLDER: "/files/projects/my-project"
-
-## @param imagePullSecrets Secret to use for pulling the image
-imagePullSecrets: [ ]
-
-nameOverride: ""
-fullnameOverride: ""
-
-podAnnotations: { }
-
-podSecurityContext: { }
-# fsGroup: 2000
-
-securityContext: { }
-  # capabilities:
-  #   drop:
-  #   - ALL
-  # readOnlyRootFilesystem: true
-  # runAsNonRoot: true
-# runAsUser: 1000
-
-## @section Service
-service:
-  http:
-    type: ClusterIP
-    port: 80
-    targetPort: 8081
-
-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
-
-## @section Ingress
-## @param ingress.enabled Enable ingress
-## @param ingress.className Ingress class name
-## @param ingress.annotations Ingress annotations
-## @param ingress.hosts[0].host Default Ingress host
-## @param ingress.hosts[0].paths[0].path Default Ingress path
-## @param ingress.hosts[0].paths[0].pathType Ingress path type
-## @param ingress.tls Ingress tls settings
-## @extra ingress.apiVersion Specify APIVersion of ingress object. Mostly would only be used for argocd.
-ingress:
-  enabled: false
-  # className: nginx
-  className:
-  annotations: {}
-    # kubernetes.io/ingress.class: nginx
-    # kubernetes.io/tls-acme: "true"
-  hosts:
-    - host: hop.example.com
-      paths:
-        - path: /
-          pathType: Prefix
-  tls: []
-  #  - secretName: chart-example-tls
-  #    hosts:
-  #      - hop.example.com
-  # Mostly for argocd or any other CI that uses `helm template | kubectl apply` or similar
-  # If helm doesn't correctly detect your ingress API version you can set it here.
-  # apiVersion: networking.k8s.io/v1
-
-## @section Autoscaling
-autoscaling:
-  enabled: false
-  minReplicas: 1
-  maxReplicas: 100
-  targetCPUUtilizationPercentage: 80
-  # targetMemoryUtilizationPercentage: 80
-
-nodeSelector: { }
-
-tolerations: [ ]
-
-affinity: { }
-
-## @section Persistence
-#
-## @param persistence.enabled Enable persistent storage
-## @param persistence.existingClaim Use an existing claim to store repository information
-persistence:
-  enabled: false
-  existingClaim: my-claim
-
-## @section Hop
-hop:
-  port: 8081
-  user: admin
diff --git a/helm/hop-server/.helmignore b/helm/hop/.helmignore
similarity index 100%
rename from helm/hop-server/.helmignore
rename to helm/hop/.helmignore
diff --git a/helm/hop-server/Chart.yaml b/helm/hop/Chart.yaml
similarity index 96%
rename from helm/hop-server/Chart.yaml
rename to helm/hop/Chart.yaml
index 474ac00181..008a6fedb2 100644
--- a/helm/hop-server/Chart.yaml
+++ b/helm/hop/Chart.yaml
@@ -16,8 +16,8 @@
 # under the License.
 
 apiVersion: v2
-name: hop-server
-description: A Helm chart for Kubernetes
+name: hop
+description: A Helm chart for hop services
 
 # A chart can be either an 'application' or a 'library' chart.
 #
diff --git a/helm/hop/templates/_helpers/_helpers.tpl b/helm/hop/templates/_helpers/_helpers.tpl
new file mode 100644
index 0000000000..25b0d68c5f
--- /dev/null
+++ b/helm/hop/templates/_helpers/_helpers.tpl
@@ -0,0 +1,159 @@
+{{/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+*/}}
+
+{{/*
+Expand the name of the chart.
+*/}}
+
+{{/*
+hop-server
+*/}}
+{{- define "server.name" -}}
+{{- default "server" .Values.server.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 "server.fullname" -}}
+{{- if .Values.server.fullnameOverride }}
+{{- .Values.server.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default "server" .Values.server.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 "server.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "server.labels" -}}
+helm.sh/chart: {{ include "server.chart" . }}
+{{ include "server.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "server.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "server.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "server.serviceAccountName" -}}
+{{- if .Values.server.serviceAccount.create }}
+{{- default (include "server.fullname" .) .Values.server.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.server.serviceAccount.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Function to format extra environment variables
+*/}}
+{{- define "helpers.list-extra-env-variables"}}
+{{- range $key, $val := .Values.server.image.env }}
+- name: {{ $key }}
+  value: {{ $val | quote }}
+{{- end }}
+{{- end }}
+
+{{/*
+hop-web
+*/}}
+
+{{- define "web.name" -}}
+{{- default .Chart.Name .Values.web.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 "web.fullname" -}}
+{{- if .Values.web.fullnameOverride }}
+{{- .Values.web.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default "web" .Values.web.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 "web.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "web.labels" -}}
+helm.sh/chart: {{ include "web.chart" . }}
+{{ include "web.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "web.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "web.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "web.serviceAccountName" -}}
+{{- if .Values.web.serviceAccount.create }}
+{{- default (include "web.fullname" .) .Values.web.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.web.serviceAccount.name }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/hop-server/templates/hop-config.yaml b/helm/hop/templates/hop-server/server-config.yaml
similarity index 78%
rename from helm/hop-server/templates/hop-config.yaml
rename to helm/hop/templates/hop-server/server-config.yaml
index f074cfceee..500bec3b78 100644
--- a/helm/hop-server/templates/hop-config.yaml
+++ b/helm/hop/templates/hop-server/server-config.yaml
@@ -15,12 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
+{{- if .Values.server.enabled }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: {{ include "hop.fullname" . }}
+  name: {{ include "server.fullname" . }}
   labels:
-    {{- include "hop.labels" . | nindent 4 }}
+    {{- include "server.labels" . | nindent 4 }}
 data:
-  port: {{ .Values.hop.port | quote }}
-  user: {{ .Values.hop.user | quote }}
+  port: {{ .Values.server.hop.port | quote }}
+  user: {{ .Values.server.hop.user | quote }}
+{{- end }}
diff --git a/helm/hop-server/templates/hop-deployment.yaml b/helm/hop/templates/hop-server/server-deployment.yaml
similarity index 58%
rename from helm/hop-server/templates/hop-deployment.yaml
rename to helm/hop/templates/hop-server/server-deployment.yaml
index f479bcedef..75f1e747c6 100644
--- a/helm/hop-server/templates/hop-deployment.yaml
+++ b/helm/hop/templates/hop-server/server-deployment.yaml
@@ -15,19 +15,20 @@
 # specific language governing permissions and limitations
 # under the License.
 
+{{- if .Values.server.enabled }}
 apiVersion: apps/v1
 kind: Deployment
 metadata:
-  name: {{ include "hop.fullname" . }}
+  name: {{ include "server.fullname" . }}
   labels:
-    {{- include "hop.labels" . | nindent 4 }}
+    {{- include "server.labels" . | nindent 4 }}
 spec:
-  {{- if not .Values.autoscaling.enabled }}
-  replicas: {{ .Values.replicaCount }}
+  {{- if not .Values.server.autoscaling.enabled }}
+  replicas: {{ .Values.server.replicaCount }}
   {{- end }}
   selector:
     matchLabels:
-      {{- include "hop.selectorLabels" . | nindent 6 }}
+      {{- include "server.selectorLabels" . | nindent 6 }}
   template:
     metadata:
       {{- with .Values.podAnnotations }}
@@ -35,45 +36,50 @@ spec:
         {{- toYaml . | nindent 8 }}
       {{- end }}
       labels:
-        {{- include "hop.selectorLabels" . | nindent 8 }}
+        {{- include "server.selectorLabels" . | nindent 8 }}
     spec:
-      {{- with .Values.imagePullSecrets }}
+      {{- with .Values.server.imagePullSecrets }}
       imagePullSecrets:
         {{- toYaml . | nindent 8 }}
       {{- end }}
       securityContext:
-        {{- toYaml .Values.podSecurityContext | nindent 8 }}
+        {{- toYaml .Values.server.podSecurityContext | nindent 8 }}
       containers:
         - name: {{ .Chart.Name }}
           securityContext:
-            {{- toYaml .Values.securityContext | nindent 12 }}
-          image: "{{ .Values.image.name }}:{{ .Values.image.tag }}"
-          imagePullPolicy: {{ .Values.image.pullPolicy }}
+            {{- toYaml .Values.server.securityContext | nindent 12 }}
+          image: "{{ .Values.server.image.name }}:{{ .Values.server.image.tag }}"
+          imagePullPolicy: {{ .Values.server.image.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.server.service.http.targetPort }}
+            name: {{ .Values.server.service.http.name }}
+            protocol: TCP
           env:
             - name: HOP_SERVER_USER
               valueFrom:
                 configMapKeyRef:
-                  name: {{ include "hop.fullname" . }}
+                  name: {{ include "server.fullname" . }}
                   key: user
             - name: HOP_SERVER_PASS
               valueFrom:
                 secretKeyRef:
-                  name: {{ include "hop.fullname" . }}
+                  name: {{ include "server.fullname" . }}
                   key: pass
             - name: HOP_SERVER_PORT
               valueFrom:
                 configMapKeyRef:
-                  name: {{ include "hop.fullname" . }}
+                  name: {{ include "server.fullname" . }}
                   key: port
             {{- include "helpers.list-extra-env-variables" . | indent 12 }}
           volumeMounts:
-            - name: {{ template "hop.fullname" . }}-data
+            - name: {{ template "server.fullname" . }}-data
               mountPath: /files
       volumes:
-        - name: {{ template "hop.fullname" . }}-data
-          {{- if .Values.persistence.enabled }}
+        - name: {{ template "server.fullname" . }}-data
+          {{- if .Values.server.persistence.enabled }}
           persistentVolumeClaim:
-            claimName: {{ .Values.persistence.existingClaim | default (printf "%s-%s" (include "hop.fullname" .) "data") }}
+            claimName: {{ .Values.server.persistence.existingClaim | default (printf "%s-%s" (include "server.fullname" .) "data") }}
           {{- else }}
           emptyDir: {}
           {{- end }}
+ {{- end }}
diff --git a/helm/hop/templates/hop-server/server-ingress.yaml b/helm/hop/templates/hop-server/server-ingress.yaml
new file mode 100644
index 0000000000..04e4cd8824
--- /dev/null
+++ b/helm/hop/templates/hop-server/server-ingress.yaml
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{- if and (.Values.server.ingress.enabled) (.Values.server.enabled) -}}
+{{- $fullName := include "server.fullname" . }}
+{{- $servicePort := .Values.server.service.http.port }}
+{{- $ingressPath := .Values.server.ingress.path }}
+{{- $ingressPathType := .Values.server.ingress.pathType }}
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    {{- include "server.labels" . | nindent 4 }}
+  {{- if .Values.server.ingress.annotations }}
+  annotations:
+    {{- range $key, $value := .Values.server.ingress.annotations }}
+    {{ $key }}: {{ tpl $value $ | quote }}
+    {{- end }}
+  {{- end }}
+spec:
+  rules:
+  {{- if .Values.server.ingress.hosts  }}
+  {{- range .Values.server.ingress.hosts }}
+    - host: {{ tpl . $}}
+      http:
+        paths:
+          - path: {{ $ingressPath }}
+            pathType: {{ $ingressPathType }}
+            backend:
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $servicePort }}
+  {{- end }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/hop-server/templates/hop-service.yaml b/helm/hop/templates/hop-server/server-service.yaml
similarity index 71%
copy from helm/hop-server/templates/hop-service.yaml
copy to helm/hop/templates/hop-server/server-service.yaml
index c49be15e14..0baabd1ad5 100644
--- a/helm/hop-server/templates/hop-service.yaml
+++ b/helm/hop/templates/hop-server/server-service.yaml
@@ -15,18 +15,20 @@
 # specific language governing permissions and limitations
 # under the License.
 
+{{- if .Values.server.enabled }}
 apiVersion: v1
 kind: Service
 metadata:
-  name: {{ include "hop.fullname" . }}
+  name: {{ include "server.fullname" . }}
   labels:
-    {{- include "hop.labels" . | nindent 4 }}
+    {{- include "server.labels" . | nindent 4 }}
 spec:
-  type: {{ .Values.service.http.type }}
+  type: {{ .Values.server.service.http.type }}
   ports:
-    - port: {{ .Values.service.http.port }}
-      targetPort: {{ .Values.service.http.targetPort }}
+    - port: {{ .Values.server.service.http.port }}
+      targetPort: {{ .Values.server.service.http.targetPort }}
       protocol: TCP
       name: http
   selector:
-    {{- include "hop.selectorLabels" . | nindent 4 }}
+    {{- include "server.selectorLabels" . | nindent 4 }}
+{{- end }}
diff --git a/helm/hop/templates/hop-web/web-deployment.yaml b/helm/hop/templates/hop-web/web-deployment.yaml
new file mode 100644
index 0000000000..34313d62e7
--- /dev/null
+++ b/helm/hop/templates/hop-web/web-deployment.yaml
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{- if .Values.web.enabled }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "web.fullname" . }}
+  labels:
+    {{- include "web.labels" . | nindent 4 }}
+spec:
+  {{- if not .Values.web.autoscaling.enabled }}
+  replicas: {{ .Values.web.replicaCount }}
+  {{- end }}
+  selector:
+    matchLabels:
+      {{- include "web.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+      {{- with .Values.web.podAnnotations }}
+      annotations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      labels:
+        {{- include "web.selectorLabels" . | nindent 8 }}
+    spec:
+      {{- with .Values.web.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      securityContext:
+        {{- toYaml .Values.web.podSecurityContext | nindent 8 }}
+      containers:
+        - name: {{ .Chart.Name }}
+          securityContext:
+            {{- toYaml .Values.web.securityContext | nindent 12 }}
+          image: "{{ .Values.web.image.name }}:{{ .Values.web.image.tag }}"
+          imagePullPolicy: {{ .Values.web.image.pullPolicy }}
+          ports:
+          - containerPort: {{ .Values.web.service.http.targetPort }}
+            name: {{ .Values.web.service.http.name }}
+            protocol: TCP
+
+{{- end }}
diff --git a/helm/hop/templates/hop-web/web-ingress.yaml b/helm/hop/templates/hop-web/web-ingress.yaml
new file mode 100644
index 0000000000..9df1bc2c92
--- /dev/null
+++ b/helm/hop/templates/hop-web/web-ingress.yaml
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+{{- if and (.Values.web.ingress.enabled) (.Values.web.enabled) -}}
+{{- $fullName := include "web.fullname" . }}
+{{- $servicePort := .Values.web.service.http.port }}
+{{- $ingressPath := .Values.web.ingress.path }}
+{{- $ingressPathType := .Values.web.ingress.pathType }}
+
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    {{- include "web.labels" . | nindent 4 }}
+  {{- if .Values.web.ingress.annotations }}
+  annotations:
+    {{- range $key, $value := .Values.web.ingress.annotations }}
+    {{ $key }}: {{ tpl $value $ | quote }}
+    {{- end }}
+  {{- end }}
+spec:
+  rules:
+  {{- if .Values.web.ingress.hosts  }}
+  {{- range .Values.web.ingress.hosts }}
+    - host: {{ tpl . $}}
+      http:
+        paths:
+          - path: {{ $ingressPath }}
+            pathType: {{ $ingressPathType }}
+            backend:
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $servicePort }}
+  {{- end }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/hop-server/templates/hop-service.yaml b/helm/hop/templates/hop-web/web-service.yaml
similarity index 73%
rename from helm/hop-server/templates/hop-service.yaml
rename to helm/hop/templates/hop-web/web-service.yaml
index c49be15e14..2bd83186c0 100644
--- a/helm/hop-server/templates/hop-service.yaml
+++ b/helm/hop/templates/hop-web/web-service.yaml
@@ -15,18 +15,20 @@
 # specific language governing permissions and limitations
 # under the License.
 
+{{- if .Values.web.enabled }}
 apiVersion: v1
 kind: Service
 metadata:
-  name: {{ include "hop.fullname" . }}
+  name: {{ include "web.fullname" . }}
   labels:
-    {{- include "hop.labels" . | nindent 4 }}
+    {{- include "web.labels" . | nindent 4 }}
 spec:
-  type: {{ .Values.service.http.type }}
+  type: {{ .Values.web.service.http.type }}
   ports:
-    - port: {{ .Values.service.http.port }}
-      targetPort: {{ .Values.service.http.targetPort }}
+    - port: {{ .Values.web.service.http.port }}
+      targetPort: {{ .Values.web.service.http.targetPort }}
       protocol: TCP
       name: http
   selector:
-    {{- include "hop.selectorLabels" . | nindent 4 }}
+    {{- include "web.selectorLabels" . | nindent 4 }}
+{{- end }}
diff --git a/helm/hop-server/templates/tests/test-connection.yaml b/helm/hop/templates/tests/test-connection.yaml
similarity index 81%
rename from helm/hop-server/templates/tests/test-connection.yaml
rename to helm/hop/templates/tests/test-connection.yaml
index a3ea23b4d4..4026a47e6c 100644
--- a/helm/hop-server/templates/tests/test-connection.yaml
+++ b/helm/hop/templates/tests/test-connection.yaml
@@ -18,9 +18,9 @@
 apiVersion: v1
 kind: Pod
 metadata:
-  name: "{{ include "hop.fullname" . }}-test-connection"
+  name: "{{ include "server.fullname" . }}-test-connection"
   labels:
-    {{- include "hop.labels" . | nindent 4 }}
+    {{- include "server.labels" . | nindent 4 }}
   annotations:
     "helm.sh/hook": test
 spec:
@@ -28,5 +28,5 @@ spec:
     - name: wget
       image: busybox
       command: [ 'wget' ]
-      args: [ '{{ include "hop.fullname" . }}:{{ .Values.service.port }}' ]
-  restartPolicy: Never
+      args: [ '{{ include "server.fullname" . }}:{{ .Values.server.service.port }}' ]
+  restartPolicy: Never
\ No newline at end of file
diff --git a/helm/hop/values.yaml b/helm/hop/values.yaml
new file mode 100644
index 0000000000..24b5a76570
--- /dev/null
+++ b/helm/hop/values.yaml
@@ -0,0 +1,188 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Default values for hop.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+# deploy hop-server
+server:
+  enabled: true
+
+## @param replicaCount number of replicas for the statefulset
+  replicaCount: 1
+
+  ## @section Image
+  ## @param image.name Image name
+  ## @param image.pullPolicy Image pull policy
+  ## @param image.tag Visit: [Image tag](https://hub.docker.com/r/apache/hop/tags?page=1&ordering=last_updated)
+  ## @param image.env Environment variables
+  image:
+    name: docker.io/apache/hop
+    pullPolicy: IfNotPresent
+    # Overrides the image tag
+    tag: "latest"
+    env:
+      # HOP_SERVER_METADATA_FOLDER: "/files/projects/my-project/metadata"
+      # HOP_CONFIG_FOLDER: "/files/config"
+      # HOP_ENVIRONMENT_NAME: "my-project-env"
+      # HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS: "/files/projects/my-project/main-config.json,/files/projects/my-project/extra-config.json"
+      # HOP_PROJECT_NAME: "my-project"
+      # HOP_PROJECT_FOLDER: "/files/projects/my-project"
+
+  ## @param imagePullSecrets Secret to use for pulling the image
+  imagePullSecrets: [ ]
+
+  nameOverride: ""
+  fullnameOverride: ""
+
+  podAnnotations: { }
+
+  podSecurityContext: { }
+  # fsGroup: 2000
+
+  securityContext: { }
+    # capabilities:
+    #   drop:
+    #   - ALL
+    # readOnlyRootFilesystem: true
+    # runAsNonRoot: true
+  # runAsUser: 1000
+
+  ## @section Service
+  service:
+    http:
+      type: ClusterIP
+      port: 80
+      targetPort: 8081
+      name: http
+
+  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
+
+  ingress:
+    enabled: false
+    # className: nginx
+    className:
+    annotations:
+      # kubernetes.io/ingress.class: nginx
+    path: /
+    pathType: Prefix
+    hosts:
+      # - server.example.com
+    tls: []
+    #  - secretName: chart-example-tls
+    #    hosts:
+    #      - server.example.com
+    # Mostly for argocd or any other CI that uses `helm template | kubectl apply` or similar
+    # If helm doesn't correctly detect your ingress API version you can set it here.
+    # apiVersion: networking.k8s.io/v1
+
+  ## @section Autoscaling
+  autoscaling:
+    enabled: false
+    minReplicas: 1
+    maxReplicas: 100
+    targetCPUUtilizationPercentage: 80
+    # targetMemoryUtilizationPercentage: 80
+
+  nodeSelector: { }
+
+  tolerations: [ ]
+
+  affinity: { }
+
+  ## @section Persistence
+  #
+  ## @param persistence.enabled Enable persistent storage
+  ## @param persistence.existingClaim Use an existing claim to store repository information
+  persistence:
+    enabled: false
+    existingClaim: my-claim
+
+  ## @section Hop
+  hop:
+    port: 8081
+    user: admin
+  
+## deploy hop-web
+web:
+  enabled: true
+
+## @param replicaCount number of replicas for the statefulset
+  replicaCount: 1
+  image:
+    name: docker.io/apache/hop-web
+    pullPolicy: IfNotPresent
+    # Overrides the image tag
+    tag: "latest"
+
+  imagePullSecrets: [ ]
+
+  nameOverride: ""
+  fullnameOverride: ""
+
+  podAnnotations: { }
+
+  podSecurityContext: { }
+
+  service:
+    http:
+      type: ClusterIP
+      port: 8080
+      targetPort: 8080
+      name: http
+
+  ingress:
+    enabled: false
+    # className: nginx
+    className:
+    annotations:
+      # kubernetes.io/ingress.class: nginx
+    path: /
+    pathType: Prefix
+    hosts:
+      # - web.example.com
+    tls: []
+    #  - secretName: chart-example-tls
+    #    hosts:
+    #      - web.example.com
+    # Mostly for argocd or any other CI that uses `helm template | kubectl apply` or similar
+    # If helm doesn't correctly detect your ingress API version you can set it here.
+    # apiVersion: networking.k8s.io/v1
+
+  autoscaling:
+    enabled: false
+    minReplicas: 1
+    maxReplicas: 100
+    targetCPUUtilizationPercentage: 80
+    # targetMemoryUtilizationPercentage: 80
+
+  nodeSelector: { }
+
+  tolerations: [ ]
+
+  affinity: { }
\ No newline at end of file