chore: retire the self-hosted zitadel - #1702
Merged
Merged
Conversation
--- kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-secrets
+++ kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-secrets
@@ -1,26 +0,0 @@
----
-apiVersion: kustomize.toolkit.fluxcd.io/v1
-kind: Kustomization
-metadata:
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-secrets
- namespace: flux-system
-spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-secrets
- dependsOn:
- - name: external-secrets-stores
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/secrets
- prune: true
- retryInterval: 1m
- sourceRef:
- kind: GitRepository
- name: immich-kubernetes
- targetNamespace: authentication
- timeout: 5m
- wait: true
-
--- kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-database
+++ kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-database
@@ -1,26 +0,0 @@
----
-apiVersion: kustomize.toolkit.fluxcd.io/v1
-kind: Kustomization
-metadata:
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-database
- namespace: flux-system
-spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-database
- dependsOn:
- - name: database-cloudnative-pg
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/database
- prune: true
- retryInterval: 1m
- sourceRef:
- kind: GitRepository
- name: immich-kubernetes
- targetNamespace: authentication
- timeout: 5m
- wait: true
-
--- kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel
+++ kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel
@@ -1,27 +0,0 @@
----
-apiVersion: kustomize.toolkit.fluxcd.io/v1
-kind: Kustomization
-metadata:
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel
- namespace: flux-system
-spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel
- dependsOn:
- - name: zitadel-secrets
- - name: zitadel-database
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/app
- prune: true
- retryInterval: 1m
- sourceRef:
- kind: GitRepository
- name: immich-kubernetes
- targetNamespace: authentication
- timeout: 5m
- wait: true
-
--- kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-pushsecret
+++ kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: flux-system/zitadel-pushsecret
@@ -1,26 +0,0 @@
----
-apiVersion: kustomize.toolkit.fluxcd.io/v1
-kind: Kustomization
-metadata:
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-pushsecret
- namespace: flux-system
-spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-pushsecret
- dependsOn:
- - name: zitadel
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/pushsecret
- prune: true
- retryInterval: 1m
- sourceRef:
- kind: GitRepository
- name: immich-kubernetes
- targetNamespace: authentication
- timeout: 5m
- wait: true
-
--- kubernetes/apps/authentication/zitadel/database Kustomization: flux-system/zitadel-database Cluster: authentication/zitadel-db
+++ kubernetes/apps/authentication/zitadel/database Kustomization: flux-system/zitadel-database Cluster: authentication/zitadel-db
@@ -1,16 +0,0 @@
----
-apiVersion: postgresql.cnpg.io/v1
-kind: Cluster
-metadata:
- labels:
- app.kubernetes.io/name: zitadel-database
- kustomize.toolkit.fluxcd.io/name: zitadel-database
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-db
- namespace: authentication
-spec:
- enableSuperuserAccess: true
- storage:
- size: 10Gi
- storageClass: zfs
-
--- kubernetes/apps/authentication/zitadel/secrets Kustomization: flux-system/zitadel-secrets ExternalSecret: authentication/zitadel-master-key
+++ kubernetes/apps/authentication/zitadel/secrets Kustomization: flux-system/zitadel-secrets ExternalSecret: authentication/zitadel-master-key
@@ -1,20 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: zitadel-secrets
- kustomize.toolkit.fluxcd.io/name: zitadel-secrets
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-master-key
- namespace: authentication
-spec:
- data:
- - remoteRef:
- key: AUTH_ZITADEL_MASTER_KEY
- secretKey: masterkey
- refreshInterval: 20s
- secretStoreRef:
- kind: ClusterSecretStore
- name: 1p-tf
-
--- kubernetes/apps/authentication/zitadel/app Kustomization: flux-system/zitadel HelmRelease: authentication/zitadel
+++ kubernetes/apps/authentication/zitadel/app Kustomization: flux-system/zitadel HelmRelease: authentication/zitadel
@@ -1,101 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: zitadel
- kustomize.toolkit.fluxcd.io/name: zitadel
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel
- namespace: authentication
-spec:
- chart:
- spec:
- chart: zitadel
- interval: 5m
- sourceRef:
- kind: HelmRepository
- name: zitadel
- namespace: flux-system
- version: 10.0.2
- interval: 5m
- values:
- env:
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- key: host
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- key: dbname
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-superuser
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-superuser
- image:
- repository: ghcr.io/zitadel/zitadel
- tag: v4.15.0@sha256:cc9fb3b2788dcbd0dff93781a0323bbe491a4cec11e1caefd9a1ed31f7fdc145
- ingress:
- annotations:
- cert-manager.io/cluster-issuer: letsencrypt-production
- nginx.ingress.kubernetes.io/backend-protocol: GRPC
- nginx.ingress.kubernetes.io/configuration-snippet: |
- grpc_set_header Host $host;
- className: nginx
- enabled: true
- hosts:
- - host: zitadel.internal.immich.cloud
- paths:
- - path: /
- pathType: Prefix
- tls:
- - hosts:
- - zitadel.internal.immich.cloud
- secretName: zitadel-tls
- login:
- enabled: false
- resources:
- limits:
- cpu: 1
- memory: 2Gi
- requests:
- cpu: 500m
- memory: 512Mi
- setupJob:
- machinekeyWriter:
- image:
- tag: 1.32.3
- zitadel:
- configmapConfig:
- ExternalDomain: zitadel.internal.immich.cloud
- FirstInstance:
- Org:
- Machine:
- Machine:
- Name: Admin
- Username: zitadel-iac-admin-sa
- MachineKey:
- Type: 1
- TLS:
- Enabled: false
- masterkeySecretName: zitadel-master-key
-
--- kubernetes/apps/authentication/zitadel/pushsecret Kustomization: flux-system/zitadel-pushsecret PushSecret: authentication/zitadel-iac-admin-sa
+++ kubernetes/apps/authentication/zitadel/pushsecret Kustomization: flux-system/zitadel-pushsecret PushSecret: authentication/zitadel-iac-admin-sa
@@ -1,23 +0,0 @@
----
-apiVersion: external-secrets.io/v1alpha1
-kind: PushSecret
-metadata:
- labels:
- app.kubernetes.io/name: zitadel-pushsecret
- kustomize.toolkit.fluxcd.io/name: zitadel-pushsecret
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- name: zitadel-iac-admin-sa
- namespace: authentication
-spec:
- data:
- - match:
- remoteRef:
- remoteKey: PUSHED_ZITADEL_IAC_ADMIN_SA
- secretKey: zitadel-iac-admin-sa.json
- secretStoreRefs:
- - kind: ClusterSecretStore
- name: 1p-kubernetes
- selector:
- secret:
- name: zitadel-iac-admin-sa
- |
--- HelmRelease: authentication/zitadel Service: authentication/zitadel
+++ HelmRelease: authentication/zitadel Service: authentication/zitadel
@@ -1,25 +0,0 @@
----
-apiVersion: v1
-kind: Service
-metadata:
- name: zitadel
- namespace: authentication
- annotations:
- traefik.ingress.kubernetes.io/service.serversscheme: h2c
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
-spec:
- type: ClusterIP
- ports:
- - port: 8080
- targetPort: 8080
- protocol: TCP
- name: http2-server
- appProtocol: kubernetes.io/h2c
- selector:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/component: start
-
--- HelmRelease: authentication/zitadel Deployment: authentication/zitadel
+++ HelmRelease: authentication/zitadel Deployment: authentication/zitadel
@@ -1,146 +0,0 @@
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: start
-spec:
- revisionHistoryLimit: 10
- replicas: 1
- selector:
- matchLabels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/component: start
- template:
- metadata:
- annotations:
- checksum/configmap: 1e4c8b5d1e226e433a596a7bb070295d0341480a08bfd8d59b830756aa73c2b2
- checksum/secret-db-ssl-ca-crt: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
- checksum/secret-zitadel-secrets: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: start
- spec:
- serviceAccountName: zitadel
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- enableServiceLinks: false
- containers:
- - name: zitadel
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: ghcr.io/zitadel/zitadel:v4.15.0@sha256:cc9fb3b2788dcbd0dff93781a0323bbe491a4cec11e1caefd9a1ed31f7fdc145
- imagePullPolicy: IfNotPresent
- args:
- - start
- - --config
- - /config/zitadel-config-yaml
- - --masterkeyFromEnv
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_MASTERKEY
- valueFrom:
- secretKeyRef:
- name: zitadel-master-key
- key: masterkey
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- key: host
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- key: dbname
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-superuser
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-superuser
- ports:
- - containerPort: 8080
- name: http2-server
- protocol: TCP
- livenessProbe:
- httpGet:
- path: /debug/healthz
- port: http2-server
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- scheme: HTTP
- initialDelaySeconds: 0
- periodSeconds: 5
- failureThreshold: 3
- readinessProbe:
- httpGet:
- path: /debug/ready
- port: http2-server
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- scheme: HTTP
- initialDelaySeconds: 0
- periodSeconds: 5
- failureThreshold: 3
- startupProbe:
- httpGet:
- path: /debug/ready
- port: http2-server
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- scheme: HTTP
- periodSeconds: 1
- failureThreshold: 30
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- resources:
- limits:
- cpu: 1
- memory: 2Gi
- requests:
- cpu: 500m
- memory: 512Mi
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
-
--- HelmRelease: authentication/zitadel Ingress: authentication/zitadel
+++ HelmRelease: authentication/zitadel Ingress: authentication/zitadel
@@ -1,33 +0,0 @@
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- annotations:
- cert-manager.io/cluster-issuer: letsencrypt-production
- nginx.ingress.kubernetes.io/backend-protocol: GRPC
- nginx.ingress.kubernetes.io/configuration-snippet: |
- grpc_set_header Host $host;
-spec:
- ingressClassName: nginx
- tls:
- - hosts:
- - zitadel.internal.immich.cloud
- secretName: zitadel-tls
- rules:
- - host: zitadel.internal.immich.cloud
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: zitadel
- port:
- number: 8080
-
--- HelmRelease: authentication/zitadel ServiceAccount: authentication/zitadel
+++ HelmRelease: authentication/zitadel ServiceAccount: authentication/zitadel
@@ -1,15 +0,0 @@
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '0'
-
--- HelmRelease: authentication/zitadel ConfigMap: authentication/zitadel-config-yaml
+++ HelmRelease: authentication/zitadel ConfigMap: authentication/zitadel-config-yaml
@@ -1,42 +0,0 @@
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: zitadel-config-yaml
- namespace: authentication
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '0'
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
-data:
- zitadel-config-yaml: |-
- ExternalDomain: zitadel.internal.immich.cloud
- ExternalSecure: true
- FirstInstance:
- MachineKeyPath: null
- Org:
- Machine:
- Machine:
- Name: Admin
- Username: zitadel-iac-admin-sa
- MachineKey:
- ExpirationDate: "2029-01-01T00:00:00Z"
- Type: 1
- Pat:
- ExpirationDate: "2029-01-01T00:00:00Z"
- Skip: null
- PatPath: null
- Skip: false
- Machine:
- Identification:
- Hostname:
- Enabled: true
- Webhook:
- Enabled: false
- TLS:
- Enabled: false
-
--- HelmRelease: authentication/zitadel Role: authentication/zitadel
+++ HelmRelease: authentication/zitadel Role: authentication/zitadel
@@ -1,32 +0,0 @@
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '0'
-rules:
-- apiGroups:
- - ''
- resources:
- - secrets
- verbs:
- - get
- - create
- - patch
- - list
- - delete
-- apiGroups:
- - ''
- resources:
- - pods
- verbs:
- - get
-
--- HelmRelease: authentication/zitadel RoleBinding: authentication/zitadel
+++ HelmRelease: authentication/zitadel RoleBinding: authentication/zitadel
@@ -1,22 +0,0 @@
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '0'
-subjects:
-- kind: ServiceAccount
- name: zitadel
-roleRef:
- kind: Role
- name: zitadel
- apiGroup: rbac.authorization.k8s.io
-
--- HelmRelease: authentication/zitadel Job: authentication/zitadel-cleanup
+++ HelmRelease: authentication/zitadel Job: authentication/zitadel-cleanup
@@ -1,53 +0,0 @@
----
-apiVersion: batch/v1
-kind: Job
-metadata:
- name: zitadel-cleanup
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: cleanup
- annotations:
- helm.sh/hook: post-delete
- helm.sh/hook-delete-policy: hook-succeeded
- helm.sh/hook-weight: '-1'
-spec:
- backoffLimit: 3
- activeDeadlineSeconds: 60
- template:
- metadata:
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: cleanup
- spec:
- serviceAccountName: zitadel
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- enableServiceLinks: false
- restartPolicy: Never
- containers:
- - name: zitadel-cleanup
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: docker.io/alpine/k8s:1.35.0
- imagePullPolicy: IfNotPresent
- command:
- - sh
- - -c
- - |
- echo "Cleaning up secrets created by zitadel-setup..."
- kubectl --namespace=authentication delete secret \
- --selector='app.kubernetes.io/managed-by=Zitadel,app.kubernetes.io/instance=zitadel' \
- --ignore-not-found=true
- echo "Cleanup completed"
- resources: {}
-
--- HelmRelease: authentication/zitadel Job: authentication/zitadel-init
+++ HelmRelease: authentication/zitadel Job: authentication/zitadel-init
@@ -1,95 +0,0 @@
----
-apiVersion: batch/v1
-kind: Job
-metadata:
- name: zitadel-init
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: init
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '1'
-spec:
- backoffLimit: 5
- activeDeadlineSeconds: 300
- template:
- metadata:
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: init
- spec:
- serviceAccountName: zitadel
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- enableServiceLinks: false
- restartPolicy: Never
- containers:
- - name: zitadel-init
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: ghcr.io/zitadel/zitadel:v4.15.0@sha256:cc9fb3b2788dcbd0dff93781a0323bbe491a4cec11e1caefd9a1ed31f7fdc145
- imagePullPolicy: IfNotPresent
- args:
- - init
- - --config
- - /config/zitadel-config-yaml
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- key: host
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- key: dbname
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-superuser
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-superuser
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- resources: {}
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
- defaultMode: 288
-
--- HelmRelease: authentication/zitadel Job: authentication/zitadel-setup
+++ HelmRelease: authentication/zitadel Job: authentication/zitadel-setup
@@ -1,194 +0,0 @@
----
-apiVersion: batch/v1
-kind: Job
-metadata:
- name: zitadel-setup
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: setup
- annotations:
- helm.sh/hook: pre-install,pre-upgrade
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: '2'
-spec:
- backoffLimit: 5
- activeDeadlineSeconds: 300
- template:
- metadata:
- labels:
- app.kubernetes.io/name: zitadel
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/component: setup
- spec:
- serviceAccountName: zitadel
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- enableServiceLinks: false
- restartPolicy: Never
- containers:
- - name: zitadel-setup
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: ghcr.io/zitadel/zitadel:v4.15.0@sha256:cc9fb3b2788dcbd0dff93781a0323bbe491a4cec11e1caefd9a1ed31f7fdc145
- imagePullPolicy: IfNotPresent
- args:
- - setup
- - --masterkeyFromEnv
- - --config
- - /config/zitadel-config-yaml
- - --steps
- - /config/zitadel-config-yaml
- - --init-projections=true
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_MASTERKEY
- valueFrom:
- secretKeyRef:
- name: zitadel-master-key
- key: masterkey
- - name: ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH
- value: /machinekey/sa.json
- - name: ZITADEL_FIRSTINSTANCE_PATPATH
- value: /machinekey/pat
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- key: host
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- key: dbname
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-app
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- key: user
- name: zitadel-db-superuser
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- key: password
- name: zitadel-db-superuser
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- - name: machinekey
- mountPath: /machinekey
- resources: {}
- - name: zitadel-machinekey
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: docker.io/alpine/k8s:1.35.0
- imagePullPolicy: IfNotPresent
- command:
- - sh
- - -c
- - |
- until [ -n "$(kubectl --namespace=authentication get pod ${POD_NAME} --output=jsonpath="{.status.containerStatuses[?(@.name=='zitadel-setup')].state.terminated}")" ]; do
- echo 'waiting for zitadel-setup container to terminate';
- sleep 5;
- done &&
- echo 'zitadel-setup container terminated' &&
- if [ -f /machinekey/sa.json ]; then
- kubectl --namespace=authentication create secret generic zitadel-iac-admin-sa \
- --from-file=zitadel-iac-admin-sa.json=/machinekey/sa.json \
- --dry-run=client --output=yaml | \
- kubectl annotate --local --filename=- \
- helm.sh/resource-policy=keep \
- --output=yaml | \
- kubectl label --local --filename=- \
- app.kubernetes.io/managed-by=Zitadel \
- app.kubernetes.io/name=zitadel \
- app.kubernetes.io/instance=zitadel \
- --output=yaml | \
- kubectl apply --server-side --field-manager=zitadel-setup --filename=-;
- fi;
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- volumeMounts:
- - name: machinekey
- mountPath: /machinekey
- readOnly: true
- resources: {}
- - name: zitadel-machine-pat
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- image: docker.io/alpine/k8s:1.35.0
- imagePullPolicy: IfNotPresent
- command:
- - sh
- - -c
- - |
- until [ -n "$(kubectl --namespace=authentication get pod "${POD_NAME}" --output=jsonpath="{.status.containerStatuses[?(@.name=='zitadel-setup')].state.terminated}")" ]; do
- echo 'waiting for zitadel-setup container to terminate';
- sleep 5;
- done &&
- echo 'zitadel-setup container terminated' &&
- if [ -f /machinekey/pat ]; then
- kubectl --namespace=authentication create secret generic zitadel-iac-admin-sa-pat \
- --from-file=pat=/machinekey/pat \
- --dry-run=client --output=yaml | \
- kubectl annotate --local --filename=- \
- helm.sh/resource-policy=keep \
- --output=yaml | \
- kubectl label --local --filename=- \
- app.kubernetes.io/managed-by=Zitadel \
- app.kubernetes.io/name=zitadel \
- app.kubernetes.io/instance=zitadel \
- --output=yaml | \
- kubectl apply --server-side --field-manager=zitadel-setup --filename=-;
- fi;
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- volumeMounts:
- - name: machinekey
- mountPath: /machinekey
- readOnly: true
- resources: {}
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
- defaultMode: 288
- - name: machinekey
- emptyDir: {}
- |
zackpollard
force-pushed
the
chore/retire-self-hosted-zitadel
branch
from
July 28, 2026 11:21
0e0c4e8 to
4825b90
Compare
remove the in-cluster zitadel instance (helmrelease, cnpg database, secrets, admin-sa pushsecret) and the terraform module that configured it. all app consumers have moved to the cloud zitadel at auth.internal.futo.org. the module's resources must be destroyed with `terragrunt destroy` BEFORE this merges, while the instance is still reachable, so the ZITADEL_OAUTH_CLIENT_ID/ SECRET_* 1password items and the zitadel org/projects/users are cleaned up rather than orphaned. see the PR description for the full teardown sequence.
zackpollard
force-pushed
the
chore/retire-self-hosted-zitadel
branch
from
July 28, 2026 11:24
4825b90 to
80a68bf
Compare
@@ spec.values.template.spec.containers.dind.image @@
# helm.toolkit.fluxcd.io/v2/HelmRelease/actions-runners/actions-runner-set
! ± value change
- docker:29.6.2-dind@sha256:bfec1f5159c63a81ca6fdedbd81404d2c0e16378ed0feec3bb3fbf3998847659
+ docker:29.6.1-dind@sha256:66d292e5c26bd33a6f6f61cacb880de2186339a524ecba1ce098dbbaceed6515
@@ spec.dependsOn @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/grafana-secrets
! - one list entry removed:
- - name: zitadel
@@ spec.dependsOn @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/grafana-secrets-dev
! - one list entry removed:
- - name: zitadel
@@ spec.dependsOn @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/data-pipeline-grafana-secrets
! - one list entry removed:
- - name: zitadel
@@ spec.dependsOn @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/containerssh-secrets
! - one list entry removed:
- - name: zitadel
@@ spec.dependsOn @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/outline-secrets
! - one list entry removed:
- - name: zitadel
@@ spec.values.controllers.main.containers.main.image.tag @@
# helm.toolkit.fluxcd.io/v2/HelmRelease/monitoring/grafana-image-renderer
! ± value change
- v5.10.3@sha256:7f776ebb20f82b9cd5940238da596da8caf26baf9025c2e0a991d23dd803a0e6
+ v5.10.1@sha256:08cef302c548801a410cec3a1c94046281b01427b1518deb7b665a97814df2f8
@@ spec.values.controllers.outline.containers.app.image.tag @@
# helm.toolkit.fluxcd.io/v2/HelmRelease/tools/outline
! ± value change
- 1.9.2@sha256:32d76719c378931dd65d93945930ca380d8376a0337d98a991fcc12b266f33cf
+ 1.9.1@sha256:9fe2cbdceccea0ffb82cbc8dc6f4c0d4ba1d377454e502d5d2bddececb34d4f1
@@ metadata.annotations.actions.github.com/values-hash @@
# actions.github.com/v1alpha1/AutoscalingRunnerSet/actions-runners/mich
! ± value change
- 204499d1f7f549403f642c5a19fe44359b015725e48b66fffff577ddcdf39e3
+ ff36d5bb08244748fd5609aca72553ad46f36e06b10c5134de80b8ecb1383b8
@@ spec.template.spec.containers.dind.image @@
# actions.github.com/v1alpha1/AutoscalingRunnerSet/actions-runners/mich
! ± value change
- docker:29.6.2-dind@sha256:bfec1f5159c63a81ca6fdedbd81404d2c0e16378ed0feec3bb3fbf3998847659
+ docker:29.6.1-dind@sha256:66d292e5c26bd33a6f6f61cacb880de2186339a524ecba1ce098dbbaceed6515
@@ spec.template.spec.containers.main.image @@
# apps/v1/Deployment/monitoring/grafana-image-renderer
! ± value change
- docker.io/grafana/grafana-image-renderer:v5.10.3@sha256:7f776ebb20f82b9cd5940238da596da8caf26baf9025c2e0a991d23dd803a0e6
+ docker.io/grafana/grafana-image-renderer:v5.10.1@sha256:08cef302c548801a410cec3a1c94046281b01427b1518deb7b665a97814df2f8
@@ spec.template.spec.containers.app.image @@
# apps/v1/Deployment/tools/outline
! ± value change
- docker.io/outlinewiki/outline:1.9.2@sha256:32d76719c378931dd65d93945930ca380d8376a0337d98a991fcc12b266f33cf
+ docker.io/outlinewiki/outline:1.9.1@sha256:9fe2cbdceccea0ffb82cbc8dc6f4c0d4ba1d377454e502d5d2bddececb34d4f1
@@ (root level) @@
# source.toolkit.fluxcd.io/v1/HelmRepository/flux-system/zitadel
! - one document removed:
- apiVersion: source.toolkit.fluxcd.io/v1
- kind: HelmRepository
- metadata:
- name: zitadel
- namespace: flux-system
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- url: "https://charts.zitadel.com/"
- interval: 1h
@@ (root level) @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/zitadel-secrets
! - one document removed:
- apiVersion: kustomize.toolkit.fluxcd.io/v1
- kind: Kustomization
- metadata:
- name: zitadel-secrets
- namespace: flux-system
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-secrets
- dependsOn:
- - name: external-secrets-stores
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/secrets
- prune: true
- retryInterval: 1m
- sourceRef:
- name: immich-kubernetes
- kind: GitRepository
- targetNamespace: authentication
- timeout: 5m
- wait: true
@@ (root level) @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/zitadel-database
! - one document removed:
- apiVersion: kustomize.toolkit.fluxcd.io/v1
- kind: Kustomization
- metadata:
- name: zitadel-database
- namespace: flux-system
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-database
- dependsOn:
- - name: database-cloudnative-pg
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/database
- prune: true
- retryInterval: 1m
- sourceRef:
- name: immich-kubernetes
- kind: GitRepository
- targetNamespace: authentication
- timeout: 5m
- wait: true
@@ (root level) @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/zitadel
! - one document removed:
- apiVersion: kustomize.toolkit.fluxcd.io/v1
- kind: Kustomization
- metadata:
- name: zitadel
- namespace: flux-system
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel
- dependsOn:
- - name: zitadel-secrets
- - name: zitadel-database
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/app
- prune: true
- retryInterval: 1m
- sourceRef:
- name: immich-kubernetes
- kind: GitRepository
- targetNamespace: authentication
- timeout: 5m
- wait: true
@@ (root level) @@
# kustomize.toolkit.fluxcd.io/v1/Kustomization/flux-system/zitadel-pushsecret
! - one document removed:
- apiVersion: kustomize.toolkit.fluxcd.io/v1
- kind: Kustomization
- metadata:
- name: zitadel-pushsecret
- namespace: flux-system
- labels:
- kustomize.toolkit.fluxcd.io/name: cluster-apps
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- commonMetadata:
- labels:
- app.kubernetes.io/name: zitadel-pushsecret
- dependsOn:
- - name: zitadel
- interval: 30m
- path: ./kubernetes/apps/authentication/zitadel/pushsecret
- prune: true
- retryInterval: 1m
- sourceRef:
- name: immich-kubernetes
- kind: GitRepository
- targetNamespace: authentication
- timeout: 5m
- wait: true
@@ (root level) @@
# helm.toolkit.fluxcd.io/v2/HelmRelease/authentication/zitadel
! - one document removed:
- apiVersion: helm.toolkit.fluxcd.io/v2
- kind: HelmRelease
- metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel
- kustomize.toolkit.fluxcd.io/name: zitadel
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- chart:
- spec:
- version: "10.0.4"
- chart: zitadel
- interval: 5m
- sourceRef:
- name: zitadel
- kind: HelmRepository
- namespace: flux-system
- interval: 5m
- values:
- resources:
- limits:
- cpu: 1
- memory: 2Gi
- requests:
- cpu: 500m
- memory: 512Mi
- image:
- repository: ghcr.io/zitadel/zitadel
- tag: "v4.16.1@sha256:fea7ea2e4648d2dfe6a22a446252f084e4a370d8caedf08d3af4632cf517d4ef"
- login:
- enabled: false
- setupJob:
- machinekeyWriter:
- image:
- tag: "1.32.3"
- env:
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: host
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: dbname
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: password
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: password
- ingress:
- annotations:
- cert-manager.io/cluster-issuer: letsencrypt-production
- nginx.ingress.kubernetes.io/backend-protocol: GRPC
- nginx.ingress.kubernetes.io/configuration-snippet: |
- grpc_set_header Host $host;
-
- className: nginx
- enabled: true
- hosts:
- - host: zitadel.internal.immich.cloud
- paths:
- - path: /
- pathType: Prefix
- tls:
- - hosts:
- - zitadel.internal.immich.cloud
- secretName: zitadel-tls
- zitadel:
- configmapConfig:
- ExternalDomain: zitadel.internal.immich.cloud
- FirstInstance:
- Org:
- Machine:
- Machine:
- Name: Admin
- Username: zitadel-iac-admin-sa
- MachineKey:
- Type: 1
- TLS:
- Enabled: false
- masterkeySecretName: zitadel-master-key
@@ (root level) @@
# postgresql.cnpg.io/v1/Cluster/authentication/zitadel-db
! - one document removed:
- apiVersion: postgresql.cnpg.io/v1
- kind: Cluster
- metadata:
- name: zitadel-db
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel-database
- kustomize.toolkit.fluxcd.io/name: zitadel-database
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- enableSuperuserAccess: true
- storage:
- size: 10Gi
- storageClass: zfs
@@ (root level) @@
# external-secrets.io/v1alpha1/PushSecret/authentication/zitadel-iac-admin-sa
! - one document removed:
- apiVersion: external-secrets.io/v1alpha1
- kind: PushSecret
- metadata:
- name: zitadel-iac-admin-sa
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel-pushsecret
- kustomize.toolkit.fluxcd.io/name: zitadel-pushsecret
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- data:
- - match:
- remoteRef:
- remoteKey: PUSHED_ZITADEL_IAC_ADMIN_SA
- secretKey: zitadel-iac-admin-sa.json
- secretStoreRefs:
- - name: 1p-kubernetes
- kind: ClusterSecretStore
- selector:
- secret:
- name: zitadel-iac-admin-sa
@@ (root level) @@
# external-secrets.io/v1/ExternalSecret/authentication/zitadel-master-key
! - one document removed:
- apiVersion: external-secrets.io/v1
- kind: ExternalSecret
- metadata:
- name: zitadel-master-key
- namespace: authentication
- labels:
- app.kubernetes.io/name: zitadel-secrets
- kustomize.toolkit.fluxcd.io/name: zitadel-secrets
- kustomize.toolkit.fluxcd.io/namespace: flux-system
- spec:
- data:
- - remoteRef:
- key: AUTH_ZITADEL_MASTER_KEY
- secretKey: masterkey
- refreshInterval: 20s
- secretStoreRef:
- name: 1p-tf
- kind: ClusterSecretStore
@@ (root level) @@
# v1/Service/authentication/zitadel
! - one document removed:
- apiVersion: v1
- kind: Service
- metadata:
- name: zitadel
- namespace: authentication
- annotations:
- traefik.ingress.kubernetes.io/service.serversscheme: h2c
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- helm.toolkit.fluxcd.io/name: zitadel
- helm.toolkit.fluxcd.io/namespace: authentication
- spec:
- type: ClusterIP
- selector:
- app.kubernetes.io/component: start
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/name: zitadel
- ports:
- - name: http2-server
- appProtocol: kubernetes.io/h2c
- port: 8080
- protocol: TCP
- targetPort: 8080
@@ (root level) @@
# apps/v1/Deployment/authentication/zitadel
! - one document removed:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: zitadel
- namespace: authentication
- labels:
- app.kubernetes.io/component: start
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- helm.toolkit.fluxcd.io/name: zitadel
- helm.toolkit.fluxcd.io/namespace: authentication
- spec:
- replicas: 1
- revisionHistoryLimit: 10
- selector:
- matchLabels:
- app.kubernetes.io/component: start
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/name: zitadel
- template:
- metadata:
- labels:
- app.kubernetes.io/component: start
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- containers:
- - name: zitadel
- image: "ghcr.io/zitadel/zitadel:v4.16.1@sha256:fea7ea2e4648d2dfe6a22a446252f084e4a370d8caedf08d3af4632cf517d4ef"
- imagePullPolicy: IfNotPresent
- args:
- - start
- - "--config"
- - /config/zitadel-config-yaml
- - "--masterkeyFromEnv"
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- ports:
- - name: http2-server
- containerPort: 8080
- protocol: TCP
- resources:
- limits:
- cpu: 1
- memory: 2Gi
- requests:
- cpu: 500m
- memory: 512Mi
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_MASTERKEY
- valueFrom:
- secretKeyRef:
- name: zitadel-master-key
- key: masterkey
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: host
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: dbname
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: password
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: password
- livenessProbe:
- failureThreshold: 3
- httpGet:
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- path: /debug/healthz
- port: http2-server
- scheme: HTTP
- initialDelaySeconds: 0
- periodSeconds: 5
- readinessProbe:
- failureThreshold: 3
- httpGet:
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- path: /debug/ready
- port: http2-server
- scheme: HTTP
- initialDelaySeconds: 0
- periodSeconds: 5
- startupProbe:
- failureThreshold: 30
- httpGet:
- httpHeaders:
- - name: Host
- value: zitadel.internal.immich.cloud
- path: /debug/ready
- port: http2-server
- scheme: HTTP
- periodSeconds: 1
- enableServiceLinks: false
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- serviceAccountName: zitadel
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
@@ (root level) @@
# networking.k8s.io/v1/Ingress/authentication/zitadel
! - one document removed:
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: zitadel
- namespace: authentication
- annotations:
- cert-manager.io/cluster-issuer: letsencrypt-production
- nginx.ingress.kubernetes.io/backend-protocol: GRPC
- nginx.ingress.kubernetes.io/configuration-snippet: |
- grpc_set_header Host $host;
-
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- helm.toolkit.fluxcd.io/name: zitadel
- helm.toolkit.fluxcd.io/namespace: authentication
- spec:
- ingressClassName: nginx
- rules:
- - host: zitadel.internal.immich.cloud
- http:
- paths:
- - backend:
- service:
- name: zitadel
- port:
- number: 8080
- path: /
- pathType: Prefix
- tls:
- - hosts:
- - zitadel.internal.immich.cloud
- secretName: zitadel-tls
@@ (root level) @@
# v1/ServiceAccount/authentication/zitadel
! - one document removed:
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: zitadel
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "0"
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
@@ (root level) @@
# v1/ConfigMap/authentication/zitadel-config-yaml
! - one document removed:
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: zitadel-config-yaml
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "0"
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- data:
- zitadel-config-yaml: |
- ExternalDomain: zitadel.internal.immich.cloud
- ExternalSecure: true
- FirstInstance:
- Org:
- Machine:
- Machine:
- Name: Admin
- Username: zitadel-iac-admin-sa
- MachineKey:
- ExpirationDate: "2029-01-01T00:00:00Z"
- Type: 1
- Pat:
- ExpirationDate: "2029-01-01T00:00:00Z"
- Skip: false
- Machine:
- Identification:
- Hostname:
- Enabled: true
- Webhook:
- Enabled: false
- TLS:
- Enabled: false
@@ (root level) @@
# rbac.authorization.k8s.io/v1/Role/authentication/zitadel
! - one document removed:
- apiVersion: rbac.authorization.k8s.io/v1
- kind: Role
- metadata:
- name: zitadel
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "0"
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- rules:
- - resources:
- - secrets
- apiGroups:
- -
- verbs:
- - get
- - create
- - patch
- - list
- - delete
- - resources:
- - pods
- apiGroups:
- -
- verbs:
- - get
@@ (root level) @@
# rbac.authorization.k8s.io/v1/RoleBinding/authentication/zitadel
! - one document removed:
- apiVersion: rbac.authorization.k8s.io/v1
- kind: RoleBinding
- metadata:
- name: zitadel
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "0"
- labels:
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- roleRef:
- name: zitadel
- apiGroup: rbac.authorization.k8s.io
- kind: Role
- subjects:
- - name: zitadel
- kind: ServiceAccount
@@ (root level) @@
# batch/v1/Job/authentication/zitadel-cleanup
! - one document removed:
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: zitadel-cleanup
- namespace: authentication
- annotations:
- helm.sh/hook: post-delete
- helm.sh/hook-delete-policy: hook-succeeded
- helm.sh/hook-weight: "-1"
- labels:
- app.kubernetes.io/component: cleanup
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- activeDeadlineSeconds: 60
- backoffLimit: 3
- template:
- metadata:
- labels:
- app.kubernetes.io/component: cleanup
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- containers:
- - name: zitadel-cleanup
- image: "docker.io/alpine/k8s:1.36.2"
- imagePullPolicy: IfNotPresent
- resources: {}
- command:
- - sh
- - "-c"
- - |
- echo "Cleaning up secrets created by zitadel-setup..."
- kubectl --namespace=authentication delete secret \
- --selector='app.kubernetes.io/managed-by=Zitadel,app.kubernetes.io/instance=zitadel' \
- --ignore-not-found=true
- echo "Cleanup completed"
-
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- enableServiceLinks: false
- restartPolicy: Never
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- serviceAccountName: zitadel
@@ (root level) @@
# batch/v1/Job/authentication/zitadel-init
! - one document removed:
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: zitadel-init
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "1"
- labels:
- app.kubernetes.io/component: init
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- activeDeadlineSeconds: 300
- backoffLimit: 5
- template:
- metadata:
- labels:
- app.kubernetes.io/component: init
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- containers:
- - name: zitadel-init
- image: "ghcr.io/zitadel/zitadel:v4.16.1@sha256:fea7ea2e4648d2dfe6a22a446252f084e4a370d8caedf08d3af4632cf517d4ef"
- imagePullPolicy: IfNotPresent
- resources: {}
- args:
- - init
- - "--config"
- - /config/zitadel-config-yaml
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: host
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: dbname
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: password
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: password
- enableServiceLinks: false
- restartPolicy: Never
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- serviceAccountName: zitadel
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
- defaultMode: 288
@@ (root level) @@
# batch/v1/Job/authentication/zitadel-setup
! - one document removed:
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: zitadel-setup
- namespace: authentication
- annotations:
- helm.sh/hook: "pre-install,pre-upgrade"
- helm.sh/hook-delete-policy: before-hook-creation
- helm.sh/hook-weight: "2"
- labels:
- app.kubernetes.io/component: setup
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- activeDeadlineSeconds: 300
- backoffLimit: 5
- template:
- metadata:
- labels:
- app.kubernetes.io/component: setup
- app.kubernetes.io/instance: zitadel
- app.kubernetes.io/managed-by: Helm
- app.kubernetes.io/name: zitadel
- spec:
- containers:
- - name: zitadel-setup
- image: "ghcr.io/zitadel/zitadel:v4.16.1@sha256:fea7ea2e4648d2dfe6a22a446252f084e4a370d8caedf08d3af4632cf517d4ef"
- imagePullPolicy: IfNotPresent
- resources: {}
- args:
- - setup
- - "--masterkeyFromEnv"
- - "--config"
- - /config/zitadel-config-yaml
- - "--steps"
- - /config/zitadel-config-yaml
- - "--init-projections=true"
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- volumeMounts:
- - name: zitadel-config-yaml
- mountPath: /config
- readOnly: true
- - name: machinekey
- mountPath: /machinekey
- env:
- - name: POD_IP
- valueFrom:
- fieldRef:
- apiVersion: v1
- fieldPath: status.podIP
- - name: ZITADEL_MASTERKEY
- valueFrom:
- secretKeyRef:
- name: zitadel-master-key
- key: masterkey
- - name: ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH
- value: /machinekey/sa.json
- - name: ZITADEL_FIRSTINSTANCE_PATPATH
- value: /machinekey/pat
- - name: ZITADEL_DATABASE_POSTGRES_AWAITINITIALCONN
- value: 5m
- - name: ZITADEL_DATABASE_POSTGRES_HOST
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: host
- - name: ZITADEL_DATABASE_POSTGRES_DATABASE
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: dbname
- - name: ZITADEL_DATABASE_POSTGRES_USER_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_USER_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-app
- key: password
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: user
- - name: ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD
- valueFrom:
- secretKeyRef:
- name: zitadel-db-superuser
- key: password
- - name: zitadel-machinekey
- image: "docker.io/alpine/k8s:1.36.2"
- imagePullPolicy: IfNotPresent
- resources: {}
- command:
- - sh
- - "-c"
- - |
- until [ -n "$(kubectl --namespace=authentication get pod ${POD_NAME} --output=jsonpath="{.status.containerStatuses[?(@.name=='zitadel-setup')].state.terminated}")" ]; do
- echo 'waiting for zitadel-setup container to terminate';
- sleep 5;
- done &&
- echo 'zitadel-setup container terminated' &&
- if [ -f /machinekey/sa.json ]; then
- kubectl --namespace=authentication create secret generic zitadel-iac-admin-sa \
- --from-file=zitadel-iac-admin-sa.json=/machinekey/sa.json \
- --dry-run=client --output=yaml | \
- kubectl annotate --local --filename=- \
- helm.sh/resource-policy=keep \
- --output=yaml | \
- kubectl label --local --filename=- \
- app.kubernetes.io/managed-by=Zitadel \
- app.kubernetes.io/name=zitadel \
- app.kubernetes.io/instance=zitadel \
- --output=yaml | \
- kubectl apply --server-side --field-manager=zitadel-setup --filename=-;
- fi;
-
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- volumeMounts:
- - name: machinekey
- mountPath: /machinekey
- readOnly: true
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- - name: zitadel-machine-pat
- image: "docker.io/alpine/k8s:1.36.2"
- imagePullPolicy: IfNotPresent
- resources: {}
- command:
- - sh
- - "-c"
- - |
- until [ -n "$(kubectl --namespace=authentication get pod "${POD_NAME}" --output=jsonpath="{.status.containerStatuses[?(@.name=='zitadel-setup')].state.terminated}")" ]; do
- echo 'waiting for zitadel-setup container to terminate';
- sleep 5;
- done &&
- echo 'zitadel-setup container terminated' &&
- if [ -f /machinekey/pat ]; then
- kubectl --namespace=authentication create secret generic zitadel-iac-admin-sa-pat \
- --from-file=pat=/machinekey/pat \
- --dry-run=client --output=yaml | \
- kubectl annotate --local --filename=- \
- helm.sh/resource-policy=keep \
- --output=yaml | \
- kubectl label --local --filename=- \
- app.kubernetes.io/managed-by=Zitadel \
- app.kubernetes.io/name=zitadel \
- app.kubernetes.io/instance=zitadel \
- --output=yaml | \
- kubectl apply --server-side --field-manager=zitadel-setup --filename=-;
- fi;
-
- securityContext:
- privileged: false
- readOnlyRootFilesystem: true
- runAsNonRoot: true
- runAsUser: 1000
- volumeMounts:
- - name: machinekey
- mountPath: /machinekey
- readOnly: true
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- enableServiceLinks: false
- restartPolicy: Never
- securityContext:
- fsGroup: 1000
- runAsNonRoot: true
- runAsUser: 1000
- serviceAccountName: zitadel
- volumes:
- - name: zitadel-config-yaml
- configMap:
- name: zitadel-config-yaml
- defaultMode: 288
- - name: machinekey
- emptyDir: {}
|
Terraform PlanShared✅ |
zackpollard
marked this pull request as ready for review
July 28, 2026 11:26
bo0tzz
approved these changes
Jul 28, 2026
zackpollard
enabled auto-merge (squash)
July 28, 2026 11:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. Destroy the self-hosted resources — while the instance is still running
The instance must be reachable so the provider can delete its org/projects/users; this also removes the
ZITADEL_OAUTH_CLIENT_ID/SECRET_*1Password items.2. Merge this PR
Flux prunes the in-cluster instance (helmrelease, CNPG database, secrets, admin-sa pushsecret); the tf module is removed.
3. Manual cleanup (not tf-managed)
masterkeyand theadmin-sapushsecret item.zitadel.internal.immich.cloudis ingress/external-dns-managed, so it's removed with the app — nothing to do.