zitadel-login

zitadel-login

Docker app from Nebur692's Repository

Overview

ZITADEL v4 Login UI — the interactive sign-in pages (username/password, MFA, WebAuthn, etc.) for a ZITADEL v4 core instance. Since v4, ZITADEL split its interactive login pages out of the main API container into this separate service. Without it, every login attempt against a v4 "zitadel" container fails with a 404 on /ui/v2/login/login — this template exists to fix exactly that. REQUIRES the companion "zitadel" template from the same repository to already be running, using the exact same Bootstrap Volume path, since this container reads the login-client.pat token that ZITADEL writes there on its first start. Your reverse proxy needs a path-based rule so that requests to "/" and "/ui/v2/login/*" reach this container's port 3000, while everything else keeps going to the "zitadel" container's port 8080. See the setup guide below for an Nginx Proxy Manager example. Full setup guide: https://github.com/Nebur692/Unraid-sso-templates

ZITADEL Logo ZITADEL Logo

GitHub Workflow Status (with event) GitHub contributors

The Identity Infrastructure for Developers

ZITADEL is an open-source identity and access management platform built for teams that need more than basic auth. Whether you're securing a SaaS product, building a B2B platform, or self-hosting a production IAM stack — ZITADEL gives you everything out of the box: SSO, MFA, Passkeys, OIDC, SAML, SCIM, and a battle-tested multi-tenancy model.

No vendor lock-in. No compromise on control. Just a robust, API-first identity platform you can own.


🏡 Website  |  💬 Chat  |  📋 Docs  |  🧑‍💻 Blog  |  📞 Contact


Why ZITADEL

We built ZITADEL to handle the hardest IAM challenges at scale — starting with multi-tenancy.

ZITADEL FusionAuth Keycloak Auth0/Okta
Open-source ✅ ❌ ✅ ❌
Self-hostable ✅ ✅ ✅ ❌
Infrastructure-level tenants ✅ Instances (High scale) ✅ Tenants 🟡 Realms (Scaling limits) ❌ (Multi-tenant = multi-account)
B2B Organizations ✅ Native & Unlimited 🟡 via Entity Management ✅ (Recent addition) 🟡 (Plan/Account dependent)
Full audit trail ✅ Comprehensive Event Stream* 🟡 Audit logs 🟡 Audit logs 🟡 Audit logs
Passkeys (FIDO2) ✅ ✅ ✅ ✅
Actions / webhooks ✅ ✅ 🟡 via SPI ✅
API-first (gRPC + REST) ✅ 🟡 REST only 🟡 REST only 🟡 REST only
SaaS + self-host parity ✅ ✅ ➖ N/A ➖ N/A

ZITADEL Cloud and self-hosted ZITADEL run the same codebase.

Key differentiators for architects:

  • Relational core, event-driven soul — every mutation is written as an immutable event for a complete, API-accessible audit trail. Unlike systems that log only select activities, ZITADEL provides a comprehensive event stream that can be audited or streamed to external systems via Webhooks.
  • Strict multi-tenant hierarchy — Identity System → Organizations → Projects, with isolated data and policy scoping at multiple levels
  • API-first design — every resource and action is available via connectRPC, gRPC, and HTTP/JSON APIs
  • Zero-downtime updates and horizontal scalability without external session stores

Get Started in 3 Minutes

👉 Quick Start Guide

ZITADEL Self-Hosted

# Docker Compose — up and running in under 3 minutes
curl -LO https://raw.githubusercontent.com/zitadel/zitadel/main/deploy/compose/docker-compose.yml \
  && curl -LO https://raw.githubusercontent.com/zitadel/zitadel/main/deploy/compose/.env.example \
  && cp .env.example .env \
  && docker compose up -d --wait

Full deployment guides:

Need professional support for your self-hosted deployment? Contact us.

ZITADEL Cloud (SaaS)

Start for free at zitadel.com — no credit card required. Available in US · EU · AU · CH. Pay-as-you-go pricing.


Integrate with the V2 API

ZITADEL exposes every capability over a typed API. Here's how to create a user with the V2 REST API:

curl -X POST https://$ZITADEL_DOMAIN/v2/users/human \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "alice@example.com",
    "profile": { "givenName": "Alice", "familyName": "Smith" },
    "email": { "email": "alice@example.com", "sendCode": {} }
  }'

Explore the full API reference — including connectRPC and gRPC transports — or jump straight to quickstart examples.


Features

Authentication

Multi-Tenancy

Integration

Self-Service & Admin

Deployment

Track upcoming features on our roadmap and follow our changelog for recent updates.


Showcase

Login V2

Our new, fully customizable login experience — documentation


Adopters & Ecosystem

Used in production by organizations worldwide. See the full Adopters list — and add yours by submitting a pull request.


How To Contribute

ZITADEL is built in the open and welcoming to contributions of all kinds.

Contributors

Made with contrib.rocks.


Security

Security policy: SECURITY.md

Vulnerability Disclosure Policy — how to responsibly report security issues.

Technical Advisories are published for major issues that could impact security or stability in production.

License

AGPL-3.0 — see LICENSING.md for the full licensing policy, including Apache 2.0 and MIT exceptions for specific directories.

Requirements

The companion "zitadel" template (v4 core/API), already started at least once, sharing the same Bootstrap Volume path.

Related apps

Details

Repository
ghcr.io/zitadel/zitadel-login:latest
Last Updated2026-10-12
First Seen2026-10-12

Runtime arguments

Web UI
http://[IP]:[PORT:3000]/ui/v2/login/
Network
bridge
Shell
sh
Privileged
false
Extra Params
--restart unless-stopped

Template configuration

ZITADEL API URLVariable

REQUIRED. Internal address of your 'zitadel' core container's API, e.g. http://192.168.1.50:8080 (its LAN/container IP and port, not the public domain).

Target
ZITADEL_API_URL
Public Base PathVariable

Do not change unless you know why — must match the path your reverse proxy routes to this container.

Target
NEXT_PUBLIC_BASE_PATH
Default
/ui/v2/login
Value
/ui/v2/login
Service User Token FileVariable

CRITICAL, do not change. Path inside this container where the login-client.pat token (written by the 'zitadel' core container on its first start) will be read from. Must match the Bootstrap Volume mount below.

Target
ZITADEL_SERVICE_USER_TOKEN_FILE
Default
/zitadel/bootstrap/login-client.pat
Value
/zitadel/bootstrap/login-client.pat
Custom Request HeadersVariable

REQUIRED behind a reverse proxy. Format: Host:your-domain,X-Forwarded-Proto:https — e.g. Host:sso.example.com,X-Forwarded-Proto:https

Target
CUSTOM_REQUEST_HEADERS
Bootstrap Volume (shared with zitadel)Pathro

Must be the EXACT same host path used as the Bootstrap Volume in the companion 'zitadel' template, mounted read-only here.

Target
/zitadel/bootstrap
Default
/mnt/user/appdata/zitadel/bootstrap
Value
/mnt/user/appdata/zitadel/bootstrap
Login UI PortPorttcp

Internal port. Route your reverse proxy's '/' and '/ui/v2/login/*' paths here — do not expose directly to the internet.

Target
3000
Default
3000
Value
3000