JupyterHubの構築

# JupyterHubを構築する
みなさまはPythonのコーディング環境、なにを使っていますか？
Jupyter Notebookという人も意外と多いと思います。
Jupyter NotebookはWebブラウザで使うコーディング環境で、プラグインを使うことでPython以外にもJavaやR等のコーディング環境にもなります。

Jupyter Notebookだけではユーザ管理はできず、グループで開発を行うときに不便です。
JupyterHubを使えばJupyter Notebookにユーザ認証のインターフェイスを付けることができるので、その構築方法を紹介します。

※　Jupyter NotebookはAnacondaでインストールするのが簡単です。
https://www.continuum.io/downloads

※　JupyterHub
http://jupyterhub.readthedocs.io/en/latest/index.html

## 環境
今回紹介する構築環境は以下です。
- OS：CentOS7.3
- Anaconda4.3.0
- Python3.5
- 基盤：AWS　EC2

## 事前設定
まずは事前にAnaconda4.3.0をインストールしましょう。

AnacondaのLinux用インストールシェルをダウンロードします。

```bash
# 以降、rootユーザで操作しますが、実際には使用可能なユーザを使ってください。
sudo su -
cd ~
wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh

```

Anacondaをインストールします。
インストール中に色々きかれますが、基本的にyesで良いです。

ただし、一つだけ注意点があります。
インストールディレクトリはひとまず/opt/anaconda3/にします。
インストールディレクトリはデフォルトだと/root/anaconda3/になってしまいますが、これだとroot以外のユーザがAnacondaを使えません。
非rootユーザ（sudo権限あってもなくても）がJupyterHubを使う場合は、そのユーザもアクセス可能なディレクトリにインストールしましょう。

```bash
bash Anaconda3-4.2.0-Linux-x86_64.sh

```

![2017-02-05_1.png](https://qiita-image-store.s3.amazonaws.com/0/55384/0ebd633d-70a9-b49e-f8c4-e8f904b706e7.png)


これでAnacondaはインストールされました。
Jupyter NotebookのConfigは不要なので、いよいよJupyterHubのインストールを行います。

## JupyterHubのインストール
AnacondaをインストールするとAnaconda用パッケージやPythonモジュールをconda installコマンドでインストールできるようになります。
JupyterHubもconda installでインストールします。

```bash
# JupyterHubをインストール
conda install -c conda-forge jupyterhub
# JupyterHubのnotebookをインストール
conda install notebook

```

これでJupyterHubをインストールしNotebookを起動できるようになりました。
次はConfigファイルを作成し、設定を行います。

## JupyterHubのConfigファイルを作成
JupyterHubのConfigファイルは以下コマンドで生成します。

```bash
cd /opt/
jupyterhub --generate-config

```

このようにjupyterhub_config.pyというファイルが作られます。

![2017-02-05_2.png](https://qiita-image-store.s3.amazonaws.com/0/55384/e65dd69e-9f1e-2b8f-b7ba-3937087fa7ba.png)


## JupyterHubの設定
JupyterHubではプロキシやTLS証明書、ユーザ、管理ユーザ等、多様な設定を行うことが可能です。
今回は最低限、管理ユーザ、ユーザ、ユーザのNotebookディレクトリのみ設定します。
jupyterhub_config.pyをエディターで開きます。

```bash
vi jupyterhub_config.py

```

以下の設定値を変更します。

まずはNotebookディレクトリです。
各ユーザのホームディレクトリ配下に~/notebook/ディレクトリを作成し、そこをNotebookディレクトリにします。

```python
## Path to the notebook directory for the single-user server.
#
#  The user sees a file listing of this directory when the notebook interface is
#  started. The current interface does not easily allow browsing beyond the
#  subdirectories in this directory's tree.
#
#  `~` will be expanded to the home directory of the user, and {username} will be
#  replaced with the name of the user.
#
#  Note that this does *not* prevent users from accessing files outside of this
#  path! They can do so with many other means.
#c.Spawner.notebook_dir = ''
# 以下を追記
c.Spawner.notebook_dir = '~/notebook'

```


次にJupyterHubの使用ユーザです。
これはWhitelistとして設定します。

```python
## Whitelist of usernames that are allowed to log in.
#
#  Use this with supported authenticators to restrict which users can log in.
#  This is an additional whitelist that further restricts users, beyond whatever
#  restrictions the authenticator has in place.
#
#  If empty, does not perform any additional restriction.
#c.Authenticator.whitelist = set()
# 以下を追加
c.Authenticator.whitelist = {'user01', 'user02'}

```

最後に管理ユーザです。

```python
## Set of users that will have admin rights on this JupyterHub.
#
#  Admin users have extra privilages:
#   - Use the admin panel to see list of users logged in
#   - Add / remove users in some authenticators
#   - Restart / halt the hub
#   - Start / stop users' single-user servers
#   - Can access each individual users' single-user server (if configured)
#
#  Admin access should be treated the same way root access is.
#
#  Defaults to an empty set, in which case no user has admin access.
#c.Authenticator.admin_users = set()
# 以下を追加
c.Authenticator.admin_users = {'user00'}

```

これで最低限の設定は完了です。
他の設定値については以下を参照してください。
http://jupyterhub.readthedocs.io/en/latest/getting-started.html#configuration


## 各ユーザのNotebookを作成
JupyterHubを使用するユーザ用にNotebookを作成します。

```bash
mkdir -p /home/user01/notebook
chown user01:usergr /home/user01/notebook

```


## JupyterHub起動
JupyterHubはデフォルトでHTTPSで起動しますが、今回はTLS証明書を設定していません。
自己署名証明書（オレオレ証明書）でも良いのですが、面倒なので、--no-sslオプションをつけてHTTPで起動します。

```bash
jupyterhub --no-ssl

```

![2017-02-05_3.png](https://qiita-image-store.s3.amazonaws.com/0/55384/d7fa5f8b-1763-007d-221f-e70e6505745e.png)


これで起動します。
JupyterHubはポート番号8000、HTTPで公開されます。

余談ですが、このコマンドはnohupと&で挟んでOSバックグラウンド起動にすることをお奨めします。

```bash

nohup jupyterhub --no-ssl &

```



## JupyterHubにアクセス
PCでWebブラウザからJupyterHubにアクセスします。
URLは http://<JupyterHubのIPまたはホスト名>:8000/　です。

![2017-02-05_4.png](https://qiita-image-store.s3.amazonaws.com/0/55384/071c0ce1-e2c5-189a-5e42-ca7b1c10135d.png)

HTTPSにしろよごら(# ﾟДﾟ)　とメッセージが出ています。
あとでオレオレ証明書を作りましょう(^_^;)。

（2018/04/27追記：証明書は[letsencrypt](https://letsencrypt.org/)でもOKなようです。
https://jupyterhub.readthedocs.io/en/0.7.2/getting-started.html#ssl-encryption）

ユーザ名とパスワードを入力してログインします。
以降Jupyter Notebook同様に使用可能ですので、割愛します。

参考URL：
http://jupyterhub.readthedocs.io/en/latest/index.html
https://www.continuum.io/downloads