Что такое ZITADEL?
Если вам понравилась настоящая статья, то можете поддержать автора став спонсором на бусти (ссылка в разделе контакты).
ZITADEL — это система управления идентификацией и доступом (IAM), разработанная швейцарской компанией CAOS AG. Она предоставляет полный набор функций по управлению пользователями, безопасной аутентификации и авторизации, подходящий как для небольших проектов, так и для крупных корпоративных решений.
Главное преимущество ZITADEL — это сочетание открытого исходного кода, современной архитектуры и облачной ориентации, что делает его удобным для DevOps, SaaS-платформ и internal tool-авторизации.
Ключевые возможности ZITADEL
Поддержка современных протоколов
- OIDC (OpenID Connect)
- OAuth 2.0
- SAML 2.0
Это делает Zitadel совместимым с большинством современных веб-приложений и сервисов.
Многоарендность и управление организациями
- Поддержка multi-tenant архитектуры
- Отдельные пространства для организаций
- Делегирование прав администраторам
Многофакторная аутентификация (MFA)
- Email/OTP
- TOTP (Google Authenticator)
- SMS
- WebAuthn (FIDO2, YubiKey и др.)
Настраивается централизованно или на уровне организации.
API и CLI
- Полноценный REST и gRPC API
zitadelCLI- Поддержка DevOps-инфраструктуры (CI/CD, GitOps)
Ролевое управление доступом
- Роли на уровне проектов, приложений и пользователей
- Кастомные клеймы и scopes в токенах
- RBAC/ABAC-подход
Облачное и локальное развёртывание
- Хостинг от разработчиков (SaaS)
- Self-hosted: Docker, Kubernetes, Podman
- Поддержка PostgreSQL и CockroachDB
Преимущества ZITADEL
| Возможность | ZITADEL | Keycloak | Auth0 | Authelia / TinyAuth |
|---|---|---|---|---|
| Open Source | ✅ | ✅ | ❌ | ✅ |
| OIDC/SAML | ✅ | ✅ | ✅ | ❌/частично |
| MFA | ✅ | ✅ | ✅ | ❌/частично |
| Multi-tenant | ✅ | Частично | ✅ | ❌ |
| UI для self-service | ✅ | ❌ | ✅ | ❌ |
| API / CLI | ✅ | Частично | ✅ | ❌ |
Как начать
Пример docker compose файла, который использовался в ролике :
1services:2 zitadel:3 restart: "always"4 container_name: zitadel5 networks:6 - zitadel7 - proxy8 image: "ghcr.io/zitadel/zitadel:latest"9 command: 'start-from-init --masterkey "${MASTERKEY_32}" --tlsMode external'10 env_file: .env11 environment:12 ZITADEL_DATABASE_POSTGRES_HOST: zitadel-db13 ZITADEL_DATABASE_POSTGRES_PORT: 543214 ZITADEL_DATABASE_POSTGRES_DATABASE: zitadel15 ZITADEL_DATABASE_POSTGRES_USER_USERNAME: ${DB_USER}16 ZITADEL_DATABASE_POSTGRES_USER_PASSWORD: ${DB_PASSWORD}17 ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE: disable18 ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME: ${DB_ADMIN_USER}19 ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD: ${DB_ADMIN_PASSWORD}20 ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE: disable21 ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME: ${ZITADEL_LOGIN_USER}22 ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD: ${ZITADEL_LOGIN_PASSWORD}23 ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED: false24 ZITADEL_FIRSTINSTANCE_ORG_NAME: HomeLab25 ZITADEL_PORT: 8080 #For External TLS (Also use h2c)26 ZITADEL_EXTERNALPORT: 44327 ZITADEL_EXTERNALDOMAIN: ${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME} #eg. auth.DOMAIN_NAME28 ZITADEL_EXTERNALSECURE: true29 labels:30 - "traefik.enable=true"31 - "traefik.http.routers.zitadel.entrypoints=http"32 - "traefik.http.routers.zitadel.rule=Host(`${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME}`)"33 - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"34 - "traefik.http.routers.zitadel.middlewares=https-redirect"35 - "traefik.http.routers.zitadel-secure.entrypoints=https"36 - "traefik.http.routers.zitadel-secure.rule=Host(`${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME}`)"37 - "traefik.http.routers.zitadel-secure.tls=true"38 - "traefik.http.routers.zitadel-secure.service=zitadel"39 - "traefik.http.services.zitadel.loadbalancer.server.scheme=h2c"40 - "traefik.http.services.zitadel.loadbalancer.passHostHeader=true"41 - "traefik.http.services.zitadel.loadbalancer.server.port=8080"42 - "traefik.docker.network=proxy"43 depends_on:44 zitadel-db:45 condition: "service_healthy"46
47 zitadel-db:48 restart: "always"49 container_name: zitadel-db50 image: postgres:17-alpine51 env_file: .env52 environment:53 POSTGRES_USER: ${DB_ADMIN_USER}54 POSTGRES_PASSWORD: ${DB_ADMIN_PASSWORD}55 networks:56 - zitadel57 healthcheck:58 test:59 [60 "CMD-SHELL",61 "pg_isready",62 "-d",63 "zitadel",64 "-U",65 "${DB_ADMIN_USER}",66 ]67 interval: "10s"68 timeout: "30s"69 retries: 570 start_period: "20s"71 volumes:72 - ${DB_LOCATION}:/var/lib/postgresql/data73
74networks:75 zitadel:76 name: zitadel77 proxy:78 external: true79 name: proxyПример файла окружения с переменными
1MASTERKEY_32=GENERATE_RANDOM_KEY_LENGTH_32_ChangeMe #Replace Master Key (tr -dc A-Za-z0-9 </dev/urandom | head -c 32)2DB_USER=Enter_DB_User_ChangeMe3DB_PASSWORD=Enter_DB_Password_ChangeMe4DB_ADMIN_USER=Enter_DB_Root_User_ChangeMe5DB_ADMIN_PASSWORD=Enter_DB_Root_Password_ChangeMe6ZITADEL_LOGIN_USER=Loginusername@Your_Domain_ChangeMe.com7ZITADEL_LOGIN_PASSWORD=Zitadel_Password_ChangeMe8ZITADEL_SUBDOMAIN=zitadel9DOMAIN_NAME=Your_Domain_ChangeMe.com10DB_LOCATION=/path/to/directory/zitadel/zitadel-dbSome information may be outdated