diff --git a/alfa-client/Jenkinsfile.storybook b/alfa-client/Jenkinsfile.storybook
new file mode 100644
index 0000000000000000000000000000000000000000..b589706023ff460ecc9ec5c164b431b464c8c610
--- /dev/null
+++ b/alfa-client/Jenkinsfile.storybook
@@ -0,0 +1,248 @@
+pipeline {
+  agent {
+    node {
+      label 'ozgcloud-jenkins-build-agent'
+    }
+  }
+
+  environment {
+        BLUE_OCEAN_URL = "https://jenkins.infra.ozg-cloud.systems/job/storybook/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/"
+        RELEASE_REGEX = /\d+.\d+.\d+/
+        SNAPSHOT_REGEX = /\d+.\d+.\d+-SNAPSHOT/
+        FAILED_STAGE = ""
+        SH_SUCCESS_STATUS_CODE = 0
+
+    }
+
+    options {
+        timeout(time: 1, unit: 'HOURS')
+        disableConcurrentBuilds()
+        buildDiscarder(logRotator(numToKeepStr: '5'))
+    }
+
+    stages {
+        stage('Check Version') {
+            steps {
+                script {
+                    FAILED_STAGE = env.STAGE_NAME 
+                     dir('alfa-client') { 
+                    VERSION = getPackagejsonVersion()
+                     }
+                }
+            }
+        }
+    
+        stage('build storybook and its docker image') {
+            steps {
+                script {
+	                FAILED_STAGE=env.STAGE_NAME
+	
+	                dir('alfa-client') {
+
+                    withNPM(npmrcConfig: 'a4272a20-bb67-4cf7-8ce5-a1c3ac66613c') {
+                        sh 'npm cache verify'
+	                    sh 'npm install'
+	                    sh 'npm run ci-storybook'
+                     }
+	                  
+	
+	                    
+	    
+	                }
+
+                }
+            }
+        }
+
+        stage('Tag and Push Docker image') {
+            steps {
+                script {
+                    FAILED_STAGE=env.STAGE_NAME
+                    IMAGE_TAG = generateImageTag()
+
+                    tagAndPushDockerImage(IMAGE_TAG)
+
+                    if (isMasterBranch()) {
+                        tagAndPushDockerImage('snapshot-latest')
+                    }
+                }
+            }
+        }
+
+        stage('Test, build and deploy Helm Chart') {
+            steps {
+                script {
+                   HELM_CHART_VERSION = generateHelmChartVersion()
+                   
+                   dir('alfa-client/libs/design-system') {
+                    sh "./run_helm_test.sh"
+                   } 
+
+                    dir('alfa-client/libs/design-system/main/helm') {                    
+
+                        sh "helm package --version=${HELM_CHART_VERSION} ."
+
+                        deployHelmChart(HELM_CHART_VERSION)
+                    }
+                }
+            }
+        }
+
+        stage('Trigger Dev rollout') {
+            when {
+                branch 'master'
+            }
+            steps {
+                script {
+                    FAILED_STAGE = env.STAGE_NAME
+
+                    cloneGitopsRepo()
+
+                    setNewGitopsVersion()
+                    pushGitopsRepo()
+                }
+            }
+        }
+    }
+
+    post { 
+        failure {
+            script {    
+                if (isMasterBranch()) {
+                    sendFailureMessage()
+                }
+            }
+        }
+    }
+}
+
+
+
+String generateImageTag() {
+    def imageTag = "${env.BRANCH_NAME}-${VERSION}"
+
+    if (isMasterBranch()) {
+        imageTag += "-${env.GIT_COMMIT.take(7)}"
+    }
+
+    return imageTag
+}
+
+Void cloneGitopsRepo() {
+    withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {
+        sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git'
+    }
+    configureGit()
+}
+
+Void configureGit() {
+    final email = "jenkins@ozg-sh.de"
+    final name = "jenkins"
+
+    dir("gitops") {
+        sh "git config user.email '${email}'"
+        sh "git config user.name '${name}'"
+    }
+}
+
+
+
+Void setNewGitopsVersion() {
+    dir("gitops") {
+        def envFile = "dev/application/values/storybook-values.yaml"
+
+        def envVersions = readYaml file: envFile
+
+        envVersions.storybook.image.tag = IMAGE_TAG
+        envVersions.storybook.helm.version = HELM_CHART_VERSION
+
+        writeYaml file: envFile, data: envVersions, overwrite: true
+
+        if (hasValuesFileChanged()) {
+            sh "git add ${envFile}"
+            sh "git commit -m 'jenkins rollout dev storybook version ${IMAGE_TAG}'"
+        }
+    }
+}
+
+Boolean hasValuesFileChanged() {
+    return sh (script: "git status | grep 'dev/application/values/storybook-values.yaml'", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer
+}
+
+
+Void pushGitopsRepo() {
+    withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {
+        dir("gitops") {
+            if (hasUnpushedCommits()) {
+                sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git'
+            }
+        }
+    }
+}
+
+Boolean hasUnpushedCommits() {
+    return sh (script: "git cherry -v | grep .", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer
+}
+
+Void tagAndPushDockerImage(String newTag){
+    withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
+        sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}'
+
+        sh "docker tag docker.ozg-sh.de/storybook:build-latest docker.ozg-sh.de/storybook:${newTag}"
+        sh "docker push docker.ozg-sh.de/storybook:${newTag}"
+    }
+}
+String getPackagejsonVersion() {
+    def packageJSON = readJSON file: 'package.json'
+    def packageJSONVersion = packageJSON.version
+    echo packageJSONVersion
+    return packageJSONVersion
+}
+
+Void deployHelmChart(String helmChartVersion) {
+    withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){
+       
+        result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps-snapshot -F file=@storybook-'''+helmChartVersion+'''.tgz''', returnStdout: true
+
+        if (result != '') {
+            error(result)
+        }
+    }
+}
+String generateHelmChartVersion() {
+    def chartVersion = "${VERSION}"
+
+    if (isMasterBranch()) {
+        chartVersion += "-${env.GIT_COMMIT.take(7)}"
+    }
+    else {
+        chartVersion += "-${env.BRANCH_NAME}"
+    }
+
+    return chartVersion.replaceAll("_", "-")
+}
+
+Boolean isMasterBranch() {
+    return env.BRANCH_NAME == 'master'
+}
+
+Void sendFailureMessage() {
+    def room = ''
+    def data = """{"msgtype":"m.text", \
+                    "body":"storybook: Build Failed. Stage: ${FAILED_STAGE} Build-ID: ${env.BUILD_NUMBER} Link: ${BLUE_OCEAN_URL}", \
+                    "format": "org.matrix.custom.html", \
+                    "formatted_body":"storybook: Build Failed. Stage: ${FAILED_STAGE} Build-ID: <a href='${BLUE_OCEAN_URL}'>${env.BUILD_NUMBER}</a>"}"""
+
+    if (isMasterBranch()) {
+        room = "!iQPAvQIiRwRpNOszjw:matrix.ozg-sh.de"
+    }
+
+    sh "curl -XPOST -H 'authorization: Bearer ${getElementAccessToken()}' -d '${data}' https://matrix.ozg-sh.de/_matrix/client/v3/rooms/$room/send/m.room.message"
+}
+
+
+String getElementAccessToken() {
+    withCredentials([string(credentialsId: 'element-login-json', variable: 'LOGIN_JSON')]) {
+        return readJSON ( text: sh (script: '''curl -XPOST -d \"$LOGIN_JSON\" https://matrix.ozg-sh.de/_matrix/client/v3/login''', returnStdout: true)).access_token
+    }
+}
diff --git a/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml b/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml
index da65f0a3297ad7f4ea15eab169824106dfba7492..6dbb84123ca23ff9e55d34392cff78b1ca64afb8 100644
--- a/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml
+++ b/alfa-client/apps/admin/src/test/helm/deployment_ozgcloud_base_values_test.yaml
@@ -33,6 +33,9 @@ set:
 
 tests:
   - it: should fail on missing environment
+    set:
+      ozgcloud:
+        environment: dev
     asserts:
       - failedTemplate:
           errorMessage: ozgcloud.environment muss angegeben sein
diff --git a/alfa-client/libs/design-system/Dockerfile b/alfa-client/libs/design-system/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..db2112bd5fa7878771e6c2a1fac73bd58feb4e09
--- /dev/null
+++ b/alfa-client/libs/design-system/Dockerfile
@@ -0,0 +1,5 @@
+FROM nginxinc/nginx-unprivileged:stable-alpine
+
+
+COPY dist/storybook /usr/share/nginx/html/
+COPY libs/design-system/nginx.conf /etc/nginx/nginx.conf
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/main/helm/Chart.yaml b/alfa-client/libs/design-system/main/helm/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fcdc7922e7386ee8ab01671dd283b5df3778f037
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/Chart.yaml
@@ -0,0 +1,30 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: v1
+appVersion: '1.0'
+description: A Helm chart for storybook
+name: storybook
+version: 0.0.0-MANAGED-BY-JENKINS
+icon: https://simpleicons.org/icons/helm.svg
diff --git a/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl b/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..08da97368b065f836fbcc316b69c38c77e7a47a9
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/templates/_helpers.tpl
@@ -0,0 +1,81 @@
+
+{{/* error check 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec) */}}
+{{/* Namespace */}}
+{{- define "app.namespace" -}}
+{{- if gt (len (.Release.Namespace)) 63 -}}
+{{- fail (printf ".Release.Namespace %s ist zu lang (max. 63 Zeichen)" .Release.Namespace) -}}
+{{- end -}}
+{{ printf "%s" .Release.Namespace }}
+{{- end -}}
+
+{{/* Chart: Name + Version */}}
+{{- define "app.chart" -}}
+{{- if gt (len (printf "%s-%s" .Chart.Name .Chart.Version)) 63 -}}
+{{- fail (printf ".Chart.Name-.Chart.Version %s-%s ist zu lang (max. 63 Zeichen)" .Chart.Name .Chart.Version) -}}
+{{- end -}}
+{{ printf "%s-%s" .Chart.Name .Chart.Version }}
+{{- end -}}
+
+{{/* Managed-by -> On Helm, this value is always Helm */}}
+{{- define "app.managedBy" -}}
+{{- if gt (len (.Release.Service)) 63 -}}
+{{- fail (printf ".Release.Service %s ist zu lang (max. 63 Zeichen)" .Release.Service) -}}
+{{- end -}}
+{{ printf "%s" .Release.Service }}
+{{- end -}}
+
+
+{{/* Default Labels: Helm recommended best-practice labels https://helm.sh/docs/chart_best_practices/labels/ */}}
+{{- define "app.defaultLabels" }}
+app.kubernetes.io/instance: storybook
+app.kubernetes.io/managed-by: {{ include "app.managedBy" . }}
+app.kubernetes.io/name: {{ .Release.Name }}
+app.kubernetes.io/namespace: {{ include "app.namespace" . }}
+app.kubernetes.io/part-of: ozgcloud
+app.kubernetes.io/version: {{ .Chart.Version }}
+helm.sh/chart: {{ include "app.chart" . }}
+{{- end -}}
+
+{{- define "app.matchLabels" }}
+app.kubernetes.io/name: {{ .Release.Name }}
+app.kubernetes.io/namespace: {{ include "app.namespace" . }}
+{{- end -}}
+
+
+{{- define "app.serviceAccountName" -}}
+{{ printf "%s" ( (.Values.serviceAccount).name | default "storybook-service-account" ) }}
+{{- end -}}
+
+
+{{- define "app.baseDomain" -}}
+{{- printf "%s.%s" (include "app.ozgcloudBezeichner" . ) (include "app.baseUrl" . ) }}
+{{- end -}}
+
+{{- define "app.ozgcloudBezeichner" -}}
+{{- required "ozgcloud.bezeichner muss angegeben sein" (.Values.ozgcloud).bezeichner -}}
+{{- if lt 46 (len (.Values.ozgcloud).bezeichner) -}}
+{{ fail (printf "ozgcloud.bezeichner %s ist zu lang (max. 46 Zeichen)" (.Values.ozgcloud).bezeichner) }}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.baseUrl" -}}
+{{- required "baseUrl muss angegeben sein" .Values.baseUrl }}
+{{- end -}}
+
+{{- define "app.getCustomList" -}}
+{{- with (.Values.env).customList -}}
+{{- if kindIs "map" . -}}
+{{ include "app.dictToList" . }}
+{{- else if kindIs "slice" . -}}
+{{ . | toYaml }}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.dictToList" -}}
+{{- $customList := list -}}
+{{- range $key, $value := . -}}
+{{- $customList = append $customList (dict "name" $key "value" $value) }}
+{{- end -}}
+{{- $customList | toYaml -}}
+{{- end -}}
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/main/helm/templates/deployment.yaml b/alfa-client/libs/design-system/main/helm/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7daf47c5c1e9f110de1a378b984698d9130c3c69
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/templates/deployment.yaml
@@ -0,0 +1,122 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  labels:
+    {{- include "app.defaultLabels" . | indent 4 }}
+spec:
+  progressDeadlineSeconds: 600
+  replicas: {{ .Values.replicaCount }}
+  revisionHistoryLimit: 10
+  selector:
+    matchLabels:
+      {{- include "app.matchLabels" . | indent 6 }}
+  strategy:
+    rollingUpdate:
+      maxSurge: 1
+      maxUnavailable: 0
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        {{- include "app.defaultLabels" . | indent 8 }}
+        component: storybook
+    spec:
+      {{- if (.Values.serviceAccount).create }}
+      serviceAccountName: {{ include "app.serviceAccountName" . }}
+      {{- end }}
+      topologySpreadConstraints:
+      - maxSkew: 1
+        topologyKey: kubernetes.io/hostname
+        whenUnsatisfiable: ScheduleAnyway
+        labelSelector:
+          matchLabels:
+            app.kubernetes.io/name: {{ .Release.Name }}
+      
+      containers:
+      - env:        
+        {{- with include "app.getCustomList" . }}
+{{ . | indent 8 }}
+        {{- end }}
+
+        image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}"
+        imagePullPolicy: Always
+        name: storybook
+
+        startupProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          timeoutSeconds: 3
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          timeoutSeconds: 3
+          periodSeconds: 10
+          successThreshold: 1
+          failureThreshold: 3
+
+        resources:
+        {{- with .Values.resources }}
+{{ toYaml . | indent 10 }}
+        {{- end }}
+        securityContext:
+          allowPrivilegeEscalation: false
+          privileged: false
+          readOnlyRootFilesystem: false
+          runAsNonRoot: true
+          {{- with (.Values.securityContext).runAsUser }}
+          runAsUser: {{ . }}
+          {{- end }}
+          {{- with (.Values.securityContext).runAsGroup }}
+          runAsGroup: {{ . }}
+          {{- end }}
+        stdin: true
+        terminationMessagePath: /dev/termination-log
+        terminationMessagePolicy: File
+        tty: true
+        
+        
+      dnsConfig: {}
+      dnsPolicy: ClusterFirst
+      imagePullSecrets:
+      - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }}
+      restartPolicy: Always
+      {{- with .Values.hostAliases }}
+      hostAliases:
+{{ toYaml . | indent 8 }}
+      {{- end }}
+      schedulerName: default-scheduler
+      securityContext: {}
+      terminationGracePeriodSeconds: 30
diff --git a/alfa-client/libs/design-system/main/helm/templates/ingress.yaml b/alfa-client/libs/design-system/main/helm/templates/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..05882a4bd3278a2170632c8e70319e2011b1823f
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/templates/ingress.yaml
@@ -0,0 +1,39 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  annotations:
+    {{- if (.Values.ingress).certManagerAnnotations -}}
+    {{- range (.Values.ingress).certManagerAnnotations }}
+{{ . | indent 4 }}
+    {{- end }}
+    {{- else if (.Values.ingress).use_staging_cert }}
+    cert-manager.io/cluster-issuer: letsencrypt-staging
+    {{- else }}
+    cert-manager.io/cluster-issuer: letsencrypt-prod
+    {{- end }}
+spec:
+  {{- if and (.Values.ingress).className (ne (.Values).cluster_env "dataport") }}
+  ingressClassName: {{ .Values.ingress.className }}
+  {{- end }}
+  rules:
+    - http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: storybook
+                port: 
+                  number: 8080
+
+      host: {{ include "app.baseDomain" . }}
+  tls:
+    - hosts:
+      - {{ include "app.baseDomain" . }}
+      {{- if (.Values.ingress).tlsSecretName }}
+      secretName: {{ (.Values.ingress).tlsSecretName }}
+      {{- else if ne (.Values).cluster_env "dataport" }}
+      secretName: {{ .Values.ozgcloud.bezeichner }}-{{ .Release.Name }}-tls
+      {{- end }}
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml b/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9e281036f63a8e3bdaeb45223007d484a80af2c3
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/templates/network_policy.yaml
@@ -0,0 +1,44 @@
+{{- if not (.Values.networkPolicy).disabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: network-policy-storybook
+  namespace: {{ .Release.Namespace }}
+spec:
+  podSelector:
+    matchLabels:
+      {{- include "app.matchLabels" . | indent 6 }}
+  policyTypes:
+    - Ingress
+    - Egress
+  ingress:
+  - ports:
+    - port: 8080
+{{- with (.Values.networkPolicy).additionalIngressConfigLocal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalIngressConfigGlobal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+  egress:
+  - to:
+    - namespaceSelector:
+        matchLabels:
+          kubernetes.io/metadata.name: {{ required "networkPolicy.dnsServerNamespace must be set" (.Values.networkPolicy).dnsServerNamespace }}
+    ports:
+      - port: 53
+        protocol: UDP
+      - port: 53
+        protocol: TCP
+      - port: 5353
+        protocol: UDP
+      - port: 5353
+        protocol: TCP
+{{- with (.Values.networkPolicy).additionalEgressConfigLocal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalEgressConfigGlobal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+
+{{- end }}
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/main/helm/templates/service.yaml b/alfa-client/libs/design-system/main/helm/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a4a152fab1b685e2df235e8b067db58d5c5a995d
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/templates/service.yaml
@@ -0,0 +1,43 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  labels:
+    {{- include "app.defaultLabels" . | indent 4 }}
+    component: storybook-service
+spec:
+  type: ClusterIP
+  ports:
+    - name: http
+      port: 8080
+      protocol: TCP
+      targetPort: 8080
+
+  selector:
+    {{- include "app.matchLabels" . | indent 4 }}
+    component: storybook
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/main/helm/values.yaml b/alfa-client/libs/design-system/main/helm/values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..68df0d24e6ecee39af5ae05d521a2f89dec67f22
--- /dev/null
+++ b/alfa-client/libs/design-system/main/helm/values.yaml
@@ -0,0 +1,6 @@
+image:
+  repo: docker.ozg-sh.de
+  name: storybook
+  tag: 0.1.0 # [default: latest]
+replicaCount: 1
+
diff --git a/alfa-client/libs/design-system/nginx.conf b/alfa-client/libs/design-system/nginx.conf
new file mode 100644
index 0000000000000000000000000000000000000000..add779e6030ab68ebb8f5dde211d26f25e69a2e4
--- /dev/null
+++ b/alfa-client/libs/design-system/nginx.conf
@@ -0,0 +1,58 @@
+# Verarbeitungsreihenfolge von location rules:
+# --------------------------------------------------------------------------------------------------------------------------------------------
+# Search-Order       Modifier       Description                                                        Match-Type        Stops-search-on-match
+# --------------------------------------------------------------------------------------------------------------------------------------------
+#     1st               =           The URI must match the specified pattern exactly                  Simple-string              Yes
+#     2nd               ^~          The URI must begin with the specified pattern                     Simple-string              Yes
+#     3rd             (None)        The URI must begin with the specified pattern                     Simple-string               No
+#     4th               ~           The URI must be a case-sensitive match to the specified Rx      Perl-Compatible-Rx      Yes (first match)
+#     4th               ~*          The URI must be a case-insensitive match to the specified Rx    Perl-Compatible-Rx      Yes (first match)
+#     N/A               @           Defines a named location block.                                   Simple-string              Yes
+# --------------------------------------------------------------------------------------------------------------------------------------------
+#
+# Regex Matches werden bevorzugt verwendet.
+# Mehr: https://stackoverflow.com/a/59846239/1546181
+pid /tmp/nginx.pid;
+worker_processes  1;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       mime.types;
+    server_tokens off;
+    access_log off;
+    error_log stderr crit;
+
+    server {
+        listen 8080;
+        server_name localhost;
+
+       
+
+        location / {
+            root   /usr/share/nginx/html/design-system;
+            index  index.html index.htm;
+        }
+        
+
+
+        client_body_temp_path /tmp/client_temp;
+        proxy_temp_path       /tmp/proxy_temp_path;
+        fastcgi_temp_path     /tmp/fastcgi_temp;
+        uwsgi_temp_path       /tmp/uwsgi_temp;
+        scgi_temp_path        /tmp/scgi_temp;
+
+        gzip on;
+        gzip_min_length 1000;
+        gzip_proxied expired no-cache no-store private auth;
+        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
+    
+
+        error_page   500 502 503 504  /50x.html;
+        location = /50x.html {
+            root html;
+        }
+    }
+}
diff --git a/alfa-client/libs/design-system/project.json b/alfa-client/libs/design-system/project.json
index bcec7a688f84eefe1731c08cc4fa56e21e415975..bc681e80f5d762322adf47a62dba25464c0a7a0d 100644
--- a/alfa-client/libs/design-system/project.json
+++ b/alfa-client/libs/design-system/project.json
@@ -48,6 +48,21 @@
           "quiet": true
         }
       }
+    },
+    "container": {
+      "executor": "@nx-tools/nx-container:build",
+      "dependsOn": ["build"],
+      "options": {
+        "engine": "docker",
+        "push": false,
+        "metadata": {
+          "images": ["docker.ozg-sh.de/storybook"],
+          "load": true,
+          "tags": [
+            "build-latest"
+          ]
+        }
+      }
     }
   }
 }
diff --git a/alfa-client/libs/design-system/run_helm_test.sh b/alfa-client/libs/design-system/run_helm_test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..03f7485f84e6da1fd27bb3e24303172c4a09111c
--- /dev/null
+++ b/alfa-client/libs/design-system/run_helm_test.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -e
+set -x
+
+helm template  ./main/helm/ -f ./test/helm-linter-values.yaml 
+helm lint -f test/helm-linter-values.yaml ./main/helm/ 
+cd main/helm && helm unittest -f '../../test/helm/*.yaml'  .
+
diff --git a/alfa-client/libs/design-system/test/helm-linter-values.yaml b/alfa-client/libs/design-system/test/helm-linter-values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..88a8eb17a808af1c3314ac178a0db55672280ae6
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm-linter-values.yaml
@@ -0,0 +1,36 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+baseUrl:  test.sh.ozg-cloud.de
+
+ozgcloud:
+  bundesland: sh
+  bezeichner: helm
+  environment: test
+
+imagePullSecret: test-image-secret
+
+networkPolicy:
+  dnsServerNamespace: dummy-dns
+
diff --git a/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..09d03963a7eeb081a86cc2e28590feaf82c7385f
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_63_char_test.yaml
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test deployment less than 63 chars
+release:
+  name: storybook
+  namespace: sh-helm-test
+
+templates:
+  - templates/deployment.yaml
+set:
+  imagePullSecret: test-image-secret
+
+tests:
+  - it: should fail on .Release.Namespace length longer than 63 characters
+    release:
+      namespace: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890
+    asserts:
+      - failedTemplate:
+          errorMessage: .Release.Namespace test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen)
+  - it: should not fail on .Release.Namespace length less than 63 characters
+    asserts:
+      - notFailedTemplate: {}
+  - it: should fail on .Chart.Name-.Chart.Version length longer than 63 characters
+    chart:
+      version: 1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890
+    asserts:
+      - failedTemplate:
+          errorMessage: .Chart.Name-.Chart.Version storybook-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen)
+  - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters
+    asserts:
+      - notFailedTemplate: {}
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..006e6c299885077afddf976b14b59bb0718dbd9a
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_env_test.yaml
@@ -0,0 +1,70 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test deployment container environments 
+templates:
+  - templates/deployment.yaml
+set:
+  imagePullSecret: test-image-secret
+
+tests:
+  - it: check customList as list
+    set:
+      env.customList:
+        - name: my_test_environment_name
+          value: "A test value"
+        - name: test_environment
+          value: "B test value"
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: my_test_environment_name
+            value: "A test value"
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: test_environment
+            value: "B test value"
+  - it: check customList as dict
+    set:
+      env.customList:
+        my_test_environment_name: "A test value"
+        test_environment: "B test value"
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: my_test_environment_name
+            value: "A test value"
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: test_environment
+            value: "B test value"
+
+  - it:  no env exist by default
+    asserts:
+      - isEmpty:
+          path: spec.template.spec.containers[0].env
diff --git a/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2df27950bdc08c277a14b952b82ebb96cb08e9b3
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_host_aliases_test.yaml
@@ -0,0 +1,52 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: deployment host aliases
+release:
+  name: storybook
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+set:  
+  imagePullSecret: test-image-secret
+tests:
+  - it: should not set spec.template.spec.hostAliases
+    asserts:
+      - isNull:
+          path: spec.template.spec.hostAliases
+  - it: should set spec.template.spec.hostAliases
+    set:
+      hostAliases:
+        - ip: "127.0.0.1"
+          hostname:
+          - "eins"
+          - "zwei"
+    asserts:
+      - contains:
+          path: spec.template.spec.hostAliases
+          content:
+            ip: "127.0.0.1"
+            hostname:
+            - "eins"
+            - "zwei"
diff --git a/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8c4e08d29e5cd804dc358818f84be4b36caae501
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_ozgcloud_base_values_test.yaml
@@ -0,0 +1,47 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test ozgcloud base values
+release:
+  name: storybook
+  namespace: sh-helm-test
+templates:
+  - templates/deployment.yaml
+
+
+tests:
+  - it: should fail on missing imagePullSecret
+    set:
+      ozgcloud:
+        environment: dev
+    asserts:
+      - failedTemplate:
+          errorMessage: imagePullSecret must be set
+  - it: should not fail on given environment
+    set:
+      ozgcloud:
+        environment: dev
+      imagePullSecret: test-image-secret
+    asserts:
+      - notFailedTemplate: {}
diff --git a/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c1823ac3b5de1ccb782f5cf89d76853def332c98
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_resources_test.yaml
@@ -0,0 +1,60 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test deployment container resources
+release:
+  name: storybook
+templates:
+  - templates/deployment.yaml
+set:
+  imagePullSecret: test-image-secret
+
+tests:
+  - it: should generate resources when values set
+    set:
+      resources:
+        limits:
+          cpu: 11m
+          memory: 22Mi
+        requests:
+          cpu: 33m
+          memory: 44Mi
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].resources.limits.cpu
+          value: 11m
+      - equal:
+          path: spec.template.spec.containers[0].resources.limits.memory
+          value: 22Mi
+      - equal:
+          path: spec.template.spec.containers[0].resources.requests.cpu
+          value: 33m
+      - equal:
+          path: spec.template.spec.containers[0].resources.requests.memory
+          value: 44Mi
+  - it: should not generate resources when values not set
+    asserts:
+      - isEmpty:
+          path: spec.template.spec.containers[0].resources
+
diff --git a/alfa-client/libs/design-system/test/helm/deployment_test.yaml b/alfa-client/libs/design-system/test/helm/deployment_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1c76b61107630a97e9d5f69cb4f52b5aed907bcb
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/deployment_test.yaml
@@ -0,0 +1,250 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: deployment_test
+release:
+  name: storybook
+  namespace: storybook
+templates:
+  - templates/deployment.yaml
+set:
+  imagePullSecret: image-pull-secret
+tests:
+  - it: validate deployment root configuration
+    asserts:
+      - isAPIVersion:
+          of: apps/v1
+      - isKind:
+          of: Deployment
+  - it: validate metadata
+    asserts:
+      - equal:
+          path: metadata.name
+          value: storybook
+      - equal:
+          path: metadata.namespace
+          value: storybook
+      - equal:
+          path: metadata.labels["app.kubernetes.io/instance"]
+          value: storybook
+      - equal:
+          path: metadata.labels["app.kubernetes.io/name"]
+          value: storybook
+      - equal:
+          path: metadata.labels["app.kubernetes.io/namespace"]
+          value: storybook
+      - equal:
+          path: metadata.labels["app.kubernetes.io/part-of"]
+          value: ozgcloud
+      - equal:
+          path: metadata.labels["app.kubernetes.io/version"]
+          value: 0.0.0-MANAGED-BY-JENKINS
+      - equal:
+          path: metadata.labels["helm.sh/chart"]
+          value: storybook-0.0.0-MANAGED-BY-JENKINS
+  - it: validate spec root configuration
+    asserts:
+      - equal:
+          path: spec.progressDeadlineSeconds
+          value: 600
+      - equal:
+          path: spec.replicas
+          value: 1
+      - equal:
+          path: spec.revisionHistoryLimit
+          value: 10
+  - it: validate spec selector
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels["app.kubernetes.io/name"]
+          value: storybook
+      - equal:
+          path: spec.selector.matchLabels["app.kubernetes.io/namespace"]
+          value: storybook
+  - it: validate rolling updates
+    asserts:
+      - equal:
+          path: spec.strategy.rollingUpdate.maxSurge
+          value: 1
+      - equal:
+          path: spec.strategy.rollingUpdate.maxUnavailable
+          value: 0
+      - equal:
+          path: spec.strategy.type
+          value: RollingUpdate
+  - it: validate spec template metadata
+    asserts:
+      - equal:
+          path: spec.template.metadata.labels.component
+          value: storybook
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/instance"]
+          value: storybook
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/name"]
+          value: storybook
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/namespace"]
+          value: storybook
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/part-of"]
+          value: ozgcloud
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/version"]
+          value: 0.0.0-MANAGED-BY-JENKINS
+      - equal:
+          path: spec.template.metadata.labels["helm.sh/chart"]
+          value: storybook-0.0.0-MANAGED-BY-JENKINS
+  - it: validate spec template spec topology spread constraints
+    asserts:
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+          value: 1
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+          value: kubernetes.io/hostname
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+          value: ScheduleAnyway
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"]
+          value: storybook
+  - it: validate image name
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].image
+          value: "docker.ozg-sh.de/storybook:0.1.0"
+      - isAPIVersion:
+          of: apps/v1
+  - it: validate image pull policy
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].imagePullPolicy
+          value: Always
+  - it: validate container name
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].name
+          value: storybook
+  - it: validate readiness probe
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.failureThreshold
+          value: 3
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.path
+          value: /
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.port
+          value: 8080
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme
+          value: HTTP
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.periodSeconds
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.successThreshold
+          value: 1
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds
+          value: 3
+  - it: validate startup probe
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.failureThreshold
+          value: 3
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.path
+          value: /
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.port
+          value: 8080
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.scheme
+          value: HTTP
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.failureThreshold
+          value: 3
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.periodSeconds
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.successThreshold
+          value: 1
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.timeoutSeconds
+          value: 3
+  - it: validate container security context
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.privileged
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.runAsNonRoot
+          value: true
+
+  - it: validate container root config
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].stdin
+          value: true
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePath
+          value: /dev/termination-log
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePolicy
+          value: File
+      - equal:
+          path: spec.template.spec.containers[0].tty
+          value: true
+  - it: validate spec template spec root config
+    asserts:
+        - equal:
+            path: spec.template.spec.dnsConfig
+            value: {}
+        - equal:
+            path: spec.template.spec.dnsPolicy
+            value: ClusterFirst
+        - equal:
+            path: spec.template.spec.imagePullSecrets[0].name
+            value: image-pull-secret
+        - equal:
+            path: spec.template.spec.restartPolicy
+            value: Always
+        - equal:
+            path: spec.template.spec.schedulerName
+            value: default-scheduler
+        - equal:
+            path: spec.template.spec.securityContext
+            value: {}
+        - equal:
+            path: spec.template.spec.terminationGracePeriodSeconds
+            value: 30
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/test/helm/ingress_tests.yaml b/alfa-client/libs/design-system/test/helm/ingress_tests.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a6d662510d9e6d214d958042372987813bffb840
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/ingress_tests.yaml
@@ -0,0 +1,101 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test ingress.yaml
+release:
+  name: storybook
+  namespace: sh-helm-test
+templates:
+  - templates/ingress.yaml
+set:  
+  ozgcloud:
+    bezeichner: helm
+  baseUrl: test.by.ozg-cloud.de
+
+tests:
+  - it: check ingress kind
+    asserts:
+      - isKind:
+          of: Ingress
+  - it: should create ingress tls
+    asserts:
+      - equal:
+          path: spec.tls[0].secretName
+          value: helm-storybook-tls
+
+  - it: should not create ingress tls/ingressClass
+    set:
+      cluster_env: dataport
+    asserts:
+      - isNull:
+          path: spec.ingressClassName
+      - isNull:
+          path: spec.tls[0].secretName
+  
+  - it: should use default letsencrypt-prod cluster-issuer
+    asserts:
+      - equal:
+          path: metadata.annotations["cert-manager.io/cluster-issuer"]
+          value: letsencrypt-prod
+
+  - it: should use letsencrypt-staging cluster-issuer
+    set:
+      ingress.use_staging_cert: true
+    asserts:
+      - equal:
+          path: metadata.annotations["cert-manager.io/cluster-issuer"]
+          value: letsencrypt-staging
+
+  - it: should use letsencrypt-prod cluster-issuer
+    set:
+      ingress.use_staging_cert: false
+    asserts:
+      - equal:
+          path: metadata.annotations["cert-manager.io/cluster-issuer"]
+          value: letsencrypt-prod
+
+  - it: should create tls hosts name correctly
+    asserts:
+      - equal:
+          path: spec.tls[0].hosts[0]
+          value: helm.test.by.ozg-cloud.de
+
+
+      - equal:
+          path: spec.rules[0].http.paths[0]
+          value: 
+              path: /
+              pathType: Prefix
+              backend:
+                service:
+                  name: storybook
+                  port: 
+                    number: 8080
+      
+
+  - it: should set hostname
+    asserts:
+      - equal:
+          path: spec.rules[0].host
+          value: helm.test.by.ozg-cloud.de
\ No newline at end of file
diff --git a/alfa-client/libs/design-system/test/helm/network_policy_test.yaml b/alfa-client/libs/design-system/test/helm/network_policy_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7e828b00c019b1f771e7c6adc373b09a431e0a76
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/network_policy_test.yaml
@@ -0,0 +1,163 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: network policy storybook test
+release:
+  name: storybook
+  namespace: by-helm-test
+templates:
+  - templates/network_policy.yaml
+set:
+  networkPolicy:
+    dnsServerNamespace: kube-system
+    ssoPublicIp: 1.1.1.1/32
+tests:
+  - it: should match apiVersion
+    asserts:
+      - isAPIVersion:
+          of: networking.k8s.io/v1
+  - it: should match kind
+    asserts:
+      - isKind:
+          of: NetworkPolicy
+  - it: validate metadata
+    asserts:
+      - equal:
+          path: metadata
+          value:
+            name: network-policy-storybook
+            namespace: by-helm-test
+
+
+  - it: should add egress rule to dns service
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-namespace
+    asserts:
+      - contains:
+          path: spec.egress
+          content:
+              to:
+              - namespaceSelector:
+                  matchLabels:
+                    kubernetes.io/metadata.name: test-dns-namespace
+              ports:
+                - port: 53
+                  protocol: UDP
+                - port: 53
+                  protocol: TCP
+                - port: 5353
+                  protocol: UDP
+                - port: 5353
+                  protocol: TCP
+
+  - it: should add additionalIngressConfig local
+    set:
+      networkPolicy:
+        ssoPublicIp: 51.89.117.53/32
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigLocal:
+        - from:
+          - podSelector: 
+              matchLabels:
+                component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+            - podSelector: 
+                matchLabels:
+                  component: client2
+  - it: should add additionalIngressConfig global
+    set:
+      networkPolicy:
+        ssoPublicIp: 51.89.117.53/32
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigGlobal:
+        - from:
+          - podSelector: 
+              matchLabels:
+                component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+            - podSelector: 
+                matchLabels:
+                  component: client2
+
+  - it: should add additionalEgressConfig local
+    set:
+      networkPolicy:
+        ssoPublicIp: 51.89.117.53/32
+        dnsServerNamespace: test-dns-namespace
+        additionalEgressConfigLocal:
+        - to:
+          - ipBlock:
+              cidr: 1.2.3.4/32
+    asserts:
+    - contains:
+        path: spec.egress
+        content:
+          to:
+          - ipBlock:
+              cidr: 1.2.3.4/32
+
+  - it: should add additionalEgressConfig global
+    set:
+      networkPolicy:
+        ssoPublicIp: 51.89.117.53/32
+        dnsServerNamespace: test-dns-namespace
+        additionalEgressConfigGlobal:
+        - to:
+          - ipBlock:
+              cidr: 1.2.3.4/32
+    asserts:
+    - contains:
+        path: spec.egress
+        content:
+          to:
+          - ipBlock:
+              cidr: 1.2.3.4/32
+
+
+  - it: test network policy disabled
+    set:
+      networkPolicy:
+        disabled: true
+    asserts:
+      - hasDocuments:
+          count: 0
+
+  - it: test network policy unset should be disabled
+    set:
+      networkPolicy:
+        ssoPublicIp: 1.1.1.1
+        disabled: false
+        dnsServerNamespace: test-dns-server-namespace
+    asserts:
+      - hasDocuments:
+          count: 1
diff --git a/alfa-client/libs/design-system/test/helm/service_test.yaml b/alfa-client/libs/design-system/test/helm/service_test.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fd3ae830b640f34e4540828d884dd4fb0aa2df46
--- /dev/null
+++ b/alfa-client/libs/design-system/test/helm/service_test.yaml
@@ -0,0 +1,66 @@
+#
+# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test service
+release:
+  name: storybook
+  namespace: sh-helm-test
+templates:
+  - templates/service.yaml
+tests:
+  - it: should have the label component with correct value 
+    asserts:
+      - isKind:
+          of: Service
+      - isAPIVersion:
+           of: v1
+      - equal:
+          path: metadata.labels.component
+          value: storybook-service
+  - it: should be of type ClusterIP
+    asserts:
+      - equal:
+          path: spec.type
+          value: ClusterIP
+
+  - it: selector should contain the component label with correct value
+    asserts:
+      - equal:
+          path: spec.selector.component
+          value: storybook
+
+  - it: selector should contain helm recommended labels name and namespace
+    asserts:
+      - equal:
+          path: spec.selector
+          value:
+            app.kubernetes.io/name: storybook
+            app.kubernetes.io/namespace: sh-helm-test
+            component: storybook
+
+  - it: check component label for service
+    asserts:
+      - equal:
+          path: metadata.labels["component"]
+          value: storybook-service
\ No newline at end of file
diff --git a/alfa-client/package.json b/alfa-client/package.json
index 941615e48c676d90e015854377c3441e18a98a3e..dc0151bac5d9d6567a481c5009ca1a0bebdccd54 100644
--- a/alfa-client/package.json
+++ b/alfa-client/package.json
@@ -43,7 +43,8 @@
     "cypress:install": "npx cypress install",
     "cypress:open": "npx cypress open --project apps/alfa-e2e",
     "workspace-generator": "nx workspace-generator",
-    "storybook": "nx storybook design-system"
+    "storybook": "nx storybook design-system",
+    "ci-storybook": "nx build-storybook design-system && nx container design-system"
   },
   "private": true,
   "dependencies": {