Zitadel est l’alternative open-source à Auth0/Okta qui a la plus forte traction en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer) : implémentation OIDC complète, multi-tenant, MFA, passkeys, identity broker, auto-hébergeable. Pour les PME africaines qui veulent du SSO professionnel sans facture par utilisateur, Zitadel est imbattable. Voici le guide pratique.
Ce guide général couvre tout. Les articles connexes détaillent : installer Zitadel sur Coolify, flux OIDC complet, passkeys et MFA, Zitadel vs Keycloak vs Authentik.
Pourquoi Zitadel
- Open-source AGPLv3, écrit en Go
- OIDC + OAuth2 + SAML standards complets
- Multi-tenant : organisations, projects, applications
- Passkeys (WebAuthn) natifs
- MFA : TOTP, SMS, OTP email, U2F
- Identity Broker : login social Google/GitHub/Apple/Microsoft
- API gRPC + REST complètes
- SCIM pour provisioning auto
- Self-hosted ou SaaS Cloud (zitadel.cloud)
Cas d’usage
- SSO interne pour vos outils self-hosted (Forgejo, NocoDB, Grafana, Coolify, n8n)
- Auth pour vos applications custom (web/mobile)
- Login social Google/GitHub pour utilisateurs externes
- Multi-tenant SaaS (chaque client = une org Zitadel)
- Conformité avec audit log centralisé
Étape 1 — Installer Zitadel
Voir notre tutoriel Coolify.
Étape 2 — Premier setup
- Login admin (credentials initiales dans logs Zitadel)
- Créer une Organization (par client multi-tenant) ou rester sur « default »
- Créer un Project
- Créer une Application :
- Type : Web (pour app web), Native (pour mobile), API (pour M2M)
- Auth Method : Code (PKCE) pour SPA, Code + Client Secret pour backend, Implicit déconseillé
- Redirect URIs :
https://app.exemple.sn/auth/callback
Étape 3 — Intégrer dans votre app
Voir notre tutoriel flux OIDC. SDK officiels JS, Go, Python, .NET.
Étape 4 — Identity Brokers (login social)
- Settings → Identity Providers → Add
- Google : Client ID + Secret depuis Google Cloud Console
- GitHub : Client ID + Secret depuis OAuth App
- Generic OIDC : pour autres providers
Bouton « Continuer avec Google » apparaît automatiquement sur la page de login Zitadel.
Étape 5 — Passkeys et MFA
Voir notre tutoriel passkeys. Sécurité moderne sans mot de passe.
Étape 6 — SSO sur outils self-hosted
Brancher Zitadel comme provider OIDC dans :
- Forgejo : Site Administration → Authentication Sources → OAuth2
- Grafana : auth.generic_oauth dans config
- NocoDB : config OIDC dans variables env
- Pocketbase : Auth providers → Custom OIDC
- Outline / Wiki.js / etc. : tous supportent OIDC
Adaptation Afrique de l’Ouest
Pour PME africaine, Zitadel sur VPS Hetzner (5-10 €/mois) remplace Auth0 Pro (130-2000 USD/mois selon volume) ou Okta (15+ USD/user/mois). Économie majeure pour des centaines voire milliers d’utilisateurs.
Dans la continuité
Où héberger votre projet web ?
Hostinger propose des plans dimensionnés pour les freelances et PME. Lien d’affiliation — pas de surcoût pour vous.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Pourquoi Zitadel pour un SSO self-hosted en 2026
Zitadel s’impose comme alternative open-source mature à Keycloak pour gérer l’authentification centralisée d’une PME ouest-africaine. Écrit en Go, il consomme deux à trois fois moins de RAM que Keycloak (250 Mo vs 800 Mo au repos), supporte OIDC, OAuth 2.1, SAML 2.0 et passkeys WebAuthn nativement. Un VPS Hetzner CX22 à 4,51 EUR/mois (2 960 FCFA) suffit pour 500 utilisateurs.
Avant de lancer l’installation, vérifiez que votre domaine pointe bien vers le VPS et que les ports 80/443 sont ouverts. Sinon le challenge ACME de Caddy échouera silencieusement.
Étape 1 : Préparer le VPS Ubuntu 24.04
Connectez-vous en SSH puis durcissez le système avant tout. Zitadel exposera un endpoint d’authentification critique, donc on ferme tout ce qui ne sert pas.
ssh root@sso.votredomaine.sn
apt update && apt upgrade -y
apt install -y ufw fail2ban curl
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
La commande ufw status doit afficher Status: active avec uniquement les trois ports listés. Si vous voyez d’autres ports ouverts, fermez-les avant de continuer.
Étape 2 : Installer Docker et Docker Compose v2
Zitadel se déploie via Docker Compose officiel. On utilise le dépôt Docker upstream pour obtenir la version 27.x à jour, pas la version 24.x d’Ubuntu qui est obsolète.
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version
La sortie doit indiquer Docker Compose version v2.32.x ou supérieur. Si la commande échoue, c’est que le plugin compose n’a pas été installé : relancez apt install docker-compose-plugin.
Étape 3 : Configurer le docker-compose.yml Zitadel
Créez un dossier dédié et un fichier compose minimal avec PostgreSQL 17 et Zitadel v2.66 (dernière stable janvier 2026). Le mot de passe admin sera généré au premier démarrage et affiché dans les logs.
mkdir -p /opt/zitadel && cd /opt/zitadel
cat > docker-compose.yml <<'EOF'
services:
zitadel:
image: ghcr.io/zitadel/zitadel:v2.66.0
command: 'start-from-init --masterkey "MasterkeyNeedsToHave32Characters" --tlsMode disabled'
environment:
ZITADEL_DATABASE_POSTGRES_HOST: db
ZITADEL_DATABASE_POSTGRES_PORT: 5432
ZITADEL_DATABASE_POSTGRES_DATABASE: zitadel
ZITADEL_DATABASE_POSTGRES_USER_USERNAME: zitadel
ZITADEL_DATABASE_POSTGRES_USER_PASSWORD: changeme-strong
ZITADEL_DATABASE_POSTGRES_USER_SSL_MODE: disable
ZITADEL_DATABASE_POSTGRES_ADMIN_USERNAME: postgres
ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD: changeme-admin
ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE: disable
ZITADEL_EXTERNALDOMAIN: sso.votredomaine.sn
ZITADEL_EXTERNALSECURE: true
ZITADEL_EXTERNALPORT: 443
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
db:
image: postgres:17-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: changeme-admin
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 10
EOF
docker compose up -d
Au bout de 30 secondes, docker compose logs zitadel | grep "Initial admin" révèle le couple identifiant/mot de passe initial. Notez-le immédiatement, il ne sera plus jamais réaffiché.
Étape 4 : Mettre Caddy en reverse proxy TLS
Caddy gère Let’s Encrypt automatiquement et termine le TLS avant Zitadel. Cette séparation simplifie les mises à jour et permet de réutiliser le même reverse proxy pour d’autres services.
apt install -y caddy
cat > /etc/caddy/Caddyfile <<'EOF'
sso.votredomaine.sn {
reverse_proxy h2c://localhost:8080
}
EOF
systemctl reload caddy
Au bout de 60 secondes, curl -I https://sso.votredomaine.sn doit retourner HTTP/2 200 avec un certificat Let’s Encrypt valide. Si vous voyez une erreur 502, vérifiez que Zitadel écoute bien en h2c (HTTP/2 cleartext) et pas en HTTP/1.1.
Étape 5 : Créer la première organisation et le premier projet
Connectez-vous sur https://sso.votredomaine.sn avec les identifiants notés à l’étape 3. La console Zitadel guide la création de l’organisation racine — typiquement le nom de votre entreprise, par exemple « Acme Dakar ». Créez ensuite un projet, puis une application OIDC web.
Pour chaque application interne (CRM, intranet, GitLab), enregistrez une application OIDC distincte. Cela permet de révoquer l’accès d’une seule appli sans toucher aux autres. Les redirect URIs doivent être déclarés exactement, wildcard interdit en production.
Étape 6 : Activer les passkeys et MFA obligatoire
Dans Settings → Login Policy, cochez « Force MFA » et « Allow Passkeys ». WebAuthn fonctionne sur Chrome 130+ et Safari 17+, donc tous les téléphones Android 12+ et iPhone 15+ utilisés au Sénégal sont compatibles. Pour les utilisateurs sans smartphone récent, gardez TOTP en fallback.
Testez l’enregistrement passkey depuis un compte de démonstration avant de l’imposer aux utilisateurs réels. Une fois passkey enregistrée, le login se fait par empreinte digitale ou Face ID en moins de deux secondes.
Étape 7 : Sauvegarde PostgreSQL et plan de reprise
Une perte de la base Zitadel = perte de toutes les identités. Programmez un backup quotidien automatisé et testez la restauration au moins une fois par trimestre.
cat > /usr/local/bin/zitadel-backup.sh <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
docker exec zitadel-db-1 pg_dump -U postgres zitadel | gzip > /backup/zitadel-$DATE.sql.gz
find /backup -name "zitadel-*.sql.gz" -mtime +30 -delete
EOF
chmod +x /usr/local/bin/zitadel-backup.sh
echo "0 3 * * * /usr/local/bin/zitadel-backup.sh" | crontab -
Le dump tourne chaque nuit à 3h, les sauvegardes de plus de 30 jours sont purgées. Synchronisez ensuite /backup vers un stockage S3 (Hetzner Storage Box à 3,20 EUR/mois) pour résister à une perte du VPS entier.
Étape 8 : Intégrer la première application — exemple GitLab CE
Dans GitLab, allez dans Admin → Settings → SAML/OIDC. Renseignez l’issuer https://sso.votredomaine.sn, le client_id et client_secret générés par Zitadel à l’étape 5. Activez « Auto link OIDC user » pour que les comptes existants se rattachent automatiquement par email.
Après redémarrage de GitLab, le bouton « Sign in with Zitadel » apparaît sur la page de login. Premier test avec un compte non-admin : si la connexion réussit et que les groupes sont propagés, le SSO est opérationnel.
Lectures complémentaires, consultez notre comparaison Keycloak vs Authelia vs Zitadel et le guide durcissement VPS Ubuntu 24.04.
Étape 9 : Provisionner les utilisateurs en masse via API
Créer 200 comptes à la main est intenable. Zitadel expose une API gRPC et REST pour le provisioning. Générez d’abord un Personal Access Token dans la console (Service Users → New).
curl -X POST https://sso.votredomaine.sn/management/v1/users/human/_import \
-H "Authorization: Bearer $ZITADEL_PAT" \
-H "Content-Type: application/json" \
-d '{
"userName": "fatou.diop",
"profile": {"firstName": "Fatou", "lastName": "Diop"},
"email": {"email": "fatou@acme.sn", "isEmailVerified": true},
"password": {"password": "Tmp!ChangeMe2026", "changeRequired": true}
}'
La réponse JSON contient l’userId. Stockez-le dans votre annuaire RH. Boucle bash sur un CSV pour importer 200 comptes en moins de cinq minutes. À la première connexion, l’utilisateur sera forcé de changer son mot de passe et d’enregistrer un facteur MFA.
Étape 10 : Surveillance Prometheus et alertes
Zitadel expose des métriques Prometheus sur /debug/metrics. Ajoutez un job au scrape config et créez une alerte sur le taux d’échecs d’authentification — un pic indique soit une attaque par bourrage d’identifiants, soit une panne d’intégration.
scrape_configs:
- job_name: 'zitadel'
metrics_path: /debug/metrics
static_configs:
- targets: ['sso.votredomaine.sn:443']
scheme: https
Dans Grafana, importez le dashboard officiel ID 18493 (Zitadel Overview) pour visualiser logins/sec, latence p99 et taux d’erreur 5xx. Si la latence dépasse 500 ms en p99, vérifiez d’abord la charge PostgreSQL : un index manquant sur events.aggregate_id est le coupable habituel.
Étape 11 : Migrer depuis un annuaire LDAP existant
Beaucoup de PME tournent encore sur un Active Directory ou OpenLDAP local. Zitadel supporte la fédération LDAP en lecture pour migration progressive. Dans Settings → Identity Providers, ajoutez un IdP LDAP avec le DN base, le filtre utilisateur et un compte de service en lecture seule.
Les utilisateurs LDAP peuvent alors se connecter via Zitadel sans recréer leur mot de passe. Une fois 100% des comptes migrés et MFA activé, coupez la fédération LDAP et désactivez l’AD progressivement. Gardez un backup AD au moins six mois au cas où.
Étape 12 : Coût total de possession sur 12 mois
Pour 500 utilisateurs au Sénégal, comptez : VPS Hetzner CX22 4,51 EUR/mois (54,12 EUR/an = 35 500 FCFA), Storage Box backup 3,20 EUR/mois (25 200 FCFA/an), domaine .sn 12 000 FCFA/an, certificats Let’s Encrypt gratuits. Total annuel ≈ 73 000 FCFA, soit 146 FCFA par utilisateur par an.
Comparé à Okta (2 USD/utilisateur/mois = 7 200 FCFA/an/utilisateur), l’économie est colossale : facteur 50. Le seul vrai coût caché reste le temps admin — comptez deux jours d’installation initiale et une demi-journée de maintenance trimestrielle.
Étape 9 : Provisionner les utilisateurs en masse via API
Créer 200 comptes à la main est intenable. Zitadel expose une API gRPC et REST pour le provisioning. Générez d’abord un Personal Access Token dans la console (Service Users → New).
curl -X POST https://sso.votredomaine.sn/management/v1/users/human/_import -H "Authorization: Bearer $ZITADEL_PAT" -d '{"userName":"fatou.diop","email":{"email":"fatou@acme.sn","isEmailVerified":true}}'
La réponse JSON contient l’userId. Stockez-le dans votre annuaire RH. Boucle bash sur un CSV pour importer 200 comptes en moins de cinq minutes. À la première connexion, l’utilisateur sera forcé de changer son mot de passe et d’enregistrer un facteur MFA.
Étape 10 : Surveillance Prometheus et alertes
Zitadel expose des métriques Prometheus sur /debug/metrics. Ajoutez un job au scrape config et créez une alerte sur le taux d’échecs d’authentification — un pic indique soit une attaque par bourrage d’identifiants, soit une panne d’intégration.
scrape_configs:
- job_name: 'zitadel'
metrics_path: /debug/metrics
static_configs:
- targets: ['sso.votredomaine.sn:443']
scheme: https
Dans Grafana, importez le dashboard officiel ID 18493 (Zitadel Overview) pour visualiser logins par seconde, latence p99 et taux d’erreur 5xx. Si la latence dépasse 500 ms en p99, vérifiez d’abord la charge PostgreSQL : un index manquant sur events aggregate id est le coupable habituel.
Étape 11 : Migrer depuis un annuaire LDAP existant
Beaucoup de PME tournent encore sur un Active Directory ou OpenLDAP local. Zitadel supporte la fédération LDAP en lecture pour migration progressive. Dans Settings → Identity Providers, ajoutez un IdP LDAP avec le DN base, le filtre utilisateur et un compte de service en lecture seule.
Les utilisateurs LDAP peuvent alors se connecter via Zitadel sans recréer leur mot de passe. Une fois 100 pourcent des comptes migrés et MFA activé, coupez la fédération LDAP et désactivez l’AD progressivement. Gardez un backup AD au moins six mois au cas où un retour arrière serait nécessaire.
Étape 12 : Coût total de possession sur 12 mois
Pour 500 utilisateurs au Sénégal, comptez : VPS Hetzner CX22 4,51 EUR par mois (54,12 EUR par an, soit 35 500 FCFA), Storage Box backup 3,20 EUR par mois (25 200 FCFA par an), domaine .sn 12 000 FCFA par an, certificats Let’s Encrypt gratuits. Total annuel environ 73 000 FCFA, soit 146 FCFA par utilisateur par an.
Comparé à Okta (2 USD par utilisateur par mois, soit 7 200 FCFA par an et par utilisateur), l’économie est colossale, facteur cinquante. Le seul vrai coût caché reste le temps admin : comptez deux jours d’installation initiale et une demi-journée de maintenance trimestrielle. Pour 500 utilisateurs, ça reste largement rentable comparé à un abonnement SaaS.
Étape 13 : Audit de sécurité et conformité locale
Zitadel journalise chaque événement d’authentification dans la table events. Pour répondre à un audit interne ou à une demande de la Commission de Protection des Données du Sénégal, exportez les logs des 90 derniers jours via l’API Events. Conservez les exports chiffrés avec age ou GPG, jamais en clair.
Activez aussi la rotation des secrets clients OIDC tous les six mois. Dans Zitadel, chaque application a un bouton Regenerate Client Secret qui invalide l’ancien immédiatement. Programmez un rappel calendrier le 1er janvier et le 1er juillet pour ne pas oublier.