🔐 Keycloak 26 : Guide Complet pour Créer un Cluster Haute Disponibilité avec Docker et JDBC_PING

🔴 Niveau : Avancé | ⏱️ Lecture : 40 min | 🛠️ Mise en œuvre : 1-2 heures

📚 Prérequis

  • 1 serveur Linux (Debian 12/13 ou Ubuntu 22.04/24.04 LTS)
  • Docker et Docker Compose installés
  • Base de données PostgreSQL accessible (voir notre tutoriel PostgreSQL 17 HA)
  • Accès root ou sudo sur le serveur
  • (Optionnel) Nom de domaine + certificat SSL pour la production

Keycloak est la solution IAM (Identity and Access Management) open source de référence. Dans ce tutoriel complet, nous allons déployer un cluster Keycloak 26 en haute disponibilité avec Docker Compose, utilisant JDBC_PING pour la découverte automatique des nœuds et une base PostgreSQL externe.

Cette architecture est prête pour la production : failover automatique, sessions distribuées, et scaling horizontal simple.


🏗️ Architecture du Cluster

Notre cluster Keycloak sera composé de 2 réplicas (ou plus) avec une base PostgreSQL externe :

📊 Rôle de chaque composant

  • Keycloak 26 : Serveur d’authentification SSO avec support OIDC, SAML 2.0, OAuth 2.0
  • JDBC_PING : Protocole de découverte des nœuds du cluster via la base de données (pas de multicast requis)
  • PostgreSQL : Base de données pour stocker la configuration, les utilisateurs et la table de découverte cluster
  • Reverse Proxy : Terminaison SSL, load balancing et routing vers les nœuds Keycloak

🔌 Ports utilisés

PortServiceDescription
8080Keycloak HTTPInterface web et API REST
8443Keycloak HTTPSInterface sécurisée (si configuré)
9000Keycloak ManagementHealth checks et métriques
5432PostgreSQLBase de données
443Reverse ProxyPoint d’entrée HTTPS public

🔄 Pourquoi JDBC_PING ?

Keycloak 26 utilise par défaut JDBC_PING pour la découverte des nœuds en mode production. Cette méthode présente plusieurs avantages :

  • Pas de multicast : Fonctionne dans tous les environnements (cloud, Docker, Kubernetes)
  • Simple : Utilise la base de données existante comme registre
  • Fiable : Chaque nœud s’enregistre dans une table PostgreSQL
  • Failover automatique : Un nœud qui tombe est détecté et retiré

⚙️ Étape 1 : Préparation du Serveur

Commençons par préparer notre serveur et installer Docker.

1.1 Mise à jour du système

1.2 Installation de Docker

Important : Déconnectez-vous et reconnectez-vous pour que les changements de groupe prennent effet.


🐘 Étape 2 : Configuration de PostgreSQL

Keycloak a besoin d’une base PostgreSQL. Si vous n’avez pas encore de cluster PostgreSQL, consultez notre tutoriel pour déployer un cluster PostgreSQL 17 HA complet ou utilisez notre rôle Ansible qui le déploie pour vous en 5 minutes ci-dessous.

2.1 Création de la base et de l’utilisateur

Connectez-vous à votre serveur PostgreSQL et exécutez :

2.2 Configuration de pg_hba.conf

Ajoutez une règle pour autoriser les connexions depuis votre serveur Keycloak :

Rechargez la configuration PostgreSQL après modification.


🐳 Étape 3 : Image Keycloak Optimisée

Pour la production, nous allons créer une image Docker optimisée de Keycloak. Cette image pré-compile les configurations et réduit significativement le temps de démarrage.

3.1 Création de l’arborescence

3.2 Dockerfile multi-stage

Créez le fichier Dockerfile :

Ce Dockerfile utilise un build multi-stage :

  • Stage 1 (builder) : Compile Keycloak avec les options de production (PostgreSQL, health, metrics)
  • Stage 2 : Copie uniquement les fichiers optimisés dans l’image finale

📦 Étape 4 : Configuration Docker Compose

Créez le fichier docker-compose.yml complet :

📝 Explication des variables d’environnement

VariableDescription
KEYCLOAK_ADMINNom d’utilisateur administrateur initial
KEYCLOAK_ADMIN_PASSWORDMot de passe administrateur initial (changer en prod!)
KC_DBType de base de données (postgres)
KC_DB_URLURL JDBC de connexion PostgreSQL
KC_DB_USERNAMEUtilisateur PostgreSQL
KC_DB_PASSWORDMot de passe PostgreSQL
KC_PROXY_HEADERSHeaders de proxy à faire confiance (xforwarded)
KC_HTTP_ENABLEDActiver HTTP (requis derrière un reverse proxy SSL)
KC_HEALTH_ENABLEDActiver les endpoints /health/*

🚀 Étape 5 : Démarrage du Cluster

5.1 Build de l’image optimisée

5.2 Lancement du cluster

Attendez de voir le message Keycloak 26.0 on JVM (powered by Quarkus) started sur les deux réplicas.

5.3 Vérification du cluster

5.4 Accès à la console d’administration

Ouvrez votre navigateur à l’adresse : http://<IP_SERVEUR>:8080/admin/

  • Utilisateur : admin
  • Mot de passe : VotreMotDePasseAdmin (celui configuré dans docker-compose.yml)

🔒 Étape 6 : Reverse Proxy Nginx (HTTPS)

En production, vous devez placer un reverse proxy devant Keycloak pour la terminaison SSL.

6.1 Installation de Nginx

6.2 Configuration Nginx

Créez le fichier /etc/nginx/sites-available/keycloak :

6.3 Activation et test

6.4 Mise à jour docker-compose pour hostname fixe

Modifiez le docker-compose.yml pour utiliser l’hostname de production :

Puis redémarrez le cluster :


✅ Étape 7 : Tests et Validation

7.1 Création d’un Realm de test

Dans la console admin (https://auth.example.com/admin/) :

  1. Cliquez sur le menu déroulant « master » → Create Realm
  2. Entrez le nom : test
  3. Cliquez Create

7.2 Création d’un utilisateur

  1. Menu UsersAdd user
  2. Username : testuser
  3. Email : test@example.com
  4. Email verified : On
  5. Cliquez Create
  6. Onglet CredentialsSet password
  7. Désactivez Temporary et définissez un mot de passe

7.3 Création d’un client OIDC

  1. Menu ClientsCreate client
  2. Client ID : test-app
  3. Client type : OpenID Connect
  4. Next → Laissez les options par défaut
  5. Next → Valid redirect URIs : * (pour les tests uniquement!)
  6. Save

7.4 Test d’authentification OIDC

7.5 Vérifier le clustering


🔧 Troubleshooting

Problème : Keycloak ne démarre pas

Problème : Les nœuds ne forment pas de cluster

Problème : Erreur « Invalid redirect URI »

Dans le client OIDC, ajoutez l’URI de redirection correcte dans Valid redirect URIs et Valid post logout redirect URIs.

Problème : Sessions non partagées entre nœuds

Vérifiez que le cluster est bien formé. Si les nœuds ne se voient pas, les sessions ne seront pas répliquées.


🔧 Commandes Utiles


🚀 Conclusion : Automatisez avec Ansible !

Vous venez de déployer manuellement un cluster Keycloak HA complet. Cette configuration vous offre :

  • Haute disponibilité avec failover automatique
  • Sessions distribuées entre les nœuds
  • Scaling horizontal simple avec Docker Compose
  • Image optimisée pour des démarrages rapides
  • JDBC_PING : Fonctionne partout sans multicast

Cependant, ce processus manuel est long, répétitif et source d’erreurs. Pour des déploiements en production, nous recommandons fortement d’automatiser avec Ansible.

DevOps Store propose des rôles Ansible professionnels, testés et documentés pour automatiser votre infrastructure. Notre rôle keycloak_ha déploie cette architecture complète en quelques minutes :

  • 🔄 Idempotent : Exécutez-le autant de fois que nécessaire
  • ⚙️ Configurable : Réplicas, mémoire JVM, hostname personnalisables
  • Testé : Validé avec Molecule sur Debian 12/13 et Ubuntu 22.04/24.04
  • 📚 Documenté : Guides Day-1 et Day-2 inclus
  • 🔐 Sécurisé : Supporte Ansible Vault pour les secrets

📖 Glossaire

  • Keycloak : Solution IAM open source développée par Red Hat, standard de facto pour le SSO
  • OIDC : OpenID Connect, protocole d’authentification basé sur OAuth 2.0
  • SAML : Security Assertion Markup Language, protocole SSO basé sur XML
  • JDBC_PING : Méthode de découverte des nœuds cluster via une table en base de données
  • Realm : Espace de noms isolé dans Keycloak contenant utilisateurs, clients et configurations
  • Client : Application enregistrée dans Keycloak pour l’authentification
  • Infinispan : Cache distribué utilisé par Keycloak pour les sessions et tokens

Ce tutoriel vous a été utile ? Partagez-le avec vos collègues DevOps !