Orthanc を使ってみた-その1

# Orthanc を使ってみた
　医療用画像の規格である DICOM をお使いの皆さん、Orthanc ってご存知でしょうか。私も最近知って使ってみたのですが、とても便利ですよね！

　Orthanc の公式サイトでは「Open-source, lightweight DICOM server.」とうたっています。まさにこの通りで、とても簡単に構築でき、トラブルもなく大変便利に使っています。REST API や Lua 言語によるスクリプトも組めるし、フリーだし、素晴らしいです。数百 Study の MRI を溜め込んでますが、今の所トラブルフリーです。

　この記事は試しに Orthanc を少々使ってみた、個人的備忘録的にまとめてみものです。

参考にした web site
本家：https://www.orthanc-server.com/
説明書 (Orthanc book)：https://book.orthanc-server.com/

# サーバ環境の整備

**私の環境**
今回使用した環境はこちら
* OS: Ubuntu 20.04.2 LTS
* Docker version 20.10.8
* Mozilla Firefox 90.0.2

**Docker rootless**
まずはこちらの公式サイトの手順で Docker を整備しました。
https://docs.docker.com/engine/install/ubuntu/
さらに Docker rootless の環境を用意しました。これも公式サイトの手順で OK でした。「Caution: This is experimental function. Please use carefully.」とあるので注意します。
https://docs.docker.jp/engine/security/rootless.html

# カスタマイズせずに Orthanc を起動してみる
Orthanc の公式 Docker は様々な repository があります。
https://hub.docker.com/u/jodogne
今回は公式プラグイン全部のせを使ってみます。
https://hub.docker.com/r/jodogne/orthanc-plugins
コマンドはこちら。Port 8042 は http 用です。

```
$ docker pull jodogne/orthanc-plugins
$ docker run --rm -d --name orthanc1 -p 8042:8042 \
    jodogne/orthanc-plugins
```

``` $ docker ps -a  ``` などで無事に動作したことが確認できれば、http://localhost:8042/ にアクセスしてみましょう。ID と Password の入力を求められますので、それぞれ「orthanc」、「orthanc」と入力します。すると、このような Orthanc Explorer の画面が見えましたか？
![202108162242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531063/81fcd718-e389-84c6-3ba3-6a8007e08b56.png)
この Orthanc Explorer 画面の操作は非常に簡単でわかりやすいです。手元にデータが有れば、「Upload」でデータをアップロードしたり、「Do lookup」で保存されたデータを確認したり、画像を見たり、色々やってみましょう。

一通り楽しんだら、コンテナを止めましょう。

```
$ docker stop orthanc1
```

# Orthanc のカスタマイズ

Orthanc の設定をカスタマイズをしてみましょう。
"orthanc.json" が設定ファイルです。デフォルトの設定ファイルを "~/Orthanc/Config1/" に保存してみましょう。

```
$ mkdir ~/Orthanc
$ mkdir ~/Orthanc/Config1 
$ docker pull jodogne/orthanc-plugins:1.9.6
$ docker run --rm --entrypoint=cat \
    jodogne/orthanc-plugins:1.9.6 \
    /etc/orthanc/orthanc.json > ~/Orthanc/Config1/orthanc.json
```

これで "~/Orthanc/Config1/orthanc.json" が生成されました。このファイルを編集しましょう。
変更部分を抜粋すると、この様になりました。

```json-doc:orthanc.json
  // HTTP port 番号の変更 (line 81)
  "HttpPort" : 50010,

  // AET の変更 (line 119)
  "DicomAet" : "ORTHANC1",

  // DICOM port 番号の変更 (line 126)
  "DicomPort" : 60010,

  // すべての SOP class を受け入れる (line 160)
  "UnknownSopClassAccepted" : true,

  // ID, Password を入力させるための "//" の削除 (line 229)
  "RegisteredUsers" : {
    "alice" : "alicePassword"
  },

  // 末尾に "," の追加 (line 826)
  "SynchronousZipStream" : true,

  // PostgreSQL を使うための設定 (line 827)
  "PostgreSQL":{
    "EnableIndex":true,
    "EnableStorage":true,
    "Host":"192.168.10.12",
    "Port":5432,
    "Database":"orthanc",
    "Username":"otpostgres",
    "Password":"otpassword"
  }
```

設定ファイルに文法的な問題がないか確認します。

```
$ cat ~/Orthanc/Config1/orthanc.json |json_verify -c
JSON is valid
```

　Orthanc のデフォルトでは、データベースとして SQLite を使用していますが、性能やスケーラビリティの面から他のデータベースの利用が推奨されています。今回は postgreSQL を使用することにします。設定ファイルでは、最後に記述されている部分がそれに対応します。
　コンテナやサーバ再起動後にもデータが消失しないように、 PostgreSQL 用のディレクトリを作成します。DB はここに保管されることになります。

```
$ mkdir ~/Orthanc/DB1/
```

PostgreSQL のコンテナを起動し、Database を作成します。このとき先ほど作成したディレクトリを指定します。また、 Docker の network として "orthanc_nw" も作成します。

```
$ docker pull postgres:13.3
$ docker network create --subnet=192.168.10.0/24 orthanc_nw
$ docker run -d --name orthanc-postgres1 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /etc/timezone:/etc/timezone:ro \
    -v /home/hogehoge/Orthanc/DB1/:/var/lib/postgresql/data \
    -e POSTGRES_USER=otpostgres \
    -e POSTGRES_PASSWORD=otpassword \
    --net=orthanc_nw --ip=192.168.10.12 \
    postgres:13.3
$ docker run -it --link orthanc-postgres1:postfres \
    --net=orthanc_nw --rm postgres:13.3 \
    sh -c 'echo "CREATE DATABASE orthanc;" \
    |exec psql -h 192.168.10.12 -p 5432 -U otpostgres -h 192.168.10.12'
```

　このあと```Password for user otpostgres:```と表示されるので、設定ファイルで指定した "otpassword" と入力します。 これで Database が生成されました。

　それでは、Orthanc を起動しますが、先の設定ファイルの場所を指定し、タイムゾーンをサーバ環境と同じものを使うようにし、IPアドレスを指定し、詳細なログを吐くように設定します。

```
$ docker run -d --name orthanc1 \
    -p 50010:50010 \
    -p 60010:60010 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /etc/timezone:/etc/timezone:ro \
    -v /home/hogehoge/Orthanc/Config1/:/etc/orthanc/ \
    --net=orthanc_nw --ip=192.168.10.11 \
    jodogne/orthanc-plugins:1.9.6 \
    --verbose /etc/orthanc
```

Orthanc の コンテナが起動に成功したかどうか `` $ docker ps -a``で確認します。
成功したなら、 http://localhost:50010 にアクセスします。ID と Password の入力を求められますので、それぞれ「alice」、「alicePassword」と入力します。無事起動できたでしょうか。

OK ならデータを Push してみます。今回は、dcm4che/dcm4che-tools　を使用します。

```
$ docker pull dcm4che/dcm4che-tools:5.25.0
$ docker run --rm --net=orthanc_nw --ip=192.168.10.100 \
    dcm4che/dcm4che-tools:5.25.0 \
    storescu -bDCM4CHEE \
    -cORTHANC1@192.168.10.11:60010 \
    /opt dmc4che/etc/testdata/dicom
```

ブラウザの "Do lookup" をクリックすると送ったデータが見えるはずです。図のように "DOE^J1 - LEFT WRIST" が見えればOKです。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531063/3b0e1a26-18c9-fd82-344c-982667f77b40.png)

コンテナを止めた後に再度起動して、送ったデータが保存されているか確認します。

```
$ docker stop orthanc1 orthanc-postgres1
$ docker rm orthanc1 orthanc-postgres1
$ docker run -d --name orthanc-postgres1 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /etc/timezone:/etc/timezone:ro \
    -v /home/hogehoge/Orthanc/DB1/:/var/lib/postgresql/data \
    -e POSTGRES_USER=otpostgres \
    -e POSTGRES_PASSWORD=otpassword \
    --net=orthanc_nw --ip=192.168.10.12 \
    postgres:13.3
$ docker run -d --name orthanc1 \
    -p 50010:50010 \
    -p 60010:60010 \
    -v /etc/localtime:/etc/localtime:ro \
    -v /etc/timezone:/etc/timezone:ro \
    -v /home/hogehoge/Orthanc/Config1/:/etc/orthanc/ \
    --net=orthanc_nw --ip=192.168.10.11 \
    jodogne/orthanc-plugins:1.9.6 \
    --verbose /etc/orthanc
```

　http://localhost:50010 にアクセスして "Do lookup" をクリックします。
先程同様、 " DOE^J1 - LEFT WRIST" が見えていたら成功です。

　これでその1は完走です。大した苦労もなくできてしまいました。素晴らしい。

　実用上は、サーバ再起動後も自動でコンテナが立ち上がってほしいとか、通信する相手を指定しなければならないとか、受信したデータに対して何らかの処理をしたい、といった要望が出て来ることになると思います。そのあたりを簡単に試したので、その2をいつの日かまとめられたらなぁ、と思っています。いつになりますやら。

つづく

# 追記
[その2](https://qiita.com/qweasdzxc/items/95d4900d1f1e2fe30596)を書きました。