jupyter notebookをリモートサーバ(CentOS)に構築

# jupyter notebookをリモートサーバ(CentOS)に構築

### やりたいこと
- 会社のあれやこれやをPythonでやりたい
  - GitLabを操作(issue集計したり投稿したり)
- 利用する人はエンジニアの他、開発環境ない人も使用する(マネージャーとか管理系の人)
- 今回はAnacondaというライブラリ集を使用する

### OS  Version

```
[root@XXX ~]# cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)
```



## Anacondaのインストール

### AnacodaのInstallerダウンロード

- バージョン指定する場合は[レポジトリ](https://repo.anaconda.com/archive/)から選択可。

```
[root@XXX tmp]# cd /tmp
[root@XXX tmp]# curl https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh -O
```

### Install
```
[root@XXX tmp]# bash ./Anaconda3-5.3.1-Linux-x86_64.sh 
-- 対話形式 以下抜粋

Please, press ENTER to continue
>>> *Enterおす

Do you approve the license terms? [yes|no]
>>>yes 

Anaconda3 will now be installed into this location:
/root/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/root/anaconda3] >>> *Enterおす

Do you wish the installer to initialize Anaconda3
in your /root/.bashrc ? [yes|no]
[no] >>> yes

```
### bashrc読み込み

```
[root@XXX tmp]# source ~/.bashrc
```

### AnacondaのVersion確認

```
[root@XXX tmp]# anaconda -V
anaconda Command line client (version 1.7.2)
```

## jupyterのインストール

- Anaconda入れた時点で既にjupyterに入っている
- ローカルだけで使用する場合は、Pathまで確認したらいきなり起動確認してOK

### jupyterのVesion確認

```
[root@XXX tmp]# jupyter --version
4.4.0
```

### Path確認

```
[root@XXX tmp]# jupyter --path
config:
    /root/.jupyter
    /root/anaconda3/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /root/.local/share/jupyter
    /root/anaconda3/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /run/user/0/jupyter
```

## ローカル以外のPCからのアクセスを許可(任意)
- 不安な場合は特定のipだけ許容する設定にしましょう
    - 後述のConfigファイル作成時に設定可能です

### ipythonでpasswd設定

- ブラウザからアクセスしたときにパスワード聞いてくれるようになる

- passwordを対話形式でハッシュ化してくれるPytnonのライブラリ

```
[root@XXX ~]# ipython
Python 3.7.0 (default, Jun 28 2018, 13:15:42) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password: 
Verify password: 
Out[2]: 'sha1:8e9f3XXXXXXXXXXXXXXXXXXXXXXXX'

In [3]: exit
```

### configファイル作成

- cmdで作るけど中身はコメントアウトされており、何も設定していなければデフォルトで動く(はず)
- 中身多いので簡潔な設定ファイルにしたいなら、下記のパス・ファイルを`touch`で作って設定手書きしてもいい

```
[root@XXX tmp]# jupyter notebook --generate-config
Writing default config to: /root/.jupyter/jupyter_notebook_config.py
```

### configファイル設定

- `/root/.jupyter/jupyter_notebook_config.py`に以下を記載

```
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888 #Defalt
c.NotebookApp.password = u'sha1:8e9f3XXXXXXXXXXXXXXXXXXXXXXXX'
c.NotebookApp.notebook_dir = '/root/jupyter_files/'
```

### ポート開放

- これと`jupyter_notebook_config.py`に書いた内容

```
[root@XXX ~]# firewall-cmd --add-port=8888/tcp --zone=public --permanent
success
[root@XXX ~]# firewall-cmd --add-service=http --zone=public --permanent
success
[root@XXX ~]# firewall-cmd --reload
success
[root@XXX ~]# firewall-cmd --list-ports --zone=public
8888/tcp
```

## 起動確認

- `jupyter notebook `と唱えれば完了

```
[root@XXX ~]# jupyter notebook 
# rootでログインしている場合は↓のオプション必要です
[root@XXX ~]# jupyter notebook --allow-root
[I 10:17:31.193 NotebookApp] JupyterLab extension loaded from /root/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 10:17:31.194 NotebookApp] JupyterLab application directory is /root/anaconda3/share/jupyter/lab
[I 10:17:31.196 NotebookApp] Serving notebooks from local directory: /root/jupyter_files
[I 10:17:31.197 NotebookApp] The Jupyter Notebook is running at:
[I 10:17:31.197 NotebookApp] http://${hostname} or 127.0.0.1):8888/
```

- 他のホストからの接続が許容されていない場合は`localhost`と表示されるのでTypoとか疑う(戒め)
  - 「jupyter_notebook_config.py」内の`c.NotebookApp.ip = '*'`が`c.NoebookApp.ip = '*'`になっていたりするかもしれない

```
[I 10:17:31.197 NotebookApp] The Jupyter Notebook is running at:
[I 10:17:31.197 NotebookApp] http://localhost:8888/
```



## サービス登録

- このままだとコンソール閉じたり`Ctrl＋C`したらjupyterも終了するのでサービスとして実行するようにする

### Unit定義ファイル作成

```
[root@XXX ~]# touch /etc/systemd/system/notebook.service
```

### Unit定義ファイル編集

```
[root@XXX ~]# vi /etc/systemd/system/notebook.service
```

- `ExecStart`のコマンドは、rootの場合はオプション必要 
  - 詳細は上述の起動確認部を参照

```
[Unit]
Description = Jupyter Notebook

[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/root/anaconda3/bin/jupyter notebook    # `$ which jupyter` で確認
WorkingDirectory=/root   #Anacondaを導入したユーザーのホームディレクトリ(ログイン直後に `$pwd`) 
User=root   #Anacondaを導入したユーザー名  `$ id`
Group=root  #Anacondaを導入したユーザーの所属するグループ名
Restart=always

[Install]
WantedBy = multi-user.target
```

### Unitが登録されているか確認

`[root@XXX ~]# $ systemctl list-unit-files --type=service`

### サービスとして起動

```
# 起動
[root@XXX ~]# systemctl start notebook 
# 起動確認 
[root@XXX ~]# systemctl status notebook
# 起動時に自動開始するよう設定
[root@XXX ~]# systemctl enable notebook
```



## 参考

### 外から接続できないときの参考
- [jupyterがportを見張っているか](https://qiita.com/sonoshou/items/cc2b740147ba1b8da1f3)
- [firewallの設定と確認](https://centosinstall.com/centos/centos7/firewalld)

### 先人たち
- [基本的な設定](http://tech-study.hateblo.jp/entry/2017/08/11/145704)
- [サービス化する]([https://qiita.com/hiroseabook/items/1da01ea439b01c1eb48c#5-systemd-%E3%81%A7-jupyternotebook-%E3%82%92%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%8C%96%E3%81%99%E3%82%8B](https://qiita.com/hiroseabook/items/1da01ea439b01c1eb48c#5-systemd-で-jupyternotebook-をサービス化する))