Mercurial > hg > orthanc-book
diff Sphinx/source/users/docker-orthancteam.rst @ 1023:5d4701d8fe28
replaced osimis/orthanc by orthancteam/orthanc
author | Alain Mazy <am@osimis.io> |
---|---|
date | Thu, 01 Feb 2024 15:09:48 +0100 |
parents | |
children | 16e4ee083319 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sphinx/source/users/docker-orthancteam.rst Thu Feb 01 15:09:48 2024 +0100 @@ -0,0 +1,472 @@ +.. _docker-orthancteam: +.. highlight:: bash + + +orthancteam/orthanc Docker images +================================= + +.. contents:: + :depth: 3 + +.. warning:: + Starting from February 2024, the ``osimis/orthanc`` Docker images have been renamed + into ``orthancteam/orthanc``. The ``osimis/orthanc`` images won't be updated anymore + therefore you should switch to the ``orthancteam/orthanc`` images. + + Note that all old tags released prior to February 2024 have been copied into ``orthancteam/orthanc`` + as well so, even if you are using an old version, you should update the name in your setup. + The name is the only thing that has changed. The content and build procedure are identical. + +.. warning:: + + Starting from the ``22.6.1`` release, we are providing 2 types of images: + + - the default image with the usual tag: e.g ``22.6.1`` + - the full image with a e.g ``22.6.1-full`` tag + + The default image is suitable for 99.9% of users. + + You should use the full image only if you need to use one of these: + + - the Azure Blob storage plugin + - the Google Cloud storage plugin + - the ODBC plugin with SQL Server (msodbcsql18 is preinstalled) + + +Introduction +------------ + +Our commercial partner `Orthanc Team <https://orthanc.team>`__ +`publishes separated Docker images +<https://hub.docker.com/r/orthancteam/orthanc>`__. +These images have been designed to be used with ``docker-compose`` and +provide a configuration system through: + +- environment variables +- Docker secrets +- classical configuration files +- a mix of these options + +This `repository <https://github.com/orthanc-server/orthanc-setup-samples/src>`__ +contains lots of examples on how to use these images. In particular, +`this example <https://github.com/orthanc-server/orthanc-setup-samples/tree/master/docker/all-usages/docker-compose.yml>`__ +shows all the way that can be used to generate the same +configuration in Orthanc. + + +Environment variables +--------------------- + +Any part of the Orthanc configuration file can be configured through an +environment variable. Now that Orthanc and its plugins have hundreds of +configuration parameter, listing all these environment variable would be +too long. That's why we have defined a standard way of naming the variable: + ++---------------------------+----------------------------------------------+----------------------------------------------------------------+ +| Orthanc configuration | Environment variable | Sample value | ++===========================+==============================================+================================================================+ +| StableAge | ORTHANC__STABLE_AGE | ``30`` | ++---------------------------+----------------------------------------------+----------------------------------------------------------------+ +| DicomWeb.Root | ORTHANC__DICOM_WEB__ROOT | ``/dicom-web/`` | ++---------------------------+----------------------------------------------+----------------------------------------------------------------+ +| DicomWeb.Servers | ORTHANC__DICOM_WEB__SERVERS | ``{"sample": [ "http://127.0.0.1/dicom-web/"]}`` | ++---------------------------+----------------------------------------------+----------------------------------------------------------------+ + +To find out an environment variable name from an Orthanc setting +(i.e. ``DicomWeb.StudiesMetadata`` is the ``path`` to a setting): + +- whenever a word contains a capital letter, insert an underscore ``_`` in front. + ``DicomWeb.StudiesMetadata`` now becomes ``Dicom_Web.Studies_Metadata`` +- whenever you go down one level in the JSON configuration, insert + a double underscore ``__``. ``Dicom_Web.Studies_Metadata`` now becomes + ``Dicom_Web__Studies_Metadata`` +- capitalize all letters. ``Dicom_Web__Studies_Metadata`` now becomes + ``DICOM_WEB__STUDIES_METADATA`` +- add ``ORTHANC__`` in front. ``DICOM_WEB__STUDIES_METADATA`` now becomes + ``ORTHANC__DICOM_WEB__STUDIES_METADATA`` + +Note that, this automatic rule might fail because of 2 capital letters one after each other in some +Orthanc settings. Therefore, there are some `exceptions <https://github.com/orthanc-server/orthanc-builder/blob/master/docker/orthanc/env-var-non-standards.json>`__ to this rule +that are however quite intuitive. + +Special environment variables +----------------------------- + +Other environment variables are not related to the Orthanc configuration file +but can be specified to control the way Orthanc is run. + +- ``VERBOSE_STARTUP=true`` will allow you to debug the startup process and see + the configuration that has been provided to Orthanc. This setup should be + disabled in production since it might display secret information like passwords + in your logs +- ``VERBOSE_ENABLED=true`` will start Orthanc with the ``--verbose`` option +- ``TRACE_ENABLED=true`` will start Orthanc with the ``--trace`` option +- ``NO_JOBS=true`` will start Orthanc with the ``--no-jobs`` option +- ``LOGDIR=/logs`` will start Orthanc with the ``--logdir=/logs`` option (introduced in 21.9.1) +- ``LOGFILE=/logs`` will start Orthanc with the ``--logfile=/logs/orthanc.log`` option (introduced in 21.9.1) +- ``MALLOC_ARENA_MAX=10`` will :ref:`control memory usage <scalability-memory>` +- ``ORTHANC_JSON`` can be used to pass a JSON "root" configuration (see below). +- ``BEFORE_ORTHANC_STARTUP_SCRIPT`` can be used to `run a custom script <https://groups.google.com/g/orthanc-users/c/EXjTq2ZU1vw/m/02CwW1jzAQAJ>`__ before starting Orthanc. +- ``FORCE_HOST_ID`` and ``GENERATE_HOST_ID_IF_MISSING`` can be used to control the content of /etc/hostid (introduced in 22.9.1). + DCMTK calls gethostid() when generating DICOM UIDs (used, e.g, in modifications/anonymizations). + When /etc/hostid is missing, the system tries to generate it from the IP of the system. + On some system, in particular circumstances, we have observed that the system performs a DNS query + to get the IP of the system. This DNS can timeout (after multiple with retries) and, in particular cases, + we have observed a delay of 40 seconds to generate a single DICOM UID in Orthanc. + Therefore, if /etc/hostid is missing, the startup script creates it and fill it with a random number (default behaviour). + This behaviour can still be deactivated by defining ``GENERATE_HOST_ID_IF_MISSING=false``. + The host id can also be forced by defining ``FORCE_HOST_ID``. + + + +Configuration files +------------------- + +.. highlight:: yaml + +Configuration files should be stored in the ``/etc/orthanc/`` folder inside the Docker image. +This is done by building an image thanks to a ``Dockerfile``:: + + FROM orthancteam/orthanc + COPY orthanc.json /etc/orthanc/ + + +Configuration files can also be passed as secrets as shown in this ``docker-compose.yml``:: + + version: "3.3" + services: + orthanc-file-in-secrets: + image: orthancteam/orthanc + depends_on: [index-db] + ports: ["8201:8042"] + environment: + VERBOSE_STARTUP: "true" + + secrets: + - orthanc.secret.json + + secrets: + orthanc.secret.json: + file: orthanc.secret.json + +Finally, a whole configuration file can be passed as a JSON through the ``ORTHANC_JSON`` environment variable:: + + version: "3.3" + services: + orthanc-file-in-env-var: + image: orthancteam/orthanc + depends_on: [index-db] + ports: ["8200:8042"] + environment: + VERBOSE_ENABLED: "true" + OSIMIS_WEB_VIEWER1_PLUGIN_ENABLED: "true" + + ORTHANC_JSON: | + { + "Name": "orthanc-file-in-env-var", + "PostgreSQL" : { + "Host": "index-db", + "Password": "pg-password" + }, + "RegisteredUsers": { + "demo": "demo" + } + } + + +Docker secrets +-------------- + +.. highlight:: yaml + +When using your container in a ``Docker Swarm`` or ``Kubernetes`` environment, +it is usually advised to pass sensitive information through ``Docker Secrets``. +For this purpose, any secret whose name is similar to the name of an +environment variable is considered as an environment variable:: + + version: "3.3" + services: + orthanc-with-direct-secret: + image: orthancteam/orthanc + depends_on: [index-db] + ports: ["8003:8042"] + environment: + ORTHANC__NAME: "orthanc-with-direct-secret" + VERBOSE_ENABLED: "true" + + OSIMIS_WEB_VIEWER1_PLUGIN_ENABLED: "true" + + ORTHANC__POSTGRESQL__HOST: "index-db" + ORTHANC__REGISTERED_USERS: | + {"demo": "demo"} + + secrets: + - ORTHANC__POSTGRESQL__PASSWORD + secrets: + ORTHANC__POSTGRESQL__PASSWORD: + file: ORTHANC__POSTGRESQL__PASSWORD + + +Mixing configuration +-------------------- + +Parts of your configuration can be defined in a configuration file, +another part in an environment variable and yet another in a secret. +If the same setting is defined in multiple location, the latest one +will overwrite the first. Settings are evaluated in this order: + +- JSON files from ``/etc/orthanc/`` +- JSON files from ``/run/secrets`` (Docker secrets are copied there + by Docker) +- environment variables +- secret environment variables + +At this point, if some settings have not been defined yet, some defaults +are applied (see below). + + +Default configuration +--------------------- + +.. highlight:: json + +Orthanc and each plugin might have some default settings that might +eventually be different from the defaults included in the Orthanc +executable or the plugin library. + +.. below json is copied from orthanc-builder/docker/orthanc/orthanc-defaults.json + +Orthanc non-standard defaults:: + + { + "StorageDirectory" : "/var/lib/orthanc/db", + + "RemoteAccessAllowed": true, + "AuthenticationEnabled": true, + + "HttpsCACertificates" : "/etc/ssl/certs/ca-certificates.crt", + + "Plugins" : ["/usr/share/orthanc/plugins/"] + } + + +Default Lua scripts +------------------- + +Some Lua scripts are already loaded in the image but are not configured to +be loaded by Orthanc automatically. You'll have to add them to the ``"LuaScripts"`` +configuration if you want to use them. + +`/lua-scripts/filter-http-tools-reset.lua <https://github.com/orthanc-server/orthanc-builder/blob/master/docker/orthanc/filter-http-tools-reset.lua>`__ +can be used to regenerate the ``/tmp/orthanc.json`` configuration file that is loaded by Orthanc every time +you POST to ``/tools/reset``. Note that it declares an ``IncomingHttpRequestFilter`` +callback that might conflict with your scripts. + +Healthcheck probe +----------------- + +In version 21.10.0, the `/probes/test-aliveness.py <https://github.com/orthanc-server/orthanc-builder/blob/master/docker/orthanc/test-aliveness.py>`__ +script has been added in order to perform healthchecks. Check the doc in the script itself for more details. +A sample configuration is also available in `this sample <https://github.com/orthanc-server/orthanc-setup-samples/src/8016d140a237a892db703aac4782307c46732847/docker/tls-mutual-auth/docker-compose.yml#lines-51>`__ + + +Plugins +------- + +Plugins are automatically enabled as soon as you define a setting +in their JSON section or as soon as you define to ``true`` their +specific environment variable. + +Below is a list of all plugins, their environment variable and their default configuration +(only when their default configuration is different from the plugin defaults): + + +.. below table is obtained by running orthanc-builder/docker/orthanc/generatePluginDoc.py + + ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| Plugin | Environment variable | Default configuration | ++==================================================+==================================================+====================================================================================================+ +| **Authorization** | ``AUTHORIZATION_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **ConnectivityChecks** | ``CONNECTIVITY_CHECKS_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **DicomWeb** | ``DICOM_WEB_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "DicomWeb": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Gdcm** | ``GDCM_PLUGIN_ENABLED`` | .. code-block:: json | +| | Note: enabled by default | | +| | | { | +| | | "Gdcm": { | +| | | "Throttling": 4, | +| | | "RestrictTransferSyntaxes": [ | +| | | "1.2.840.10008.1.2.4.90", | +| | | "1.2.840.10008.1.2.4.91", | +| | | "1.2.840.10008.1.2.4.92", | +| | | "1.2.840.10008.1.2.4.93" | +| | | ] | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **OrthancWebViewer** | ``ORTHANC_WEB_VIEWER_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **StoneWebViewer** | ``STONE_WEB_VIEWER_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **OsimisWebViewerBasic** | ``OSIMIS_WEB_VIEWER1_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **OsimisWebViewerBasicAlpha** | ``OSIMIS_WEB_VIEWER1_ALPHA_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **PostgreSQL** | ``POSTGRESQL_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "PostgreSQL": { | +| | | "EnableIndex": true, | +| | | "EnableStorage": false, | +| | | "Port": 5432, | +| | | "Host": "HOST MUST BE DEFINED", | +| | | "Database": "postgres", | +| | | "Username": "postgres", | +| | | "Password": "postgres", | +| | | "EnableSsl": false, | +| | | "Lock": false | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **MySQL** | ``MYSQL_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "MySQL": { | +| | | "EnableIndex": true, | +| | | "EnableStorage": false, | +| | | "Port": 3306, | +| | | "Host": "HOST MUST BE DEFINED", | +| | | "Database": "mysql", | +| | | "Username": "root", | +| | | "Password": "mysql", | +| | | "Lock": false | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Python** | ``PYTHON_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **ServeFolders** | ``SERVE_FOLDERS_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Transfers** | ``TRANSFERS_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Worklists** | ``WORKLISTS_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Worklists": { | +| | | "Enable": true, | +| | | "Database": "/var/lib/orthanc/worklists" | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Housekeeper** | ``HOUSEKEEPER_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Housekeeper": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **DelayedDeletion** | ``DELAYED_DELETION_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "DelayedDeletion": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **MultitenantDicom** | ``MULTITENANT_DICOM_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Wsi** | ``WSI_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Odbc** | ``ODBC_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Odbc": { | +| | | "EnableIndex": true, | +| | | "EnableStorage": false, | +| | | "IndexConnectionString": "MUST BE DEFINED", | +| | | "StorageConnectionString": "MUST BE DEFINED" | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Tcia** | ``TCIA_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Tcia": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Indexer** | ``INDEXER_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Indexer": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Neuro** | ``NEURO_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "Neuro": { | +| | | "Enable": true | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **AzureBlobStorage** | ``AZURE_BLOB_STORAGE_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "AzureBlobStorage": { | +| | | "ConnectionString": "MUST BE DEFINED BY YOU", | +| | | "ContainerName": "MUST BE DEFINED BY YOU" | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **AwsS3Storage** | ``AWS_S3_STORAGE_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "AwsS3Storage": { | +| | | "BucketName": "MUST BE DEFINED BY YOU", | +| | | "Region": "MUST BE DEFINED BY YOU" | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **GoogleCloudStorage** | ``GOOGLE_CLOUD_STORAGE_PLUGIN_ENABLED`` | .. code-block:: json | +| | | | +| | | { | +| | | "GoogleCloudStorage": { | +| | | "ServiceAccountFile": "MUST BE DEFINED BY YOU", | +| | | "BucketName": "MUST BE DEFINED BY YOU" | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **OrthancExplorer2** | ``ORTHANC_EXPLORER_2_ENABLED`` | .. code-block:: json | +| | Note: enabled by default | | +| | | { | +| | | "OrthancExplorer2": { | +| | | "Enable": true, | +| | | "IsDefaultOrthancUI": false | +| | | } | +| | | } | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **VolView** | ``VOLVIEW_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| **Ohif** | ``OHIF_PLUGIN_ENABLED`` | | ++--------------------------------------------------+--------------------------------------------------+----------------------------------------------------------------------------------------------------+ + + +Under the hood +-------------- + +The source code that is used to generate the image can be found `here <https://github.com/orthanc-server/orthanc-builder/blob/master/docker/orthanc/Dockerfile>`__. + +The Python script that is used at startup can be found `here <https://github.com/orthanc-server/orthanc-builder/blob/master/docker/orthanc/generateConfiguration.py>`__