diff --git a/k8s/Chart.yaml b/k8s/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..023d131d3621079eaf02c701177a0f279fdf45d1
--- /dev/null
+++ b/k8s/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: kszkepzes
+description:
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "prod"
diff --git a/k8s/deployment.yml b/k8s/deployment.yml
deleted file mode 100644
index be0e71650ff87f1635d36238bf54d6f09a23d4a5..0000000000000000000000000000000000000000
--- a/k8s/deployment.yml
+++ /dev/null
@@ -1,155 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: kszkepzes-backend
-  namespace: kszk-kepzes-site
-spec:
-  strategy:
-    type: Recreate
-  replicas: 1
-  selector:
-    matchLabels:
-      app: kszkepzes-backend
-  template:
-    metadata:
-      labels:
-        app: kszkepzes-backend
-    spec:
-      initContainers:
-        - name: volume-permission-fix
-          image: busybox
-          command:
-            - "sh"
-            - "-c"
-            - |
-              chown -R 1000:1000 /mediafiles
-              chown -R 1000:1000 /staticfiles
-          volumeMounts:
-            - name: kszkepzes-media-volume
-              mountPath: /mediafiles
-            - name: kszkepzes-static-volume
-              mountPath: /staticfiles
-          resources:
-            limits:
-              memory: 30Mi
-        - name: kszkepzes-backend-collectstatic
-          image: harbor.sch.bme.hu/kszk/kszkepzes-backend:##IMAGETAG##
-          imagePullPolicy: "IfNotPresent"
-          command: ["python", "manage.py", "collectstatic", "--noinput"]
-          volumeMounts:
-            - mountPath: /home/app/kszkepzes-backend/staticfiles
-              name: kszkepzes-static-volume
-          envFrom:
-            - configMapRef:
-                name: kszkepzes-config
-            - secretRef:
-                name: kszkepzes-secret-config
-          resources:
-            limits:
-              memory: 200Mi
-        - name: kszkepzes-backend-migrate
-          image: harbor.sch.bme.hu/kszk/kszkepzes-backend:##IMAGETAG##
-          imagePullPolicy: "IfNotPresent"
-          command: ["python", "manage.py", "migrate", "--noinput"]
-          envFrom:
-            - configMapRef:
-                name: kszkepzes-config
-            - secretRef:
-                name: kszkepzes-secret-config
-          resources:
-            limits:
-              memory: 200Mi
-      containers:
-        - name: kszkepzes-backend
-          image: harbor.sch.bme.hu/kszk/kszkepzes-backend:##IMAGETAG##
-          imagePullPolicy: "IfNotPresent"
-          volumeMounts:
-            - mountPath: /home/app/kszkepzes-backend/mediafiles
-              name: kszkepzes-media-volume
-            - mountPath: /home/app/kszkepzes-backend/staticfiles
-              name: kszkepzes-static-volume
-          ports:
-            - containerPort: 8000
-          envFrom:
-            - configMapRef:
-                name: kszkepzes-config
-            - secretRef:
-                name: kszkepzes-secret-config
-          resources:
-            requests:
-              cpu: "80m"
-            limits:
-              memory: 600Mi
-              cpu: "2"
-        - name: kszkepzes-files-serve
-          securityContext:
-            runAsUser: 1000
-            runAsGroup: 1000
-          image: halverneus/static-file-server:latest
-          imagePullPolicy: "Always"
-          volumeMounts:
-            - mountPath: /var/www/html/mediafiles
-              name: kszkepzes-media-volume
-            - mountPath: /var/www/html/staticfiles
-              name: kszkepzes-static-volume
-          ports:
-            - containerPort: 8080
-          env:
-            - name: PORT
-              value: "8080"
-            - name: SHOW_LISTING
-              value: "false"
-            - name: FOLDER
-              value: "/var/www/html"
-          resources:
-            requests:
-              cpu: "20m"
-            limits:
-              memory: 200Mi
-              cpu: "2"
-      volumes:
-        - name: kszkepzes-media-volume
-          persistentVolumeClaim:
-            claimName: kszkepzes-media-pv-claim
-        - name: kszkepzes-static-volume
-          persistentVolumeClaim:
-            claimName: kszkepzes-static-pv-claim
-      imagePullSecrets:
-        - name: harbor
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: kszkepzes-backend-worker
-  namespace: kszk-kepzes-site
-spec:
-  strategy:
-    type: Recreate
-  replicas: 1
-  selector:
-    matchLabels:
-      app: kszkepzes-backend-worker
-  template:
-    metadata:
-      labels:
-        app: kszkepzes-backend-worker
-    spec:
-      containers:
-        - name: worker
-          image: harbor.sch.bme.hu/kszk/kszkepzes-backend:##IMAGETAG##
-          imagePullPolicy: "IfNotPresent"
-          envFrom:
-            - configMapRef:
-                name: kszkepzes-config
-            - secretRef:
-                name: kszkepzes-secret-config
-          command: ["python3"]
-          args: ["-m", "celery", "-A", "kszkepzes", "worker", "-l", "debug"]
-          resources:
-            requests:
-              cpu: "100m"
-            limits:
-              memory: 600Mi
-              cpu: "2"
-      imagePullSecrets:
-        - name: harbor
diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml
deleted file mode 100644
index bbde98c0f9620b369055de31a1bfeeefa324887c..0000000000000000000000000000000000000000
--- a/k8s/ingress.yaml
+++ /dev/null
@@ -1,54 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  annotations:
-    cert-manager.io/cluster-issuer: letsencrypt-prod
-    kubernetes.io/ingress.class: nginx
-    kubernetes.io/tls-acme: "true"
-    nginx.ingress.kubernetes.io/proxy-body-size: 20m
-  name: kszkepzes
-  namespace: kszk-kepzes-site
-spec:
-  rules:
-    - host: ujonc.kszk.bme.hu
-      http:
-        paths:
-          - path: /
-            pathType: Prefix
-            backend:
-              service:
-                name: kszkepzes-frontend
-                port:
-                  number: 3000
-          - path: /api
-            pathType: Prefix
-            backend:
-              service:
-                name: kszkepzes-backend
-                port:
-                  number: 8000
-          - path: /admin
-            pathType: Prefix
-            backend:
-              service:
-                name: kszkepzes-backend
-                port:
-                  number: 8000
-          - path: /staticfiles
-            pathType: Prefix
-            backend:
-              service:
-                name: kszkepzes-backend
-                port:
-                  number: 8080
-          - path: /mediafiles
-            pathType: Prefix
-            backend:
-              service:
-                name: kszkepzes-backend
-                port:
-                  number: 8080
-  tls:
-    - hosts:
-        - ujonc.kszk.bme.hu
-      secretName: kszkepzes-cert
diff --git a/k8s/pvc.yaml b/k8s/pvc.yaml
deleted file mode 100644
index f314143c98b4ea9790aff6ac8c46a54ad4dc1cff..0000000000000000000000000000000000000000
--- a/k8s/pvc.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  labels:
-    app: kszkepzes
-  name: kszkepzes-media-pv-claim
-  namespace: kszk-kepzes-site
-spec:
-  accessModes:
-  - ReadWriteOnce
-  resources:
-    requests:
-      storage: 10Gi
-  storageClassName: vsphere
-
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  labels:
-    app: kszkepzes
-  name: kszkepzes-static-pv-claim
-  namespace: kszk-kepzes-site
-spec:
-  accessModes:
-  - ReadWriteOnce
-  resources:
-    requests:
-      storage: 1Gi
-  storageClassName: vsphere
diff --git a/k8s/redis.values.yaml b/k8s/redis.values.yaml
deleted file mode 100644
index bfcb6b819adb30ea50de9ebddfeca6b879b1992a..0000000000000000000000000000000000000000
--- a/k8s/redis.values.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-# https://artifacthub.io/packages/helm/bitnami/redis
-master:
-  resources:
-    requests:
-      memory: 100Mi
-      cpu: 80m
-    limits:
-      memory: 0.75Gi
-      cpu: 1
-  persistence:
-    size: 1Gi
-replica:
-  resources:
-    requests:
-      memory: 100Mi
-      cpu: 80m
-    limits:
-      memory: 0.75Gi
-      cpu: 1
-  persistence:
-    size: 1Gi
diff --git a/k8s/service.yml b/k8s/service.yml
deleted file mode 100644
index f0f2242bb949041f9a50d974cbe6d28b220e6051..0000000000000000000000000000000000000000
--- a/k8s/service.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
-  name: kszkepzes-backend
-  namespace: kszk-kepzes-site
-spec:
-  type: ClusterIP
-  ports:
-    - port: 8000
-      targetPort: 8000
-      name: backend
-      protocol: TCP
-    - port: 8080
-      targetPort: 8080
-      name: files
-      protocol: TCP
-  selector:
-    app: kszkepzes-backend
diff --git a/k8s/templates/backend.yaml b/k8s/templates/backend.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..bd5da3fc962d3cd0ab349fa05cf5851d161acd2b
--- /dev/null
+++ b/k8s/templates/backend.yaml
@@ -0,0 +1,278 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}-backend
+spec:
+  strategy:
+    type: Recreate
+  replicas: 1
+  selector:
+    matchLabels:
+      app: {{ .Release.Name }}-backend
+  template:
+    metadata:
+      labels:
+        app: {{ .Release.Name }}-backend
+    spec:
+      initContainers:
+        - name: volume-permission-fix
+          image: busybox
+          command:
+            - "sh"
+            - "-c"
+            - |
+              chown -R 1000:1000 /mediafiles
+              chown -R 1000:1000 /staticfiles
+          volumeMounts:
+            - name: kszkepzes-media-volume
+              mountPath: /mediafiles
+            - name: kszkepzes-static-volume
+              mountPath: /staticfiles
+          resources:
+            limits:
+              memory: 30Mi
+        - name: kszkepzes-backend-collectstatic
+          image: {{ .Values.backend.image }}:{{ .Values.backend.tag }}
+          imagePullPolicy: "Always"
+          command: ["python", "manage.py", "collectstatic", "--noinput"]
+          volumeMounts:
+            - mountPath: /home/app/kszkepzes-backend/staticfiles
+              name: kszkepzes-static-volume
+          envFrom:
+            - configMapRef:
+                name: {{ .Release.Name }}-config
+            - secretRef:
+                name: {{ .Release.Name }}-secret-config
+          resources:
+            limits:
+              memory: 200Mi
+        - name: kszkepzes-backend-migrate
+          image: {{ .Values.backend.image }}:{{ .Values.backend.tag }}
+          imagePullPolicy: "Always"
+          command: ["python", "manage.py", "migrate", "--noinput"]
+          envFrom:
+            - configMapRef:
+                name: {{ .Release.Name }}-config
+            - secretRef:
+                name: {{ .Release.Name }}-secret-config
+          resources:
+            limits:
+              memory: 200Mi
+      containers:
+        - name: kszkepzes-backend
+          image: {{ .Values.backend.image }}:{{ .Values.backend.tag }}
+          imagePullPolicy: "Always"
+          volumeMounts:
+            - mountPath: /home/app/kszkepzes-backend/mediafiles
+              name: kszkepzes-media-volume
+            - mountPath: /home/app/kszkepzes-backend/staticfiles
+              name: kszkepzes-static-volume
+          ports:
+            - containerPort: 8000
+          envFrom:
+            - configMapRef:
+                name: {{ .Release.Name }}-config
+            - secretRef:
+                name: {{ .Release.Name }}-secret-config
+          resources:
+            requests:
+              cpu: "80m"
+            limits:
+              memory: 600Mi
+              cpu: "2"
+          startupProbe:
+            httpGet:
+              path: /healthz/
+              port: 8000
+            initialDelaySeconds: 10
+            periodSeconds: 5
+            failureThreshold: 5
+            timeoutSeconds: 4
+          livenessProbe:
+            httpGet:
+              port: 8000
+              path: /healthz/
+            periodSeconds: 10
+            failureThreshold: 2
+            timeoutSeconds: 4
+        - name: kszkepzes-files-serve
+          securityContext:
+            runAsUser: 1000
+            runAsGroup: 1000
+          image: halverneus/static-file-server:latest
+          imagePullPolicy: "Always"
+          volumeMounts:
+            - mountPath: /var/www/html/mediafiles
+              name: kszkepzes-media-volume
+            - mountPath: /var/www/html/staticfiles
+              name: kszkepzes-static-volume
+          ports:
+            - containerPort: 8080
+          env:
+            - name: PORT
+              value: "8080"
+            - name: SHOW_LISTING
+              value: "false"
+            - name: FOLDER
+              value: "/var/www/html"
+          resources:
+            requests:
+              cpu: "20m"
+            limits:
+              memory: 200Mi
+              cpu: "2"
+      volumes:
+        - name: kszkepzes-media-volume
+          persistentVolumeClaim:
+            claimName: {{ .Release.Name }}-media-pv-claim
+        - name: kszkepzes-static-volume
+          persistentVolumeClaim:
+            claimName: {{ .Release.Name }}-static-pv-claim
+      imagePullSecrets:
+        - name: {{ .Values.backend.imagePullSecretName }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}-backend-worker
+spec:
+  strategy:
+    type: Recreate
+  replicas: 1
+  selector:
+    matchLabels:
+      app: {{ .Release.Name }}-backend-worker
+  template:
+    metadata:
+      labels:
+        app: {{ .Release.Name }}-backend-worker
+    spec:
+      containers:
+        - name: worker
+          image: {{ .Values.backend.image }}:{{ .Values.backend.tag }}
+          imagePullPolicy: "Always"
+          envFrom:
+            - configMapRef:
+                name: {{ .Release.Name }}-config
+            - secretRef:
+                name: {{ .Release.Name }}-secret-config
+          command: ["python3"]
+          args: ["-m", "celery", "-A", "kszkepzes", "worker", "-l", "debug"]
+          livenessProbe:
+            exec:
+              command:
+              - celery
+              - inspect
+              - ping
+            periodSeconds: 10
+            failureThreshold: 2
+            timeoutSeconds: 4
+          startupProbe:
+            exec:
+              command:
+              - celery
+              - inspect
+              - ping
+            initialDelaySeconds: 10
+            periodSeconds: 5
+            failureThreshold: 5
+            timeoutSeconds: 4
+          resources:
+            requests:
+              cpu: "100m"
+            limits:
+              memory: 600Mi
+              cpu: "2"
+      imagePullSecrets:
+        - name: {{ .Values.backend.imagePullSecretName }}
+
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  labels:
+    app: {{ .Release.Name }}
+  name: {{ .Release.Name }}-media-pv-claim
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 10Gi
+  storageClassName: {{ .Values.backend.storageClassName }}
+
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  labels:
+    app: {{ .Release.Name }}
+  name: {{ .Release.Name }}-static-pv-claim
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 1Gi
+  storageClassName: {{ .Values.backend.storageClassName }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ .Release.Name }}-config
+data:
+  # DEBUG: "1"
+  DB_NAME: {{ .Values.db.name }}
+  DB_HOST: {{ .Values.db.host }}
+  CELERY_BROKER_URL: {{ printf "redis://%s-redis:6379" .Release.Name }}
+  DJANGO_SETTINGS_MODULE: "kszkepzes.settings.production"
+
+  {{ if .Values.minio.enabled }}
+  MINIO_EXTERNAL_ENDPOINT: {{ .Values.url }}
+  MINIO_ACCESS_ENDPOINT: {{ .Release.Name }}-minio:9000
+  {{ else }}
+  MINIO_EXTERNAL_ENDPOINT: {{ .Values.minio.MINIO_EXTERNAL_ENDPOINT }}
+  MINIO_ACCESS_ENDPOINT: {{ .Values.minio.MINIO_ACCESS_ENDPOINT }}
+  {{ end }}
+
+  MINIO_STATIC_BUCKET: "kepzes-static"
+  MINIO_MEDIA_BUCKET: "kepzes-media"
+  CSRF_TRUSTED_ORIGINS: {{ printf "https://%s" .Values.url }}
+  SECRET_KEY: {{ .Values.backend.secretKey }}
+  OIDC_CLIENT_ID: {{ .Values.backend.oidc.OIDC_CLIENT_ID }}
+  OIDC_AUTHORIZATION_ENDPOINT: {{ .Values.backend.oidc.OIDC_AUTHORIZATION_ENDPOINT }}
+  OIDC_TOKEN_ENDPOINT: {{ .Values.backend.oidc.OIDC_TOKEN_ENDPOINT }}
+  OIDC_USERINFO_ENDPOINT: {{ .Values.backend.oidc.OIDC_USERINFO_ENDPOINT }}
+  OIDC_JWKS_ENDPOINT: {{ .Values.backend.oidc.OIDC_JWKS_ENDPOINT }}
+  OIDC_SIGN_ALGO: {{ .Values.backend.oidc.OIDC_SIGN_ALGO }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .Release.Name }}-secret-config
+data:
+  DB_USER: {{ .Values.db.user | b64enc }}
+  DB_PASSWORD: {{ .Values.db.password | b64enc }}
+  MINIO_ACCESS_KEY: {{ .Values.minio.user | b64enc }}
+  MINIO_SECRET_KEY: {{ .Values.minio.password | b64enc }}
+  OIDC_CLIENT_SECRET: {{ .Values.backend.oidc.OIDC_CLIENT_SECRET | b64enc}}
+
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}-backend
+spec:
+  type: ClusterIP
+  ports:
+    - port: 8000
+      targetPort: 8000
+      name: backend
+      protocol: TCP
+    - port: 8080
+      targetPort: 8080
+      name: files
+      protocol: TCP
+  selector:
+    app: {{ .Release.Name }}-backend
diff --git a/k8s/templates/frontend.yaml b/k8s/templates/frontend.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9ed8fb37eaddb1dcc24af931026bdd5449adf046
--- /dev/null
+++ b/k8s/templates/frontend.yaml
@@ -0,0 +1,42 @@
+{{ if .Values.frontend.enabled}}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}-frontend
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: {{ .Release.Name }}-frontend
+  template:
+    metadata:
+      labels:
+        app: {{ .Release.Name }}-frontend
+    spec:
+      containers:
+        - name: kszkepzes-frontend
+          image: {{ .Values.frontend.image }}:{{ .Values.frontend.tag }}
+          imagePullPolicy: 'Always'
+          ports:
+            - containerPort: 3000
+          resources:
+            limits:
+              memory: 200Mi
+      imagePullSecrets:
+        - name: {{ .Values.frontend.imagePullSecretName }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}-frontend
+spec:
+  type: ClusterIP
+  ports:
+    - port: 3000
+      targetPort: 3000
+      name: front
+      protocol: TCP
+  selector:
+    app: {{ .Release.Name }}-frontend
+{{ end }}
\ No newline at end of file
diff --git a/k8s/templates/ingress.yaml b/k8s/templates/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1c9a1d3fea55ef2a77a31d0dbdfce49d0a07cfc8
--- /dev/null
+++ b/k8s/templates/ingress.yaml
@@ -0,0 +1,101 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  annotations:
+    cert-manager.io/cluster-issuer: letsencrypt
+    kubernetes.io/tls-acme: "true"
+  name: {{ .Release.Name }}
+spec:
+  rules:
+    - host: {{ .Values.url }}
+      http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-frontend
+                port:
+                  number: 3000
+          - path: /api
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-backend
+                port:
+                  number: 8000
+          - path: /admin
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-backend
+                port:
+                  number: 8000
+          - path: /staticfiles
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-backend
+                port:
+                  number: 8080
+          - path: /mediafiles
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-backend
+                port:
+                  number: 8080
+          - path: /oidc
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-backend
+                port:
+                  number: 8000
+          {{ if .Values.minio.enabled }}
+          - path: /kepzes-static
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-minio
+                port:
+                  number: 9000
+          - path: /kepzes-media
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-minio
+                port:
+                  number: 9000
+          {{end}}
+  tls:
+    - hosts:
+        - {{ .Values.url }}
+      secretName: {{ .Release.Name }}-cert
+      
+{{ if .Values.frontend.enabled }}
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  annotations:
+    cert-manager.io/cluster-issuer: letsencrypt
+    kubernetes.io/tls-acme: "true"
+  name: {{ .Release.Name }}-frontend
+spec:
+  rules:
+    - host: {{ .Values.url }}
+      http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: {{ .Release.Name }}-frontend
+                port:
+                  number: 3000
+  tls:
+    - hosts:
+        - {{ .Values.url }}
+      secretName: {{ .Release.Name }}-cert
+{{ end }}
\ No newline at end of file
diff --git a/k8s/templates/minio.yaml b/k8s/templates/minio.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..79cd6172fbe0c7d76418b43f4aed4542ecf7ef8c
--- /dev/null
+++ b/k8s/templates/minio.yaml
@@ -0,0 +1,89 @@
+{{ if .Values.minio.enabled }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}-minio
+spec:
+  selector:
+    matchLabels:
+      app: {{ .Release.Name }}-minio
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: {{ .Release.Name }}-minio
+    spec:
+      volumes:
+        - name: kszkepzes-minio-volume
+          persistentVolumeClaim:
+            claimName: {{ .Release.Name }}-minio-pvc
+      containers:
+        - name: {{ .Release.Name}}-minio
+          image: {{ .Values.minio.image }}:{{ .Values.minio.tag }}
+          args: ["server", "/data" ,"--console-address", ":9001"]
+          ports:
+            - containerPort: 9000
+              protocol: TCP
+            - containerPort: 9001
+              protocol: TCP
+          env:
+          - name: MINIO_ROOT_USER
+            valueFrom:
+                secretKeyRef:
+                  name: {{ .Release.Name }}-minio-credentials
+                  key: MINIO_ROOT_USER
+          - name: MINIO_ROOT_PASSWORD
+            valueFrom:
+                secretKeyRef:
+                  name: {{ .Release.Name }}-minio-credentials
+                  key: MINIO_ROOT_PASSWORD
+          volumeMounts:
+            - mountPath: /var/lib/minioql/data
+              name: kszkepzes-minio-volume
+          resources:
+            requests:
+              cpu: "200m"
+              memory: 500Mi
+            limits:
+              cpu: "2"
+              memory: 1Gi
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .Release.Name }}-minio-credentials
+type: Opaque
+data:
+  MINIO_ROOT_USER: {{ .Values.minio.user | b64enc }}
+  MINIO_ROOT_PASSWORD: {{ .Values.minio.password | b64enc }}
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: {{ .Release.Name }}-minio-pvc
+spec:
+  storageClassName: {{ .Values.minio.storageClassName }}
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 2Gi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}-minio
+spec:
+  type: ClusterIP
+  ports:
+    - port: 9000
+      targetPort: 9000
+      name: api
+      protocol: TCP
+    - port: 9001
+      targetPort: 9001
+      name: ui
+      protocol: TCP
+  selector:
+    app: {{ .Release.Name }}-minio
+{{ end }}
\ No newline at end of file
diff --git a/k8s/templates/redis.yaml b/k8s/templates/redis.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4ec18fae1bdde405ecb866441bc4207cf8a703f6
--- /dev/null
+++ b/k8s/templates/redis.yaml
@@ -0,0 +1,44 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}-redis
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: {{ .Release.Name }}-redis
+  template:
+    metadata:
+      labels:
+        app: {{ .Release.Name }}-redis
+    spec:
+      containers:
+      - name: redis
+        image: {{ .Values.redis.image }}:{{ .Values.redis.tag }}
+        ports:
+        - containerPort: 6379
+        args:
+        - "--save"
+        - ""
+        - "--appendonly"
+        - "no"
+        resources:
+          requests:
+            memory: 100Mi
+            cpu: "100m"
+          limits:
+            memory: 750Mi
+            cpu: "1"
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}-redis
+spec:
+  type: ClusterIP
+  ports:
+  - port: 6379
+    targetPort: 6379
+  selector:
+    app: {{ .Release.Name }}-redis
\ No newline at end of file
diff --git a/k8s/values.yaml b/k8s/values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..960d49561abc5b003f76dff68e94781284b67782
--- /dev/null
+++ b/k8s/values.yaml
@@ -0,0 +1,49 @@
+url: "ujonc.kszk.bme.hu"
+
+backend:
+  image: "harbor.sch.bme.hu/kszk-kepzes/backend"
+  tag: "test"
+  storageClassName: "local-path"
+  imagePullSecretName: "harbor"
+  secretKey: ""
+  oidc:
+    OIDC_CLIENT_ID: "a56088b8-c381-4da6-8e17-d7d129716b5a"
+    OIDC_CLIENT_SECRET: ""
+    OIDC_AUTHORIZATION_ENDPOINT: "https://login.microsoftonline.com/79f0ae63-ef51-49f5-9f51-78a3346e1507/oauth2/v2.0/authorize"
+    OIDC_TOKEN_ENDPOINT: "https://login.microsoftonline.com/79f0ae63-ef51-49f5-9f51-78a3346e1507/oauth2/v2.0/token"
+    OIDC_USERINFO_ENDPOINT: "https://graph.microsoft.com/oidc/userinfo"
+    OIDC_JWKS_ENDPOINT: "https://login.microsoftonline.com/79f0ae63-ef51-49f5-9f51-78a3346e1507/discovery/v2.0/keys"
+    OIDC_SIGN_ALGO: "RS256"
+
+frontend:
+  enabled: false
+  image: "harbor.sch.bme.hu/kszk-kepzes/frontend"
+  tag: "latest"
+  imagePullSecretName: "harbor"
+
+db:
+  host: "dbsch.internal"
+  name: ""
+  user: ""
+  password: ""
+
+minio:
+  # Deployoljon e saját miniot
+  enabled: true
+  # Ha enabled = false, milyen endpoint on érje el a backend a miniot
+  MINIO_ACCESS_ENDPOINT: "1.2.3.4:9000"
+  # Ha enabled = false, milyen (https) endpoint on lehet publikusan elérni a miniot
+  MINIO_EXTERNAL_ENDPOINT: "1.2.3.4:9000" 
+  # Helyi vagy külső minio user
+  user: "user"
+  # Helyi vagy külső minio pass
+  password: ""
+  
+  # Csak ha enabled = true
+  image: "quay.io/minio/minio"
+  tag: "RELEASE.2024-02-14T21-36-02Z"
+  storageClassName: "local-path"
+
+redis:
+  image: "redis"
+  tag: "latest"
diff --git a/src/kszkepzes/settings/production.py b/src/kszkepzes/settings/production.py
index 82c7207b4f9b6a0def59b1d9ce4b7c3f2954c94a..4d70d696ab206677e8017e425b3905304ff7f480 100644
--- a/src/kszkepzes/settings/production.py
+++ b/src/kszkepzes/settings/production.py
@@ -1,3 +1,5 @@
+from datetime import timedelta
+from typing import List, Tuple
 from .base import *
 
 DEBUG = int(os.environ.get("DEBUG", default=0))
@@ -24,6 +26,7 @@ EMAIL_HOST_PASSWORD = os.getenv('SMTP_PASSWORD')
 
 CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL')
 CELERY_RESULT_BACKEND = os.getenv('CELERY_BROKER_URL')
+REDIS_URL = os.getenv('CELERY_BROKER_URL')
 
 CSRF_TRUSTED_ORIGINS = [os.getenv('CSRF_TRUSTED_ORIGINS')]
 
@@ -39,7 +42,6 @@ MINIO_REGION = 'us-east-1'
 MINIO_ACCESS_KEY = os.environ.get("MINIO_ACCESS_KEY")
 MINIO_SECRET_KEY = os.environ.get("MINIO_SECRET_KEY")
 MINIO_URL_EXPIRY_HOURS = timedelta(hours=2)
-MINIO_CONSISTENCY_CHECK_ON_START = True
 MINIO_PUBLIC_BUCKETS = [
     os.environ.get('MINIO_STATIC_BUCKET'),
     os.environ.get('MINIO_MEDIA_BUCKET')
@@ -50,3 +52,5 @@ MINIO_STATIC_FILES_BUCKET = os.environ.get('MINIO_STATIC_BUCKET')
 MINIO_BUCKET_CHECK_ON_SAVE = True
 DEFAULT_FILE_STORAGE = 'django_minio_backend.models.MinioBackend'
 STATICFILES_STORAGE = 'django_minio_backend.models.MinioBackendStatic'
+
+SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
\ No newline at end of file