フューチャー Advent Calendar 2019 16日目の記事です。
去年のアドカレを3月に投稿することになってしまい申し訳ありません。
Keycloakのカスタマイズ
OpenID Connectを利用した認証認可ソフトウェアの一つとして便利なKeycloakですが、ローカル環境で軽く試す場合、Javaのランタイムなど考えると少し面倒なのでDocker版を利用するケースが多いかと思います。
KeycloakのDBはデフォルトでIn-memoryのH2を使ってるので、Keycloakを再起動すると永続化された既存の設定が消えてしまい、再設定する手間がかかります。
例えば、あらゆる設定を試したり、SPIを利用したり、特にCredentialModel拡張やUserStorageSPIを使ってローカル環境でゴリゴリカスタマイズする場合、頻繁に再起動することになるので、ローカルのDBを使い永続化して内容を確認したり直接いじってみたりとかしたいですよね。
Docker版のDB永続化
Docker Hubにも書いてある通り、Docker版でももちろん外部のDBが使えるようにサポートしてますし、keycloak/keycloak-containersを見るとサンプルのDockerfileまで用意されてます。
しかし、このサンプルではdocker volumeで永続化された、Docker版DBをdocker-composeにより使ってるので、ここではローカルで直接インストールされたPostgreSQLにつなごうと思います。
Dockerfile
FROM jboss/keycloak
ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD pass1234
ENV DB_VENDOR postgres
ENV DB_ADDR postgres
ENV DB_PORT 5432
ENV DB_DATABASE keycloak
ENV DB_USER keycloak-user
ENV DB_PASSWORD db-password
# ローカルで開発SPIのjarを入れる
ADD ./build/libs/*.jar /opt/jboss/keycloak/standalone/deployments/
ここで重要なのはENV DB_ADDR postgres
これをlocalhost
にしてしまうと、DBの向き先がホストOS(ローカル)じゃなくコンテナ内を指してしまうので全然繋がりません。ここはpostgres
というエイリアスにしときます。
(--net=host
でコンテナをホストネットワークにつなぐと、[UDP] /172.17.0.1 is not a valid address on any local network interface
とかでWildFlyに怒られます。)
PostgreSQL
listen_addresses = '*'
コンテナからはホストの内部IPアドレスでアクセスして来ますが、ローカル環境なので特に支障なければ適当に*
にします。
# TYPE DATABASE USER ADDRESS METHOD
host keycloak keycloak-user 192.168.0.0/16 password
Dockerコンテナの中からホストにアクセスする場合は、Remote(接続元)のIPアドレスがdocker0によって変換されるので172.17.0.0/16
などではなく、ホストの内部IPのCIDRである192.168.0.0/16
or 192.168.x.x/32
などにします。
同じく支障なければ0.0.0.0/0
でも構いません。
起動
$ docker run -p 8080:8080 --add-host postgres:`ipconfig getifaddr en0` keycloak
あとは起動時postgres
エイリアスにホストマシンの内部IPをセットすればOKです。
やってみたら
これ、別にKeycloakに限った話じゃないですよね…
他のDocker版アプリをローカルDBにつなぐ場合にも使えそうです!