✨
Keycloak (Quarkus) + Postgres + UserStorage(mysql) Docker Composeで動かす
はじめに
Keycloak (Quarkus) + PostgreSQL + UserStorage(mysql)を Docker Compose で立ち上げるサンプルコードです。
今回はローカル環境でdev modeでなくproduction modeで動かしていきます。
バージョン情報
Keycloak (Quarkus) keycloak:21.1.1
postgres:13-alpine3.14
mysql:8.1
Docker 環境構成
ディレクトリ構成
├── local
│ ├── keycloak
│ │ ├── conf
│ │ │ ├── cache-ispn.xml
│ │ │ ├── keycloak.conf
│ │ │ └── quarkus.properties
│ │ ├── providers
│ │ │ └── mysql_user-storage-jpa-example.jar
│ │ └── themes
│ ├── mysql
│ └── postgres
├── Dockerfile
└ docker-compose.yml
Keycloak Dockerfile
FROM quay.io/keycloak/keycloak:21.1.1 as builder
WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:21.1.1
COPY /opt/keycloak/ /opt/keycloak/
# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
ENV KC_DB=postgres
WORKDIR /opt/keycloak
# change these values to point to a running postgres instance
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
production modeで動かし、またリバプロ配下としない(KC_PROXY=edgeとしない)構成の為、証明書を配置する必要があります。
サンプル通りに自己署名証明書を生成しています。
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
コメントの通り、本番では適切な証明書を使用してください。
リバプロ配下とする場合は、KC_PROXY=edgeとすれば自己証明書を作らなくても起動します。
for demonstration purposes only, please make sure to use proper certificates in production instead
参考リンク
docker-compose.yml
version: "3.8"
services:
keycloak:
image: quay.io/keycloak/keycloak:21.1.1
container_name: keycloak
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8443:8443"
networks:
auth:
volumes:
- ./local/keycloak/conf:/opt/keycloak/conf
- ./local/keycloak/themes:/opt/keycloak/themes
- ./local/keycloak/providers:/opt/keycloak/providers
environment:
KEYCLOAK_ADMIN: admin # 管理ユーザーIDを設定
KEYCLOAK_ADMIN_PASSWORD: passwd # 管理ユーザーのパスワードを設定
KC_DB_URL: jdbc:postgresql://postgresql:5432/keycloak
KC_DB: postgres
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: password
KC_HOSTNAME: localhost #EC2上などで起動させる際には、HOSTIPなどを指定して下さい。
KC_ADMIN_HOSTNAME: localhost #EC2上などで起動させる際には、HOSTIPなどを指定して下さい。
TZ: "Asia/Tokyo" # タイムゾーン
command:
- --verbose start
depends_on:
- postgresql
tty: true
stdin_open: true
postgresql:
image: postgres:13-alpine3.14
container_name: keycloak-postgresql
environment:
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: password
POSTGRES_DB: keycloak
POSTGRES_INITDB_ARGS: --encoding=UTF-8
POSTGRES_HOST_AUTH_METHOD: trust
TZ: "Asia/Tokyo"
ports:
- "5432:5432"
user: root
volumes:
- ./local/postgres/postgresql_data:/var/lib/postgresql/data #postgresの永続化
networks:
auth:
#データベースサーバ
mysql-db:
image: mysql:8.1
container_name: mysql-user-db
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: userstorage
MYSQL_USER: keycloak
MYSQL_PASSWORD: password
ports:
- "3306:3306"
networks:
auth:
volumes:
- ./local/mysql/mysql_data:/var/lib/mysql #mysqlの永続化
tty: true
networks:
auth:
Keycloakコンテナの設定値の説明
キー | 設定値 | 説明 |
---|---|---|
volumes | ./local/keycloak/conf:/opt/keycloak/conf | quarkus.properties mysqlへの接続先を設定する為に使用 |
./local/keycloak/themes:/opt/keycloak/themes | レルム毎のログイン画面を設定(今回は割愛) | |
./local/keycloak/providers:/opt/keycloak/providers | UserStorageSPI接続用のJAR | |
environment | KC_ADMIN_HOSTNAME | 環境に合わせて適切に設定、場合によってはアドミン画面にはいれなくなる |
quarkus.propertiesの設定値
quarkus.datasource.user-store.db-kind=mysql
quarkus.datasource.user-store.username=root
quarkus.datasource.user-store.password=password
quarkus.datasource.user-store.jdbc.url=jdbc:mysql://mysql-db:3306/keycloak
今後の投稿
今回のローカル環境でkeycloak環境を構築する為の構成でした。
次回はAWS環境でkeycloakを冗長構成 + DNS_PINGを用いた構成を上げていきたいと思います。
Discussion