This commit is contained in:
Masroor Ehsan 2025-01-26 22:38:37 +06:00
commit 0dbb93f3ab
8 changed files with 937 additions and 0 deletions

38
.env Normal file
View File

@ -0,0 +1,38 @@
# docker-compose environment file
#
# When you set the same environment variable in multiple files,
# heres the priority used by Compose to choose which value to use:
#
# 1. Compose file
# 2. Shell environment variables
# 3. Environment file
# 4. Dockerfile
# 5. Variable is not defined
#
# Nginx configuration
#
NGINX_DEFAULT_CONF=./config/nginx_ohif.conf
#
# OHIF Viewer
#
VIEWER_CONFIG=./config/ohif.js
#
# Orthanc core with plugins
#
ORTHANC_CONFIG=./config/orthanc.json
ORTHANC_OHIF=./config/orthanc_ohif.js
ORTHANC_DB_MNT=./orthanc_db
#
# PostgreSQL database - default values should not be used in production
#
POSTGRES_DATA_MNT=./pg_sql
PGDATA=/var/lib/postgresql/data
POSTGRES_DB=orthanc
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=pgpassword

28
config/nginx_ohif.conf Normal file
View File

@ -0,0 +1,28 @@
server {
listen 80;
# set client body size to 500M, this is to allow uploading of DICOMs, throws '413 request entity too large nginx' error otherwise #
client_max_body_size 500M;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# https://book.orthanc-server.com/faq/nginx.html#nginx
location /orthanc/ {
proxy_pass http://pacs:8042;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
rewrite /orthanc(.*) $1 break;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Origin' '*';
}
}

144
config/ohif.js Normal file
View File

@ -0,0 +1,144 @@
window.config = {
// default: '/'
routerBasename: "/",
extensions: [],
showStudyList: false,
filterQueryParam: false,
servers: {
dicomWeb: [
{
name: "Orthanc",
wadoUriRoot: "/orthanc/wado",
qidoRoot: "/orthanc/dicom-web",
wadoRoot: "/orthanc/dicom-web",
qidoSupportsIncludeField: true,
imageRendering: "wadors",
thumbnailRendering: "wadors",
enableStudyLazyLoad: true,
supportsFuzzyMatching: true,
},
],
},
whiteLabeling: {
/* Used to replace the default Logo */
createLogoComponentFn: function (React) {
return React.createElement("a", {
target: "_self",
rel: "noopener noreferrer",
className: "header-brand",
href: "/",
style: {
display: "block",
background: "url(/logo.png)",
backgroundSize: "contain",
backgroundRepeat: "no-repeat",
width: "200px",
},
});
},
},
// Extensions should be able to suggest default values for these?
// Or we can require that these be explicitly set
hotkeys: [
// ~ Global
{
commandName: "incrementActiveViewport",
label: "Next Viewport",
keys: ["right"],
},
{
commandName: "decrementActiveViewport",
label: "Previous Viewport",
keys: ["left"],
},
// Supported Keys: https://craig.is/killing/mice
// ~ Cornerstone Extension
{ commandName: "rotateViewportCW", label: "Rotate Right", keys: ["r"] },
{ commandName: "rotateViewportCCW", label: "Rotate Left", keys: ["l"] },
{ commandName: "invertViewport", label: "Invert", keys: ["i"] },
{
commandName: "flipViewportVertical",
label: "Flip Horizontally",
keys: ["h"],
},
{
commandName: "flipViewportHorizontal",
label: "Flip Vertically",
keys: ["v"],
},
{ commandName: "scaleUpViewport", label: "Zoom In", keys: ["+"] },
{ commandName: "scaleDownViewport", label: "Zoom Out", keys: ["-"] },
{ commandName: "fitViewportToWindow", label: "Zoom to Fit", keys: ["="] },
{ commandName: "resetViewport", label: "Reset", keys: ["space"] },
// clearAnnotations
{ commandName: "nextImage", label: "Next Image", keys: ["down"] },
{ commandName: "previousImage", label: "Previous Image", keys: ["up"] },
// firstImage
// lastImage
{
commandName: "previousViewportDisplaySet",
label: "Previous Series",
keys: ["pagedown"],
},
{
commandName: "nextViewportDisplaySet",
label: "Next Series",
keys: ["pageup"],
},
// ~ Cornerstone Tools
{ commandName: "setZoomTool", label: "Zoom", keys: ["z"] },
// ~ Window level presets
{
commandName: "windowLevelPreset1",
label: "W/L Preset 1",
keys: ["1"],
},
{
commandName: "windowLevelPreset2",
label: "W/L Preset 2",
keys: ["2"],
},
{
commandName: "windowLevelPreset3",
label: "W/L Preset 3",
keys: ["3"],
},
{
commandName: "windowLevelPreset4",
label: "W/L Preset 4",
keys: ["4"],
},
{
commandName: "windowLevelPreset5",
label: "W/L Preset 5",
keys: ["5"],
},
{
commandName: "windowLevelPreset6",
label: "W/L Preset 6",
keys: ["6"],
},
{
commandName: "windowLevelPreset7",
label: "W/L Preset 7",
keys: ["7"],
},
{
commandName: "windowLevelPreset8",
label: "W/L Preset 8",
keys: ["8"],
},
{
commandName: "windowLevelPreset9",
label: "W/L Preset 9",
keys: ["9"],
},
],
cornerstoneExtensionConfig: {},
investigationalUseDialog: {
option: 'never',
},
// studyListFunctionsEnabled is set to true to enable DICOM uploading
studyListFunctionsEnabled: false,
};

261
config/orthanc.json Normal file
View File

@ -0,0 +1,261 @@
{
"Name": "CHEVRON",
"StorageDirectory": "/var/lib/orthanc/db",
"IndexDirectory": "/var/lib/orthanc/db",
"StorageCompression": true,
"MaximumStorageSize": 0,
"MaximumPatientCount": 0,
"MaximumStorageCacheSize": 128,
"LuaScripts": [],
"Plugins": [
"/usr/share/orthanc/plugins",
"/usr/local/share/orthanc/plugins"
],
"OHIF": {
"UserConfiguration": "/usr/local/share/orthanc/ohif.js"
},
"ExtraMainDicomTags": {
"Instance": [
"Rows",
"Columns",
"ImageType",
"SOPClassUID",
"ContentDate",
"ContentTime",
"FrameOfReferenceUID",
"PixelSpacing",
"SpecificCharacterSet",
"BitsAllocated",
"BitsStored",
"RescaleSlope",
"RescaleIntercept",
"SliceThickness",
"WindowCenter",
"WindowWidth",
"PhotometricInterpretation",
"BFSenderID",
"PixelRepresentation"
],
"Series": [
"TimezoneOffsetFromUTC",
"BodyPartExamined",
"PerformedProcedureStepStartDate",
"PerformedProcedureStepStartTime",
"RequestAttributesSequence"
],
"Study": [
"OtherPatientNames",
"OtherPatientIDs",
"TimezoneOffsetFromUTC",
"AcquisitionUID",
"AcquisitionDate",
"AcquisitionDeviceProcessingDescription",
"AcquisitionTime",
"BodyPartExamined",
"InstitutionAddress",
"Manufacturer",
"ManufacturerModelName",
"Modality",
"OperatorsName",
"ProtocolName",
"SeriesDescription",
"SoftwareVersions",
"ReferringPhysicianName",
"ReferringPhysicianIdentificationSequence",
"ConsultingPhysicianName",
"ConsultingPhysicianIdentificationSequence",
"RequestingPhysician",
"BFSenderID",
"StationName"
],
"Patient": [
"OtherPatientNames",
"OtherPatientIDs"
]
},
"ConcurrentJobs": 8,
"HttpServerEnabled": true,
"OrthancExplorerEnabled": true,
"HttpPort": 8042,
"HttpDescribeErrors": true,
"HttpCompressionEnabled": true,
"WebDavEnabled": true,
"WebDavDeleteAllowed": false,
"WebDavUploadAllowed": true,
"DicomServerEnabled": true,
"DicomAet": "CHEVRON",
"DicomCheckCalledAet": true,
"DicomPort": 4242,
"DefaultEncoding": "Latin1",
"AcceptedTransferSyntaxes": [
"1.2.840.10008.1.*"
],
"UnknownSopClassAccepted": false,
"DicomScpTimeout": 30,
"RemoteAccessAllowed": true,
"SslEnabled": false,
"SslCertificate": "certificate.pem",
"SslMinimumProtocolVersion": 4,
"SslVerifyPeers": false,
"SslTrustedClientCertificates": "trustedClientCertificates.pem",
"AuthenticationEnabled": false,
"RegisteredUsers": {
"dicom": "letmein"
},
"DicomTlsEnabled": false,
"DicomTlsRemoteCertificateRequired": true,
"DicomAlwaysAllowEcho": true,
"DicomAlwaysAllowStore": true,
"DicomAlwaysAllowFind": false,
"DicomAlwaysAllowFindWorklist": false,
"DicomAlwaysAllowGet": false,
"DicomAlwaysAllowMove": false,
"DicomCheckModalityHost": false,
"DicomModalities": {
// "MAPDRX" : [ "MAPDR", "127.0.0.1", 11112]
},
"DicomModalitiesInDatabase": false,
"DicomEchoChecksFind": false,
"DicomScuTimeout": 10,
"DicomScuPreferredTransferSyntax": "1.2.840.10008.1.2.1",
"DicomThreadsCount": 4,
"OrthancPeers": {},
"OrthancPeersInDatabase": false,
"HttpProxy": "",
"HttpVerbose": false,
"HttpTimeout": 60,
"HttpsVerifyPeers": true,
"HttpsCACertificates": "/etc/ssl/certs/ca-certificates.crt",
"UserMetadata": {
// "Sample" : 1024
},
"UserContentType": {
// "sample" : 1024
// "sample2" : [ 1025, "application/pdf" ]
},
"StableAge": 60,
"StrictAetComparison": false,
"StoreMD5ForAttachments": true,
"LimitFindResults": 0,
"LimitFindInstances": 0,
"LogExportedResources": false,
"KeepAlive": true,
"TcpNoDelay": true,
"HttpThreadsCount": 50,
"StoreDicom": true,
"DicomAssociationCloseDelay": 5,
"QueryRetrieveSize": 100,
"CaseSensitivePN": false,
"LoadPrivateDictionary": true,
"Dictionary" : {
"0011,1060" : [ "LO", "InnowaveUploaderID", 1, 1, "InowavePrivateGroup"],
"1971,1020" : [ "LO", "BFSenderID", 1, 1, "BlackFish"]
},
"SynchronousCMove": true,
"JobsHistorySize": 10,
"SaveJobs": true,
"OverwriteInstances": false,
"MediaArchiveSize": 1,
"StorageAccessOnFind": "Always",
"MetricsEnabled": true,
"ExecuteLuaEnabled": false,
"HttpRequestTimeout": 30,
"DefaultPrivateCreator": "",
"StorageCommitmentReportsSize": 100,
"TranscodeDicomProtocol": true,
"BuiltinDecoderTranscoderOrder": "After",
"IngestTranscoding": "1.2.840.10008.1.2.4.91",
"IngestTranscodingOfUncompressed": true,
"IngestTranscodingOfCompressed": true,
"DicomLossyTranscodingQuality": 90,
"SyncStorageArea": true,
"MallocArenaMax": 5,
"DeidentifyLogs": true,
"DeidentifyLogsDicomVersion": "2021b",
"MaximumPduLength": 16384,
"CheckRevisions": false,
"SynchronousZipStream": true,
"ZipLoaderThreads": 0,
"Warnings": {
"W001_TagsBeingReadFromStorage": true,
"W002_InconsistentDicomTagsInDb": true
},
"StoneWebViewer": {
/**
* Enables/disables the print button.
**/
"PrintEnabled": false,
/**
* Enables/disables the button to download a screenshot of the
* active viewport as a JPEG file.
**/
"DownloadAsJpegEnabled": false,
/**
* Enables/disables the button to download the display study.
* Only used if "OrthancApiRoot" is properly set.
**/
"DownloadStudyEnabled": false,
/**
* If option "DownloadDicomDir" is set to "true", the Stone Web
* viewer will create DICOMDIR media archives (as generated by the
* route "/studies/{id}/media" of Orthanc), instead of archives
* containing a human-readable hierarchy of folders (as generated
* by the route "/studies/{id}/archive").
**/
"DownloadDicomDir": true,
/**
* By setting option "InstitutionLogo" to an URL containing an
* image, this logo will be displayed at the bottom-left of the
* Stone Web viewer.
**/
"InstitutionLogo": "http://pacs.mylabctg.com:8042/stone-webviewer/img/orthanc.png",
/**
* Whether to display the info panel at startup. Allowed values:
* "Always", "Never", "User". With "User", the user can decide to
* show or not the info panel in the user preferences panel (this
* is implemented using a cookie). (New in Stone Web viewer 2.4)
**/
"ShowInfoPanelAtStartup": "Never",
/**
* Whether to give access to the user preferences window. (New in
* Stone Web viewer 2.4)
**/
"ShowUserPreferencesButton": true,
/**
* Display a "not for diagnostic usage" disclaimer above the list
* of studies/series. (New in Stone Web viewer 2.4)
**/
"ShowNotForDiagnosticUsageDisclaimer": false
},
"DicomWeb": {
"Enable": true,
"Root": "/dicom-web/",
"PublicRoot": "/dicom-web/",
"EnableWado": true,
"WadoRoot": "/wado",
"Ssl": false,
"Servers": {
"main": [
"http://pacs.mylabctg.com:8042/dicom-web/"
]
},
"QidoCaseSensitive": true,
"MetadataWorkerThreadsCount": 10,
"EnableMetadataCache": true,
"StudiesMetadata": "Full",
"SeriesMetadata": "Full"
},
"OrthancExplorer2": {
"Enable": true,
"IsDefaultOrthancUI": true
},
"PostgreSQL": {
"EnableIndex": true,
"EnableStorage": false, // DICOM files are stored in the Orthanc container in /var/lib/orthanc/db/
"Host": "postgres", // the name of the PostgreSQL container
"Port": 5432,
"Database": "orthanc", // default database name in PostgreSQL container (no need to create it)
"Username": "postgres", // default user name in PostgreSQL container (no need to create it)
"Password": "pgpassword"
}
}

256
config/orthanc_ohif.js Normal file
View File

@ -0,0 +1,256 @@
/**
* SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium,
* and 2018-2024 Open Health Imaging Foundation
* SPDX-License-Identifier: MIT
*/
window.config = {
extensions: [],
modes: [],
customizationService: {
// Shows a custom route -access via http://localhost:3000/custom
// helloPage: '@ohif/extension-default.customizationModule.helloPage',
},
showStudyList: false,
investigationalUseDialog: {
option: 'never',
},
whiteLabeling: {
/* Used to replace the default Logo */
createLogoComponentFn: function (React) {
return React.createElement("a", {
target: "_self",
rel: "noopener noreferrer",
className: "header-brand",
href: "/",
style: {
display: "block",
background: "url(/logo.png)",
backgroundSize: "contain",
backgroundRepeat: "no-repeat",
width: "200px",
},
});
},
},
customizationService: {
cornerstoneOverlayTopLeft: {
id: 'cornerstoneOverlayTopLeft',
items: [
{
id: 'WindowLevel',
customizationType: 'ohif.overlayItem.windowLevel',
},
{
id: 'PatientName',
customizationType: 'ohif.overlayItem',
label: 'Pt:',
color: 'white',
condition: ({ instance }) =>
instance &&
instance.PatientName &&
instance.PatientName.Alphabetic,
contentF: ({ instance, formatters: { formatPN } }) => {
if (instance && instance.PatientName && instance.PatientName.Alphabetic) {
return formatPN(instance.PatientName.Alphabetic) + ' ' + (instance.PatientSex ? '(' + instance.PatientSex + ')' : '');
} else {
return 'N/A';
}
},
},
{
id: 'PatientAge',
customizationType: 'ohif.overlayItem',
label: 'Age:',
color: 'white',
title: "Patient's Age",
condition: ({ instance }) => instance && instance.PatientAge,
contentF: ({ instance }) => instance.PatientAge,
},
{
id: 'ID',
customizationType: 'ohif.overlayItem',
label: 'ID:',
color: 'white',
title: 'Patient PID',
condition: ({ instance }) => instance && instance.PatientID,
contentF: ({ instance }) => instance.PatientID,
},
],
},
},
// some windows systems have issues with more than 3 web workers
maxNumberOfWebWorkers: 3,
// below flag is for performance reasons, but it might not work for all servers
omitQuotationForMultipartRequest: true,
showWarningMessageForCrossOrigin: true,
showCPUFallbackMessage: true,
showLoadingIndicator: true,
strictZSpacingForVolumeViewport: true,
maxNumRequests: {
interaction: 100,
thumbnail: 75,
// Prefetch number is dependent on the http protocol. For http 2 or
// above, the number of requests can be go a lot higher.
prefetch: 25,
},
// filterQueryParam: false,
httpErrorHandler: error => {
// This is 429 when rejected from the public idc sandbox too often.
if (error.status) {
console.warn(error.status);
} else {
console.warn(error);
}
},
hotkeys: [
{
commandName: 'incrementActiveViewport',
label: 'Next Viewport',
keys: ['right'],
},
{
commandName: 'decrementActiveViewport',
label: 'Previous Viewport',
keys: ['left'],
},
{ commandName: 'rotateViewportCW', label: 'Rotate Right', keys: ['r'] },
{ commandName: 'rotateViewportCCW', label: 'Rotate Left', keys: ['l'] },
{ commandName: 'invertViewport', label: 'Invert', keys: ['i'] },
{
commandName: 'flipViewportHorizontal',
label: 'Flip Horizontally',
keys: ['h'],
},
{
commandName: 'flipViewportVertical',
label: 'Flip Vertically',
keys: ['v'],
},
{ commandName: 'scaleUpViewport', label: 'Zoom In', keys: ['+'] },
{ commandName: 'scaleDownViewport', label: 'Zoom Out', keys: ['-'] },
{ commandName: 'fitViewportToWindow', label: 'Zoom to Fit', keys: ['='] },
{ commandName: 'resetViewport', label: 'Reset', keys: ['space'] },
{ commandName: 'nextImage', label: 'Next Image', keys: ['down'] },
{ commandName: 'previousImage', label: 'Previous Image', keys: ['up'] },
// {
// commandName: 'previousViewportDisplaySet',
// label: 'Previous Series',
// keys: ['pagedown'],
// },
// {
// commandName: 'nextViewportDisplaySet',
// label: 'Next Series',
// keys: ['pageup'],
// },
{
commandName: 'setToolActive',
commandOptions: { toolName: 'Zoom' },
label: 'Zoom',
keys: ['z'],
},
// ~ Window level presets
{
commandName: 'windowLevelPreset1',
label: 'W/L Preset 1',
keys: ['1'],
},
{
commandName: 'windowLevelPreset2',
label: 'W/L Preset 2',
keys: ['2'],
},
{
commandName: 'windowLevelPreset3',
label: 'W/L Preset 3',
keys: ['3'],
},
{
commandName: 'windowLevelPreset4',
label: 'W/L Preset 4',
keys: ['4'],
},
{
commandName: 'windowLevelPreset5',
label: 'W/L Preset 5',
keys: ['5'],
},
{
commandName: 'windowLevelPreset6',
label: 'W/L Preset 6',
keys: ['6'],
},
{
commandName: 'windowLevelPreset7',
label: 'W/L Preset 7',
keys: ['7'],
},
{
commandName: 'windowLevelPreset8',
label: 'W/L Preset 8',
keys: ['8'],
},
{
commandName: 'windowLevelPreset9',
label: 'W/L Preset 9',
keys: ['9'],
},
],
};
/**
* SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium,
* and 2018-2024 Open Health Imaging Foundation
* SPDX-License-Identifier: MIT
*/
window.config.routerBasename = '/ohif/';
if (true) {
window.config.dataSources = [
{
friendlyName: 'Orthanc DICOMweb',
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
sourceName: 'dicomweb',
configuration: {
name: 'orthanc',
wadoUriRoot: '../dicom-web',
qidoRoot: '../dicom-web',
wadoRoot: '../dicom-web',
qidoSupportsIncludeField: false,
supportsReject: false,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
enableStudyLazyLoad: true,
supportsFuzzyMatching: false,
supportsWildcard: true,
staticWado: true,
singlepart: 'bulkdata,pdf,video',
acceptHeader: ['multipart/related; type=application/octet-stream; transfer-syntax=*']
}
}
];
window.config.defaultDataSourceName = 'dicomweb';
} else {
window.config.showStudyList = false;
window.config.dataSources = [
{
friendlyName: 'Orthanc DICOM JSON',
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
sourceName: 'dicomjson',
configuration: {
name: 'json',
},
}
];
window.config.defaultDataSourceName = 'dicomjson';
}

154
config/stone.json Normal file
View File

@ -0,0 +1,154 @@
{
"StoneWebViewer" :
{
/**
* Defines how dates are displayed in the UI. If this option is not
* set, the DICOM tags will be displayed as such. "DD" will be
* replaced by the day, "MM" by the month, and "YYYY" by the year.
**/
// "DateFormat" : "DD/MM/YYYY",
/**
* Defines how times are displayed in the UI. If this option is not
* set, the DICOM tags will be displayed as such. "hh" will be
* replaced by the hour, "mm" by the minutes, "ss" by the seconds
* and ".f" by the fractions of seconds.
**/
// "TimeFormat" : "hh:mm:ss.f",
/**
* This option allows you to define windowing presets.
* For each preset, you must provide a name, the window width
* and window center.
**/
"WindowingPresets" : [
{"Name" : "CT Lung", "WindowCenter" : -400, "WindowWidth" : 1600},
{"Name" : "CT Abdomen", "WindowCenter" : 60, "WindowWidth" : 400},
{"Name" : "CT Bone", "WindowCenter" : 300, "WindowWidth" : 1500},
{"Name" : "CT Brain", "WindowCenter" : 40, "WindowWidth" : 80},
{"Name" : "CT Chest", "WindowCenter" : 40, "WindowWidth" : 400},
{"Name" : "CT Angio", "WindowCenter" : 300, "WindowWidth" : 600}
],
/**
* Enables/disables the combined tool. This is the default mode
* for mouse interactions. The combined tool allows to access the
* windowing, zoom and pan from a single mouse configuration. The
* behaviour of the combined tool is defined in
* CombinedToolBehaviour. The available mouse actions are
* "Crosshair", "Windowing", "Pan", "Rotate", "Zoom" and
* "MagnifyingGlass".
**/
"CombinedToolEnabled" : true,
"CombinedToolBehaviour" : {
"LeftMouseButton" : "Windowing",
"MiddleMouseButton" : "Pan",
"RightMouseButton" : "Zoom"
},
/**
* Enables/disables the print button.
**/
"PrintEnabled" : false,
/**
* Enables/disables the button to download a screenshot of the
* active viewport as a JPEG file.
**/
"DownloadAsJpegEnabled" : false,
/**
* Enables/disables the button to download the display study.
* Only used if "OrthancApiRoot" is properly set.
**/
"DownloadStudyEnabled" : false,
/**
* The allowed origin for messages corresponding to dynamic actions
* triggered by another Web page using "window.postMessage()". The
* special value "*" will allow any origin, which is an insecure
* value to be used only during development. If this option is not
* set, all the requests for dynamic actions will be rejected.
* https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
**/
"ExpectedMessageOrigin" : "http://localhost:8042",
/**
* Root path of the DICOMweb server. This option is automatically
* set by the Orthanc plugin if missing.
**/
"DicomWebRoot" : "../dicom-web",
/**
* Set the size of the cache that stores the DICOM files. This
* size is expressed in megabytes. The default value of 128MB
* should work in most setups, except if very large multiframe
* instances are encountered, which might for instance be the case
* for mammography. Setting this parameter to zero will disable
* the cache, which should only be done for testing.
**/
"DicomCacheSize" : 128,
/**
* The following parameter can be set if running the Stone Web
* viewer from Orthanc, but without using the associated plugin
* (e.g. using the "Serve Folders" sample plugin). Using the
* plugin would overwrite this setting. This will enable features
* that are only available if the Orthanc REST API is accessible
* (download of studies, and playing videos). This option is
* typically used by the developers of Stone.
**/
"OrthancApiRoot" : "..",
/**
* If option "DownloadDicomDir" is set to "true", the Stone Web
* viewer will create DICOMDIR media archives (as generated by the
* route "/studies/{id}/media" of Orthanc), instead of archives
* containing a human-readable hierarchy of folders (as generated
* by the route "/studies/{id}/archive").
**/
"DownloadDicomDir" : false,
/**
* By setting option "InstitutionLogo" to an URL containing an
* image, this logo will be displayed at the bottom-left of the
* Stone Web viewer.
**/
"InstitutionLogo" : "",
/**
* Define a list of modality type that the viewer will ignore.
**/
"SkipSeriesFromModalities": ["SR", "SEG", "PR"],
/**
* Whether to display the info panel at startup. Allowed values:
* "Always", "Never", "User". With "User", the user can decide to
* show or not the info panel in the user preferences panel (this
* is implemented using a cookie). (New in Stone Web viewer 2.4)
**/
"ShowInfoPanelAtStartup": "User",
/**
* Whether to give access to the user preferences window. (New in
* Stone Web viewer 2.4)
**/
"ShowUserPreferencesButton" : true,
/**
* Display a "not for diagnostic usage" disclaimer above the list
* of studies/series. (New in Stone Web viewer 2.4)
**/
"ShowNotForDiagnosticUsageDisclaimer": false,
/**
* HTTP headers to be set in each request to the DICOMweb server.
* Note that the value of the headers can be taken from the
* environment variables.
**/
"DicomWebHttpHeaders" : {
/* "Authorization" : "Bearer ${USER}" */
}
}
}

56
docker-compose.yml Normal file
View File

@ -0,0 +1,56 @@
services:
postgres:
image: postgres
container_name: postgres
networks:
- pacs
volumes:
- ${POSTGRES_DATA_MNT}:${PGDATA}
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- PGDATA=${PGDATA}
- POSTGRES_DB=${POSTGRES_DB}
pacs:
container_name: orthanc
image: jodogne/orthanc-plugins
ports:
- 8042:8042
- 4242:4242
volumes:
# configuration file
- ${ORTHANC_CONFIG:-./config/orthanc.json}:/etc/orthanc/orthanc.json:ro
# storage volume for raw dicoms
- ${ORTHANC_DB_MNT:-./orthanc_db}:/var/lib/orthanc/db
- ${ORTHANC_OHIF:-./config/orthanc_ohif.js}:/usr/local/share/orthanc/ohif.js:ro
environment:
VERBOSE_ENABLED: "true"
VERBOSE_STARTUP: "true"
DICOM_WEB_PLUGIN_ENABLED: "true"
OHIF_PLUGIN_ENABLED: "true"
VOLVIEW_PLUGIN_ENABLED: "true"
restart: always
networks:
- pacs
depends_on:
- postgres
ohif:
container_name: ohif
image: ohif/viewer
ports:
- 3000:80
environment:
- APP_CONFIG:/usr/share/nginx/html/app-config.js
volumes:
- ${NGINX_DEFAULT_CONF}:/etc/nginx/conf.d/default.conf:ro
- ${VIEWER_CONFIG}:/usr/share/nginx/html/app-config.js:ro
- ./logo.png:/usr/share/nginx/html/logo.png:ro
restart: always
networks:
- pacs
networks:
pacs:
external: true

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB