Domain Clustered Mode
Pour installer un keycloak en mode Cluster nous devons avoir la configuration suivante.
- Une base de données
- 2 serveurs Keycloak
- un load-balancer
Configuration de la base de donnée
Dans le répertoire keycloak.
Nous allons suivre les étapres suivantes
- Télécharger un package JDBC (Java Database Connectivity) pour la base de données
- Packager le .JAR dans un module et l'installer dans le serveur
- Déclarer le JDBC driver dans la configuration du serveur
- Modifier le datasource pour utiliser le driver JDBC
- Modifier le datasource pour définir les paramètres de connexion à la base de donnée
Les étapes suivantes seront fait avec une base PostreSQL, elles sont identiques pour d'autres SGBD.
Création du package JDBC
# Création du fichier contenant le package
cd modules/system/layers/keycloak/org
mkdir -p postgresql/main
cd postgresql/main/
# Téléchargement du JDBC choisi
wget https://jdbc.postgresql.org/download/postgresql-42.2.23.jar
touch module.xml
Editer le fichier module.xml
en suivant le la syntaxe suivante:
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">
<resources>
<resource-root path="postgresql-42.2.23.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
Le nom du module org.postgresql
doit correspondre au chemin du répertoire, dans notre cas /org/postgresql.
La variable resource-root path
doit correspondre au nom exact du fichier .JAR téléchargé précédemment.
Déclaration et installation du package
Toutes les modifications qui seront faitent dans le fichier domain.xml
doivent être effectué dans la balise XML :
<profile name="auth-server-clustered">
...
</profile>
Qui est le profil Keycloak pris en compte lors d'une configuration Cluster.
Nous allons déclarer ce nouveau module dans notre profile. Il sera disponible quand le serveur démarrera.
cd domain/configuration
nano domain.xml
Supprimer la ligne suivante, puisqu'un serveur de load-balancer spécifique va être installé
<server-group name="load-balancer-group" profile="load-balancer">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="load-balancer-sockets" default-interface="public"/>
</server-group>
Retirer load balancer dans le fichier host-master.xml
<server name="load-balancer" group="load-balancer-group">
<jvm name="default"/>
</server>
Dans le fichier domain.xml, nous recherchons le driver com.h2database.h2
déjà déclaré.
Le nom du driver peut être choisi selon vos envie, le module
correspond à celui créer précédemment.
<subsystem xmlns="urn:jboss:domain:datasources:6.0">
<datasources>
...
<drivers>
<!--> Driver à rajouter <-->
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
Modification de la Datasource
Après avoir déclaré le driver JDBC nous allons maintenant modifier le datasource de Keycloak afin qu'il utilise notre nouvelle base de donnée.
La modification ce fait dans le même fichier que précédemment, dans le block juste au dessus.
Modifier le datasource KeycloakDS
, en changeant connection-url
et driver
.
La partie user-name
et
Nous inscrivons ici les informations de connexion en clair. Il existe des méthodes d'obfuscation, mais cela dépasse le cadre de ce tutoriel.
<subsystem xmlns="urn:jboss:domain:datasources:6.0">
<datasources>
...
<!--> Datasource à modifier <-->
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
<connection-url>jdbc:postgresql://localhost/keycloak</connection-url>
<driver>postgresql</driver>
<pool>
<max-pool-size>20</max-pool-size>
</pool>
<security>
<user-name>postgres</user-name>
<password></password>
</security>
</datasource>
...
</datasources>
</subsystem>
Ajout de la datasource
Aucune modification particulière, les options par défaut sont : https://www.keycloak.org/docs/latest/server_installation/#database-configuration
Création de la base de donnée
Se connecter au serveur de base de donnée, elle doit être encodée en UTF-8.
-- Vérifier l'encodage par défaut
show server_encoding;
-- Si ce n'est pas UTF8, créer la base de donnée de cette manière
create database keycloak with encoding 'UTF8';
Configuration du Load Balancer
Dans cet exemple nous allons utiliser Nginx.
Peut importe le load balancer choisi, il est important de rajouter les headers HTTP suivants:
- X-Forwarded-For
- X-Forwarded-Proto
http {
upstream keycloak {
server <your_ip_1>:8080 fail_timeout=2s;
server <your_ip_2>:8080 fail_timeout=2s;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://keycloak;
}
}
...
}
Modif user add ./adduser.sh
<management>
<security-realms>
<security-realm name="ManagementRealm">
<server-identities>
<secret value="bWdtdDEyMyE="/>
</server-identities>
Copier le XML avec le secret Rajouter admin
<remote security-realm="ManagementRealm" username="admin">
Lancer le serveur ?
domain.sh -Djboss.http.port=80 --host-config=host-master.xml