keycloak HAのセットアップ手順

keycloak のセットアップを行ったのでメモ。

DockerImage が公開されているからちょろいちょろいと思ってたら
そのままだと HAモードで動かないことがわかりました。
https://hub.docker.com/r/jboss/keycloak-ha-postgres/

しょうがないので 公開されている Dockerfile ファイルを参考にして
VirtualBox上に HA(ハイアベイラビリティ)モードで動作させることを目指しました。
(なるべくデフォルト設定で)

目指す構成

構築する keycloak の構成

環境

  • Virtualbox 5.1.3
  • Ubuntu16.04 Server(最小構成インストール)
  • Keycloak 3.4.1.Final (執筆時最新)

さて、さっそくやってみましょう!

host側セットアップ

java install

# apt-get update -y
# apt-get update -y && apt install -y openjdk-8-jdk

udp マルチキャスト設定

/etc/network/interfaces

auto enp0s8
iface enp0s8 inet dhcp
  post-up route add -net 224.0.0.0 netmask 240.0.0.0 enp0s8
  post-up ifconfig enp0s8 multicast

keycloak install

# wget https://downloads.jboss.org/keycloak/3.4.1.Final/keycloak-3.4.1.Final.tar.gz
# tar -xvf keycloak-3.4.1.Final.tar.gz
# export JBOSS_HOME=/root/keycloak-3.4.1.Final

config

jboss cli

JBoss CLI で 管理サーバを起動します。

# $JBOSS_HOME/bin/jboss-cli.sh
[disconnected /] embed-server --server-config=standalone-ha.xml --std-out=echo

09:33:53,376 INFO  [org.jboss.modules] (AeshProcess: 1) JBoss Modules version 1.6.1.Final
09:33:53,531 INFO  [org.jboss.msc] (AeshProcess: 1) JBoss MSC version 1.2.7.SP1

      ;
      ;

[standalone@embedded /]

起動したら、以下の設定を行っていきます

  • loglevel
/subsystem=logging/logger=org.keycloak:add
/subsystem=logging/logger=org.keycloak:write-attribute(name=level,value=INFO)
  • proxy
/subsystem=undertow/server=default-server/http-listener=default: write-attribute(name=proxy-address-forwarding, value=false)
  • change-database(postgres)
/subsystem=datasources/data-source=KeycloakDS: remove()
/subsystem=datasources/data-source=KeycloakDS: add(jndi-name=java:jboss/datasources/KeycloakDS,enabled=true,use-java-context=true,use-ccm=true, connection-url=jdbc:postgresql://<DB host:5432>/keycloak, driver-name=postgresql)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=user-name, value=keycloak)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=password, value=password)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=check-valid-connection-sql, value="SELECT 1")
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=background-validation, value=true)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=background-validation-millis, value=60000)
/subsystem=datasources/data-source=KeycloakDS: write-attribute(name=flush-strategy, value=IdleConnections)
/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql, driver-module-name=org.postgresql.jdbc, driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
  • infinispan
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:remove
/subsystem=infinispan/cache-container=keycloak/replicated-cache=sessions:add()
/subsystem=infinispan/cache-container=keycloak/replicated-cache=sessions:write-attribute(name="mode",value="SYNC")

設定終了時には 以下コマンドでJBoss管理サーバを止めます

[standalone@embedded /] stop-embedded-server

[disconnected /] exit

postgres Driver

export JDBC_POSTGRES_VERSION=42.1.4
mkdir -p $JBOSS_HOME/modules/system/layers/base/org/postgresql/jdbc/main 
curl -L http://central.maven.org/maven2/org/postgresql/postgresql/$JDBC_POSTGRES_VERSION/postgresql-$JDBC_POSTGRES_VERSION.jar > $JBOSS_HOME/modules/system/layers/base/org/postgresql/jdbc/main/postgres-jdbc.jar

起動

# $JBOSS_HOME/bin/standalone.sh -c standalone-ha.xml -b 0.0.0.0 -Djboss.bind.address.private=<enp0s8 IP> -Djboss.bind.address.management=<enp0s8 IP>

同一ホスト内で複数起動するときはこんな感じ

# $JBOSS_HOME/bin/standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1
# $JBOSS_HOME/bin/standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=node2