см. также: - Кластер 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.
Создайте 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-адрес / имя хоста первого узла
Опишите службы для первого узла в конфигурационном файле 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-сервером.
Опишите службы для второго узла в конфигурационном файле 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
Примечание:
SKIP_INIT_CONFIG: "true". Это делается для запуска LDAP без какой-либо конфигурации на втором хосте; после включения репликации, как описано в последующих шагах, конфигурация будет получена с первого LDAP.Запустите контейнеры host1-ldap и mariadb на первом кластере
docker-compose up -d host1-ldap mariadb
Запустите контейнеры host2-ldap и mariadb на втором кластере
docker-compose up -d host2-ldap mariadb
Можно убедиться, что на втором кластере, зайдя в его LDAP с помощью Apache Directory Studio, он запущен без какой-либо конфигурации, тогда как LDAP первого кластера инициализирован конфигурацией архива по умолчанию.
Подготовьте репликацию для ldap на хосте 1 следующим образом:
docker exec <host1-ldap-container-name> prepare-replication
замените
Подготовьте репликацию для ldap на хосте 2 следующим образом:
docker exec <host2-ldap-container-name> prepare-replication
замените
Включите репликацию сначала для ldap на хосте 2, поскольку мы использовали SKIP_INIT_CONFIG: "true", следующим образом:
docker exec <host2-ldap-container-name> enable-replication
замените
Включите репликацию для ldap на хосте 1 следующим образом:
docker exec <host1-ldap-container-name> enable-replication
замените
Можно проверить успешность репликации LDAP, войдя в LDAP второго кластера с помощью Apache Directory Studio и убедившись, что конфигурация получена из LDAP первого кластера. В качестве альтернативы можно также изменить значение какого-либо атрибута в LDAP первого кластера и убедиться, что изменение отразилось в LDAP второго кластера.
Включите Master to Master Replication between two MariaDB Servers. Можно пропустить пункты 1 и 4, поскольку мы уже запустили контейнеры mariadb на обоих кластерах.
После успешной репликации LDAP и MariaDB запустите контейнеры keycloak, db (postgres) и arc на
первом кластере
docker-compose up -d keycloak db arc
Убедитесь, что 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 и не переопределил его настройки.
Запустите контейнеры 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]
После запуска 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


