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

Минимальный набор сервисов Архива

(Необязательно) Создайте системные группы и пользователей с определёнными ID групп и пользователей, используемых сервисами Архива на хосте

Например:

$ 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
# groupadd -r dcm4chee-arc --gid=1023 && useradd -r -g dcm4chee-arc --uid=1023 dcm4chee-arc
# exit

В противном случае в выведенной информации о каталогах и файлах, созданных контейнерами в bind-mounted каталогах хоста, в качестве сведений о владельце будут отображаться числовые ID пользователя и группы. Например:

$ sudo ls -l /var/local/dcm4chee-arc/wildfly/
total 20
-rw-r--r-- 1 1023 1023    0 Sep  3 22:34 chown.done
drwxr-sr-x 4 1023 1023 4096 Sep  3 22:34 configuration
drwxr-sr-x 9 1023 1023 4096 Sep  3 22:34 data
drwxr-sr-x 2 1023 1023 4096 Sep  3 22:34 deployments
drwxr-sr-x 2 1023 1023 4096 Sep  3 22:34 log
drwxr-sr-x 5 1023 1023 4096 Sep  4 00:53 tmp

Далее используйте Docker Command Line либо как альтернативу — Docker Compose:

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

  1. Создайте пользовательскую сеть bridge

    $ docker network create dcm4chee_network

  2. Запустите сервер OpenLDAP

    Запустите контейнер, предоставляющий LDAP-сервер, в созданной сети, например: $ docker run --network=dcm4chee_network --name ldap \ -p 389:389 \ -v /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data \ -v /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d \ -d dcm4che/slapd-dcm4chee:2.6.10-34.3

    Публикация порта ldap 389 из контейнера на хосте через -p 389:389 обеспечивает доступ к LDAP-серверу также для внешних LDAP-клиентов, например Apache LDAP Directory Studio. Для работы Архива это не требуется, поскольку контейнер Архива подключается к порту LDAP сервера LDAP-контейнера через созданную сеть bridge.

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

    Инициализированные данные LDAP и конфигурацию сервера OpenLDAP можно настроить с помощью переменных окружения. Например: -e LDAP_BASE_DN=dc=ihe,dc=net \ -e LDAP_ROOTPASS=mypass \ -e ARCHIVE_DEVICE_NAME=central-archive \ -e AE_TITLE=CENTRAL \ -e DICOM_PORT=10104 \ -e HL7_PORT=12575 -e STORAGE_DIR=/storage/fs1 будет использовать - dc=ihe,dc=net (по умолчанию: dc=dcm4che,dc=org) в качестве суффикса базы данных (или base DN) каталога LDAP, - mypass (по умолчанию: secret) в качестве пароля root для доступа к каталогу LDAP, - central-archive (по умолчанию: dcm4chee-arc) в качестве Device Name Архива, - CENTRAL (по умолчанию: DCM4CHEE) в качестве основного Application Entity Title Архива, - 10104 (по умолчанию: 11112) в качестве порта прослушивания для DICOM-соединений с Архивом, - 12575 (по умолчанию: 2575) в качестве порта прослушивания для HL7-приёмника Архива, - /storage/fs1 (по умолчанию: /opt/wildfly/standalone/data/fs1) в качестве пути к каталогу — внутри контейнера Архива — где Архив хранит полученные DICOM-объекты.

  3. Запустите сервер PostgreSQL

    Запустите контейнер, предоставляющий сервер базы данных, в созданной сети, например: $ docker run --network=dcm4chee_network --name db \ -p 5432:5432 \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/db:/var/lib/postgresql/data \ -d dcm4che/postgres-dcm4chee:17.4-34

    Публикация порта сервера PostgreSQL 5432 из контейнера на хосте через -p 5432:5432 обеспечивает доступ к серверу PostgreSQL также для внешних PostgreSQL-клиентов. Для работы Архива это не требуется, поскольку контейнер Архива подключается к порту сервера PostgreSQL-контейнера через созданную сеть bridge.

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

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

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

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

  4. Запустите Wildfly с развёрнутым приложением dcm4che Archive 5

    Запустите контейнер, предоставляющий Wildfly с развёрнутым приложением dcm4che Archive 5, в созданной сети, например: $ docker run --network=dcm4chee_network --name arc \ -p 8080:8080 \ -p 8443:8443 \ -p 9990:9990 \ -p 9993:9993 \ -p 11112:11112 \ -p 2762:2762 \ -p 2575:2575 \ -p 12575:12575 \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ -e WILDFLY_WAIT_FOR="ldap:389 db:5432" \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone \ -d dcm4che/dcm4chee-arc-psql:5.34.3

    -p 8080:8080 \ -p 8443:8443 \ -p 9990:9990 \ -p 9993:9993 \ -p 11112:11112 \ -p 2762:2762 \ -p 2575:2575 \ -p 12575:12575 \ публикует http-порт (8080) и https-порт (8443) веб-сервера, http-порт (9990) и https-порт (9993) консоли администрирования WildFly, а также DICOM-порт (11112), DICOM TLS-порт (2762), HL7-порт (2575) и HL7 TLS-порт (12575) приложения Архива из контейнера на хост, чтобы внешние http(s)-клиенты, DICOM-приложения и HL7-отправители могли подключаться к WildFly и приложению Архива.

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

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

    -e WILDFLY_WAIT_FOR="ldap:389 db:5432" задерживает запуск WildFly до тех пор, пока OpenLDAP slapd и сервер PostgreSQL не начнут прослушивать указанные порты, что предотвращает ошибки при перезапуске всех контейнеров, вызванные ошибками подключения приложения Архива к LDAP и PostgreSQL до того, как OpenLDAP slapd и PostgreSQL будут готовы принимать соединения.

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

    Bind mount -v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone обеспечивает хранение конфигурации сервера Wildfly в указанном каталоге хоста. Она инициализируется при первом запуске контейнера, если она ещё не присутствует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании контейнера сервера Архива.

    Если вы задали переменную окружения STORAGE_DIR для контейнера LDAP-сервера, которая указывает путь к каталогу, где Архив хранит полученные DICOM-объекты, вам также следует выполнить bind mount этого каталога в каталог хоста, чтобы гарантировать, что сохранённые DICOM-объекты не будут потеряны при удалении и повторном создании контейнера сервера Архива. Например, если STORAGE_DIR=/storage/fs1, вы можете использовать bind mount -v /var/local/dcm4chee-arc/storage:/storage. Вам также необходимо убедиться, что системный пользователь, под которым в контейнере Архива запускается WildFly, имеет право на запись в этот каталог, либо создав каталог и изменив его владельца на этого системного пользователя: ``` $ sudo -i

    mkdir -p /var/local/dcm4chee-arc/storage

    chown 1023:1023 /var/local/dcm4chee-arc/storage

    exit

    `` либо добавив к значению по умолчанию переменной окруженияWILDFLY_CHOWN=/opt/wildfly/standaloneпуть к каталогу, подключённому через bind mount (например,WILDFLY_CHOWN="/opt/wildfly/standalone /storage"`).

    Значение по умолчанию STORAGE_DIR=/opt/wildfly/standalone/data/fs1 контейнера LDAP задаёт подкаталог каталога /opt/wildfly/standalone и поэтому уже отображён из контейнера в каталог хоста через -v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone.

    По умолчанию https-сервисы будут использовать сертификат для обработки TLS-соединений. Чтобы избежать предупреждения системы безопасности в веб-браузерах, обращающихся к UI Архива или консоли администрирования WildFly, вам необходимо предоставить сертификат, Common Name и/или Subject Alt Name которого соответствует имени хоста и который подписан доверенным издателем, в файле хранилища ключей в формате PKCS #12 или Java KeyStore (JKS), выполнить bind mount файла или содержащего его каталога в контейнер и указать его через переменную окружения KEYSTORE.

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

    Проверьте журнал сервера Wildfly, чтобы убедиться, что Архив успешно запустился: console $ tail -f /var/local/dcm4chee-arc/wildfly/log/server.log 2022-06-09 14:03:58,946 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-2) Start TCP Listener on /0.0.0.0:11112 2022-06-09 14:03:58,946 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-1) Start TCP Listener on /0.0.0.0:2575 2022-06-09 14:03:59,048 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-3) Start TCP Listener on /0.0.0.0:12575 2022-06-09 14:03:59,048 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-4) Start TCP Listener on /0.0.0.0:2762 2022-06-09 14:03:59,211 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "dcm4chee-arc-ui2-5.34.3-secure.war" (runtime-name : "dcm4chee-arc-ui2-5.34.3-secure.war") 2022-06-09 14:03:59,211 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "dcm4chee-arc-ear-5.34.3-psql-secure.ear" (runtime-name : "dcm4chee-arc-ear-5.34.3-psql-secure.ear") 2022-06-09 14:03:59,238 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server 2022-06-09 14:03:59,246 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 27.0.1.Final (WildFly Core 18.1.1.Final) started in 10685ms - Started 2819 of 3031 services (446 services are lazy, passive or on-demand) - Server configuration file in use: dcm4chee-arc-oidc.xml 2022-06-09 14:03:59,248 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0062: Http management interface listening on http://0.0.0.0:9990/management and https://0.0.0.0:9993/management 2022-06-09 14:03:59,248 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0053: Admin console listening on http://0.0.0.0:9990 and https://0.0.0.0:9993

  5. (Необязательно) Отправьте КТ-изображения в Архив с помощью dcm4che/dcm4che-tools

    console $ docker run --rm --network=dcm4chee_network dcm4che/dcm4che-tools storescu -cDCM4CHEE@arc:11112 /opt/dcm4che/etc/testdata/dicom Scanning files to send ................ Scanned 16 files in 0.053s (=3ms/file) 17:20:53,552 INFO - Initiate connection from 0.0.0.0/0.0.0.0:0 to 192.168.2.131:11112 17:20:53,560 INFO - Established connection Socket[addr=/192.168.2.131,port=11112,localport=59369] 17:20:53,570 DEBUG - /172.18.0.2:59369->/192.168.2.131:11112(1): enter state: Sta4 - Awaiting transport connection opening to complete 17:20:53,571 INFO - STORESCU->DCM4CHEE(1) << A-ASSOCIATE-RQ : 17:20:54,657 INFO - STORESCU->DCM4CHEE(1) >> A-RELEASE-RP 17:20:54,657 INFO - STORESCU->DCM4CHEE(1): close Socket[addr=/192.168.2.131,port=11112,localport=59369] 17:20:54,657 DEBUG - STORESCU->DCM4CHEE(1): enter state: Sta1 - Idle Sent 16 objects (=2.027MB) in 1.06s (=1.912MB/s)

    Полученные изображения должны появиться в UI Архива по адресу http://localhost:8080/dcm4chee-arc/ui2 или https://localhost:8443/dcm4chee-arc/ui2:

  6. Вы можете остановить все 3 контейнера командой:

    $ docker stop ldap db arc

    и снова запустить все 3 контейнера командой:

    $ docker start ldap db arc

  7. Вы можете удалить остановленные контейнеры командой
    ```
    $ docker rm -v ldap db arc
    ```
    

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

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

В качестве альтернативы Docker Command Line можно использовать Docker Compose, который позаботится о запуске всех 3 контейнеров:

  1. (Необязательно) Создайте системные группы и пользователей с определёнными ID групп и пользователей, используемых сервисами Архива, как описано выше.
  2. Опишите сервисы в конфигурационном файле docker-compose.yml (например):

    yaml version: "3" services: ldap: image: dcm4che/slapd-dcm4chee:2.6.10-34.3 logging: driver: json-file options: max-size: "10m" ports: - "389:389" environment: 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 db: image: dcm4che/postgres-dcm4chee:17.4-34 logging: driver: json-file options: max-size: "10m" ports: - "5432:5432" 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 arc: image: dcm4che/dcm4chee-arc-psql:5.34.3 logging: driver: json-file options: max-size: "10m" ports: - "8080:8080" - "8443:8443" - "9990:9990" - "9993:9993" - "11112:11112" - "2762:2762" - "2575:2575" - "12575:12575" environment: POSTGRES_DB: pacsdb POSTGRES_USER: pacs POSTGRES_PASSWORD: pacs WILDFLY_CHOWN: /storage WILDFLY_WAIT_FOR: ldap:389 db:5432 depends_on: - ldap - db volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone - /var/local/dcm4chee-arc/storage:/storage

См. доступные переменные окружения для - контейнера Slapd - контейнера PostgreSQL - контейнера Архива

Примечание: Если возникают трудности с запуском сервиса Архива из-за сообщения 
````
There is insufficient memory for the Java Runtime Environment to continue. Cannot create GC thread. Out of system resources.
````
добавьте следующую опцию к сервису `arc` 
````
security_opt:
 - seccomp:unconfined
````
  1. Создайте и запустите 3 контейнера, вызвав

    console $ docker-compose -p dcm4chee up -d Creating network "dcm4chee_network" with the default driver Creating dcm4chee_ldap_1 ... Creating dcm4chee_db_1 ... Creating dcm4chee_ldap_1 Creating dcm4chee_db_1 ... done Creating dcm4chee_arc_1 ... Creating dcm4chee_arc_1 ... done в каталоге, содержащем docker-compose.yml.

  2. Вы можете остановить все 3 контейнера командой:

    console $ docker-compose -p dcm4chee stop Stopping dcm4chee_arc_1 ... done Stopping dcm4chee_db_1 ... done Stopping dcm4chee_ldap_1 ... done

    и снова запустить все 3 контейнера командой:

    console $ docker-compose -p dcm4chee start Starting db ... done Starting ldap ... done Starting arc ... done

  3. Вы можете остановить и удалить все 3 контейнера командой
    ```console
    $ docker-compose -p dcm4chee down
    Stopping dcm4chee_arc_1  ... done
    Stopping dcm4chee_db_1   ... done
    Stopping dcm4chee_ldap_1 ... done
    Removing dcm4chee_arc_1  ... done
    Removing dcm4chee_db_1   ... done
    Removing dcm4chee_ldap_1 ... done
    Removing network dcm4chee_network
    ```