Ubuntu18.04でJupyterLab環境をセットアップする方法

提供:Dev Guides
移動先:案内検索

著者は、 Write for DOnations プログラムの一環として、国連財団を選択して寄付を受け取りました。

序章

JupyterLab は、機能が豊富なUIであり、特にデータサイエンスとAIの分野で、ユーザーがタスクを簡単に実行できるようにします。 JupyterLab環境は、 JupyterNotebookの生産性を重視した再設計を提供します。 組み込みのHTMLビューアやCSVビューアなどのツールと、JupyterNotebookのいくつかの個別の機能を同じ画面に統合する機能を紹介します。

このチュートリアルでは、Ubuntu18.04サーバーにJupyterLabをインストールしてセットアップします。 また、ドメイン名を使用して、任意のWebブラウザーからリモートでJupyterLabインスタンスに安全に接続できるようにサーバーを構成します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • この初期サーバーセットアップガイドを使用して、sudo権限を持つ非rootユーザーアカウントを持つUbuntu18.04サーバー。
  • サーバーへのPythonAnacondaディストリビューションのインストール。 Ubuntu18.04チュートリアルにAnacondaPythonディストリビューションをインストールする方法を使用できます。
  • DNSレコードを編集するためにアクセスできる登録済みドメイン名またはサブドメイン。 このチュートリアルでは、全体を通してyour_domainを使用します。 Namecheap でドメインを購入するか、 Freenom で無料ドメインを取得するか、任意のレジストラに新しいドメインを登録できます。
  • ドメインに設定されている次のDNSレコード: サーバーのパブリックIPアドレスを指すyour_domainを持つAレコード。 サーバーのパブリックIPアドレスを指すwww.your_domainを含むAレコード。 このDNSレコードの作成、編集、および削除の方法に関するドキュメントは、これらのレコードの設定に役立ちます。

ステップ1—パスワードの設定

このステップでは、JupyterLabインストールでパスワードを設定します。 インスタンスは一般公開されているため、パスワードを設定しておくことが重要です。

まず、Anaconda環境がアクティブ化されていることを確認します。 前提条件のチュートリアルに従って、環境はbaseと呼ばれます。

環境をアクティブ化するには、次のコマンドを使用します。

conda activate base

プロンプトは、デフォルトのAnaconda環境baseを反映するようにターミナルで変更されます。

sammy@your_server:~$

このチュートリアルの今後のすべてのコマンドは、base環境内で実行されます。

Anaconda環境をアクティブにすると、サーバーでJupyterLabのパスワードを設定する準備が整います。

まず、Jupyterの構成ファイルを生成しましょう。

jupyter notebook --generate-config

次の出力が表示されます。

OutputWriting default config to: /home/sammy/.jupyter/jupyter_notebook_config.py

JupyterLabとJupyterNotebookの両方が同じ構成ファイルを共有します。

次に、次のコマンドを使用して、JupyterLabインスタンスにリモートでアクセスするためのパスワードを設定します。

jupyter notebook password

Jupyterは、選択したパスワードを入力するように求めます。

OutputEnter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /home/sammy/.jupyter/jupyter_notebook_config.json

Jupyterは、パスワードをハッシュ形式で/home/sammy/.jupyter/jupyter_notebook_config.jsonに保存します。 将来、このハッシュ値が必要になります。

最後に、前のコマンドで生成されたファイルに対してcatコマンドを使用して、ハッシュされたパスワードを表示します。

cat /home/sammy/.jupyter/jupyter_notebook_config.json

次のような出力が表示されます。

/home/sammy/.jupyter/jupyter_notebook_config.json

{
  "NotebookApp": {
    "password": "sha1:your_hashed_password"
  }
}

JSONpasswordキーの値をコピーして、一時的に保存します。

JupyterLabインスタンスのパスワードを設定しました。 次のステップでは、サーバーのLet'sEncrypt証明書を作成します。

ステップ2—Let'sEncryptの構成

このステップでは、ドメインのLet'sEncrypt証明書を作成します。 これにより、ブラウザからJupyterLab環境にアクセスするときにデータが保護されます。

まず、Certbotをサーバーにインストールします。 リポジトリをaptソースに追加することから始めます。

sudo add-apt-repository ppa:certbot/certbot

コマンドを実行すると、ENTERを押してPPAの追加を完了するように求められます。

OutputThis is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu.

Note: Packages are only provided for currently supported Ubuntu releases.
 More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot
Press [ENTER] to continue or Ctrl-c to cancel adding it.

ENTERを押して、PPAの追加を続行します。

コマンドの実行が終了したら、apt updateコマンドを使用してaptソースを更新します。

sudo apt update

次に、Certbotをインストールします。

sudo apt install certbot

Certbotの実行を開始してインスタンスの証明書を生成する前に、サーバーのポート:80とポート:443でのアクセスを許可して、Certbotがこれらのポートを使用してドメイン名を確認できるようにします。 。 ポート:80はサーバーへのhttp要求に対してチェックされ、ポート:443https要求に対して使用されます。 Certbotは最初にhttpリクエストを作成し、サーバーの証明書を取得した後、httpsリクエストを作成します。これは、ポート:443を介してプロセスにプロキシされます。 :80ポートでリッスンしています。 これにより、証明書のインストールが成功したことが確認されます。

まず、ポート:80へのアクセスを許可します。

sudo ufw allow 80

次の出力が表示されます。

OutputRule added
Rule added (v6)

次に、ポート:443へのアクセスを許可します。

sudo ufw allow 443
OutputRule added
Rule added (v6)

最後に、Certbotを実行して、次のコマンドを使用してインスタンスの証明書を生成します。

sudo certbot certonly --standalone

standaloneフラグは、certbotに、検証プロセスの間、一時サーバーを実行するように指示します。

メールの入力を求められます。

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): your_email

有効なメールアドレスを入力して、ENTERを押します。

次に、CertbotとLet'sEncryptの利用規約を確認して同意するように求められます。 利用規約を確認し、同意する場合はAと入力して、ENTERを押します。

Output- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

これで、電子メールをElectronicFrontierFoundationと共有するように求められます。 答えを入力してENTERを押します。

Output- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y/N

最後に、ドメイン名の入力を求められます。 プロトコルを指定せずにドメイン名を入力します。

OutputPlease enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): your_domain
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your_domain
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your_domain/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your_domain/privkey.pem
   Your cert will expire on 2020-09-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Certbotはドメイン検証を実行し、ドメインの証明書とキーを生成して/etc/letsencrypt/live/your_domainに保存します。

Let's Encrypt証明書を設定したので、JupyterLab構成ファイルを更新します。

ステップ3—JupyterLabの構成

このステップでは、JupyterLab構成を編集して、ステップ2で生成したLet'sEncrypt証明書が使用されていることを確認します。 また、手順1で設定したパスワードを使用してアクセスできるようにします。

まず、/home/sammy/.jupyter/jupyter_notebook_config.pyでJupyterLab構成ファイルを編集する必要があります。

nano /home/sammy/.jupyter/jupyter_notebook_config.py

次に、c.NotebookApp.certfileの値を定義する行に移動し、次のように更新します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## The full path to an SSL/TLS certificate file.
c.NotebookApp.certfile = '/etc/letsencrypt/live/your_domain/fullchain.pem'
...

次に、c.NotebookApp.keyfile変数を見つけて、次のように設定します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## The full path to a private key file for usage with SSL/TLS.
c.NotebookApp.keyfile = '/etc/letsencrypt/live/your_domain/privkey.pem'
...

c.NotebookApp.certfileおよびc.NotebookApp.keyfileは、httpsプロトコルを使用してサーバーにリモートアクセスしようとしたときに提供されるSSL証明書を指します。

次に、c.NotebookApp.ip変数を定義する行に移動し、次のように更新します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## The IP address the notebook server will listen on.
c.NotebookApp.ip = '*'
...

c.NotebookApp.ipは、サーバーを実行しているJupyterLabにアクセスできるIPを定義します。 *ワイルドカードに設定して、JupyterLabにアクセスする必要のある任意のコンピューターからのアクセスを許可します。

次に、c.NotebookApp.open_browser構成を見つけて、次のように更新します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## Whether to open in a browser after starting. The specific browser used is
#  platform dependent and determined by the python standard library `webbrowser`
#  module, unless it is overridden using the --browser (NotebookApp.browser)
#  configuration option.
c.NotebookApp.open_browser = False
...

デフォルトでは、JupyterLabは、実行開始時にブラウザセッションを自動的に開始しようとします。 リモートサーバーにはブラウザがないため、エラーを回避するためにこれをオフにする必要があります。

次に、c.NotebookApp.password変数に移動し、次のように変更します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## Hashed password to use for web authentication.
#
#  To generate, type in a python/IPython shell:
#
#    from notebook.auth import passwd; passwd()
#
#  The string should be of the form type:salt:hashed-password.
c.NotebookApp.password = 'your_hashed_password'
...

JupyterLabは、このハッシュ化されたパスワード構成を使用して、ブラウザーでアクセスするために入力したパスワードを確認します。

最後に、ファイルをさらにナビゲートし、c.NotebookApp.portのエントリを更新します。

/home/sammy/.jupyter/jupyter_notebook_config.py

...
## The port the notebook server will listen on.
c.NotebookApp.port = 9000
...

c.NotebookApp.portは、JupyterLabランタイムにアクセスするための固定ポートを設定します。 このようにして、ufwファイアウォールからの1つのポートへのアクセスのみを許可できます。

完了したら、ファイルを保存して終了します。

最後に、9000ポートでトラフィックを許可します。

sudo ufw allow 9000

次の出力が表示されます。

OutputRule added
Rule added (v6)

すべての構成を設定したので、JupyterLabを実行します。

ステップ4—JupyterLabを実行する

このステップでは、JupyterLabインスタンスのテスト実行を実行します。

まず、現在の作業ディレクトリをユーザーのホームディレクトリに変更します。

cd ~

次に、証明書ファイルのアクセス許可を変更して、JupyterLabがそれらにアクセスできるようにします。 /etc/letsencryptフォルダーのアクセス許可を次のように変更します。

sudo chmod 750 -R /etc/letsencrypt
sudo chown sammy:sammy -R /etc/letsencrypt

次に、JupyterLabインスタンスを呼び出して、次のコマンドの使用を開始します。

jupyter lab

このコマンドは、いくつかの構成パラメーターを受け入れます。 ただし、これらの変更は構成ファイルで既に行っているため、ここで明示的に指定する必要はありません。 これらをこのコマンドの引数として指定して、構成ファイルの値をオーバーライドできます。

これで、https://your_domain:9000に移動して、JupyterLabのログイン画面が表示されることを確認できます。

手順2でJupyterLabに設定したパスワードでログインすると、JupyterLabインターフェイスが表示されます。

最後に、CTRL+Cを2回押して、JupyterLabサーバーを停止します。

次のステップでは、JupyterLabサーバーをバックグラウンドで継続的に実行できるようにシステムサービスを設定します。

ステップ6—systemdサービスを設定する

このステップでは、ターミナルウィンドウが終了した場合でもJupyterLabを実行し続けることができるsystemdサービスを作成します。 systemdのサービスとユニットの詳細については、 systemdEssentialsに関するこのガイドを参照してください。

まず、次のコマンドを使用して、.serviceファイルを作成する必要があります。

sudo nano /etc/systemd/system/jupyterlab.service

次のコンテンツを/etc/systemd/system/jupyterlab.serviceファイルに追加します。

/etc/systemd/system/jupyterlab.service

[Unit]
Description=Jupyter Lab Server

[Service]
User=sammy
Group=sammy
Type=simple
WorkingDirectory=/home/sammy/
ExecStart=/home/sammy/anaconda3/bin/jupyter-lab --config=/home/sammy/.jupyter/jupyter_notebook_config.py
StandardOutput=null
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

完了したら、エディターを保存して終了します。

サービスファイルは、それ自体をデーモンとしてシステムに自動的に登録します。 ただし、デフォルトでは実行されていません。

systemctlコマンドを使用して、サービスを開始します。

sudo systemctl start jupyterlab

これにより、JupyterLabサーバーがバックグラウンドで起動します。 次のコマンドを使用して、サーバーが起動したかどうかを確認できます。

sudo systemctl status jupyterlab

次の出力が表示されます。

Output● jupyterlab.service - Jupyter Lab Server
   Loaded: loaded (/etc/systemd/system/jupyterlab.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-04-26 20:58:29 UTC; 5s ago
 Main PID: 5654 (jupyter-lab)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/jupyterlab.service
           └─5654 /home/sammy/anaconda3/bin/python3.7 /home/sammy/anaconda3/bin/jupyter-lab --config=/home/

Qを押して、サービスステータス出力を終了します。

これで、任意のブラウザでhttps://your_domain:9000に移動し、手順2で設定したパスワードを入力して、サーバーで実行されているJupyterLab環境にアクセスできます。

ステップ7—Let'sEncrypt証明書の更新を構成する

この最後のステップでは、Let's Encryptが提供するSSL証明書を構成して、90日ごとに有効期限が切れると自動的に更新し、サーバーを再起動して新しい証明書をロードします。

Certbotはインストールの証明書を更新しますが、サーバーを自動的に再起動することはありません。 新しい証明書で再起動するようにサーバーを構成するには、サーバーのCertbot構成にrenew_hookを提供する必要があります。

/etc/letsencrypt/renewal/your_domain.confファイルを編集し、構成ファイルの最後にrenew_hookを追加する必要があります。

まず、次のコマンドを使用して、/etc/letsencrypt/renewal/your_domain.confファイルをエディターで開きます。

sudo nano /etc/letsencrypt/renewal/your_domain.conf

次に、このファイルの最後に次の行を追加します。

/etc/letsencrypt/renewal/your_domain.conf

...
renew_hook = systemctl reload jupyterlab

ファイルを保存して終了します。

最後に、更新プロセスのドライランを実行して、構成ファイルが有効であることを確認します。

sudo certbot renew --dry-run

コマンドがエラーなしで実行された場合、Certbotの更新は正常にセットアップされており、証明書の有効期限が近づくと、サーバーが自動的に更新されて再起動されます。

結論

この記事では、サーバー上にJupyterLab環境をセットアップし、リモートでアクセスできるようにしました。 これで、任意のブラウザから機械学習またはデータサイエンスのプロジェクトにアクセスでき、SSL暗号化を使用してすべての交換が行われるので安心できます。 それに加えて、環境にはクラウドベースのサーバーのすべての利点があります。