Guía de despliegue

Alojar ZITADEL en un VPS: SSO multi-tenant sin Keycloak

Desplegar en un VPS Cloud →

Tutorial

Alojar ZITADEL en un VPS: SSO multi-tenant sin Keycloak

Seguridad y monitorización14 min de lectura10 pasos

ZITADEL es un proveedor de identidad cloud-native escrito en Go, diseñado desde el principio para equipos B2B que gestionan múltiples clientes o proyectos distintos. Mientras Keycloak exige configurar un realm por tenant — con todo el riesgo de deriva de configuración que ello implica — y Authentik trata el multi-tenancy como una característica adicional, ZITADEL coloca las organizaciones y los proyectos en el núcleo de su modelo de datos. Cada tenant tiene sus propios usuarios, sus propias reglas de autenticación y sus propias aplicaciones, sin interferir jamás con los vecinos. Su huella de memoria es la de un binario Go — de 150 a 300 MB para el stack completo con PostgreSQL, frente a los 512 MB a 1 GB de JVM de Keycloak en reposo. Soporta OIDC, OAuth2, SAML 2.0, LDAP y Passkeys WebAuthn desde la versión 2.x, con una API gRPC/REST que permite automatizar por completo la gestión de tenants.

Contenido· ZITADEL vs Keycloak vs Authentik: cuál elegir para un SaaS B2B1/10
  1. 01ZITADEL vs Keycloak vs Authentik: cuál elegir para un SaaS B2B
  2. 02Por qué ZITADEL destaca para uso en agencias y SaaS B2B
  3. 03Prerequisitos: servidor, Docker y DNS
  4. 04Desplegar ZITADEL con Docker Compose y PostgreSQL
  5. 05Configurar la autenticación OIDC para tus aplicaciones
  6. 06Modelo multi-tenant: organizaciones, proyectos y aplicaciones
  7. 07ZITADEL vs Authentik vs Keycloak — comparativa técnica
  8. 08Activar Passkeys y MFA en ZITADEL v2
  9. 09Solución de problemas: errores frecuentes de ZITADEL en Docker
  10. 10Próximo paso: profundiza en tu stack SSO auto-alojado

ZITADEL vs Keycloak vs Authentik: cuál elegir para un SaaS B2B

Keycloak es el estándar histórico, rico en funciones y respaldado por Red Hat. Su problema para un VPS self-hosted: la JVM. En reposo, Keycloak consume entre 512 MB y 1 GB de RAM, y cada realm es un árbol de configuración separado que mantener. La semana 38 de 2026 ilustró el riesgo: seis CVEs corregidas en dos releases consecutivas, incluidos dos DoS no autenticados en los endpoints SAML y de login.

Authentik (2026.8.2) es la elección natural para equipos que quieren un IdP completo con interfaz gráfica, flujos visuales y provisionamiento SCIM. Está escrito en Python/Django y requiere al menos 1 GB de RAM utilizable.

ZITADEL (v2.x, Go) es el único de los tres que diseñó el multi-tenancy como primitiva de primera clase. Una instalación única expone organizaciones independientes — cada cliente obtiene su espacio aislado sin duplicación de configuración. Para una agencia que aloja diez clientes en un único VPS, es la diferencia entre diez archivos de configuración de Keycloak y una API que lo orquesta todo.

Por qué ZITADEL destaca para uso en agencias y SaaS B2B

  • Multi-tenancy nativo: organizaciones y proyectos son primitivas del modelo de datos, no soluciones alternativas — cada cliente obtiene un espacio aislado sin duplicación de configuración
  • Escrito en Go: binario único, inicio en segundos, huella de memoria de 150 a 300 MB stack completo frente a 512 MB a 1 GB de JVM
  • OIDC, OAuth2, SAML 2.0 y LDAP: todos los protocolos empresariales en una sola instalación
  • Passkeys y WebAuthn nativos desde v2: cada organización puede imponer Passkeys como único factor de autenticación sin plugins
  • API-first gRPC/REST: toda operación disponible en la consola lo está también vía API — provisionar un tenant o crear una aplicación OIDC en pocas líneas de script
  • Acciones (webhooks/código): lógica personalizada disparada en eventos de autenticación sin modificar el core
  • Despliegue sin estado de aplicación: ZITADEL almacena todo en PostgreSQL — sin caché distribuida, sin volúmenes adicionales
  • Licencia Apache 2.0: el núcleo es completamente open source sin funciones críticas ocultas tras una licencia Enterprise

Prerequisitos: servidor, Docker y DNS

La configuración mínima recomendada por el equipo para un despliegue en producción es 2 vCPU y 4 GB de RAM — de los cuales unos 300 MB serán utilizados por ZITADEL mismo, el resto yendo a PostgreSQL y otros servicios.

Software requerido: Docker Engine 24+ y Docker Compose v2. Los puertos 80 y 443 deben estar abiertos (nginx terminará el TLS). Un nombre de dominio apuntando a la IP de tu VPS — ZITADEL requiere un FQDN incluso en desarrollo, ya que las cookies OIDC están vinculadas al dominio.

Base de datos: PostgreSQL 15 o 16. ZITADEL también soporta CockroachDB para despliegues de alta disponibilidad, pero en un VPS de un único nodo, PostgreSQL es la elección natural.

Desplegar ZITADEL con Docker Compose y PostgreSQL

  1. Crear la estructura de directorios

    Conéctate a tu VPS por SSH y crea los directorios necesarios:

    mkdir -p /opt/zitadel/{config,certs}
    cd /opt/zitadel
  2. Crear el archivo .env con los secretos

    cat > /opt/zitadel/.env <<EOF
    POSTGRES_PASSWORD=$(openssl rand -base64 32 | tr -d '\n')
    ZITADEL_MASTERKEY=$(openssl rand -base64 32 | tr -d '\n' | head -c 32)
    ZITADEL_DOMAIN=sso.tu-dominio.com
    EOF

    El MASTERKEY debe tener exactamente 32 caracteres.

  3. Escribir el docker-compose.yml

    Crea /opt/zitadel/docker-compose.yml con los servicios PostgreSQL y ZITADEL, configurando la conexión a la base de datos mediante variables de entorno y exponiendo el puerto 8080 para nginx.

  4. Configurar nginx como reverse proxy TLS

    Crea un bloque de servidor nginx para sso.tu-dominio.com que redirija HTTP a HTTPS y proxee las peticiones a http://127.0.0.1:8080. Establece la cabecera X-Forwarded-Proto: https. Obtén el certificado Let's Encrypt con Certbot.

  5. Iniciar el stack ZITADEL

    cd /opt/zitadel
    docker compose up -d
    docker compose logs -f zitadel

    Espera el mensaje server is listening on [::]:8080 en los logs — generalmente tarda de 30 a 60 segundos.

  6. Recuperar las credenciales de administrador iniciales

    docker compose logs zitadel 2>&1 | grep -A 5 'initial'

    Las credenciales se muestran solo una vez. Guárdalas en tu gestor de secretos.

  7. Iniciar sesión en la consola de administración

    Abre https://sso.tu-dominio.com/ui/console en un navegador. Inicia sesión con las credenciales recuperadas en el paso anterior.

  8. Crear tu primera organización cliente

    En la consola, ve a Organización → Nueva organización. Dale el nombre de tu cliente. ZITADEL crea automáticamente un espacio aislado — los usuarios de esta organización no pueden ver los de las demás.

  9. Crear un proyecto y una aplicación OIDC

    En la organización, ve a Proyectos → Nuevo proyecto. Crea una Aplicación web de tipo OIDC. ZITADEL te pedirá el tipo de cliente y las URLs de redirección. Generará un Client ID y un Client Secret.

  10. Verificar el estado y fijar la versión de la imagen

    curl -s https://sso.tu-dominio.com/healthz | jq .

    Una respuesta {"status": "pass"} confirma que ZITADEL responde correctamente. Fija la etiqueta de versión en docker-compose.yml — stable sigue el último release, lo que puede introducir cambios no planificados en producción.

Configurar la autenticación OIDC para tus aplicaciones

Una vez ZITADEL en marcha y una aplicación OIDC creada, la configuración del lado del cliente es estándar — cualquier biblioteca OIDC (passport.js, next-auth, python-oidc, etc.) funciona sin adaptación específica de ZITADEL.

Parámetros OIDC esenciales:

ISSUER=https://sso.tu-dominio.com
CLIENT_ID=<client_id_generado>
CLIENT_SECRET=<client_secret_generado>
REDIRECT_URI=https://tu-app.com/callback
SCOPES=openid profile email

El Discovery Document está disponible en https://sso.tu-dominio.com/.well-known/openid-configuration. Para SPAs (React, Vue), usa el flujo PKCE sin secreto en el lado del cliente.

Modelo multi-tenant: organizaciones, proyectos y aplicaciones

El modelo de datos de ZITADEL se articula en tres niveles que corresponden exactamente a las necesidades de una agencia o SaaS B2B.

La organización es el contenedor de un tenant. Cada organización tiene sus propios usuarios, sus propios IdP externos y sus propias políticas de contraseña. Puede ser administrada por un delegado de la organización — tu cliente — sin que eso le dé acceso a las demás organizaciones.

El proyecto agrupa las aplicaciones de un único producto. Un proyecto puede contener una aplicación web, una aplicación móvil y una API — todas compartiendo los mismos roles y permisos, definidos una sola vez a nivel de proyecto.

La aplicación representa un cliente OIDC, OAuth2 o SAML específico. Este modelo permite a una agencia gestionar diez clientes en una única instalación de ZITADEL sin ningún riesgo de contaminación entre tenants.

ZITADEL vs Authentik vs Keycloak — comparativa técnica

Desplace la tabla

CriterioZITADEL v2.xAuthentik 2026.8Keycloak 26.7
Lenguaje / runtimeGo — binario únicoPython + Rust (frontend)Java (JVM)
RAM stack completo (reposo)150 – 300 MB~1 GB (worker + PostgreSQL)512 MB – 1 GB (solo JVM)
Multi-tenancy nativoSí — primitiva OrganizacionesParcial — tenants separadosParcial — realms separados
OIDC / OAuth2 / SAMLSí — los tres nativosSí — los tres nativosSí — los tres nativos
Passkeys / WebAuthnSí, nativo v2Sí (2026.2+)Sí (v21+)
API-firstgRPC + REST, cobertura 100%REST parcialREST parcial
Interfaz de administraciónConsola web + APIUI completa con flujos visualesUI completa, configuración XML
LicenciaApache 2.0 (núcleo)MIT (Community) / EnterpriseApache 2.0

Activar Passkeys y MFA en ZITADEL v2

ZITADEL v2 ofrece Passkeys WebAuthn como factor de autenticación principal — no solo como segundo factor. Para activarlos en una organización:

1. En la consola, abre Organización → Política de seguridad → Política MFA
2. Activa Passkeys (WebAuthn sin contraseña) y selecciona Forzar si quieres que todos los usuarios de esta organización utilicen únicamente Passkeys
3. Para una política más flexible: permite tanto Passkeys como TOTP — el usuario elige durante el registro

ZITADEL también soporta TOTP estándar (Google Authenticator, cualquier app compatible con RFC 6238) y claves de seguridad físicas U2F/FIDO2 (YubiKey, etc.) para despliegues empresariales.

Solución de problemas: errores frecuentes de ZITADEL en Docker

masterkey must be 32 characters: usa openssl rand -hex 16 (32 caracteres hex = 16 bytes) para obtener una clave de longitud exacta.

connection refused en el puerto 8080 mientras el contenedor está en marcha: ZITADEL solo responde en :8080 cuando las migraciones están completas — start-from-init en una base vacía puede tardar de 30 a 90 segundos. Espera el log server is listening on [::]:8080.

Bucle de redirección HTTP/HTTPS: verifica que proxy_set_header X-Forwarded-Proto https esté en el bloque location / de nginx.

invalid_client durante el flujo OIDC: verifica que la URL de redirección declarada en la aplicación ZITADEL coincida exactamente con la que envía tu aplicación — ZITADEL es estricto en la coincidencia.

PostgreSQL rechaza la conexión: reinicia ZITADEL con docker compose restart zitadel. Usa restart: on-failure:5 para absorber los retrasos de inicio.

Pérdida de credenciales de administrador iniciales: elimina la base de datos (docker compose down -v) y reinicia start-from-init. En producción, crea inmediatamente una segunda cuenta de administrador.

Próximo paso: profundiza en tu stack SSO auto-alojado

ZITADEL en producción en un VPS es un excelente primer paso. Para ir más lejos:

- [Desplegar ZITADEL en VPS — guía avanzada](/deployer-zitadel-vps): certificados TLS automáticos con Let's Encrypt, backup de PostgreSQL a S3 y actualizaciones sin downtime.
- [Authentik vs Authelia: ¿qué SSO self-hosted para tu VPS?](/authentik-vs-authelia-sso-self-hosted): si tu caso de uso es menos orientado a multi-tenancy y más a proxy de autenticación.
- [Migrar de Keycloak a Authelia o ZITADEL](/keycloak-cves-semaine-38-migrer-authelia-zitadel-vps): las seis CVEs de la semana 38 analizadas y el camino de migración concreto desde un realm Keycloak existente.
- [Auto-alojar Authelia en VPS](/self-host-authelia-vps): si buscas una pasarela de autenticación ultra-ligera (menos de 30 MB) en lugar de un IdP completo.

Un VPS con 4 GB de RAM, acceso root e IPv4 dedicada cubre cómodamente ZITADEL en producción con margen para las aplicaciones que protege.

Despliegue su infraestructura hoy mismo

VPS Cloud. Entornos preconfigurados disponibles.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva