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ダウンロード

[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

参考

外から接続できないときの参考

先人たち