см. Настройка тестовой среды Docker Swarm с использованием Multipass
$ 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
$ 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
$ 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
$ sudo mkdir -p /var/local/dcm4chee-arc/keycloak
$ sudo mkdir -p /var/local/dcm4chee-arc/wildfly
$ sudo mkdir -p /var/local/dcm4chee-arc/storage
$ 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
$ 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 на любом из узлов:
$ 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:
Создайте overlay network на узле manager:
$ docker network create --driver overlay dcm4chee_default
Создайте 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.
Создайте 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) перед запуском контейнера, иначе
контейнер не запустится.
Создайте 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).
Создайте 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.
Создайте 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.
Создайте 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.
Создайте 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 непосредственно на
-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.
Создайте 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.
Войдите с именем пользователя/паролем root/changeit в Realm Admin Console Keycloak по адресу
https://<arc-node>:8843/admin/dcm4che/console — замените \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:

Доступ к 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.
Войдите с именем пользователя/паролем root/changeit в Realm Admin Console Keycloak по адресу
https://<arc-node>:8843/admin/dcm4che/console — замените \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 на следующем шаге.
Создайте 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-образа:

сертификатом, чьё _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.
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
$ 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
```
$ docker service rm elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc
```
Вы можете удалить созданную overlay network командой
$ docker network rm dcm4chee_default
Выполните на каждом из 2 узлов worker;
console
$ docker swarm leave
Node left the swarm.
Выполните на узле manager:
console
$ docker swarm leave -f
Node left the swarm.
В качестве альтернативы Docker Service можно использовать Docker Stack для развёртывания всех 8 служб:
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"
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.
```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
Если вы настроили 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`, снова.
```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
```
Установка:
$ 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:
