first commit

This commit is contained in:
mozzie 2023-04-26 10:58:17 +08:00
commit 33c139cc30
5 changed files with 645 additions and 0 deletions

21
.env Normal file
View File

@ -0,0 +1,21 @@
#
# Orthanc 相关
#
# 挂载 orthanc.json 配置文件
ORTHANC_CONFIG=./config/orthanc.json
# 挂载 到本地的 dicom 文件存储,需要关闭数据库插件存储,在 orthanc.json 配置 PostgreSQL->EnableStorage 设为 false
ORTHANC_DB_MNT=./orthanc_db
#
# PostgreSQL 配置
#
# 数据库文件 挂在到本地位置
POSTGRES_DATA_MNT=./pg_data/data
# 数据库文件 在容器里的路径
PGDATA=/var/lib/postgresql/data
POSTGRES_DB=orthanc
POSTGRES_PORT=5432
POSTGRES_USER=orthanc
POSTGRES_PASSWORD=orthanc

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
orthanc_db/*
pg_data/*

477
README.md Normal file
View File

@ -0,0 +1,477 @@
# orthanc.json 配置说明
## Name
显示在 Orthanc web 服务的 header 文字
## StorageDirectory
> EnableStorage 为 true 的话,默认是用数据库插件的路径存储。
用来指定 Orthanc 存储 DICOM 文件的目录的,它不仅针对 sqlite也针对其他数据库插件例如 PostgreSQL 或 MySQL。但是如果使用了数据库插件你也可以配置它们把 DICOM 文件存储在数据库中,而不是在 StorageDirectory 指定的目录中
## IndexDirectory
用来指定 Orthanc 存储 SQLite 索引的目录,如果没设置,默认使用 `StorageDirectory` 的值,可以优化性能
## TemporaryDirectory
临时文件夹,可以被安全的删除,
- UNIX-like: "/tmp/Orthanc/
- windows: "C:/Temp"
## StorageCompression
用来指定 Orthanc 是否对 DICOM 文件进行压缩的。如果这个属性设置为 trueOrthanc 会在存储 DICOM 文件之前,使用 gzip 算法对它们进行压缩,以节省磁盘空间。如果这个属性设置为 falseOrthanc 不会对 DICOM 文件进行压缩,而是保持它们的原始传输语法
## MaximumStorageSize
存储大小限制,`0`代表不限制
## MaximumPatientCount
在给定时间可以存储的最大患者数量,`0`代表不限制
## LuaScripts []
可以嵌入到 Orthanc 中的脚本语言,它可以用来定制 Orthanc 的行为和逻辑,以适应特定的医疗工作流程。你可以使用 lua 脚本来实现以下功能:
- 响应 Orthanc 的各种事件,例如接收到 DICOM 实例、提交了一个任务、完成了一个任务等。
- 过滤或修改传入的 DICOM 实例或 REST 请求,例如删除敏感信息、添加元数据、转换传输语法等。
- 调用 Orthanc 的 REST API 或其他外部服务,例如发送邮件、通知、日志等。
- 实现自定义的插件或扩展,例如增加新的 REST 端点、提供新的功能或界面等。
## Plugins []
插件的目录
```json
"Plugins": ["/usr/share/orthanc/plugins"]
```
## ConcurrentJobs
> Orthanc <= 1.3.2 ,请设为 1
用来指定 Orthanc 可以同时运行的任务jobs的最大数量的。任务是一种可以在 Orthanc 中执行的长时间操作,例如转码、导出、修改、删除等。你可以通过 REST API 来创建、查询、取消或删除任务。ConcurrentJobs 属性可以控制 Orthanc 的并发性能和资源消耗,你可以根据你的硬件配置和工作负载来调整这个属性
- 设置为 `0`,使用全部的 CPU 核心
## HttpServerEnabled
如果此参数设置为“false”禁用 REST API。默认 Orthanc 充当纯粹的 DICOM 服务器。
## HttpPort
REST API 服务 web 界面端口
## HttpDescribeErrors
当以下选项为`true`时,如果遇到错误在调用 REST API 时,一条描述错误的 JSON 消息放在 HTTP 响应中
## HttpCompressionEnabled
启用 HTTP 压缩以提高网络带宽利用率
支持`gzip`和`deflate` 编码。
## DicomServerEnabled
启用 DICOM 服务器。如果此参数设置为“false”Orthanc 充当纯粹的 REST 服务器。不能接收文件或通过 DICOM 协议进行查询/检索。
## DicomAet
> Aet:Application Entity Title
用来标识 DICOM 网络节点的字符串,它在 DICOM 通信中起到了类似于 IP 地址或域名的作用。
## DicomCheckCalledAet
用来指定 Orthanc 是否检查传入的 DICOM 连接的应用实体标题Application Entity Title的。
如果这个属性设置为:
- true接受与 `DicomAet` 属性相同的连接
- false接受全部连接
## DicomPort
DICOM 服务器的端口
## DefaultEncoding
> 推荐设置 Utf8 || Chinese
假设的 DICOM 文件的默认编码没有 `SpecificCharacterSet`DICOM 标签,指定 Orthanc 的默认字符编码
- Ascii
- Utf8
- Latin1
- Latin2
- Latin3
- Latin4
- Latin5
- Cyrillic: 西里尔字母
- Windows1251
- Arabic: 阿拉伯语
- Greek: 希腊语
- Hebrew: 希伯来语
- Thai
- Japanese
- Chinese
- JapaneseKanji
- Korean
- SimplifiedChinese: 简体中文
## DeflatedTransferSyntaxAccepted
> Deflated 压缩是一种基于 Zlib 的无损压缩算法,可以减少 DICOM 文件的大小
用来控制是否接受 `Deflated` 压缩的 DICOM 文件
## JpegTransferSyntaxAccepted
用来控制是否接受 JPEG 压缩的 DICOM 文件
## JpegLosslessTransferSyntaxAccepted
用来控制是否接受 JPEG 无损压缩的 DICOM 文件
## JpipTransferSyntaxAccepted
> JPIP 是一种基于网络的交互式图像传输协议,可以实现图像的渐进式加载和区域访问
控制是否接受 JPIP 压缩的 DICOM 文件
## Mpeg2TransferSyntaxAccepted
> MPEG-2 是一种用于视频和音频的压缩标准,可以实现高质量的多媒体传输
用来控制是否接受 `MPEG-2` 压缩的 DICOM 文件
## RleTransferSyntaxAccepted
> RLE 是一种无损压缩算法,可以减少 DICOM 文件的大小
是否接受 RLE 压缩的 DICOM 文件
## UnknownSopClassAccepted
> SOP 类是一种定义了 DICOM 服务类型和信息对象类型的标识符
用来控制是否接受未知的存储 SOP 类的 DICOM 文件
## DicomScpTimeout
作为 C-Store SCP 传输超时设计
## RemoteAccessAllowed
用来控制是否允许远程主机连接到 HTTP 服务器
## SslEnabled
是否启用 SSL 加密
## SslCertificate
指定 SSL 证书的路径
## AuthenticationEnabled
> 设为 false 无需密码登录
是否启用`用户名密码`登录。从 Orthanc 1.5.8 开始,默认启用,需要开启`RemoteAccessAllowed`
## RegisteredUsers
访问 `8042 web`需要输入的账号密码,如果为 `{}`,直接访问
```json
"RegisteredUsers": {
// 用户1
"demo": "demo",
// 用户2
"hm": "27516120"
},
```
## DicomModalities
用来配置已知的 DICOM 设备的列表的,每个设备需要指定:
1. 一个符号名称AET应用实体标题
2. IP 地址
3. 端口号
这样就可以通过`DICOM commands (C-ECHO,C-STORE, C-FIND, C-MOVE...)`与这些设备进行 DICOM 通信。
```json
"demo": [
"HM-ORTHANC",
"192.168.1.126",
4242
],
"ohif" : [ "OHIFDCM", "viewer", 3000 ]
```
## DicomModalitiesInDatabase
是否将 DICOM 模式存储在 Orthanc 数据库中而不是在此配置文件中Orthanc 1.5.0 中的新增)
## DicomAlwaysAllowEcho
Orthanc SCP 是否允许传入的 `C-Echo` 请求,只有`Orthanc 1.3.0`默认为 false
## DicomAlwaysAllowStore
Orthanc SCP 是否允许传入的 `C-Store` 请求
## DicomCheckModalityHost
Orthanc 是否检查远程的 IP/主机名地址,启动 DICOM 连接的模式
## DicomScuTimeout
远程 DICOM SCP服务器没有回答的超时就关闭单位 `seconds`
# OrthancPeers
用来配置已知的 Orthanc 服务器的列表的,每个服务器需要指定一个符号名称,以及其基本 URL可能还需要用户名和密码如果该服务器启用了密码保护的话。可以通过 HTTP/HTTPS 协议与这些服务器进行资源的发送和接收。
```json
"OrthancPeers": {
"peer" : [ "http://127.0.0.1:8043/", "alice", "alicePassword" ]
"peer2" : [ "http://127.0.0.1:8044/" ]
"peer3" : {
"Url" : "http://127.0.0.1:8043/",
"Username" : "alice",
"Password" : "alicePassword",
"HttpHeaders" : { "Token" : "Hello world" },
"CertificateFile" : "client.crt",
"CertificateKeyFile" : "client.key",
"CertificateKeyPassword" : "certpass",
"Pkcs11" : false
}
},
```
## OrthancPeersInDatabase
是否将`peers`存在数据库中
## HttpProxy
网络访问受限的情况下,可以使用 配置 http 代理
## HttpVerbose
是否在日志中显示 Orthanc 发出的 HTTP 请求的详细信息的
## HttpTimeout
http 服务请求超时时间,单位 `seconds`
## HttpsVerifyPeers
`peers`在 http 通信过程中 是否校验`ssl证书`
## HttpsCACertificates
`peers` 通信证书的路径,证书必须采用 PEM 格式,基于 Debian 的系统,此选项可以设置为`/etc/ssl/certs/ca-certificates.crt`
## UserMetadata
用来定义用户自定义元数据的字典,将一个介于 1024 和 65535 之间的数字映射到一个唯一的字符串。这个选项可以用于为 DICOM 资源添加一些额外的信息,例如患者的电话号码或者检查的费用
## UserContentType
`MIME`限制
## StableAge
定义一个 DICOM 资源被认为是稳定的所需的最小生命周期(以`秒`为单位)
## StrictAetComparison
避免在资源还在接收过程中就被处理或者导出。`Aet`名称严格要求`大小写`相同
## StoreMD5ForAttachments
> 默认为 true
是否为每个附件计算并存储 MD5 校验,检测附件是否被篡改或者损坏,但是会增加一些存储空间和计算时间的开销
## LimitFindResults
> 默认为 0不限制
响应 `C-Find` 请求时返回的最大结果数
## LimitFindInstances
> 默认为 0不限制
响应 `C-Find` 请求时返回的最大实例数
## LimitJobs
> 可以用于控制 Orthanc 的并发性能,但是也会增加内存和 CPU 的消耗
给定时间同时运行的最大处理任务数的,如果设置为 0则表示使用所有可用的 CPU 逻辑核心。
## LogExportedResources
LogExportedResources 参数是用来控制是否在日志中记录导出到其他 DICOM 设备或者 Orthanc 节点的资源的
## KeepAlive
用来控制是否启用 HTTP 长连接的,这个选项可以用于提高 HTTP 通信的效率,但是也会占用更多的网络资源
## TcpNoDelay
是否禁用 TCP 延迟算法,如果设置为 true则表示禁用
## HttpThreadsCount
> 这个选项可以用于控制 Orthanc 的并发性能,但是也会增加内存和 CPU 的消耗
用来控制处理 HTTP 请求的线程数的,如果设置为 0则表示使用所有可用的 CPU 逻辑核心。
## StoreDicom
如果此选项设置为`false`Orthanc 将仅在索引中运行模式。DICOM 文件不会存储在驱动器上。
> 此选项可能会阻止升级到较新版本的 Orthanc
## DicomAssociationCloseDelay
> 避免过早地关闭 DICOM 关联,导致一些设备无法发送后续的 DICOM 文件
在没有收到进一步的 `DIMSE` 命令后Orthanc 作为 C-Store SCP 关闭 DICOM 关联的延迟时间(以秒为单位)
## QueryRetrieveSize
查询/检索 DICOM 请求的最大数量
## CaseSensitivePN
> 默认情况下,搜索是不区分大小写
处理 C-Find SCP 请求时,将此标志设置为`true`,将为 PN 值表示启用区分大小写的匹配(如患者姓名)。
## Pkcs11
硬件安全模块HSM进行 HTTPS 客户端身份验证时的智能卡
```json
"Pkcs11": {
"Module" : "/usr/local/lib/libbeidpkcs11.so",
"Module" : "C:/Windows/System32/beidpkcs11.dll",
"Pin" : "1234",
"Verbose" : true
}
```
## LoadPrivateDictionary
> 以用于避免与用户自定义的私有 DICOM 标签冲突,但是也会导致一些私有 DICOM 标签无法识别
是否加载 Orthanc 自带的私有 DICOM 标签字典的
## Locale
> 可以用于支持不同语言和字符集的人名,但是也会影响排序和检索的结果
指定 Orthanc 使用的区域设置的目前只用于比较人名PN类型的 DICOM 标签。
## Dictionary
> 可以用于扩展 Orthanc 支持的 DICOM 标签,但是也要注意避免与现有的 DICOM 标准或者私有字典冲突
定义用户自定义的 DICOM 标签字典的,每个条目必须将一个十六进制的标签编号映射到一个字符串,表示该标签的 VR值表示和名称。
```json
"Dictionary": {
"0008,0005": ["SpecificCharacterSet", "GB18030", 1, 1]
"0014,1020" : [ "DA", "ValidationExpiryDate", 1, 1 ]
"00e1,10c2" : [ "UI", "PET-CT Multi Modality Name", 1, 1, "ELSCINT1" ]
"7053,1003" : [ "ST", "Original Image Filename", 1, 1, "Philips PET Private Group" ]
"2001,5f" : [ "SQ", "StackSequence", 1, 1, "Philips Imaging DD 001" ]
}
```
## SynchronousCMove
是否同步运行 DICOM C-Move 操作
## JobsHistorySize
保存在内存中的已完成作业的最大数量
## SaveJobs
> 默认 true
是否将作业保存到 Orthanc 数据库中。挂起/正在运行/完成的作业是如果 Orthanc 停止,则自动从数据库重新加载然后`重新启动`
## OverwriteInstances
> 默认 false不覆盖
指定 Orthanc 在接收 DICOM 实例,是否覆盖
## MediaArchiveSize
ZIP/媒体档案的最大数量
## StorageAccessOnFind
> 默认 Always允许 Orthanc 在需要时立即读取存储区域
C-FIND 期间,指定 Orthanc 如何访问存储的性能设置
## MetricsEnabled
是否启用 `Prometheus` 兼容的指标接口的,如果设置为 true则表示启用。用于监控 Orthanc 的运行状态和性能,但是也会增加一些内存和 CPU 的消耗
## ExecuteLuaEnabled
> 默认情况下禁用
是否启用了对 URI`/tools/execute-script`的调用。Orthanc 1.5.8,出于安全考虑
## HttpRequestTimeout
以秒为单位设置 HTTP 请求的超时,这个参数对应于 `Mongoose/Civetweb``request_timeout_ms` 也有影响
## DicomWeb
```json
"DicomWeb":{
"Enable": true, // 是否开启 Enable
"Root": "/dicom-web/", // DICOMweb API的根URI适用于QIDO-RS、STOW-RS和WADO-RS
"EnableWado": true, // 是否启用WADO-URI以前称为WADO支持
"WadoRoot": "/wado", // WADO-URI的根URI又名WADOAPI
"Ssl": false, // ssl 开启
"QidoCaseSensitive": true, // 对于QIDO-RS服务器搜索是否区分大小写自版本0.5起)
"Host": "localhost", // WADO-RS请求的 host
"StudiesMetadata": "Full", // 如何检索 研病例级元数据
"SeriesMetadata": "Full" // 如何检 索序列级元数据
}
```
## PostgreSQL
```json
"PostgreSQL": {
"EnableIndex": true,
"EnableStorage": true, // 启用或禁用PostgreSQL存储插件。如果设置为trueOrthanc将把它接收到的DICOM文件存储为PostgreSQL数据库中的大对象。如果设置为falseOrthanc将继续使用默认的文件系统存储区域。对应的是 StorageDirectory属性的路径也就是DICOM文件存储在/var/lib/orthanc/db/ 里
"Host": "postgres", // PostgreSQL容器的host对应 docker 的 container_name
"Port": 5432, // PostgreSQL容器服务的端口
"Database": "orthanc", // PostgreSQL容器数据库名称
"Username": "orthanc", // PostgreSQL容器数据库用户名
"Password": "orthanc" // PostgreSQL容器数据库密码
}
```

97
config/orthanc.json Normal file
View File

@ -0,0 +1,97 @@
{
"Name": "DICOM PACS",
"StorageDirectory": "/var/lib/orthanc/db",
// "IndexDirectory": "",
"StorageCompression": true,
"MaximumStorageSize": 0,
"MaximumPatientCount": 0,
"LuaScripts": [],
"Plugins": [
"/usr/share/orthanc/plugins"
],
"ConcurrentJobs": 0,
"HttpServerEnabled": true,
"HttpPort": 8042,
"HttpDescribeErrors": true,
"HttpCompressionEnabled": true,
"DicomServerEnabled": true,
"DicomAet": "DICOM-ORTHANC",
"DicomCheckCalledAet": false,
"DicomPort": 4242,
"DefaultEncoding": "Utf8",
"DeflatedTransferSyntaxAccepted": true,
"JpegTransferSyntaxAccepted": true,
"Jpeg2000TransferSyntaxAccepted": true,
"JpegLosslessTransferSyntaxAccepted": true,
"JpipTransferSyntaxAccepted": true,
"Mpeg2TransferSyntaxAccepted": true,
"RleTransferSyntaxAccepted": true,
"UnknownSopClassAccepted": false,
"DicomScpTimeout": 30,
"RemoteAccessAllowed": true,
"SslEnabled": false,
"SslCertificate": "certificate.pem",
"AuthenticationEnabled": false,
"RegisteredUsers": {},
"DicomModalities": {},
"DicomModalitiesInDatabase": false,
"DicomAlwaysAllowEcho": true,
"DicomAlwaysAllowStore": true,
"DicomCheckModalityHost": false,
"DicomScuTimeout": 10,
"OrthancPeers": {},
"OrthancPeersInDatabase": false,
"HttpProxy": "",
"HttpVerbose": false,
"HttpTimeout": 60,
"HttpsVerifyPeers": true,
"HttpsCACertificates": "",
"UserMetadata": {},
"UserContentType": {},
"StableAge": 60,
"StrictAetComparison": false,
"StoreMD5ForAttachments": true,
"LimitFindResults": 0,
"LimitFindInstances": 0,
"LimitJobs": 20,
"LogExportedResources": false,
"KeepAlive": true,
"TcpNoDelay": true,
"HttpThreadsCount": 50,
"StoreDicom": true,
"DicomAssociationCloseDelay": 5,
"QueryRetrieveSize": 100,
"CaseSensitivePN": false,
"LoadPrivateDictionary": true,
"Locale": "en_US.UTF-8",
"Dictionary": {},
"SynchronousCMove": true,
"JobsHistorySize": 10,
"SaveJobs": true,
"OverwriteInstances": false,
"MediaArchiveSize": 1,
"StorageAccessOnFind": "Always",
"MetricsEnabled": true,
"ExecuteLuaEnabled": false,
"HttpRequestTimeout": 30,
"DicomWeb": {
"Enable": true,
"Root": "/dicom-web/",
"EnableWado": true,
"WadoRoot": "/wado",
"Ssl": false,
"QidoCaseSensitive": true,
"Host": "localhost",
"StudiesMetadata": "Full",
"SeriesMetadata": "Full"
},
"PostgreSQL": {
"EnableIndex": true,
"EnableStorage": false,
"Host": "postgres",
"Port": 5432,
"Database": "orthanc",
"Username": "orthanc",
"Password": "orthanc"
}
}

48
docker-compose.yml Normal file
View File

@ -0,0 +1,48 @@
version: '3.6'
services:
orthanc:
image: osimis/orthanc:20.11.2
container_name: orthanc
depends_on:
- postgres
restart: always
ports:
- '8042:8042'
- '4242:4242'
volumes:
# 挂载orthanc.json配置
- ${ORTHANC_CONFIG}:/etc/orthanc/orthanc.json:ro
# 不使用 postgre 存储 dicom挂载出来到 ${ORTHANC_DB_MNT},更健康
- ${ORTHANC_DB_MNT}:/var/lib/orthanc/db
environment:
- DICOM_WEB_PLUGIN_ENABLED=true
- POSTGRESQL_PLUGIN_ENABLED=true
- TZ=Asia/Shanghai
command: /etc/orthanc/orthanc.json
logging:
driver: "json-file"
options:
max-size: "800m"
postgres:
image: postgres:13.1
container_name: postgres
restart: always
ports:
- '5432:5432'
volumes:
# postgrel->data 挂载出来
- ${POSTGRES_DATA_MNT}:${PGDATA}
environment:
- PGDATA=${PGDATA}
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- TZ=Asia/Shanghai
logging:
driver: "json-file"
options:
max-size: "800m"