From 1791f46424acb3405ee6a3695458c39974a28178 Mon Sep 17 00:00:00 2001 From: Silvan Date: Tue, 20 Feb 2024 09:33:50 +0100 Subject: [PATCH] docs: change examples to psql (#7358) Replaces CockroachDB as default in self hosting examples. * Update docs/docs/concepts/architecture/software.md Co-authored-by: Elio Bischof * Update docs/docs/concepts/architecture/software.md Co-authored-by: Elio Bischof --------- Co-authored-by: Elio Bischof --- docs/docs/concepts/architecture/software.md | 12 +-- .../deploy/docker-compose-sa.yaml | 25 ++++-- .../self-hosting/deploy/docker-compose.yaml | 25 ++++-- docs/docs/self-hosting/deploy/linux.mdx | 15 ++-- .../loadbalancing-example/docker-compose.yaml | 47 ++++------- .../example-zitadel-config.yaml | 18 ++--- .../example-zitadel-secrets.yaml | 6 +- .../loadbalancing-example.mdx | 2 +- docs/docs/self-hosting/deploy/macos.mdx | 15 ++-- docs/docs/self-hosting/deploy/overview.mdx | 3 +- .../manage/configure/_compose.mdx | 2 +- .../self-hosting/manage/configure/_helm.mdx | 4 +- .../manage/configure/_linuxunix.mdx | 17 ++-- .../manage/configure/docker-compose.yaml | 52 ++++-------- .../configure/example-zitadel-config.yaml | 18 ++--- .../configure/example-zitadel-secrets.yaml | 6 +- .../example-zitadel-values-secrets.yaml | 4 +- .../manage/database/_postgres.mdx | 6 +- .../self-hosting/manage/database/database.mdx | 10 +-- docs/docs/self-hosting/manage/production.md | 2 +- .../reverseproxy/_proxy_guide_tls_mode.mdx | 2 +- .../reverseproxy/caddy/docker-compose.yaml | 15 +++- .../manage/reverseproxy/docker-compose.yaml | 79 ++++++++++++++++--- .../reverseproxy/nginx/docker-compose.yaml | 15 +++- .../reverseproxy/traefik/docker-compose.yaml | 15 +++- .../software-release-cycles-support.md | 1 - 26 files changed, 238 insertions(+), 178 deletions(-) diff --git a/docs/docs/concepts/architecture/software.md b/docs/docs/concepts/architecture/software.md index 110ddfbce..cd31f701b 100644 --- a/docs/docs/concepts/architecture/software.md +++ b/docs/docs/concepts/architecture/software.md @@ -136,16 +136,12 @@ It is also responsible to execute authorization checks. To check if a request is ### Storage Layer -As ZITADEL itself is built completely stateless only the storage layer is needed for storing things. -The storage layer of ZITADEL is responsible for multiple things. For example: +As ZITADEL itself is built completely stateless only the storage layer is needed to persist states. +The storage layer of ZITADEL is responsible for multiple tasks. For example: -- Distributing data for high availability over multiple server, data centers or regions - Guarantee strong consistency for the command side - Guarantee good query performance for the query side -- Ability to store data in specific data centers or regions for data residency (This is only supported with CockroachDB Cloud or Enterprise) - Backup and restore operation for disaster recovery purpose -ZITADEL currently supports CockroachDB as first choice of storage due to its perfect match for ZITADELs needs. -Alternatively you can run ZITADEL also with Postgres which is [Enterprise Supported](/docs/support/software-release-cycles-support#partially-supported). -Make sure to read our [Production Guide](/docs/self-hosting/manage/production#prefer-cockroachdb) before you decide to use it. - +ZITADEL currently supports PostgreSQL and CockroachDB.. +Make sure to read our [Production Guide](/docs/self-hosting/manage/production#prefer-cockroachdb) before you decide on using one of them. diff --git a/docs/docs/self-hosting/deploy/docker-compose-sa.yaml b/docs/docs/self-hosting/deploy/docker-compose-sa.yaml index 34dc55c6a..76238a62f 100644 --- a/docs/docs/self-hosting/deploy/docker-compose-sa.yaml +++ b/docs/docs/self-hosting/deploy/docker-compose-sa.yaml @@ -8,35 +8,44 @@ services: image: 'ghcr.io/zitadel/zitadel:latest' command: 'start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled' environment: - - 'ZITADEL_DATABASE_COCKROACH_HOST=crdb' + - 'ZITADEL_DATABASE_POSTGRES_HOST=db' + - 'ZITADEL_DATABASE_POSTGRES_PORT=5432' + - 'ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable' - 'ZITADEL_EXTERNALSECURE=false' - 'ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/machinekey/zitadel-admin-sa.json' - 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa' - 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin' - 'ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1' depends_on: - crdb: + db: condition: 'service_healthy' ports: - '8080:8080' volumes: - ./machinekey:/machinekey - crdb: + db: restart: 'always' + image: postgres:16-alpine + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres networks: - 'zitadel' - image: 'cockroachdb/cockroach:latest' - command: 'start-single-node --insecure' healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"] + test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"] interval: '10s' timeout: '30s' retries: 5 start_period: '20s' ports: - - '9090:8080' - - '26257:26257' + - '5432:5432' networks: zitadel: diff --git a/docs/docs/self-hosting/deploy/docker-compose.yaml b/docs/docs/self-hosting/deploy/docker-compose.yaml index cfc624492..30e58f512 100644 --- a/docs/docs/self-hosting/deploy/docker-compose.yaml +++ b/docs/docs/self-hosting/deploy/docker-compose.yaml @@ -8,29 +8,38 @@ services: image: 'ghcr.io/zitadel/zitadel:latest' command: 'start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled' environment: - - 'ZITADEL_DATABASE_COCKROACH_HOST=crdb' + - 'ZITADEL_DATABASE_POSTGRES_HOST=db' + - 'ZITADEL_DATABASE_POSTGRES_PORT=5432' + - 'ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel' + - 'ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres' + - 'ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable' - 'ZITADEL_EXTERNALSECURE=false' depends_on: - crdb: + db: condition: 'service_healthy' ports: - '8080:8080' - crdb: + db: restart: 'always' + image: postgres:16-alpine + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres networks: - 'zitadel' - image: 'cockroachdb/cockroach:latest' - command: 'start-single-node --insecure' healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"] + test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"] interval: '10s' timeout: '30s' retries: 5 start_period: '20s' ports: - - '9090:8080' - - '26257:26257' + - '5432:5432' networks: zitadel: diff --git a/docs/docs/self-hosting/deploy/linux.mdx b/docs/docs/self-hosting/deploy/linux.mdx index c06182107..b12204eb4 100644 --- a/docs/docs/self-hosting/deploy/linux.mdx +++ b/docs/docs/self-hosting/deploy/linux.mdx @@ -8,15 +8,16 @@ import DefaultUser from "./_defaultuser.mdx"; import Next from "./_next.mdx"; import NoteInstanceNotFound from "./troubleshooting/_note_instance_not_found.mdx"; -## Install CockroachDB +## Install PostgreSQL -Download a `cockroach` binary as described [in the CockroachDB docs](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). -ZITADEL is tested against CockroachDB latest stable tag and Ubuntu 20.04. +Download a `postgresql` binary as described [in the PostgreSQL docs](https://www.postgresql.org/download/linux/). +ZITADEL is tested against PostgreSQL and CockroachDB latest stable tag and Ubuntu 20.04. -## Run CockroachDB +## Run PostgreSQL ```bash -cockroach start-single-node --insecure --background --http-addr :9090 --listen-addr=localhost +sudo systemctl start postgresql +sudo systemctl enable postgresql ``` ## Install ZITADEL @@ -30,7 +31,7 @@ LATEST=$(curl -i https://github.com/zitadel/zitadel/releases/latest | grep locat ## Run ZITADEL ```bash -ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled +ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled ``` @@ -52,7 +53,7 @@ ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeeds ### Setup ZITADEL with a service account ```bash -ZITADEL_EXTERNALSECURE=false ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/tmp/zitadel-admin-sa.json ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1 zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled +ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable ZITADEL_EXTERNALSECURE=false ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/tmp/zitadel-admin-sa.json ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1 zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled # then you can move your machine key mv /tmp/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json diff --git a/docs/docs/self-hosting/deploy/loadbalancing-example/docker-compose.yaml b/docs/docs/self-hosting/deploy/loadbalancing-example/docker-compose.yaml index 8b5927ea6..ea8a214f3 100644 --- a/docs/docs/self-hosting/deploy/loadbalancing-example/docker-compose.yaml +++ b/docs/docs/self-hosting/deploy/loadbalancing-example/docker-compose.yaml @@ -4,7 +4,7 @@ services: traefik: networks: - 'zitadel' - image: "traefik:v2.10.1" + image: "traefik:latest" ports: - "80:80" - "443:443" @@ -18,49 +18,34 @@ services: image: 'ghcr.io/zitadel/zitadel:stable' command: 'start-from-init --config /example-zitadel-config.yaml --config /example-zitadel-secrets.yaml --steps /example-zitadel-init-steps.yaml --masterkey "${ZITADEL_MASTERKEY}" --tlsMode external' depends_on: - certs: - condition: 'service_completed_successfully' - + db: + condition: 'service_healthy' volumes: - './example-zitadel-config.yaml:/example-zitadel-config.yaml:ro' - './example-zitadel-secrets.yaml:/example-zitadel-secrets.yaml:ro' - './example-zitadel-init-steps.yaml:/example-zitadel-init-steps.yaml:ro' - - 'zitadel-certs:/crdb-certs:ro' - certs: - image: 'cockroachdb/cockroach:latest' - entrypoint: [ '/bin/bash', '-c' ] - command: [ 'cp /certs/* /zitadel-certs/ && cockroach cert create-client --overwrite --certs-dir /zitadel-certs/ --ca-key /zitadel-certs/ca.key zitadel_user && chown 1000:1000 /zitadel-certs/*' ] - volumes: - - 'certs:/certs:ro' - - 'zitadel-certs:/zitadel-certs:rw' - depends_on: - my-cockroach-db: - condition: 'service_healthy' - - my-cockroach-db: - restart: 'always' + db: + image: postgres:16-alpine + restart: always + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=postgres + ports: + - '5432:5432' networks: - 'zitadel' - image: 'cockroachdb/cockroach:latest' - command: 'start-single-node --advertise-addr my-cockroach-db' healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"] - interval: '10s' - timeout: '30s' + test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"] + interval: 10s + timeout: 60s retries: 5 - start_period: '20s' - ports: - - '9090:8080' - - '26257:26257' + start_period: 10s volumes: - - 'certs:/cockroach/certs:rw' - - 'data:/cockroach/cockroach-data:rw' + - 'data:/var/lib/postgresql/data:rw' networks: zitadel: volumes: - certs: - zitadel-certs: data: diff --git a/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-config.yaml b/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-config.yaml index 6c45449cf..e5f077336 100644 --- a/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-config.yaml +++ b/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-config.yaml @@ -7,22 +7,18 @@ ExternalSecure: true ExternalDomain: my.domain ExternalPort: 443 -# If not using the docker compose example, adjust these values for connecting ZITADEL to your CockroachDB +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL Database: - cockroach: - Host: 'my-cockroach-db' + postgres: + Host: 'db' + Port: 5432 + Database: zitadel User: SSL: - Mode: 'verify-full' - RootCert: "/crdb-certs/ca.crt" - Cert: "/crdb-certs/client.zitadel_user.crt" - Key: "/crdb-certs/client.zitadel_user.key" + Mode: 'disable' Admin: SSL: - Mode: 'verify-full' - RootCert: "/crdb-certs/ca.crt" - Cert: "/crdb-certs/client.root.crt" - Key: "/crdb-certs/client.root.key" + Mode: 'disable' LogStore: Access: diff --git a/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-secrets.yaml b/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-secrets.yaml index 6485eef20..242da43b2 100644 --- a/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-secrets.yaml +++ b/docs/docs/self-hosting/deploy/loadbalancing-example/example-zitadel-secrets.yaml @@ -1,10 +1,12 @@ # All possible options and their defaults: https://github.com/zitadel/zitadel/blob/main/cmd/defaults.yaml -# If not using the docker compose example, adjust these values for connecting ZITADEL to your CockroachDB +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL Database: - cockroach: + postgres: User: # If the user doesn't exist already, it is created Username: 'zitadel_user' + Password: 'zitadel' Admin: Username: 'root' + Password: 'postgres' diff --git a/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx b/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx index 37fa10ac1..acf3243b9 100644 --- a/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx +++ b/docs/docs/self-hosting/deploy/loadbalancing-example/loadbalancing-example.mdx @@ -15,7 +15,7 @@ With this example configuration, you create a near production environment for ZI The stack consists of three long-running containers: - A [Traefik](https://doc.traefik.io/traefik/) reverse proxy with upstream HTTP/2 enabled, issuing a self-signed TLS certificate. - A secure ZITADEL container configured for a custom domain. As we terminate TLS with Traefik, we configure ZITADEL for `--tlsMode external`. -- A secure [CockroachDB](https://www.cockroachlabs.com/docs/stable/). +- An insecure [PostgreSQL](https://www.postgresql.org/docs/current/index.html). The setup is tested against Docker version 20.10.17 and Docker Compose version v2.2.3 diff --git a/docs/docs/self-hosting/deploy/macos.mdx b/docs/docs/self-hosting/deploy/macos.mdx index 647f22213..423293d29 100644 --- a/docs/docs/self-hosting/deploy/macos.mdx +++ b/docs/docs/self-hosting/deploy/macos.mdx @@ -8,15 +8,16 @@ import DefaultUser from './_defaultuser.mdx' import Next from './_next.mdx' import NoteInstanceNotFound from './troubleshooting/_note_instance_not_found.mdx'; -## Install CockroachDB +## Install PostgreSQL -Download a `cockroach` binary as described [in the CockroachDB docs](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). -ZITADEL is tested against CockroachDB latest stable tag. +Download a `postgresql` binary as described [in the PostgreSQL docs](https://www.postgresql.org/download/macosx/). +ZITADEL is tested against PostgreSQL and CockroachDB latest stable tag and Ubuntu 20.04. -## Run CockroachDB +## Run PostgreSQL ```bash -cockroach start-single-node --insecure --background --http-addr :9090 --listen-addr=localhost +sudo pg_ctl init -D /tmp/postgresql +sudo pg_ctl start -D /tmp/postgresql ``` ## Install ZITADEL @@ -42,7 +43,7 @@ LATEST=$(curl -i https://github.com/zitadel/zitadel/releases/latest | grep locat ## Run ZITADEL ```bash -ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled +ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=$(whoami) ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled ``` @@ -54,7 +55,7 @@ ZITADEL_EXTERNALSECURE=false zitadel start-from-init --masterkey "MasterkeyNeeds ### Setup ZITADEL with a service account ```bash -ZITADEL_EXTERNALSECURE=false ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/tmp/zitadel-admin-sa.json ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1 zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled +ZITADEL_DATABASE_POSTGRES_HOST=localhost ZITADEL_DATABASE_POSTGRES_PORT=5432 ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=$(whoami) ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable ZITADEL_EXTERNALSECURE=false ZITADEL_FIRSTINSTANCE_MACHINEKEYPATH=/tmp/zitadel-admin-sa.json ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_USERNAME=zitadel-admin-sa ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINE_NAME=Admin ZITADEL_FIRSTINSTANCE_ORG_MACHINE_MACHINEKEY_TYPE=1 zitadel start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled # then you can move your machine key mv /tmp/zitadel-admin-sa.json $HOME/zitadel-admin-sa.json diff --git a/docs/docs/self-hosting/deploy/overview.mdx b/docs/docs/self-hosting/deploy/overview.mdx index d7ba3c92e..1e55d60cc 100644 --- a/docs/docs/self-hosting/deploy/overview.mdx +++ b/docs/docs/self-hosting/deploy/overview.mdx @@ -14,8 +14,7 @@ Choose your platform and run ZITADEL with the most minimal configuration possibl ## Prerequisites - For test environments, ZITADEL does not need many resources, 1 CPU and 512MB memory are more than enough. (With more CPU, the password hashing might be faster) -- A CockroachDB or Postgresql as only needed storage. Make sure to read our [Production Guide](/docs/self-hosting/manage/production#prefer-cockroachdb) before you decide to use Postgresql. -) +- A PostgreSQL or CockroachDB as only needed storage. Make sure to read our [Production Guide](/docs/self-hosting/manage/production#prefer-cockroachdb) before you decide to use Postgresql. ## Releases diff --git a/docs/docs/self-hosting/manage/configure/_compose.mdx b/docs/docs/self-hosting/manage/configure/_compose.mdx index c1a802bb2..ade03169d 100644 --- a/docs/docs/self-hosting/manage/configure/_compose.mdx +++ b/docs/docs/self-hosting/manage/configure/_compose.mdx @@ -22,7 +22,7 @@ By executing the commands below, you will download the following files: ```bash -# Download the docker compose example configuration for a secure CockroachDB. +# Download the docker compose example configuration. wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/docker-compose.yaml # Download and adjust the example configuration file containing standard configuration. diff --git a/docs/docs/self-hosting/manage/configure/_helm.mdx b/docs/docs/self-hosting/manage/configure/_helm.mdx index 2600231ae..a4b5e4908 100644 --- a/docs/docs/self-hosting/manage/configure/_helm.mdx +++ b/docs/docs/self-hosting/manage/configure/_helm.mdx @@ -18,10 +18,10 @@ By executing the commands below, you will download the following files: ```bash # Download and adjust the example configuration file containing standard configuration -wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/production/example-zitadel-values.yaml +wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/example-zitadel-values.yaml # Download and adjust the example configuration file containing secret configuration -wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/production/example-zitadel-values-secrets.yaml +wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/example-zitadel-values-secrets.yaml # Install an insecure zitadel release that works with localhost helm install --namespace zitadel --create-namespace my-zitadel zitadel/zitadel \ diff --git a/docs/docs/self-hosting/manage/configure/_linuxunix.mdx b/docs/docs/self-hosting/manage/configure/_linuxunix.mdx index 9fd256d47..e68ae4e8d 100644 --- a/docs/docs/self-hosting/manage/configure/_linuxunix.mdx +++ b/docs/docs/self-hosting/manage/configure/_linuxunix.mdx @@ -19,13 +19,13 @@ By executing the commands below, you will download the following files: ```bash # Download and adjust the example configuration file containing standard configuration -wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/production/example-zitadel-config.yaml +wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/example-zitadel-config.yaml # Download and adjust the example configuration file containing secret configuration -wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/production/example-zitadel-secrets.yaml +wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/example-zitadel-secrets.yaml # Download and adjust the example configuration file containing database initialization configuration -wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/production/example-zitadel-init-steps.yaml +wget https://raw.githubusercontent.com/zitadel/zitadel/main/docs/docs/self-hosting/manage/configure/example-zitadel-init-steps.yaml # A single ZITADEL instance always needs the same 32 characters long masterkey # If you haven't done so already, you can generate a new one @@ -44,9 +44,14 @@ zitadel start-from-init \ ```bash # Set runtime environment variables -export ZITADEL_DATABASE_COCKROACH_HOST="my.database" -export ZITADEL_DATABASE_COCKROACH_USER_USERNAME="my_zitadel_db_user" -export ZITADEL_DATABASE_COCKROACH_USER_PASSWORD="Secret_DB_User_Password" +export ZITADEL_DATABASE_POSTGRES_HOST=my.database +export ZITADEL_DATABASE_POSTGRES_PORT=5432 +export ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel +export ZITADEL_DATABASE_POSTGRES_USER_USERNAME=my_zitadel_db_user +export ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=Secret_DB_User_Password +export ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable +export ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root +export ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable export ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME="root" export ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD="RootPassword1!" diff --git a/docs/docs/self-hosting/manage/configure/docker-compose.yaml b/docs/docs/self-hosting/manage/configure/docker-compose.yaml index c31c13c5a..05c52512b 100644 --- a/docs/docs/self-hosting/manage/configure/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/configure/docker-compose.yaml @@ -7,54 +7,34 @@ services: - "zitadel" image: "ghcr.io/zitadel/zitadel:stable" command: 'start-from-init --config /example-zitadel-config.yaml --config /example-zitadel-secrets.yaml --steps /example-zitadel-init-steps.yaml --masterkey "${ZITADEL_MASTERKEY}" --tlsMode disabled' - depends_on: - certs: - condition: "service_completed_successfully" ports: - "8080:8080" volumes: - "./example-zitadel-config.yaml:/example-zitadel-config.yaml:ro" - "./example-zitadel-secrets.yaml:/example-zitadel-secrets.yaml:ro" - "./example-zitadel-init-steps.yaml:/example-zitadel-init-steps.yaml:ro" - - "zitadel-certs:/crdb-certs:ro" - certs: - image: "cockroachdb/cockroach:latest" - entrypoint: ["/bin/bash", "-c"] - command: - [ - "cp /certs/* /zitadel-certs/ && cockroach cert create-client --overwrite --certs-dir /zitadel-certs/ --ca-key /zitadel-certs/ca.key zitadel_user && chown 1000:1000 /zitadel-certs/*", - ] - volumes: - - "certs:/certs:ro" - - "zitadel-certs:/zitadel-certs:rw" - depends_on: - my-cockroach-db: - condition: "service_healthy" - - my-cockroach-db: - restart: "always" - networks: - - "zitadel" - image: "cockroachdb/cockroach:latest" - command: "start-single-node --advertise-addr my-cockroach-db" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"] - interval: "10s" - timeout: "30s" - retries: 5 - start_period: "20s" + db: + image: postgres:16-alpine + restart: always + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=postgres ports: - - "9090:8080" - - "26257:26257" + - '5432:5432' + networks: + - 'zitadel' + healthcheck: + test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"] + interval: 10s + timeout: 60s + retries: 5 + start_period: 10s volumes: - - "certs:/cockroach/certs:rw" - - "data:/cockroach/cockroach-data:rw" + - 'data:/var/lib/postgresql/data:rw' networks: zitadel: volumes: - certs: - zitadel-certs: data: diff --git a/docs/docs/self-hosting/manage/configure/example-zitadel-config.yaml b/docs/docs/self-hosting/manage/configure/example-zitadel-config.yaml index fe5dd8284..0e9962434 100644 --- a/docs/docs/self-hosting/manage/configure/example-zitadel-config.yaml +++ b/docs/docs/self-hosting/manage/configure/example-zitadel-config.yaml @@ -5,19 +5,15 @@ Log: # Make ZITADEL accessible over HTTP, not HTTPS ExternalSecure: false -# If not using the docker compose example, adjust these values for connecting ZITADEL to your CockroachDB +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL Database: - cockroach: - Host: 'my-cockroach-db' + postgres: + Host: 'db' + Port: 5432 + Database: zitadel User: SSL: - Mode: 'verify-full' - RootCert: "/crdb-certs/ca.crt" - Cert: "/crdb-certs/client.zitadel_user.crt" - Key: "/crdb-certs/client.zitadel_user.key" + Mode: 'disable' Admin: SSL: - Mode: 'verify-full' - RootCert: "/crdb-certs/ca.crt" - Cert: "/crdb-certs/client.root.crt" - Key: "/crdb-certs/client.root.key" + Mode: 'disable' diff --git a/docs/docs/self-hosting/manage/configure/example-zitadel-secrets.yaml b/docs/docs/self-hosting/manage/configure/example-zitadel-secrets.yaml index 6485eef20..072229c46 100644 --- a/docs/docs/self-hosting/manage/configure/example-zitadel-secrets.yaml +++ b/docs/docs/self-hosting/manage/configure/example-zitadel-secrets.yaml @@ -1,10 +1,12 @@ # All possible options and their defaults: https://github.com/zitadel/zitadel/blob/main/cmd/defaults.yaml -# If not using the docker compose example, adjust these values for connecting ZITADEL to your CockroachDB +# If not using the docker compose example, adjust these values for connecting ZITADEL to your PostgreSQL Database: - cockroach: + postgres: User: # If the user doesn't exist already, it is created Username: 'zitadel_user' + Password: 'zitadel_pw' Admin: Username: 'root' + Password: 'postgres' diff --git a/docs/docs/self-hosting/manage/configure/example-zitadel-values-secrets.yaml b/docs/docs/self-hosting/manage/configure/example-zitadel-values-secrets.yaml index 83734560d..99e5ce564 100644 --- a/docs/docs/self-hosting/manage/configure/example-zitadel-values-secrets.yaml +++ b/docs/docs/self-hosting/manage/configure/example-zitadel-values-secrets.yaml @@ -6,10 +6,10 @@ zitadel: secretConfig: Database: - cockroach: + postgres: User: # If the user doesn't exist already, it is created - Username: 'zitadel_user' + Username: 'root' Password: 'Secret_DB_User_Password' Admin: Username: 'root' diff --git a/docs/docs/self-hosting/manage/database/_postgres.mdx b/docs/docs/self-hosting/manage/database/_postgres.mdx index ec2d7861a..de5530948 100644 --- a/docs/docs/self-hosting/manage/database/_postgres.mdx +++ b/docs/docs/self-hosting/manage/database/_postgres.mdx @@ -1,10 +1,6 @@ ## ZITADEL with Postgres -:::caution -Be aware that PostgreSQL is only [Enterprise Supported](/docs/support/software-release-cycles-support#partially-supported). -::: - -If you want to use a PostgreSQL database instead of CockroachDB you can [overwrite the default configuration](../configure/configure.mdx). +If you want to use a PostgreSQL database you can [overwrite the default configuration](../configure/configure.mdx). Make sure to read our [Production Guide](/docs/self-hosting/manage/production#prefer-cockroachdb) before you decide to use it. Currently versions >= 14 are supported. diff --git a/docs/docs/self-hosting/manage/database/database.mdx b/docs/docs/self-hosting/manage/database/database.mdx index 7000cb00d..37be4ea22 100644 --- a/docs/docs/self-hosting/manage/database/database.mdx +++ b/docs/docs/self-hosting/manage/database/database.mdx @@ -13,18 +13,18 @@ import Postgres from './_postgres.mdx' groupId="database-vendor" default="cockroach" values={[ - {'label': 'Cockroach', 'value': 'crdb'}, {'label': 'Postgres', 'value': 'pg'}, + {'label': 'Cockroach', 'value': 'crdb'}, ]} > - - - - + + + + ## Zitadel credentials diff --git a/docs/docs/self-hosting/manage/production.md b/docs/docs/self-hosting/manage/production.md index ac15a0a40..b516b2548 100644 --- a/docs/docs/self-hosting/manage/production.md +++ b/docs/docs/self-hosting/manage/production.md @@ -90,7 +90,7 @@ but in the Projections.Customizations.Telemetry section ### Prefer CockroachDB ZITADEL supports [CockroachDB](https://www.cockroachlabs.com/) and [PostgreSQL](https://www.postgresql.org/). -We highly recommend using CockroachDB, +We recommend using CockroachDB, as horizontal scaling is much easier than with PostgreSQL. Also, if you are concerned about multi-regional data locality, [the way to go is with CockroachDB](https://www.cockroachlabs.com/docs/stable/multiregion-overview.html). diff --git a/docs/docs/self-hosting/manage/reverseproxy/_proxy_guide_tls_mode.mdx b/docs/docs/self-hosting/manage/reverseproxy/_proxy_guide_tls_mode.mdx index f4a780473..debca2f4f 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/_proxy_guide_tls_mode.mdx +++ b/docs/docs/self-hosting/manage/reverseproxy/_proxy_guide_tls_mode.mdx @@ -64,7 +64,7 @@ export const LoginURL = ({mode}) => { if (mode === "disabled") { scheme = "http" } - const url = scheme + "://127.0.0.1.sslip.io/ui/console"; + const url = scheme + "://127.0.0.1.sslip.io/ui/console/?login_hint=zitadel-admin@zitadel.127.0.0.1.sslip.io"; return {url} } diff --git a/docs/docs/self-hosting/manage/reverseproxy/caddy/docker-compose.yaml b/docs/docs/self-hosting/manage/reverseproxy/caddy/docker-compose.yaml index f3a724053..aa4b7f686 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/caddy/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/reverseproxy/caddy/docker-compose.yaml @@ -3,35 +3,44 @@ version: '3.8' services: proxy-disabled-tls: - image: "caddy:2.7.5-alpine" + image: "caddy:latest" volumes: - "./disabled-tls.Caddyfile:/etc/caddy/Caddyfile:ro" ports: - "80:80" + networks: + - 'zitadel' depends_on: zitadel-disabled-tls: condition: 'service_healthy' proxy-external-tls: - image: "caddy:2.7.5-alpine" + image: "caddy:latest" volumes: - "./external-tls.Caddyfile:/etc/caddy/Caddyfile:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-external-tls: condition: 'service_healthy' proxy-enabled-tls: - image: "caddy:2.7.5-alpine" + image: "caddy:latest" volumes: - "./enabled-tls.Caddyfile:/etc/caddy/Caddyfile:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-enabled-tls: condition: 'service_healthy' + +networks: + zitadel: diff --git a/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml b/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml index d391328a5..5b21b8e26 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/reverseproxy/docker-compose.yaml @@ -10,6 +10,18 @@ services: - ZITADEL_EXTERNALPORT=80 - ZITADEL_EXTERNALSECURE=false - ZITADEL_TLS_ENABLED=false + # database configuration + - ZITADEL_DATABASE_POSTGRES_HOST=db + - ZITADEL_DATABASE_POSTGRES_PORT=5432 + - ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel + - ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel_user + - ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel_pw + - ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable + - ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root + - ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres + - ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable + networks: + - 'zitadel' depends_on: zitadel-init: condition: 'service_completed_successfully' @@ -24,6 +36,18 @@ services: - ZITADEL_EXTERNALPORT=443 - ZITADEL_EXTERNALSECURE=true - ZITADEL_TLS_ENABLED=false + # database configuration + - ZITADEL_DATABASE_POSTGRES_HOST=db + - ZITADEL_DATABASE_POSTGRES_PORT=5432 + - ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel + - ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel_user + - ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel_pw + - ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable + - ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root + - ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres + - ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable + networks: + - 'zitadel' depends_on: zitadel-init: condition: 'service_completed_successfully' @@ -40,9 +64,21 @@ services: - ZITADEL_TLS_ENABLED=true - ZITADEL_TLS_CERTPATH=/etc/certs/selfsigned.crt - ZITADEL_TLS_KEYPATH=/etc/certs/selfsigned.key + # database configuration + - ZITADEL_DATABASE_POSTGRES_HOST=db + - ZITADEL_DATABASE_POSTGRES_PORT=5432 + - ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel + - ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel_user + - ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel_pw + - ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable + - ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root + - ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres + - ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable volumes: - ./selfsigned.crt:/etc/certs/selfsigned.crt - ./selfsigned.key:/etc/certs/selfsigned.key + networks: + - 'zitadel' depends_on: zitadel-init: condition: 'service_completed_successfully' @@ -61,13 +97,23 @@ services: # If ZITADEL can't resolve a requests original host to this domain, # it will return a 404 Instance not found error. - ZITADEL_EXTERNALDOMAIN=127.0.0.1.sslip.io - # ZITADEL accesses the database via the docker network. - - ZITADEL_DATABASE_COCKROACH_HOST=db # In case something doesn't work as expected, # it can be handy to be able to read the access logs. - ZITADEL_LOGSTORE_ACCESS_STDOUT_ENABLED=true # For convenience, ZITADEL should not ask to change the initial admin users password. - ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED=false + # database configuration + - ZITADEL_DATABASE_POSTGRES_HOST=db + - ZITADEL_DATABASE_POSTGRES_PORT=5432 + - ZITADEL_DATABASE_POSTGRES_DATABASE=zitadel + - ZITADEL_DATABASE_POSTGRES_USER_USERNAME=zitadel_user + - ZITADEL_DATABASE_POSTGRES_USER_PASSWORD=zitadel_pw + - ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE=disable + - ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME=root + - ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD=postgres + - ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE=disable + networks: + - 'zitadel' healthcheck: test: ["CMD", "/app/zitadel", "ready"] interval: '10s' @@ -77,14 +123,25 @@ services: db: restart: 'always' - image: 'cockroachdb/cockroach:latest' - command: 'start-single-node --insecure --http-addr :9090' + image: postgres:16-alpine + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=postgres healthcheck: - test: ['CMD', 'curl', '-f', 'http://localhost:9090/health?ready=1'] - interval: '10s' - timeout: '30s' - retries: 5 - start_period: '20s' + test: ["CMD-SHELL", "pg_isready", "-d", "db_prod"] + interval: 5s + timeout: 60s + retries: 10 + start_period: 5s ports: - - "26257:26257" - - "9090:9090" + - '5432:5432' + networks: + - 'zitadel' + volumes: + - 'data:/var/lib/postgresql/data:rw' + +networks: + zitadel: + +volumes: + data: \ No newline at end of file diff --git a/docs/docs/self-hosting/manage/reverseproxy/nginx/docker-compose.yaml b/docs/docs/self-hosting/manage/reverseproxy/nginx/docker-compose.yaml index 99b47219c..21b336197 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/nginx/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/reverseproxy/nginx/docker-compose.yaml @@ -3,35 +3,44 @@ version: '3.8' services: proxy-disabled-tls: - image: "nginx:1.25.3-alpine" + image: "nginx:mainline-alpine" volumes: - "./nginx-disabled-tls.conf:/etc/nginx/nginx.conf:ro" ports: - "80:80" + networks: + - 'zitadel' depends_on: zitadel-disabled-tls: condition: 'service_healthy' proxy-external-tls: - image: "nginx:1.25.3-alpine" + image: "nginx:mainline-alpine" volumes: - "./nginx-external-tls.conf:/etc/nginx/nginx.conf:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-external-tls: condition: 'service_healthy' proxy-enabled-tls: - image: "nginx:1.25.3-alpine" + image: "nginx:mainline-alpine" volumes: - "./nginx-enabled-tls.conf:/etc/nginx/nginx.conf:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-enabled-tls: condition: 'service_healthy' + +networks: + zitadel: \ No newline at end of file diff --git a/docs/docs/self-hosting/manage/reverseproxy/traefik/docker-compose.yaml b/docs/docs/self-hosting/manage/reverseproxy/traefik/docker-compose.yaml index 3082e95d2..aee5cf891 100644 --- a/docs/docs/self-hosting/manage/reverseproxy/traefik/docker-compose.yaml +++ b/docs/docs/self-hosting/manage/reverseproxy/traefik/docker-compose.yaml @@ -3,35 +3,44 @@ version: '3.8' services: proxy-disabled-tls: - image: "traefik:v2.10.5" + image: "traefik:latest" volumes: - "./traefik-disabled-tls.yaml:/etc/traefik/traefik.yaml:ro" ports: - "80:80" + networks: + - 'zitadel' depends_on: zitadel-disabled-tls: condition: 'service_healthy' proxy-external-tls: - image: "traefik:v2.10.5" + image: "traefik:latest" volumes: - "./traefik-external-tls.yaml:/etc/traefik/traefik.yaml:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-external-tls: condition: 'service_healthy' proxy-enabled-tls: - image: "traefik:v2.10.5" + image: "traefik:latest" volumes: - "./traefik-enabled-tls.yaml:/etc/traefik/traefik.yaml:ro" - "./selfsigned.crt:/etc/certs/selfsigned.crt:ro" - "./selfsigned.key:/etc/certs/selfsigned.key:ro" ports: - "443:443" + networks: + - 'zitadel' depends_on: zitadel-enabled-tls: condition: 'service_healthy' + +networks: + zitadel: \ No newline at end of file diff --git a/docs/docs/support/software-release-cycles-support.md b/docs/docs/support/software-release-cycles-support.md index 87fbdd652..6524c489f 100644 --- a/docs/docs/support/software-release-cycles-support.md +++ b/docs/docs/support/software-release-cycles-support.md @@ -31,7 +31,6 @@ If you encounter issues with an enterprise supported feature and you are eligibl **Enterprise supported features** -- Database PostgreSQL - LDAP Identity Provider - [Terraform Provider](https://github.com/zitadel/terraform-provider-zitadel)