Keycloak (Quarkus) + Postgres + UserStorage(mysql) Docker Composeで動かす

2023/08/19に公開

はじめに

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 --from=builder /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

参考リンク
https://www.keycloak.org/server/reverseproxy

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