Galaxy ServerをDockerを利用して起動した時にログインユーザーだけが利用できるようにする

# ログインユーザーだけがツールを利用できるようにしたい
[Galaxy Serverを手元のコンピューターで動かしてみよう](https://qiita.com/percipere/items/3a11622b352814686c0b)で動作させたGalaxy サーバーには、手元のマシンからだけでは無くネットワークを経由して接続可能な全てのマシンからアクセスできてしまう

その場合のアクセス方法は`http://動作中のマシンのIPアドレス:8080`となる

初期の状態はこうなっている
![Screen Shot 2018-12-12 at 11.17.06.png](https://qiita-image-store.s3.amazonaws.com/0/213053/93df4a5d-9418-2df5-c1da-b64f4d5a745b.png)
ログイン前でもToolsには各種のツールが並んでいて、このまま利用することができる

もし、そのような状況が意図したものであれば問題は無いが、誰か知らない人に自分のマシンのGalaxyサーバーのツールを利用して欲しくない場合もある

そこで、ツールを利用する場合にはログインが必要になるようにGalaxyサーバーの設定を変更してみよう

# Galaxyの設定はどこで変更するのか

Galaxyではサーバーの様々な項目について設定を柔軟に変更できるようになっている
最も基本的な設定ファイルがgalaxy.ymlファイル
設定の詳細については[Galaxy Configuration](
https://docs.galaxyproject.org/en/master/admin/config.html)を参照の事

# 実際に設定を変更してみよう
ここで変更するパラメータはrequire_loginとなる
require_loginの既定値はfalseで、この場合はGalaxyサーバーにアクセスできるユーザーはログインしなくてもツールを利用する事ができる
ここではrequire_loginの設定を変更してgalaxyを起動してみよう
[Galaxy's config settings](https://github.com/bgruening/docker-galaxy-stable#galaxys-config-settings--toc)によると、Docker版のGalaxy では `docker run`で環境変数を設定することでgalaxy.ymlの設定値を変更する事ができると記載されている
>Every Galaxy configuration parameter in config/galaxy.ini can be overwritten by passing an environment variable to the docker run command during startup. The name of the environment variable has to be: GALAXY_CONFIG+ the_original_parameter_name_in_capital_letters For example, you can set the Galaxy session timeout to 5 minutes by adding -e "GALAXY_CONFIG_SESSION_DURATION=5" to the docker run command

`GALAXY_CONFIG_`に加えてパラメーターの文字列を大文字にしたものに値を設定する
ここで設定するのはrequire_loginなので　`GALAXY_CONFIG_REQUIRE_LOGIN=True` となる　

```bash
$ docker run -d --rm \
    -p 8080:80 -p 8021:21 -p 8022:22 -p 8800:8800 \
    --volumes-from galaxy-store \
    --privileged=true  \
    -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
    -e GALAXY_CONFIG_REQUIRE_LOGIN=True \
    -e ENABLE_TTS_INSTALL=True \
    bgruening/galaxy-stable
```

ログインしていない場合にToolsペインやHistoryペインが消えてログイン画面のみの表示となる
![Screen Shot 2018-12-12 at 11.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/213053/0e9247c9-52e7-b872-8a96-c15cd29749e2.png)


# galaxy.ymlの変更
Dockerコンテナでは無いGalaxyのサーバー版ではgalaxy.ymlのファイルを変更する事で設定を変更する
require_loginをtrueにすることでログインが必要となるように動作を変更してみよう

Galaxy Configurationによれば、galaxy.ymlはgalaxyのディレクトリのconfigに存在すると書かれている

> Configuration files can be found underneath the config/ subdirectory, wherein you can find <name>.sample files corresponding to configuration files that you can modify by copying the <name>.sample to <name>. In many cases, you will find that the sample configuration provides the most up-to-date and detailed documentation about the features configured therein.

では、現在デーモンモードで動作しているgalaxyのコンテナに接続して、このファイルを書き換え/作成してみよう

最初に現在動作しているGalaxyコンテナの"CONTAINER ID"を確認しよう

```terminal
$ docker ps
CONTAINER ID        IMAGE                     COMMAND              CREATED             STATUS              PORTS                                                                                                         NAMES
0498d80bbb78        bgruening/galaxy-stable   "/usr/bin/startup"   17 minutes ago      Up 17 minutes       443/tcp, 9002/tcp, 0.0.0.0:8800->8800/tcp, 0.0.0.0:8021->21/tcp, 0.0.0.0:8022->22/tcp, 0.0.0.0:8080->80/tcp   jovial_hertz
```

ここでは"CONTAINER ID"は0498d80bbb78となっている
このIDはコンテナの実行毎に異なる

後の記述を統一するために環境変数に"CONTAINER ID"を格納しておく

```bash
export CONTAINER_ID="0498d80bbb78"
```

("0498d80bbb78"の部分は各自のCONTAINER IDで置き換える事)
現在動作中のコンテナに接続して該当のファイルに変更を加えてみる

```bash
$ docker exec -it ${CONTAINER_ID} /bin/bash
root@0498d80bbb78:/galaxy-central# ls config
auth_conf.xml.sample                    job_resource_params_conf.xml.sample  shed_tool_conf.xml.sample
build_sites.yml.sample                  lmod_modules_mapping.yml.sample      shed_tool_data_table_conf.xml
containers_conf.yml.sample              local_conda_mapping.yml.sample       shed_tool_data_table_conf.xml.sample
data_manager_conf.xml.sample            migrated_tools_conf.xml              swarm_manager_conf.yml.sample
datatypes_conf.xml.sample               migrated_tools_conf.xml.sample       tool_conf.xml.main
dependency_resolvers_conf.xml.sample    object_store_conf.xml.sample         tool_conf.xml.sample
disposable_email_blacklist.conf.sample  oidc_backends_config.xml.sample      tool_data_table_conf.xml.sample
error_report.yml.sample                 oidc_config.xml.sample               tool_destinations.yml.sample
galaxy.yml.docker_sample                openid_conf.xml.sample               tool_sheds_conf.xml.sample
galaxy.yml.sample                       plugins                              tool_shed.yml.sample
job_conf.xml.docker_sample              reports.yml.sample                   user_preferences_extra_conf.yml.sample
job_conf.xml.sample_advanced            shed_data_manager_conf.xml           workflow_resource_mapper_conf.yml.sample
job_conf.xml.sample_basic               shed_data_manager_conf.xml.sample    workflow_resource_params_conf.xml.sample
job_metrics_conf.xml.sample             shed_tool_conf.xml                   workflow_schedulers_conf.xml.sample
```

どうやら`config`ディレクトリにはgalaxy.ymlは存在しないようだ

Galaxy Configurationを読むと

> Edit config/galaxy.yml (copy it from config/galaxy.yml.sample if it does not exist) to make configuration changes.

galaxy.yml存在しない場合にはgalaxy.yml.sampleをコピーして利用するようにと書かれている
その通りにしてみよう

```bash:inside_docker_container
root@0498d80bbb78:/galaxy-central# cd config
root@0498d80bbb78:/galaxy-central/config# cp galaxy.yml.sample galaxy.yml
```

galaxy.ymlに`require_login`が含まれているか確認してみる

```bash
root@0498d80bbb78:/galaxy-central/config# cat -n galaxy.yml| grep "require_login"
  1259	  #require_login: false
  1262	  # page (even if require_login is True)
```

既定値と同じなのでコメントアウトされているが1259行目に確かに存在する
後は適当なエディターで、この1259行目の後に`require_login: true`を書き込もう

その後、Galaxyのサーバープロセスを再起動

```bash:inside_docker_container
root@0498d80bbb78:/galaxy-central/config# supervisorctl restart galaxy:
galaxy:galaxy_nodejs_proxy: stopped
galaxy:handler0: stopped
galaxy:galaxy_web: stopped
galaxy:handler1: stopped
galaxy:galaxy_nodejs_proxy: started
galaxy:galaxy_web: started
galaxy:handler0: started
galaxy:handler1: started
```

さて、結果はどうなったか
![Screen Shot 2018-12-12 at 11.17.06.png](https://qiita-image-store.s3.amazonaws.com/0/213053/42b6c66b-d807-e9e4-0f5a-08cf49fe7589.png)
何も変わらない

実はDockerコンテナのGalaxyはsupervisordで管理されているために、普通のGalaxyとは設定が異なっている

## galaxy.ymlはどこに？
supervisord の構成ファイルを参照してどのgalaxy.ymlを利用しているのか確認してみる

```bash:inside_docker_container
root@0498d80bbb78:/galaxy-central/config# ls /etc/supervisor/conf.d
galaxy.conf
root@0498d80bbb78:/galaxy-central/config# grep "galaxy.yml" /etc/supervisor/conf.d/galaxy.conf 
command         = /galaxy_venv/bin/uwsgi --virtualenv /galaxy_venv --yaml /etc/galaxy/galaxy.yml --logdate --thunder-lock --master --processes %(ENV_UWSGI_PROCESSES)s --threads %(ENV_UWSGI_THREADS)s --logto /home/galaxy/logs/uwsgi.log --socket 127.0.0.1:4001 --pythonpath lib --stats 127.0.0.1:9191 -b 16384
command         = /galaxy_venv/bin/python ./lib/galaxy/main.py -c /etc/galaxy/galaxy.yml --server-name=handler%(process_num)s --log-file=/home/galaxy/logs/handler%(process_num)s.log
```

このDocker imageのGalaxyサーバーは`/etc/galaxy/galaxy.yml`を利用している事がわかった

## 適切なgalaxy.ymlを利用する
galaxy.ymlの設定ファイルがどこに存在するかわかったので、これを変更してGalaxy サーバーを利用しよう

変更内容を永続的なものとするために、ホスト側にgalaxy.ymlを置いて、これをDocker container内部にマウントして利用する事としたい

## あらためて設定を変更
まずは、ホストのファイルシステムに該当のファイルをコピーする

```bash
$ docker exec ${CONTAINER_ID} cat /etc/galaxy/galaxy.yml > galaxy.yml
```

ファイルがホスト上にコピーされるので、ホスト上にコピーされたgalaxy.ymlに`require_login: true`を先ほどと同様に追加しよう

現在起動中のコンテナの停止

```bash
$ docker kill ${CONTAINER_ID} 
```

新しいコンテナをデーモンモードで起動

```bash
$ docker run -d --rm \
    -p 8080:80 -p 8021:21 -p 8022:22 -p 8800:8800 \
    --volumes-from galaxy-store \
    -v ${PWD}/galaxy.yml:/etc/galaxy/galaxy.yml \
    --privileged=true  \
    -e GALAXY_CONFIG_ENABLE_BETA_MULLED_CONTAINERS=True \
    -e ENABLE_TTS_INSTALL=True \
    bgruening/galaxy-stable
```

ホストのカレントディレクトリのgalaxy.ymlを**コンテナ上の/etc/galaxy/galaxy.yml**にマップしているのは以下の部分
`-v ${PWD}/galaxy.yml:/etc/galaxy/galaxy.yml` 
パス指定には絶対パスを利用する

以上の設定を終えたのでブラウザから接続して結果を確認
![Screen Shot 2018-12-12 at 11.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/213053/2184b829-5c86-b45b-56e3-39203b359783.png)

期待通りの画面が表示された
このgalaxy.ymlファイルはコンテナ環境ではないGalaxy Serverでも同様に利用できる(はず)

今回はここまで:smile: