<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.nixos.org/w/index.php?action=history&amp;feed=atom&amp;title=Zitadel</id>
	<title>Zitadel - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nixos.org/w/index.php?action=history&amp;feed=atom&amp;title=Zitadel"/>
	<link rel="alternate" type="text/html" href="https://wiki.nixos.org/w/index.php?title=Zitadel&amp;action=history"/>
	<updated>2026-04-06T17:58:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.0</generator>
	<entry>
		<id>https://wiki.nixos.org/w/index.php?title=Zitadel&amp;diff=30971&amp;oldid=prev</id>
		<title>Lyamc: Created this first-draft page in order to document the service.</title>
		<link rel="alternate" type="text/html" href="https://wiki.nixos.org/w/index.php?title=Zitadel&amp;diff=30971&amp;oldid=prev"/>
		<updated>2026-03-29T06:29:37Z</updated>

		<summary type="html">&lt;p&gt;Created this first-draft page in order to document the service.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;[https://zitadel.com/ Zitadel]&amp;#039;&amp;#039;&amp;#039; is an open-source identity and access management platform built for the cloud-native era. It provides authentication, authorization, and user management with support for OIDC, SAML, MFA, and more.&lt;br /&gt;
&lt;br /&gt;
== Setup (Native / Containerless) ==&lt;br /&gt;
The following configuration provides a complete, declarative setup for Zitadel with:&lt;br /&gt;
&lt;br /&gt;
* [[PostgreSQL]] (no Docker)&lt;br /&gt;
* [[Nginx]] reverse proxy using existing ACME certificates&lt;br /&gt;
* Declarative creation&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Modify and save the configuration as &amp;lt;code&amp;gt;/etc/nixos/services/zitadel.n&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;ix&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nix&lt;br /&gt;
 { config, pkgs, lib, ... }:&lt;br /&gt;
 &lt;br /&gt;
 let&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Root domain, using Wildcard Certificate as per &amp;lt;nowiki&amp;gt;https://wiki.nixos.org/wiki/ACME&amp;lt;/nowiki&amp;gt; CloudFlare section&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # If using per-domain certificates, change to the appropriate subdomain.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; rootDomain = &amp;quot;example.com&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Domain where Zitadel will be available.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Change to rootDomain if using per-domain ACME certificates&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; zitadelDomain = &amp;quot;auth.${rootDomain}&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Strong password for the dedicated PostgreSQL user&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; dbPassword = &amp;quot;make-sure-this-is-secure-and-long&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Initial admin password for the Zitadel console&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Change this immediately after first login!&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; adminPassword = &amp;quot;change-this-immediately-to-a-strong-password&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Email address for the initial admin user&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; initialAdminEmail = &amp;quot;admin@${rootDomain}&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Internal port Zitadel listens on (chosen to avoid conflict with other services on port 80)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; internalPort = 2080;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # External port when using TLS Enabled or for reverse proxy with external TLS mode&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Currently only works with 443, see &amp;lt;nowiki&amp;gt;https://github.com/zitadel/zitadel/issues/11380&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; externalPort = 443;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # false = HTTP, true = HTTPS&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; externalSecure = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Zitadel TLS Mode (disabled, enabled, external)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; tlsMode = &amp;quot;disabled&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 in&lt;br /&gt;
 {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # === PostgreSQL ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; services.postgresql = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   enable = true;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   package = pkgs.postgresql_17;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   ensureDatabases = [ &amp;quot;zitadel&amp;quot; ];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   # Enable TCP/IP for localhost connections&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   enableTCPIP = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   # Authentication rules&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   authentication = pkgs.lib.mkOverride 10 &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     # Local Unix socket connections use peer authentication&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     local   all             all                                     peer&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     # TCP localhost: allow zitadel user to connect to any database&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     host    all             zitadel         127.0.0.1/32            trust&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     host    all             zitadel         ::1/128                 trust&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   # Initial database setup&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   initialScript = pkgs.writeText &amp;quot;zitadel-init.sql&amp;quot; &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     CREATE ROLE zitadel WITH LOGIN PASSWORD &amp;#039;${dbPassword}&amp;#039; CREATEDB CREATEROLE;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     GRANT ALL PRIVILEGES ON DATABASE zitadel TO zitadel;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   settings = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     max_connections = 100;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     shared_buffers = &amp;quot;256MB&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Ensure the zitadel role always has CREATEROLE for migrations&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; systemd.services.zitadel-postgres-setup = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   description = &amp;quot;Ensure Zitadel PostgreSQL user has required privileges&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   wantedBy = [ &amp;quot;multi-user.target&amp;quot; ];&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   after = [ &amp;quot;postgresql.service&amp;quot; ];&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   requires = [ &amp;quot;postgresql.service&amp;quot; ];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   serviceConfig = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Type = &amp;quot;oneshot&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     RemainAfterExit = true;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     User = &amp;quot;postgres&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   script = &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     ${config.services.postgresql.package}/bin/psql -d postgres &amp;lt;&amp;lt;&amp;#039;EOF&amp;#039;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       DO $$&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       BEGIN&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = &amp;#039;zitadel&amp;#039;) THEN&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           CREATE ROLE zitadel WITH LOGIN PASSWORD &amp;#039;${dbPassword}&amp;#039; CREATEDB CREATEROLE;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         ELSE&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           ALTER ROLE zitadel WITH PASSWORD &amp;#039;${dbPassword}&amp;#039; CREATEDB CREATEROLE;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         END IF;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       END&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       $$;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       GRANT ALL PRIVILEGES ON DATABASE zitadel TO zitadel;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     EOF&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # === Zitadel ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; services.zitadel = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   enable = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   masterKeyFile = &amp;quot;/var/lib/zitadel/master.key&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   tlsMode = tlsMode;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   settings = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Port = httpPort;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     ExternalPort = httpsPort;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     ExternalDomain = zitadelDomain;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     ExternalSecure = externalSecure;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Database = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       postgres = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Host = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Port = 5432;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Database = &amp;quot;zitadel&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         User = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Username = &amp;quot;zitadel&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Password = dbPassword;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           SSL = { Mode = &amp;quot;disable&amp;quot;; };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Admin = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Username = &amp;quot;zitadel&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Password = dbPassword;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           SSL = { Mode = &amp;quot;disable&amp;quot;; };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   # Declarative first instance and admin user&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   steps = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     FirstInstance = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       InstanceName = &amp;quot;Zitadel&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       Org = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Human = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           UserName = &amp;quot;admin&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           FirstName = &amp;quot;Admin&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           LastName = &amp;quot;User&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           DisplayName = &amp;quot;Administrator&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Password = adminPassword;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           PasswordChangeRequired = false;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Email = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Address = initialAdminEmail;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Verified = true;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # Generate persistent master key (only once)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; system.activationScripts.zitadelMasterKey = lib.stringAfter [ &amp;quot;var&amp;quot; ] &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   mkdir -p /var/lib/zitadel&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   if [ ! -f /var/lib/zitadel/master.key ]; then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     ${pkgs.coreutils}/bin/tr -dc &amp;#039;A-Za-z0-9&amp;#039; &amp;lt;/dev/urandom | head -c 32 &amp;gt; /var/lib/zitadel/master.key&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     chmod 400 /var/lib/zitadel/master.key&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     chown zitadel:zitadel /var/lib/zitadel/master.key || true&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     chown zitadel:zitadel /var/lib/zitadel || true&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   fi&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; # === Nginx reverse proxy (HTTPS only) example ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; services.nginx.enable = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; services.nginx.virtualHosts.&amp;quot;${zitadelDomain}&amp;quot; = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   forceSSL = true;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   sslCertificate = &amp;quot;/var/lib/acme/${rootDomain}/fullchain.pem&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   sslCertificateKey = &amp;quot;/var/lib/acme/${rootDomain}/key.pem&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   http2 = true;   # Enables HTTP/2 support&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   # Necessary for non-default HTTPS port&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   listen = [&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     { addr = &amp;quot;0.0.0.0&amp;quot;; port = externalPort; ssl = true; }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     { addr = &amp;quot;[::]&amp;quot;; port = externalPort; ssl = true; }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   ];&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     locations = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       # Zitadel Login V2 UI&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       &amp;quot;/ui/v2/login&amp;quot; = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         proxyPass = &amp;quot;&amp;lt;nowiki&amp;gt;http://127.0.0.1:${toString&amp;lt;/nowiki&amp;gt; internalPort}&amp;quot;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         extraConfig = &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           proxy_set_header Host $host;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       # gRPC for Console, API, etc.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       &amp;quot;/&amp;quot; = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         extraConfig = &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           grpc_pass grpc://127.0.0.1:${toString internalPort};&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           grpc_set_header Host $host;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           grpc_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   };&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; };&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; systemd.services.zitadel = {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   after = [ &amp;quot;postgresql.service&amp;quot; &amp;quot;zitadel-postgres-setup.service&amp;quot; ];&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   requires = [ &amp;quot;postgresql.service&amp;quot; &amp;quot;zitadel-postgres-setup.service&amp;quot; ];&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; };&lt;br /&gt;
 }&lt;br /&gt;
Add the module to your configuration.nix:&lt;br /&gt;
&lt;br /&gt;
nix&lt;br /&gt;
 imports = [ ./services/zitadel.nix ];&lt;br /&gt;
After a successful rebuild, Zitadel will be available at &amp;lt;nowiki&amp;gt;https://auth.example.com&amp;lt;/nowiki&amp;gt; (replace with your domain).&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Log in with username &amp;#039;&amp;#039;&amp;#039;admin&amp;#039;&amp;#039;&amp;#039; and the adminPassword you set. &amp;#039;&amp;#039;&amp;#039;Change the password&amp;#039;&amp;#039;&amp;#039; in the Zitadel console.&lt;br /&gt;
&lt;br /&gt;
For further usage, refer to the official Zitadel documentation.&lt;br /&gt;
&lt;br /&gt;
== Verification ==&lt;br /&gt;
Check that services are running:&lt;br /&gt;
&lt;br /&gt;
Bash&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status zitadel-postgres-setup&lt;br /&gt;
systemctl status postgresql&lt;br /&gt;
systemctl status zitadel&lt;br /&gt;
systemctl status nginx&lt;br /&gt;
sudo tail /var/logs/ngnix/error.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* This setup uses trust authentication for the zitadel user on localhost for a single-machine deployment.&lt;br /&gt;
* The zitadel-postgres-setup service ensures the database user has the CREATEROLE attribute required by Zitadel&amp;#039;s initialization.&lt;br /&gt;
* TLS termination happens at Nginx using existing ACME certificates&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
[[ACME]]&lt;br /&gt;
&lt;br /&gt;
[[Keycloak]]&lt;br /&gt;
&lt;br /&gt;
[https://zitadel.com/ Zitadel Offical Homepage]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/zitadel/zitadel/issues Zitadel GitHub Issue Tracker]&lt;/div&gt;</summary>
		<author><name>Lyamc</name></author>
	</entry>
</feed>