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

см. Настройка тестовой среды Docker Swarm с использованием Multipass

Защищённые службы архива с использованием Keycloak в качестве сервера аутентификации и сохранением системных журналов и журналов аудита в Elastic Stack, распределённые по 3 узлам:

Убедитесь, что на вашем DNS-сервере есть запись имени хоста для узла архива (Archive Node).
(Необязательно) Создайте системные группы и пользователей с определёнными ID групп и пользователей, используемыми службами архива
На узле архива (Archive Node)
$ sudo -i
# groupadd -r dcm4chee-arc --gid=1023 && useradd -r -g dcm4chee-arc --uid=1023 dcm4chee-arc
# groupadd -r keycloak-dcm4chee --gid=1029 && useradd -r -g keycloak-dcm4chee --uid=1029 keycloak-dcm4chee
# exit
На узле базы данных (Database Node)
$ sudo -i
# groupadd -r slapd-dcm4chee --gid=1021 && useradd -r -g slapd-dcm4chee --uid=1021 slapd-dcm4chee
# groupadd -r postgres-dcm4chee --gid=999 && useradd -r -g postgres-dcm4chee --uid=999 postgres-dcm4chee
# exit
Системная конфигурация для Elasticsearch на узле Elastic Stack
$ sudo -i
# sysctl -w vm.swappiness=1
# echo 'vm.swappiness=1' >> /etc/sysctl.conf (для сохранения после перезагрузки)
# exit
$ sudo -i
# sysctl -w vm.max_map_count=262144
# echo 'vm.max_map_count=262144' >> /etc/sysctl.conf (для сохранения после перезагрузки)
# exit
Создайте каталоги на хосте для bind-монтирования
На узле архива (Archive Node)
$ sudo mkdir -p /var/local/dcm4chee-arc/keycloak
$ sudo mkdir -p /var/local/dcm4chee-arc/wildfly
$ sudo mkdir -p /var/local/dcm4chee-arc/storage
На узле базы данных (Database Node)
$ sudo mkdir -p /var/local/dcm4chee-arc/ldap
$ sudo mkdir -p /var/local/dcm4chee-arc/slapd.d
$ sudo mkdir -p /var/local/dcm4chee-arc/db
$ sudo mkdir -p /var/local/dcm4chee-arc/mysql
На узле Elastic Stack
$ sudo mkdir -p /var/local/dcm4chee-arc/esdatadir
$ sudo chmod g+rwx /var/local/dcm4chee-arc/esdatadir
$ sudo chgrp 0 /var/local/dcm4chee-arc/esdatadir

Обеспечьте у Elasticsearch доступ на запись к bind-монтированным каталогам config, data и log, предоставив групповой доступ с gid 0 для локального каталога.

$ sudo mkdir -p /var/local/dcm4chee-arc/esdatadir
$ sudo mkdir -p /var/local/dcm4chee-arc/logstash
$ sudo touch /var/local/dcm4chee-arc/logstash/filter-hashtree

Обеспечьте у Logstash (uid=1000) доступ на запись к отображённому файлу, используемому для сохранения отпечатка последнего аудиторского сообщения — настраиваемому переменной окружения HASH_FILE:

$ sudo chown 1000:1000 /var/local/dcm4chee-arc/logstash/filter-hashtree
Создайте swarm

Выполните следующую команду для создания нового swarm на любом из узлов:

$ docker swarm init --advertise-addr <NODE-IP>

Например:

$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

На каждом из остальных 2 узлов выполните команду из вывода $ docker swarm init, чтобы создать узел worker, присоединённый к swarm, например:

$ docker swarm join \
--token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

This node joined a swarm as a worker.

Чтобы просмотреть список узлов в swarm, выполните $ docker node ls на узле manager (= там, где вы создали swarm), например:

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
jill34qzqqz9x5zlo5vg69sq4     elk-node            Ready               Active              
o5xraaz2lhxe8bhmjt22mzzka *   arc-node            Ready               Active              Leader
rw89dvm047372gswfmzp0v0vh     db-node             Ready               Active              

Далее можно использовать Docker Service либо, в качестве альтернативы, Docker Stack:

Использование Docker Service

  1. Создайте overlay network

    Создайте overlay network на узле manager: $ docker network create --driver overlay dcm4chee_default

  2. Разверните Elasticsearch в swarm

    Создайте Swarm Service, запускающий Elasticsearch на узле Elastic Stack, например: $ docker service create \ --network dcm4chee_default \ --name elasticsearch \ --constraint 'node.hostname == <elk-node>' \ -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \ -e discovery.type=single-node \ -e xpack.security.enabled=false \ -p published=9200,target=9200,mode=host \ -p published=9300,target=9300,mode=host \ --endpoint-mode dnsrr \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/esdatadir,dst=/usr/share/elasticsearch/data \ -d docker.elastic.co/elasticsearch/elasticsearch:8.15.1

    Замените <elk-node> на имя хоста узла Elastic Stack.

    -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" — задаёт размер кучи JVM, используемый Elasticsearch.

    -e discovery.type=single-node — устанавливает тип discovery в single-node; иначе Elasticsearch не запустится из-за невыполненных Bootstrap Checks при запуске.

-e xpack.security.enabled=false — отключает функции безопасности, иначе Logstash не сможет подключиться к Elasticsearch по обычному http.

```
-p published=9200,target=9200,mode=host \
-p published=9300,target=9300,mode=host \
--endpoint-mode dnsrr \
```
публикует REST-порт (`9200`) и порт внутрисетевого обмена (`9300`) Elasticsearch непосредственно на `<elk-node>`,
[в обход routing mesh](https://docs.docker.com/engine/swarm/ingress/#bypass-the-routing-mesh), чтобы обеспечить
доступ клиентам вне swarm. Это не требуется для работы архива, поскольку контейнеры Logstash и
Kibana подключаются к Elasticsearch через созданную overlay network.

Bind mount `--mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly` и
`--mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly` дублирует ваш часовой пояс хоста внутри контейнера.
В противном случае часовой пояс контейнера — UTC. **Внимание:** Если на узле Elastic Stack нет файла `/etc/timezone`,
его необходимо создать (например: `$ echo "Europe/Vienna" > /etc/timezone`) перед запуском контейнера, иначе
контейнер не запустится.

Bind mount `--mount type=bind,src=/var/local/dcm4chee-arc/esdatadir,/usr/share/elasticsearch/data` обеспечивает
хранение данных в указанном каталоге хоста. Каталог инициализируется при первом запуске контейнера, если он ещё
не существует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном
создании контейнера Elasticsearch.
  1. Разверните Kibana в swarm

    Создайте Swarm Service, запускающий Kibana на узле Elastic Stack, например: $ docker service create \ --network dcm4chee_default \ --name kibana \ --constraint 'node.hostname == <elk-node>' \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ -d docker.elastic.co/kibana/kibana:8.15.1

    Замените <elk-node> на имя хоста узла Elastic Stack.

    Вы можете разрешить доступ к Kibana из любого веб-браузера без аутентификации пользователя, опубликовав http-порт Kibana для клиентов вне swarm.

    В противном случае веб-браузеры должны обращаться к Kibana через Keycloak Proxy, который выполняет аутентификацию пользователя в Keycloak и перенаправляет HTTP-запросы от авторизованных пользователей в Kibana через созданную overlay network.

    Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле Elastic Stack нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.

  2. Разверните Logstash в swarm

    Создайте Swarm Service, запускающий Logstash на узле Elastic Stack, например: $ docker service create \ --network dcm4chee_default \ --name logstash \ --constraint 'node.hostname == <elk-node>' \ -p published=12201,target=12201,protocol=udp,mode=host \ -p published=8514,target=8514,protocol=udp,mode=host \ -p published=8514,target=8514,mode=host \ --endpoint-mode dnsrr \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/logstash/filter-hashtree,dst=/usr/share/logstash/data/filter-hashtree \ -d dcm4che/logstash-dcm4chee:8.15.1-18

    Замените <elk-node> на имя хоста узла Elastic Stack.

    -p published=12201,target=12201,protocol=udp,mode=host \ -p published=8514,target=8514,protocol=udp,mode=host \ -p published=8514,target=8514,mode=host \ --endpoint-mode dnsrr \ публикует настроенные порты GELF Logger (12201) и Syslog (8514) Logstash непосредственно на <elk-node>, в обход routing mesh, чтобы обеспечить доступ клиентам вне swarm. Публикация порта GELF Logger также необходима, если другие службы настроили GELF Logging Driver для отправки журналов в Logstash. Keycloak и приложение архива подключаются к Logstash через созданную overlay network, поэтому они не зависят от публикации этих портов.

    Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле Elastic Stack нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед созданием службы, иначе контейнер не запустится.

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/logstash/filter-hashtree,dst=/usr/share/logstash/data/filter-hashtree обеспечивает хранение файла с отпечатком последнего аудиторского сообщения — настраиваемого переменной окружения HASH_FILE со значением по умолчанию /usr/share/logstash/data/filter-hashtree — вне контейнера, чтобы избегать запуска нового дерева хэшей при каждом пересоздании контейнера. Внимание: Файл должен уже существовать и быть доступен для записи пользователю logstash в контейнере (uid=1000).

  3. Разверните OpenLDAP Server в swarm

    Создайте Swarm Service, запускающий LDAP-сервер на узле базы данных, например: $ docker service create \ --network dcm4chee_default \ --name ldap \ --constraint 'node.hostname == <db-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=slapd \ -p published=389,target=389,mode=host \ --endpoint-mode dnsrr \ -e STORAGE_DIR=/storage/fs1 \ -e ARCHIVE_HOST=<arc-node> \ -e SYSLOG_HOST=<elk-node> \ -e SYSLOG_PORT=8514 \ -e SYSLOG_PROTOCOL=TLS \ --mount type=bind,src=/var/local/dcm4chee-arc/ldap,dst=/var/lib/openldap/openldap-data \ --mount type=bind,src=/var/local/dcm4chee-arc/slapd.d,dst=/etc/openldap/slapd.d \ -d dcm4che/slapd-dcm4chee:2.6.10-34.3

    Замените <arc-node>, <db-node> и <elk-node> на имена хостов узлов архива, базы данных и Elastic Stack.

    --log-driver gelf \ --log-opt gelf-address=udp://logstash:12201 \ --log-opt tag=slapd \ настраивает GELF Logging Driver для службы.

    -p published=389,target=389,mode=host \ --endpoint-mode dnsrr \ публикует ldap-порт 389 непосредственно на <db-node>, в обход routing mesh, чтобы обеспечить доступ LDAP-клиентам вне swarm. Это не требуется для работы архива, поскольку контейнер архива подключается к LDAP-порту контейнера LDAP-сервера через созданную overlay network.

    -e STORAGE_DIR=/storage/fs1 указывает /storage/fs1 (по умолчанию: /opt/wildfly/standalone/data/fs1) как путь к каталогу — внутри контейнера архива — где архив хранит полученные DICOM-объекты.

    -e SYSLOG_HOST=logstash -e SYSLOG_PORT=8514 -e SYSLOG_PROTOCOL=TLS указывает отправлять аудиторские журналы в контейнер Logstash, используя TLS (по умолчанию: UDP).

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/ldap,dst=/var/lib/openldap и --mount type=bind,src=/var/local/dcm4chee-arc/slapd.d,dst=/etc/openldap/slapd.d обеспечивает хранение базы данных LDAP и конфигурации OpenLDAP-сервера в указанных каталогах хоста. Они инициализируются при первом запуске контейнера, если они ещё не существуют в указанных каталогах хоста. Это гарантирует, что изменения в конфигурации архива не будут потеряны при удалении и повторном создании контейнера OpenLDAP Server.

  4. Разверните MariaDB Server, используемый сервером аутентификации Keycloak

Создайте Swarm Service, запускающий MariaDB Server на узле базы данных, например: $ docker service create \ --network dcm4chee_default \ --name mariadb \ --constraint 'node.hostname == <db-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=mariadb \ -p published=3306,target=3306,mode=host \ --endpoint-mode dnsrr \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=keycloak \ -e MYSQL_USER=keycloak \ -e MYSQL_PASSWORD=keycloak \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/mysql,dst=/var/lib/omysql \ -d mariadb:10.11.4 Замените <db-node> и <elk-node> на имена хостов узлов базы данных и Elastic Stack.

```
--log-driver gelf \
--log-opt gelf-address=udp://<elk-node>:12201 \
--log-opt tag=mariadb \
```
настраивает [GELF Logging Driver](https://docs.docker.com/engine/admin/logging/gelf/) для службы.

```
-p published=3306,target=3306,mode=host \
--endpoint-mode dnsrr \
```
публикует порт MariaDB Server `3306` непосредственно на `<db-node>`, [в обход routing mesh](https://docs.docker.com/engine/swarm/ingress/#bypass-the-routing-mesh),
чтобы обеспечить доступ к MariaDB Server также для клиентов MariaDB/MySQL вне swarm. Это не требуется для работы Keycloak,
поскольку контейнер Keycloak подключается к серверному порту контейнера MariaDB Server через созданную overlay network.

```
-e MYSQL_ROOT_PASSWORD=secret
-e MYSQL_DATABASE=keycloak \
-e MYSQL_USER=keycloak \
-e MYSQL_PASSWORD=keycloak \
```

задают пароль суперпользователя root MariaDB, имя базы данных, пользователя и его пароль.

См. дополнительные переменные окружения контейнера MariaDB.

Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле архива нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед созданием службы, иначе контейнер не запустится.

Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/mysql,dst=/var/lib/mysql обеспечивает хранение базы данных в указанном каталоге хоста. Она инициализируется при первом запуске контейнера, если она ещё не существует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании контейнера MariaDB Server.

  1. Разверните сервер аутентификации Keycloak в swarm

    Создайте Swarm Service, запускающий предварительно настроенный сервер аутентификации Keycloak на узле архива, например: $ docker service create \ --network dcm4chee_default \ --name keycloak \ --constraint 'node.hostname == <arc-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=keycloak \ -p published=8843,target=8843,mode=host \ --endpoint-mode dnsrr \ -e KC_HTTPS_PORT=8843 \ -e KC_HOSTNAME=https://<arc-node>:8843 \ -e KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true \ -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \ -e KC_BOOTSTRAP_ADMIN_PASSWORD=changeit \ -e KC_DB=mariadb \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_URL_HOST=mariadb \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=keycloak \ -e KC_LOG=file,gelf \ -e KC_LOG_GELF_HOST=<elk-node> \ -e ARCHIVE_HOST=<arc-node> \ -e LOGSTASH_HOST=logstash \ -e KIBANA_CLIENT_ID=kibana \ -e KIBANA_CLIENT_SECRET=changeit \ -e KIBANA_REDIRECT_URL=https://<arc-node>:8643/oauth2/callback/* \ -e KEYCLOAK_WAIT_FOR="ldap:389 mariadb:8514 logstash:8514" \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/keycloak,dst=/opt/keycloak/data \ -d dcm4che/keycloak:26.0.6

    Замените <arc-node> и <elk-node> на имена хостов узлов архива и Elastic Stack.

    --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=keycloak \ настраивает GELF Logging Driver для службы.

    -p published=8843,target=8843,mode=host \ --endpoint-mode dnsrr \ публикует https-порт (8843) Keycloak непосредственно на <arc-node>, в обход routing mesh, чтобы обеспечить доступ http(s)-клиентам вне swarm.

    Номер https-порта задаётся в -e HTTPS_PORT=8843 \ чтобы избежать конфликтов с https-портом, используемым Wildfly с развёрнутым по умолчанию приложением dcm4che Archive 5.

    Если вы установили переменные окружения LDAP_BASE_DN, LDAP_ROOTPASS для службы LDAP, вы должны установить эти переменные окружения также для службы Keycloak. В противном случае Keycloak не сможет подключиться к LDAP-серверу.

    -e KEYCLOAK_WAIT_FOR="ldap:389 mariadb:8514 logstash:8514" задерживает запуск Keycloak до тех пор, пока OpenLDAP, MariaDB и Logstash не начнут прослушивание указанных портов.

    Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле архива нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед созданием службы, иначе контейнер не запустится.

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/keycloak,dst=/opt/keycloak/data обеспечивает хранение конфигурации сервера Keycloak в указанном каталоге хоста. Каталог инициализируется при первом запуске контейнера, если он ещё не существует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании контейнера Keycloak Server.

    Дополнительные переменные окружения контейнера Keycloak см. на https://github.com/dcm4che-dockerfiles/keycloak#environment-variables.

  2. Разверните PostgreSQL Server в swarm

    Создайте Swarm Service, запускающий PostgreSQL на узле базы данных, например: $ docker service create \ --network dcm4chee_default \ --name db \ --constraint 'node.hostname == <db-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://logstash:12201 \ --log-opt tag=postgres \ -p published=5432,target=5432,mode=host \ --endpoint-mode dnsrr \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/db,dst=/var/lib/postgresql/data \ -d dcm4che/postgres-dcm4chee:17.4-34

    Замените <db-node> и <elk-node> на имена хостов узлов базы данных и Elastic Stack.

    --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=postgres \ настраивает GELF Logging Driver для службы.

    -p published=5432,target=5432,mode=host \ --endpoint-mode dnsrr \ публикует порт PostgreSQL Server 5432 непосредственно на , в обход routing mesh, чтобы обеспечить доступ PostgreSQL-клиентам вне swarm. Это не требуется для работы архива, поскольку контейнер архива подключается к серверному порту контейнера PostgreSQL Server через созданную overlay network.

    -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ задают имя базы данных, пользователя и его пароль.

    Дополнительные переменные окружения контейнера PostgreSQL см. на https://github.com/dcm4che-dockerfiles/postgres-dcm4chee#environment-variables.

    Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле базы данных нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед созданием службы, иначе контейнер не запустится.

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/db,dst=/var/lib/postgresql/data обеспечивает хранение базы данных в указанном каталоге хоста. Она инициализируется при первом запуске контейнера, если она ещё не существует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании контейнера PostgreSQL Server.

  3. Разверните Wildfly с dcm4che Archive 5 в swarm

    Создайте Swarm Service, запускающий Wildfly с развёрнутым приложением dcm4che Archive 5 на узле архива, например: $ docker service create \ --network dcm4chee_default \ --name arc \ --constraint 'node.hostname == <arc-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://logstash:12201 \ --log-opt tag=dcm4chee-arc \ -p published=8080,target=8080,mode=host \ -p published=8443,target=8443,mode=host \ -p published=9990,target=9990,mode=host \ -p published=9993,target=9993,mode=host \ -p published=11112,target=11112,mode=host \ -p published=2762,target=2762,mode=host \ -p published=2575,target=2575,mode=host \ -p published=12575,target=12575,mode=host \ --endpoint-mode dnsrr \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ -e LOGSTASH_HOST=logstash \ -e WILDFLY_WAIT_FOR='ldap:389 db:5432 logstash:8514' \ -e WILDFLY_CHOWN='/opt/wildfly/standalone /storage' \ -e AUTH_SERVER_URL=https://<arc-node>:8843 \ --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly \ --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly \ --mount type=bind,src=/var/local/dcm4chee-arc/wildfly,dst=/opt/wildfly/standalone \ --mount type=bind,src=/var/local/dcm4chee-arc/storage,dst=/storage \ -d dcm4che/dcm4chee-arc-psql:5.34.3-secure

    Замените <arc-node> и <elk-node> на имена хостов узлов архива и Elastic Stack.

    --log-driver gelf \ --log-opt gelf-address=udp://<elk-node>:12201 \ --log-opt tag=dcm4chee-arc \ настраивает GELF Logging Driver для службы.

    -p published=8080,target=8080,mode=host \ -p published=8443,target=8443,mode=host \ -p published=9990,target=9990,mode=host \ -p published=9993,target=9993,mode=host \ -p published=11112,target=11112,mode=host \ -p published=2762,target=2762,mode=host \ -p published=2575,target=2575,mode=host \ -p published=12575,target=12575,mode=host \ --endpoint-mode dnsrr \ публикует http-порт (8080) и https-порт (8443) веб-сервера, http-порт (9990) и https-порт (9993) WildFly Administration Console, а также DICOM-порт (11112), DICOM TLS-порт (2762), HL7-порт (2575) и HL7 TLS-порт (12575) приложения архива непосредственно на <arc-node>, в обход routing mesh, чтобы обеспечить доступ http(s)-клиентов, DICOM-приложений и отправителей HL7 вне swarm.

    Переменные окружения: -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ задают имя базы данных, пользователя и пароль для подключения к серверу PostgreSQL, которые должны совпадать со значениями, указанными для контейнера PostgreSQL Server. В противном случае приложение архива не сможет подключиться к серверу PostgreSQL.

    Если вы установили переменные окружения LDAP_BASE_DN, LDAP_ROOTPASS или ARCHIVE_DEVICE_NAME для контейнера LDAP-сервера, вы должны установить эти переменные окружения также для контейнера архива. В противном случае приложение архива не сможет подключиться к LDAP-серверу или не найдёт свою конфигурацию в каталоге LDAP.

    -e WILDFLY_WAIT_FOR='ldap:389 db:5432 logstash:8514' задерживает запуск WildFly до тех пор, пока OpenLDAP slapd, PostgreSQL и Logstash не начнут прослушивание указанных портов.

    -e WILDFLY_CHOWN="/opt/wildfly/standalone /storage" обеспечивает системному пользователю, запускающему WilfFly в контейнере архива, доступ на запись к конфигурации Wildfly и каталогу Archive Storage — как указано в -e STORAGE_DIR=/storage/fs1 контейнера LDAP.

    -e AUTH_SERVER_URL=https://<arc-node>:8843 — замените <arc-node> на имя хоста узла архива, которое должно разрешаться вашим DNS-сервером, — указывает Keycloak перенаправлять запросы от не выполнивших вход пользователей на страницу входа Keycloak.

    Если вы установили переменные окружения REALM_NAME или SSL_REQUIRED для контейнера Keycloak server, вы должны установить эти переменные окружения также для контейнера архива. В противном случае фоновый внеполосный REST-вызов к Keycloak для авторизации пользователя завершится ошибкой.

    Если вы хотите запустить более одного контейнера архива, вам следует указать различные значения переменной окружения UI_CLIENT_ID (по умолчанию: dcm4chee-arc-ui) и зарегистрировать каждый из UI архива в Keycloak.

    Дополнительные переменные окружения контейнера архива см. на https://github.com/dcm4che-dockerfiles/dcm4chee-arc-psql#environment-variables.

    Bind mount --mount type=bind,src=/etc/localtime,dst=/etc/localtime,readonly и --mount type=bind,src=/etc/timezone,dst=/etc/timezone,readonly дублирует ваш часовой пояс хоста внутри контейнера. В противном случае часовой пояс контейнера — UTC. Внимание: Если на узле архива нет файла /etc/timezone, его необходимо создать (например: $ echo "Europe/Vienna" > /etc/timezone) перед созданием службы, иначе контейнер не запустится.

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/wildfly,dst=/opt/wildfly/standalone обеспечивает хранение конфигурации сервера Wildfly в указанном каталоге хоста. Каталог инициализируется при первом запуске контейнера, если он ещё не существует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании контейнера Archive Server.

    Bind mount --mount type=bind,src=/var/local/dcm4chee-arc/storage,dst=/storage обеспечивает фактическое хранение полученных DICOM-объектов, сохранённых в /storage/fs1, как указано в -e STORAGE_DIR=/storage/fs1 контейнера LDAP, в указанном каталоге хоста, что гарантирует, что сохранённые DICOM-объекты не будут потеряны при удалении и повторном создании контейнера Archive Server.

  4. Проверьте OIDC-клиента для UI архива в Keycloak

    Войдите с именем пользователя/паролем root/changeit в Realm Admin Console Keycloak по адресу https://<arc-node>:8843/admin/dcm4che/console — замените \ на имя хоста узла архива. Если вы изменили имя realm по умолчанию: dcm4che через переменную окружения REALM_NAME для контейнеров Keycloak и Archive, вам также следует заменить dcm4che на это значение в URL.

    Docker-образ Keycloak dcm4che/keycloak:19.0.1 и новее создаёт OIDC-клиента для UI архива при первом запуске; он настраивается через переменные окружения UI_CLIENT_ID, ARCHIVE_HOST, ARCHIVE_HTTP_PORT и ARCHIVE_HTTPS_PORT:

  5. Проверьте OIDC-клиента для Wildfly Administration Console в Keycloak

    Доступ к Wildfly Administration Console также защищён с помощью Keycloak.

    Docker-образ Keycloak dcm4che/keycloak:19.0.1 и новее также создаёт дополнительный OIDC-клиент для Wildfly Administration Console при первом запуске; он настраивается через переменные окружения WILDFLY_CONSOLE, ARCHIVE_HOST и ARCHIVE_MANAGEMENT_HTTPS_PORT:

    Только пользователи с ролью ADMINISTRATOR имеют доступ к WildFly Administration Console.

    Выйдите из системы перед тем, как проверять, что доступ к WildFly Administration Console по адресу http://<arc-node>:9990 или https://<arc-node>:9993 перенаправит вас на страницу входа Keycloak. Вы можете войти с именем пользователя/паролем root/changeit.

  6. Проверьте OIDC-клиента для OAuth2-Proxy, защищающего Kibana, в Keycloak

    Войдите с именем пользователя/паролем root/changeit в Realm Admin Console Keycloak по адресу https://<arc-node>:8843/admin/dcm4che/console — замените \ на имя хоста узла архива. Если вы изменили имя realm по умолчанию: dcm4che через переменную окружения REALM_NAME для контейнеров Keycloak, Keycloak Proxy и Archive, вам также следует заменить dcm4che на это значение в URL.

    Docker-образ Keycloak dcm4che/keycloak:19.0.1 и новее создаёт OIDC-клиента для OAuth2-Proxy, защищающего Kibana, при первом запуске; он настраивается через переменные окружения KIBANA_CLIENT_ID, KIBANA_CLIENT_SECRET и KIBANA_REDIRECT_URL:

    с Audience Token Mapper audience:

    и Client Credential changeit:

    который вы можете/должны Regenerate Secret и скопировать новое значение, чтобы передать его как переменную окружения OAUTH2_PROXY_CLIENT_SECRET в контейнер OAuth2 Proxy на следующем шаге.

    1. Запустите OAuth2 Proxy, защищающий Kibana

    Oauth2-proxy можно настроить через параметры командной строки, переменные окружения или файл конфигурации (в порядке убывания приоритета, т.е. параметры командной строки переопределяют переменные окружения, а переменные окружения переопределяют настройки файла конфигурации).

    Создайте Swarm Service, запускающий OAuth2 Proxy на узле архива, например: $ docker service create \ --network dcm4chee_default \ --name oauth2-proxy \ --constraint 'node.hostname == <arc-node>' \ --log-driver gelf \ --log-opt gelf-address=udp://elk-node:12201 \ --log-opt tag=oauth2-proxy \ -p published=8643,target=8643,mode=host \ --endpoint-mode dnsrr \ -e OAUTH2_PROXY_HTTPS_ADDRESS=0.0.0.0:8643 \ -e OAUTH2_PROXY_PROVIDER=keycloak-oidc \ -e OAUTH2_PROXY_SKIP_PROVIDER_BUTTON=true \ -e OAUTH2_PROXY_UPSTREAMS=http://kibana:5601 \ -e OAUTH2_PROXY_OIDC_ISSUER_URL=https://arc-node:8843/realms/dcm4che \ -e OAUTH2_PROXY_REDIRECT_URL=https://arc-node:8643/oauth2/callback \ -e OAUTH2_PROXY_ALLOWED_ROLES=auditlog \ -e OAUTH2_PROXY_CLIENT_ID=kibana \ -e OAUTH2_PROXY_CLIENT_SECRET=changeit \ -e OAUTH2_PROXY_EMAIL_DOMAINS=* \ -e OAUTH2_PROXY_OIDC_EMAIL_CLAIM=sub \ -e OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL=true \ -e OAUTH2_PROXY_COOKIE_SECRET=T0F1dGhLaWJhbmFUZXN0cw== \ -e OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY=true \ -e OAUTH2_PROXY_TLS_CERT_FILE=/etc/certs/cert.pem \ -e OAUTH2_PROXY_TLS_KEY_FILE=/etc/certs/key.pem \ -e OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR=/templates \ -d dcm4che/oauth2-proxy:7.7.1

Примечание : - OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<arc-node>:8843/realms/dcm4che" применяется только для Keycloak v18.0+ и если используется значение по умолчанию KC_HTTP_RELATIVE_PATH. - Если используются более ранние версии Keycloak или если KC_HTTP_RELATIVE_PATH установлен в /auth для Keycloak v18.0+, тогда OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<arc-node>:8843/auth/realms/dcm4che"

 - `-p 8643:8643` — публикует https-порт (`8643`) OAuth2-Proxy из контейнера на хост, чтобы
   разрешить подключения от внешних https-клиентов к OAuth2-Proxy, что должно совпадать с
 - `-e OAUTH2_PROXY_HTTPS_ADDRESS=0.0.0.0:8643` — портом для прослушивания, и с портом
 - `-e OAUTH2_PROXY_PROVIDER=kibana-oidc` — указывает поставщика OAuth.
 - `-e OAUTH2_PROXY_SKIP_PROVIDER_BUTTON` опционален. Если установлен в `true`, он пропускает страницу входа с указанием
   `Sign-on with Keycloak` и напрямую отображает страницу входа Keycloak.
 - `-e OAUTH2_PROXY_UPSTREAMS=http://kibana:5601` — указывает https-URL Kibana в качестве upstream-endpoint
 - `-e OAUTH2_PROXY_OIDC_ISSUER_URL=https://<arc-node>:8843/realms/dcm4che` — указывает URL-адрес издателя OpenID Connect,
   где порт (`8843`) соответствует `KC_HTTPS_PORT`, использованному при запуске контейнера Keycloak
 - `-e OAUTH2_PROXY_REDIRECT_URL=https://<arc-node>:8643/oauth2/callback` — URL-адрес перенаправления для URL-адреса обратного вызова
   сервера аутентификации Keycloak — замените _\<arc-node>_ на имя хоста узла архива, которое должно
   разрешаться вашим DNS-сервером.
 - `-e OAUTH2_PROXY_ALLOWED_ROLES=auditlog` — (keycloak-oidc) ограничивает вход членами этих ролей (может указываться несколько раз)
 - `-e OAUTH2_PROXY_CLIENT_ID=kibana` — указывает Client ID, используемый для аутентификации на сервере Keycloak,
 - `-e OAUTH2_PROXY_CLIENT_SECRET=<kibana-client-secret>` — указывает Client Secret, используемый для аутентификации
   на сервере аутентификации Keycloak для клиента типа _Confidential_ — _kibana_. Значение должно совпадать с тем, которое
   использовалось при запуске контейнера _keycloak_.
 - `-e OAUTH2_PROXY_EMAIL_DOMAINS="*"` как `*` указывает аутентифицировать любой email.
 - `-e OAUTH2_PROXY_OIDC_EMAIL_CLAIM="preferred_username"` — какой claim OIDC содержит email пользователя (по умолчанию "email")
 - `-e OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL="true"` — указывает не завершаться ошибкой, если адрес email в id_token не подтверждён
 - `-e OAUTH2_PROXY_COOKIE_SECRET=T0F1dGhLaWJhbmFUZXN0cw==` — указывает стартовую строку для защищённых файлов cookie (опционально в кодировке base64)
 - `-e OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY=true` как `true` пропускает проверку сертификатов, предоставляемых при использовании HTTPS
 - `-e OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR` указывает расположение каталога с пользовательскими шаблонами, содержащего настроенную
   страницу ошибки запрета доступа, отображаемую неавторизованным пользователям при аутентификации. Примечание : В OAuth2 proxy пока нет механизма
   для настройки только одного из шаблонов (т.е. sign_in или error). Поэтому, если требуется настроить только один, необходимо
   по-прежнему предоставлять оба шаблона.
 - `-e OAUTH2_PROXY_TLS_CERT_FILE` и `OAUTH2_PROXY_TLS_KEY_FILE` указывают путь к TLS-сертификату и закрытому ключу в
   формате [Privacy-Enhanced Mail (PEM)](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) для поддержки TLS.
   Чтобы избежать предупреждения системы безопасности в веб-браузерах, подключающихся к Kibana через OAuth2 Proxy, замените сертификат, предоставляемый в
   `/etc/certs/cert.pem` docker-образа:
   ![](/wp-content/uploads/dcm4chee-ru/images/images/cert.png)
   сертификатом, чьё _Common Name_ и/или _Subject Alt Name_ совпадает с именем хоста и который подписан
   доверенным издателем; примонтируйте PEM-файлы с сертификатом и соответствующим закрытым ключом и скорректируйте
   `OAUTH2_PROXY_TLS_CERT_FILE` и `OAUTH2_PROXY_TLS_KEY_FILE` так, чтобы они указывали их пути внутри контейнера.

   ```
   $ docker run --rm dcm4che/oauth2-proxy:7.7.1 help
   ```

покажет все доступные переменные окружения и параметры команд. См. также OAuth2 Proxy, а также Keycloak OIDC Auth Provider для Keycloak для получения дополнительной информации о параметрах конфигурации OAuth2 Proxy.

  1. Просмотр служб и контейнеров

console $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 26xg4sn0vb0q arc replicated 1/1 dcm4che/dcm4chee-arc-psql:5.34.3-secure *:8080->8080/tcp,*:8443->8443/tcp,*:9990->9990/tcp,*:11112->11112/tcp,*:2575->2575/tcp dtksw5sv18xt keycloak replicated 1/1 dcm4che/keycloak:26.0.6 *:8843->8843/tcp jt50ort8c7qw ldap replicated 1/1 dcm4che/slapd-dcm4chee:2.6.10-34.3 *:389->389/tcp ku6wx87ap9y9 oauth2-proxy replicated 1/1 dcm4che/oauth2-proxy:7.7.1 *:8643->8643/tcp pkkqh4zvvop0 logstash replicated 1/1 dcm4che/logstash-dcm4chee:8.15.1-18 *:12201->12201/udp,*:8514->8514/udp,*:8514->8514/tcp rn7n79g36u30 db replicated 1/1 dcm4che/postgres-dcm4chee:17.4-34 *:5432->5432/tcp v991z4viy2cn elasticsearch replicated 1/1 docker.elastic.co/elasticsearch/elasticsearch:8.15.1 *:9200->9200/tcp,*:9300->9300/tcp xubeh4sbhm8n kibana replicated 1/1 docker.elastic.co/kibana/kibana:8.15.1 *:5601->5601/tcp

console $ docker service ps elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 76janjrnoca8 elasticsearch.1 docker.elastic.co/elasticsearch/elasticsearch:8.15.1 elk-node Running Running 4 minutes ago nqfj2jw1zosw arc.1 dcm4che/dcm4chee-arc-psql:5.34.3-secure arc-node Running Running 4 minutes ago 9w2osm5k7dqy db.1 dcm4che/postgres-dcm4chee:17.4-34 db-node Running Running about a minute ago 829g3b2jtm5m oauth2-proxy.1 dcm4che/oauth2-proxy:7.7.1 arc-node Running Running about a minute ago 117jw1w92pjr keycloak.1 dcm4che/keycloak:26.0.6 arc-node Running Running 4 minutes ago x0f08a5i4x4q ldap.1 dcm4che/slapd-dcm4chee:2.6.10-34.3 db-node Running Running about a minute ago mxbin0wv2h7s logstash.1 dcm4che/logstash-dcm4chee:8.15.1-18 elk-node Running Running about a minute ago qfj2x7ny6p0d kibana.1 docker.elastic.co/kibana/kibana:8.15.1 elk-node Running Running about a minute ago

  1. Вы можете остановить службы командой

    $ docker service scale elasticsearch=0 kibana=0 logstash=0 ldap=0 mariadb=0 keycloak=0 oauth2-proxy=0 db=0 arc=0 и перезапустить службы командой $ docker service scale elasticsearch=1 kibana=1 logstash=1 ldap=1 mariadb=1 keycloak=1 oauth2-proxy=1 db=1 arc=1

  2. Вы можете удалить службы из swarm командой
    ```
    $ docker service rm elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc
    ```
    

    Вы можете удалить созданную overlay network командой $ docker network rm dcm4chee_default

  3. Вы можете удалить swarm следующим образом

    Выполните на каждом из 2 узлов worker; console $ docker swarm leave Node left the swarm.

    Выполните на узле manager: console $ docker swarm leave -f Node left the swarm.

Использование Docker Stack

В качестве альтернативы Docker Service можно использовать Docker Stack для развёртывания всех 8 служб:

  1. Опишите службы в файле конфигурации docker-compose.yml (например):

    yaml version: "3.5" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.15.1 environment: ES_JAVA_OPTS: -Xms1024m -Xmx1024m discovery.type: single-node xpack.security.enabled: "false" logging: driver: json-file options: max-size: "10m" ports: - target: 9200 published: 9200 protocol: tcp mode: host - target: 9300 published: 9300 protocol: tcp mode: host volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/esdatadir:/usr/share/elasticsearch/data deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <elk-node>] kibana: image: docker.elastic.co/kibana/kibana:8.15.1 logging: driver: json-file options: max-size: "10m" ports: - target: 5601 published: 5601 protocol: tcp mode: host volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <elk-node>] logstash: image: dcm4che/logstash-dcm4chee:8.15.1-18 logging: driver: json-file options: max-size: "10m" ports: - target: 12201 published: 12201 protocol: udp mode: host - target: 8514 published: 8514 protocol: udp mode: host - target: 8514 published: 8514 protocol: tcp mode: host volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/logstash/filter-hashtree:/usr/share/logstash/data/filter-hashtree deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <elk-node>] ldap: image: dcm4che/slapd-dcm4chee:2.6.10-34.3 logging: driver: gelf options: gelf-address: "udp://<elk-node>:12201" tag: ldap ports: - target: 389 published: 389 protocol: tcp mode: host environment: SYSLOG_HOST: logstash SYSLOG_PORT: 8514 SYSLOG_PROTOCOL: TLS STORAGE_DIR: /storage/fs1 volumes: - /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data - /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <db-node>] mariadb: image: mariadb:10.11.4 logging: driver: gelf options: gelf-address: "udp://<elk-node>:12201" tag: mariadb ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: keycloak volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/mysql:/var/lib/mysql deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <db-node>] keycloak: image: dcm4che/keycloak:26.0.6 logging: driver: gelf options: gelf-address: "udp://<elk-node>:12201" tag: keycloak ports: - target: 8843 published: 8843 protocol: tcp mode: host environment: KC_HTTPS_PORT: 8843 KC_HOSTNAME: https://<arc-node>:8843 KC_HOSTNAME_BACKCHANNEL_DYNAMIC: 'true' KC_BOOTSTRAP_ADMIN_USERNAME: admin KC_BOOTSTRAP_ADMIN_PASSWORD: changeit KC_DB: mariadb KC_DB_URL_DATABASE: keycloak KC_DB_URL_HOST: mariadb KC_DB_USERNAME: keycloak KC_DB_PASSWORD: keycloak KC_LOG: file,gelf KC_LOG_GELF_HOST: logstash ARCHIVE_HOST: <arc-node> KIBANA_CLIENT_ID: kibana KIBANA_CLIENT_SECRET: <kibana-client-secret> KIBANA_REDIRECT_URL: https://<arc-node>:8643/oauth2/callback/* KEYCLOAK_WAIT_FOR: ldap:389 mariadb:3306 logstash:8514 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/keycloak:/opt/keycloak/data deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <arc-node>] oauth2-proxy: image: dcm4che/oauth2-proxy:7.7.1 ports: - target: 8643 published: 8643 protocol: tcp mode: host environment: OAUTH2_PROXY_HTTPS_ADDRESS: 0.0.0.0:8643 OAUTH2_PROXY_PROVIDER: keycloak-oidc OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true" OAUTH2_PROXY_UPSTREAMS: "http://kibana:5601" OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<arc-node>:8843/realms/dcm4che" OAUTH2_PROXY_REDIRECT_URL: "https://<arc-node>:8643/oauth2/callback" OAUTH2_PROXY_ALLOWED_ROLES: auditlog OAUTH2_PROXY_CLIENT_ID: kibana OAUTH2_PROXY_CLIENT_SECRET: changeit OAUTH2_PROXY_EMAIL_DOMAINS: "*" OAUTH2_PROXY_OIDC_EMAIL_CLAIM: "sub" OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL: "true" OAUTH2_PROXY_COOKIE_SECRET: T0F1dGhLaWJhbmFUZXN0cw== OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY: "true" OAUTH2_PROXY_TLS_CERT_FILE: /etc/certs/cert.pem OAUTH2_PROXY_TLS_KEY_FILE: /etc/certs/key.pem OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR: /templates deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <arc-node>] db: image: dcm4che/postgres-dcm4chee:17.4-34 logging: driver: gelf options: gelf-address: "udp://<elk-node>:12201" tag: postgres ports: - target: 5432 published: 5432 protocol: tcp mode: host environment: POSTGRES_DB: pacsdb POSTGRES_USER: pacs POSTGRES_PASSWORD: pacs volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/db:/var/lib/postgresql/data deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <db-node>] arc: image: dcm4che/dcm4chee-arc-psql:5.34.3-secure logging: driver: gelf options: gelf-address: "udp://<elk-node>:12201" tag: dcm4chee-arc ports: - target: 8080 published: 8080 protocol: tcp mode: host - target: 8443 published: 8443 protocol: tcp mode: host - target: 9990 published: 9990 protocol: tcp mode: host - target: 9993 published: 9993 protocol: tcp mode: host - target: 11112 published: 11112 protocol: tcp mode: host - target: 2762 published: 2762 protocol: tcp mode: host - target: 2575 published: 2575 protocol: tcp mode: host - target: 12575 published: 12575 protocol: tcp mode: host environment: LOGSTASH_HOST: logstash POSTGRES_DB: pacsdb POSTGRES_USER: pacs POSTGRES_PASSWORD: pacs AUTH_SERVER_URL: https://keycloak:8843 UI_AUTH_SERVER_URL: https://<arc-host>:8843 WILDFLY_CHOWN: /storage WILDFLY_WAIT_FOR: ldap:389 mariadb:5432 logstash:8514 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 deploy: endpoint_mode: dnsrr placement: constraints: [node.hostname == <arc-node>]

    Замените <arc-node>, <db-node> и <elk-node> на имена хостов узлов архива, базы данных и Elastic Stack.

примечание : - OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<arc-node>:8843/realms/dcm4che" применяется только для Keycloak v18.0+ и если используется значение по умолчанию KC_HTTP_RELATIVE_PATH. - Если используются более ранние версии Keycloak или если KC_HTTP_RELATIVE_PATH установлен в /auth для Keycloak v18.0+, тогда OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<arc-node>:8843/auth/realms/dcm4che"

  1. Разверните все 9 служб в swarm, выполнив

    console $ docker stack deploy -c docker-compose.yml dcm4chee Creating network dcm4chee_default Creating service dcm4chee_elasticsearch Creating service dcm4chee_kibana Creating service dcm4chee_logstash Creating service dcm4chee_ldap Creating service dcm4chee_mariadb Creating service dcm4chee_keycloak Creating service dcm4chee_oauth2-proxy Creating service dcm4chee_db Creating service dcm4chee_arc

    в каталоге, содержащем docker-compose.yml.

  2. Просмотр служб и контейнеров
    ```console
    $ docker stack services dcm4chee
    ID                  NAME                           MODE                REPLICAS            IMAGE                                                    PORTS
    0nlodmc3exg4        dcm4chee_oauth2-proxy          replicated          1/1                 dcm4che/oauth2-proxy:7.7.1                               *:8643->8643/tcp
    7jr7svjz7vur        dcm4chee_elasticsearch         replicated          1/1                 docker.elastic.co/elasticsearch/elasticsearch:8.15.1     *:9200->9200/tcp,*:9300->9300/tcp
    7xqwpuddf36m        dcm4chee_keycloak              replicated          1/1                 dcm4che/keycloak:26.0.6                                  *:8843->8843/tcp
    a308pzkzyeut        dcm4chee_arc                   replicated          1/1                 dcm4che/dcm4chee-arc-psql:5.34.3-secure                  *:2575->2575/tcp,*:8080->8080/tcp,*:8443->8443/tcp,*:9990->9990/tcp,*:9993->9993/tcp,*:11112->11112/tcp
    d59jgiu9ummi        dcm4chee_ldap                  replicated          1/1                 dcm4che/slapd-dcm4chee:2.6.10-34.3                        *:389->389/tcp
    3dgkrowsdekr        dcm4chee_mariadb               replicated          1/1                 dcm4che/mariadb:10.11.4                                  *:3306->3306/tcp
    lxh9h2oaoe9a        dcm4chee_logstash              replicated          1/1                 dcm4che/logstash-dcm4chee:8.15.1-18                      *:8514->8514/udp,*:8514->8514/tcp,*:12201->12201/udp
    o5m1k5jn5od9        dcm4chee_kibana                replicated          1/1                 docker.elastic.co/kibana/kibana:8.15.1                   *:5601->5601/tcp
    vu5ufiv4cixx        dcm4chee_db                    replicated          1/1                 dcm4che/postgres-dcm4chee:17.4-34                        *:5432->5432/tcp
    ```
    

    console $ docker stack ps dcm4chee ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lq3sahd5akg0 dcm4chee_oauth2-proxy.1 dcm4che/oauth2-proxy:7.7.1 arc-node Running Running 6 minutes ago 6w9sacdo2ik7 dcm4chee_keycloak.1 dcm4che/keycloak:26.0.6 arc-node Running Running 3 minutes ago wzuwieytbjjt dcm4chee_ldap.1 dcm4che/slapd-dcm4chee:2.6.10-34.3 db-node Running Running 3 minutes ago szeuvfjruttl dcm4chee_mariadb.1 dcm4che/mariadb:10.11.4 db-node Running Running 3 minutes ago odxv7xanq173 dcm4chee_logstash.1 dcm4che/logstash-dcm4chee:8.15.1-18 elk-node Running Running 6 minutes ago x6mphxjcp6fd dcm4chee_kibana.1 docker.elastic.co/kibana/kibana:8.15.1 elk-node Running Running 6 minutes ago bx5wr396bvhh dcm4chee_elasticsearch.1 docker.elastic.co/elasticsearch/elasticsearch:8.15.1 elk-node Running Running 6 minutes ago 589p3yv4vlus dcm4chee_arc.1 dcm4che/dcm4chee-arc-psql:5.34.3-secure arc-node Running Running 4 minutes ago xeh6u4zg205u dcm4chee_db.1 dcm4che/postgres-dcm4chee:17.4-34 db-node Running Running 4 minutes ago

  3. Зарегистрируйте UI архива как OIDC-клиента в Keycloak, как описано выше.
  4. Зарегистрируйте Keycloak Proxy как OIDC-клиента в Keycloak, как описано выше.
  5. (Условно) Обновите службу Keycloak Gatekeeper с скорректированным Client Secret
    Если вы настроили OIDC-клиента для Keycloak Gatekeeper с `Access Type: confidential`, вам нужно скорректировать
    значение переменной окружения `PROXY_CLIENT_SECRET` службы `oauth2-proxy` в
    `docker-compose.yml`, чтобы оно совпадало с фактическим значением на вкладке `Credentials` для OIDC-клиента в Realm
    Admin Console Keycloak, после чего обновить службу Keycloak Gatekeeper, выполнив
    ```console
    $ docker stack deploy -c docker-compose.yml dcm4chee
    Updating service dcm4chee_archive (id: nuudyr5klhsnddgelzswi8v9n)
    Updating service dcm4chee_elasticsearch (id: pzia3mwd7j0yw6ege0rsqztnp)
    Updating service dcm4chee_kibana (id: sa2ora66tyzvpzzfzucc0kwwg)
    Updating service dcm4chee_logstash (id: v90zk4kouotqnxt2o2bpl5hma)
    Updating service dcm4chee_ldap (id: t5e2fe622zvbizfdjy6so3j90)
    Updating service dcm4chee_mariadb (id: 2zvbizfdjy6st5e2fe62o3j90)
    Updating service dcm4chee_keycloak (id: s9729xyqozqjrru6qz2izbbfi)
    Updating service dcm4chee_oauth2-proxy (id: 21mgvpigzi51l4w8wwv215yqj)
    Updating service dcm4chee_db (id: 06ug78g6se1mpqpkr28vggtqs)
    ```
    в каталоге, содержащем `docker-compose.yml`, снова.
    
  6. Вы можете остановить службы, как описано выше.
  7. Вы можете удалить все 8 служб из swarm командой
    ```console
    $ docker stack rm dcm4chee
    Removing service dcm4chee_arc
    Removing service dcm4chee_db
    Removing service dcm4chee_kibana
    Removing service dcm4chee_elasticsearch
    Removing service dcm4chee_logstash
    Removing service dcm4chee_keycloak
    Removing service dcm4chee_mariadb
    Removing service dcm4chee_ldap
    Removing service dcm4chee_oauth2-proxy
    Removing network dcm4chee_default
    ```
    
  8. Вы можете удалить swarm, как описано выше.

Использование UI Docker swarm: Swarmpit

Установка:

$ curl -o swarmpit.yaml https://raw.githubusercontent.com/swarmpit/swarmpit/master/docker-compose.yml
$ docker stack deploy -c swarmpit.yaml swarmpit

swarmpit работает на порту 888, поэтому откройте в браузере http://<IP>:888: