Раньше ничем таким не занимался, знания о DICOM заканчиваются на том, что это формат медицинских изображений…\\ На работе есть несколько медицинских устройств, которые обмениваются снимками с компа оператора на комп врача.\\ На каждом оборудовании есть своя программа и на станциях врачей своя.\\ Решил попробовать сделать единое хранилище. \\ Конечно, можно купить и платные продукты, но это не наш метод.\\ Поиск выдал Orthanc, система у меня Debian 10, так что решил поставить из репозитория:\\ apt-get install Orthanc Установил, поправил конфиг для того что бы зайти в WEB, загрузил несколько картинок... \\ В последних версиях пользователи хранятся тут : credentials.json { /** * Sensitive configuration options. This file must *not* be * publicly-readable. It must only be readable by the users that run * the "orthanc" service. **/ // The list of the registered users. Because Orthanc uses HTTP // Basic Authentication, the passwords are stored as plain text. "RegisteredUsers" : { "alice" : "alicePassword" "admin" : "adminPassword", } } Включение http сервера и авторизации тут: Orthanc.json "HttpServerEnabled" : true, "AuthenticationEnabled" : true, Что-то мне не понравился стандартный web viewer...\\ Решил прикрутить viewer от Osimis. \\ скачиваем: wget http://orthanc.osimis.io/lsb/plugin-osimis-webviewer/releases/1.2.0/libOsimisWebViewer.so нужно посмотреть -> http://orthanc.osimis.io/lsb/plugin-osimis-webviewer/releases/1.3.1/libOsimisWebViewer.so по умолчанию подгружаются все плагины находящиеся в папке /usr/share/orthanc/plugins\\ поэтому директиву Plugins править не нужно.\\ скаченную библиотеку надо поместить в папку: /usr/share/orthanc/plugins\\ и перезапустить orthanc.\\ // Whether remote hosts can connect to the HTTP server "RemoteAccessAllowed" : false, - исправить на true что бы зайти в WEB "Plugins" : [ "/home/user/ libOsimisWebViewer.so r.so", ] TITLE AE -сервера, собственно куда отправляются снимки И кодировка в которую они будут преобразованы "DefaultEncoding" : "Windows1251", // The DICOM Application Entity Title "DicomAet" : "ORTHANC", // Check whether the called AET corresponds to the AET of Orthanc // during an incoming DICOM SCU request "DicomCheckCalledAet" : false, // The DICOM port "DicomPort" : 4242, // The default encoding that is assumed for DICOM files without // "SpecificCharacterSet" DICOM tag, and that is used when answering // C-Find requests (including worklists). The allowed values are // "Ascii", "Utf8", "Latin1", "Latin2", "Latin3", "Latin4", // "Latin5", "Cyrillic", "Windows1251", "Arabic", "Greek", "Hebrew", // "Thai", "Japanese", "Chinese", "JapaneseKanji", "Korean", and // "SimplifiedChinese". //"DefaultEncoding" : "Latin1", "DefaultEncoding" : "Windows1251", WEB-интерфейс тут http://ваш ip:8042/app/explorer.html {{:orthanc1.jpg?400|}} Подключение к СУБД: apt-get install default-mysql-server default-mysql-clietn defaultlt-libmysqlclient-dev orthanc-mysql Увеличиваем размер блока данных: mcedit my.cnf max_allowed_packet = 128M создаем пользователя и бд, подключаемся: mcedit /etc/orthanc/mysql.json cat /etc/orthanc/mysql.json { /** * Configuration to use MySQL or MariaDB instead of the default * SQLite back-end of Orthanc. You will have to install the * "orthanc-mysql" package to take advantage of this feature. **/ "MySQL" : { // Enable the use of MySQL to store the Orthanc index? "EnableIndex" : true, // Enable the use of MySQL to store the DICOM files? "EnableStorage" : true, // Parameters of the MySLQ database "Host" : "localhost", "Port" : 3306, "Database" : "orthanc", "Username" : "orthanc", "UnixSocket" : "/var/run/mysqld/mysqld.sock", "Password" : "dDE4dkULEYrbBZxc", // Optional: Disable the locking of the MySQL database "Lock" : true } } Контроль доступа и отправка на другие модальности: Orthanc.json "LuaScripts" : [ "/etc/orthanc/lua/access.lua", "/etc/orthanc/lua/send.lua" ], "sample" : [ "AE_TITLE", "192.168.1.235", 4006 ] Lua: Разрешения выполнять запросы к Orthanc, с помощью этого скрипта можно разграничить права доступа к web интерфейсу Orthanc cat access.lua function IncomingHttpRequestFilter(method, uri, ip, username, httpHeaders) -- Only allow GET requests for non-admin users if method == 'GET' or method == 'POST' then return true elseif username == 'admin' then return true else return false end end Можно по ip function IncomingHttpRequestFilter(method, uri, ip, username, httpHeaders) if method == 'GET' and (username == 'user' or username == 'admin') then -- Read-only access (only GET method is allowed) return true elseif username == 'admin' and ip == '127.0.0.1' then -- Read-write access for administrator (any HTTP method is allowed on localhost) return true else -- Access is disallowed by default return false end end С помощью этого скрипта можно отправлять снимки которые пришли в Orthanc на другие DICOM сервера или на рабочие станции врачей. cat send.lua function OnStoredInstance(instanceId, tags, metadata) SendToModality(instanceId, 'sample') end С помощью этого скрипта можно разбирать изображение которые приходят на Orthanc и маршрутизировать их на другие сервера. cat /etc/orthanc/lua/send.lua function OnStoredInstance(instanceId, tags, metadata) local Modality = tags['Modality'] if string.find(Modality, 'CR') ~= nil then SendToModality(instanceId, 'sample') elseif string.find(Modality, 'MR') ~= nil then SendToModality(instanceId, 'sample') end end перезапускаем: services orthanc restart Удаление старых записей $ curl --user admin:password http://localhost:8042/tools/find -d '{"Level":"Study","Query":{"StudyDate":"20120101-20121231"}}' [ "6e2c0ec2-5d99c8ca-c1c21cee-79a09605-68391d12", "ef2ce55f-9342856a-aee23907-2667e859-9f3b734d" ] $ curl -X DELETE http://localhost:8042/studies/6e2c0ec2-5d99c8ca-c1c21cee-79a09605-68391d12 $ curl -X DELETE http://localhost:8042/studies/ef2ce55f-9342856a-aee23907-2667e859-9f3b734d