← Навигация по документации

Кластер Keycloak с MariaDB и LDAP с использованием автономного Docker

см. также: - Кластер Keycloak с MariaDB и LDAP с использованием Docker Swarm - Keycloak - Blog - Keycloak Cluster Setup - Master to Master Replication between two MariaDB Servers

Примечание: Данная конфигурация предполагает запуск двух типов баз данных. MariaDB используется в качестве базы данных для бэкенда Keycloak, тогда как Postgres используется в качестве базы данных для бэкенда архива. LDAP-контейнеры обоих кластеров также синхронизированы, они используются контейнерами архива для хранения своих конфигураций, а контейнерами Keycloak — для доступа к User Federation.

  1. Создайте docker-compose.env для первого и второго кластеров следующим образом: INI ARCHIVE_HOST=<host1-IP-addr> STORAGE_DIR=/storage/fs1 POSTGRES_DB=pacsdb POSTGRES_USER=pacs POSTGRES_PASSWORD=pacs AUTH_SERVER_URL=http://keycloak:8843 Примечание: - В AUTH_SERVER_URL здесь используется keycloak в качестве имени хоста. На первом узле привяжите этот хост keycloak к IP-адресу первого узла в файле /etc/hosts. Это делается для имитации балансировщика нагрузки для двух кластеров. - Замените <host1-IP-addr> на IP-адрес / имя хоста первого узла

  2. Опишите службы для первого узла в конфигурационном файле docker-compose.yml (например): yaml version: "3" services: host1-ldap: image: dcm4che/slapd-dcm4chee:2.6.10-34.3 logging: driver: json-file options: max-size: "10m" ports: - "389:389" env_file: docker-compose.env environment: LDAP_URLS: "ldap://host1-ldap/" LDAP_REPLICATION_HOSTS: "ldap://host1-ldap/ ldap://host2-ldap/" extra_hosts: - "host2-ldap:host2-IP-addr" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/ldap1:/var/lib/openldap/openldap-data - /var/local/dcm4chee-arc/slapd1.d:/etc/openldap/slapd.d mariadb: image: mariadb:10.7.3 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: verys3cret MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: keycloak command: - "--log-bin" - "--log-basename=host1" - "--server-id=1" - "--replicate-do-db=keycloak" - "--auto_increment_increment=2" - "--auto_increment_offset=1" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/mysql:/var/lib/mysql keycloak: image: dcm4che/keycloak:26.0.6 logging: driver: json-file options: max-size: "10m" ports: - "8843:8843" - "7600:7600" environment: KC_DB: mariadb KC_DB_URL: jdbc:mariadb://mariadb:3306/keycloak?serverTimezone=Europe/Vienna JGROUPS_DISCOVERY_EXTERNAL_IP: host1 JGROUPS_DISCOVERY_PROTOCOL: TCPPING JGROUPS_DISCOVERY_INITIAL_HOSTS: "host2[7600],host1[7600]" KC_HTTPS_PORT: 8843 KC_HOSTNAME: https://host1-IP-addr:8843 KC_HOSTNAME_BACKCHANNEL_DYNAMIC: 'true' KC_BOOTSTRAP_ADMIN_USERNAME: admin KC_BOOTSTRAP_ADMIN_PASSWORD: changeit KC_LOG: file KEYCLOAK_WAIT_FOR: host1-ldap:389 mariadb:3306 depends_on: - host1-ldap - mariadb extra_hosts: - "ldap:host1-IP-addr" - "host1:host1-IP-addr" - "host2:host2-IP-addr" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/keycloak:/opt/keycloak/data db: image: dcm4che/postgres-dcm4chee:17.4-34 logging: driver: json-file options: max-size: "10m" ports: - "5432:5432" env_file: docker-compose.env volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/db:/var/lib/postgresql/data arc: image: dcm4che/dcm4chee-arc-psql:5.34.3-secure logging: driver: json-file options: max-size: "10m" ports: - "8080:8080" - "8443:8443" - "9990:9990" - "9993:9993" - "11112:11112" - "2575:2575" env_file: docker-compose.env extra_hosts: - "ldap:host1-IP-addr" - "host1:host1-IP-addr" environment: LDAP_URL: "ldap://host1-ldap/" WILDFLY_CHOWN: /opt/wildfly/standalone /storage WILDFLY_WAIT_FOR: host1-ldap:389 db:5432 depends_on: - host1-ldap - keycloak - db volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone - /var/local/dcm4chee-arc/storage:/storage замените host1-IP-addr и host2-IP-addr на IP-адреса хостов Docker, на которых запущены оба кластера; они должны разрешаться вашим DNS-сервером.

  3. Опишите службы для второго узла в конфигурационном файле docker-compose.yml (например): yaml version: "3" services: host2-ldap: image: dcm4che/slapd-dcm4chee:2.6.10-34.3 logging: driver: json-file options: max-size: "10m" ports: - "389:389" env_file: docker-compose.env environment: LDAP_URLS: "ldap://host2-ldap/" LDAP_REPLICATION_HOSTS: "ldap://host1-ldap/ ldap://host2-ldap/" SKIP_INIT_CONFIG: "true" extra_hosts: - "host1-ldap:host1-IP-addr" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc2/ldap2:/var/lib/openldap/openldap-data - /var/local/dcm4chee-arc2/slapd2.d:/etc/openldap/slapd.d mariadb: image: mariadb:10.7.3 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: verys3cret MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: keycloak command: - "--log-bin" - "--log-basename=host2" - "--server-id=2" - "--replicate-do-db=keycloak" - "--auto_increment_increment=2" - "--auto_increment_offset=2" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc2/mysql:/var/lib/mysql keycloak: image: dcm4che/keycloak:26.0.6 logging: driver: json-file options: max-size: "10m" ports: - "8843:8843" - "7600:7600" env_file: docker-compose.env environment: KC_DB: mariadb KC_DB_URL: jdbc:mariadb://mariadb:3306/keycloak?serverTimezone=Europe/Vienna JGROUPS_DISCOVERY_EXTERNAL_IP: host2 JGROUPS_DISCOVERY_PROTOCOL: TCPPING JGROUPS_DISCOVERY_INITIAL_HOSTS: "host1[7600],host2[7600]" KC_HTTPS_PORT: 8843 KC_HOSTNAME: host2-IP-addr KC_LOG: file KEYCLOAK_WAIT_FOR: host2-ldap:389 mariadb:3306 depends_on: - host2-ldap - mariadb extra_hosts: - "ldap:host2-IP-addr" - "host2:host2-IP-addr" - "host1:host1-IP-addr" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/keycloak:/opt/keycloak/data db: image: dcm4che/postgres-dcm4chee:17.4-34 ports: - "5432:5432" env_file: docker-compose.env volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc2/db:/var/lib/postgresql/data arc: image: dcm4che/dcm4chee-arc-psql:5.34.3-secure ports: - "8080:8080" - "8443:8443" - "9990:9990" - "9993:9993" - "8787:8787" - "11112:11112" - "2575:2575" extra_hosts: - "ldap:host2-IP-addr" - "host2:host2-IP-addr" env_file: docker-compose.env environment: LDAP_URL: "ldap://host2-ldap/" WILDFLY_CHOWN: /opt/wildfly/standalone /storage WILDFLY_WAIT_FOR: host2-ldap:389 db:5432 depends_on: - host2-ldap - keycloak - db volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc2/wildfly:/opt/wildfly/standalone - /var/local/dcm4chee-arc2/storage:/storage Примечание:

  4. Запустите контейнеры host1-ldap и mariadb на первом кластере docker-compose up -d host1-ldap mariadb

  5. Запустите контейнеры host2-ldap и mariadb на втором кластере docker-compose up -d host2-ldap mariadb

  6. Можно убедиться, что на втором кластере, зайдя в его LDAP с помощью Apache Directory Studio, он запущен без какой-либо конфигурации, тогда как LDAP первого кластера инициализирован конфигурацией архива по умолчанию.

  7. Подготовьте репликацию для ldap на хосте 1 следующим образом: docker exec <host1-ldap-container-name> prepare-replication замените именем контейнера ldap на хосте 1

  8. Подготовьте репликацию для ldap на хосте 2 следующим образом: docker exec <host2-ldap-container-name> prepare-replication замените именем контейнера ldap на хосте 2

  9. Включите репликацию сначала для ldap на хосте 2, поскольку мы использовали SKIP_INIT_CONFIG: "true", следующим образом: docker exec <host2-ldap-container-name> enable-replication замените именем контейнера ldap на хосте 2

  10. Включите репликацию для ldap на хосте 1 следующим образом: docker exec <host1-ldap-container-name> enable-replication замените именем контейнера ldap на хосте 1

  11. Можно проверить успешность репликации LDAP, войдя в LDAP второго кластера с помощью Apache Directory Studio и убедившись, что конфигурация получена из LDAP первого кластера. В качестве альтернативы можно также изменить значение какого-либо атрибута в LDAP первого кластера и убедиться, что изменение отразилось в LDAP второго кластера.

  12. Включите Master to Master Replication between two MariaDB Servers. Можно пропустить пункты 1 и 4, поскольку мы уже запустили контейнеры mariadb на обоих кластерах.

  13. После успешной репликации LDAP и MariaDB запустите контейнеры keycloak, db (postgres) и arc на первом кластере docker-compose up -d keycloak db arc

  14. Убедитесь, что Keycloak на первом кластере полностью запущен и работает, проверив журналы сервера: 2023-01-20 08:35:01,084 INFO [org.infinispan.CLUSTER] (keycloak-cache-init) ISPN000094: Received new cluster view for channel ISPN: [608a234f883d-50184|0] (1) [608a234f883d-50184] 2023-01-20 08:35:01,101 INFO [org.infinispan.CLUSTER] (keycloak-cache-init) ISPN000079: Channel `ISPN` local address is `608a234f883d-50184`, physical addresses are `[172.31.0.4:40072]` 2023-01-20 08:35:45,439 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: 608a234f883d-50184, Site name: null 2023-01-20 08:35:45,543 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener 2023-01-20 08:35:45,551 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm 2023-01-20 08:35:49,777 INFO [org.keycloak.services] (main) KC-SERVICES0004: Imported realm dcm4che from file /opt/keycloak/bin/../data/import/dcm4che-realm.json. 2023-01-20 08:35:50,194 INFO [io.quarkus] (main) Keycloak 21.0.0 on JVM (powered by Quarkus 2.13.3.Final) started in 59.278s. Listening on: https://0.0.0.0:8843 2023-01-20 08:35:50,194 INFO [io.quarkus] (main) Profile prod activated. 2023-01-20 08:35:50,194 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, jdbc-mariadb, jdbc-mssql, jdbc-mysql, jdbc-oracle, jdbc-postgresql, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy, resteasy-jackson, smallrye-context-propagation, smallrye-health, smallrye-metrics, vault, vertx] 2023-01-20 08:35:50,378 INFO [org.keycloak.services] (main) KC-SERVICES0009: Added user 'admin' to realm 'master' Это нужно для того, чтобы при запуске Keycloak на втором кластере он обнаружил realm dcm4che в кластеризованной базе данных MariaDB и не переопределил его настройки.

  15. Запустите контейнеры keycloak, db (postgres) и arc на втором кластере. docker-compose up -d keycloak db arc Проверьте журналы Keycloak на втором кластере, как описано в предыдущем пункте. 2023-01-20 07:37:34,906 INFO [org.infinispan.CLUSTER] (keycloak-cache-init) ISPN000094: Received new cluster view for channel ISPN: [1d1ff27e148f-58712|0] (1) [1d1ff27e148f-58712] 2023-01-20 07:37:34,909 INFO [org.infinispan.CLUSTER] (keycloak-cache-init) ISPN000079: Channel `ISPN` local address is `1d1ff27e148f-58712`, physical addresses are `[172.26.0.6:60822]` 2023-01-20 07:37:35,259 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: 1d1ff27e148f-58712, Site name: null 2023-01-20 07:37:35,865 INFO [org.keycloak.services] (main) KC-SERVICES0003: Not importing realm dcm4che from file /opt/keycloak/bin/../data/import/dcm4che-realm.json. It already exists. 2023-01-20 07:37:35,878 INFO [org.keycloak.services] (main) KC-SERVICES0003: Not importing realm dcm4che from file /opt/keycloak/bin/../data/import/dcm4che-realm.json. It already exists. 2023-01-20 07:37:36,176 INFO [io.quarkus] (main) Keycloak 21.0.0 on JVM (powered by Quarkus 2.13.3.Final) started in 9.549s. Listening on: https://0.0.0.0:8843 2023-01-20 07:37:36,176 INFO [io.quarkus] (main) Profile prod activated. 2023-01-20 07:37:36,176 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, jdbc-mariadb, jdbc-mssql, jdbc-mysql, jdbc-oracle, jdbc-postgresql, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy, resteasy-jackson, smallrye-context-propagation, smallrye-health, smallrye-metrics, vault, vertx]

  16. После запуска Keycloak и контейнеров архиса перейдите к проверке OIDC-клиента для UI архива в Keycloak на Keycloak первого кластера. Valid Redirect URIs и Web Origins должны содержать специфичные URL архива обоих кластеров, (например): Root URL : https://host1:8443/dcm4chee-arc/ui2 Admin URL : https://host1:8443/dcm4chee-arc/ui2 Valid Redirect URI : http://host1:8080/dcm4chee-arc/ui2/* https://host1:8443/dcm4chee-arc/ui2/* http://host2:8080/dcm4chee-arc/ui2/* https://host2:8443/dcm4chee-arc/ui2/* Web Origins : http://host1:8080 https://host1:8443 http://host2:8080 https://host2:8443

  1. Откройте два браузера (например, один обычный Firefox и один Firefox в режиме приватного доступа) одновременно и войдите в UI архива обоих узлов.

  1. В административной консоли Keycloak убедитесь, что у вошедшего пользователя две сессии.