Что такое 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 файла, который использовался в ролике :
services: zitadel: restart: "always" container_name: zitadel networks: - zitadel - proxy image: "ghcr.io/zitadel/zitadel:latest" command: 'start-from-init --masterkey "${MASTERKEY_32}" --tlsMode external' env_file: .env environment: ZITADEL_DATABASE_POSTGRES_HOST: zitadel-db ZITADEL_DATABASE_POSTGRES_PORT: 5432 ZITADEL_DATABASE_POSTGRES_DATABASE: zitadel ZITADEL_DATABASE_POSTGRES_USER_USERNAME: ${DB_USER} ZITADEL_DATABASE_POSTGRES_USER_PASSWORD: ${DB_PASSWORD} ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE: disable ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME: ${DB_ADMIN_USER} ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD: ${DB_ADMIN_PASSWORD} ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE: disable ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME: ${ZITADEL_LOGIN_USER} ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD: ${ZITADEL_LOGIN_PASSWORD} ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORDCHANGEREQUIRED: false ZITADEL_FIRSTINSTANCE_ORG_NAME: HomeLab ZITADEL_PORT: 8080 #For External TLS (Also use h2c) ZITADEL_EXTERNALPORT: 443 ZITADEL_EXTERNALDOMAIN: ${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME} #eg. auth.DOMAIN_NAME ZITADEL_EXTERNALSECURE: true labels: - "traefik.enable=true" - "traefik.http.routers.zitadel.entrypoints=http" - "traefik.http.routers.zitadel.rule=Host(`${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME}`)" - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.zitadel.middlewares=https-redirect" - "traefik.http.routers.zitadel-secure.entrypoints=https" - "traefik.http.routers.zitadel-secure.rule=Host(`${ZITADEL_SUBDOMAIN}.${DOMAIN_NAME}`)" - "traefik.http.routers.zitadel-secure.tls=true" - "traefik.http.routers.zitadel-secure.service=zitadel" - "traefik.http.services.zitadel.loadbalancer.server.scheme=h2c" - "traefik.http.services.zitadel.loadbalancer.passHostHeader=true" - "traefik.http.services.zitadel.loadbalancer.server.port=8080" - "traefik.docker.network=proxy" depends_on: zitadel-db: condition: "service_healthy"
zitadel-db: restart: "always" container_name: zitadel-db image: postgres:17-alpine env_file: .env environment: POSTGRES_USER: ${DB_ADMIN_USER} POSTGRES_PASSWORD: ${DB_ADMIN_PASSWORD} networks: - zitadel healthcheck: test: [ "CMD-SHELL", "pg_isready", "-d", "zitadel", "-U", "${DB_ADMIN_USER}", ] interval: "10s" timeout: "30s" retries: 5 start_period: "20s" volumes: - ${DB_LOCATION}:/var/lib/postgresql/data
networks: zitadel: name: zitadel proxy: external: true name: proxyПример файла окружения с переменными
MASTERKEY_32=GENERATE_RANDOM_KEY_LENGTH_32_ChangeMe #Replace Master Key (tr -dc A-Za-z0-9 </dev/urandom | head -c 32)DB_USER=Enter_DB_User_ChangeMeDB_PASSWORD=Enter_DB_Password_ChangeMeDB_ADMIN_USER=Enter_DB_Root_User_ChangeMeDB_ADMIN_PASSWORD=Enter_DB_Root_Password_ChangeMeZITADEL_LOGIN_USER=Loginusername@Your_Domain_ChangeMe.comZITADEL_LOGIN_PASSWORD=Zitadel_Password_ChangeMeZITADEL_SUBDOMAIN=zitadelDOMAIN_NAME=Your_Domain_ChangeMe.comDB_LOCATION=/path/to/directory/zitadel/zitadel-dbНекоторая информация может быть устаревшей



