Ubuntu18.04でJupyterLab環境をセットアップする方法
著者は、 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" } }
JSONのpassword
キーの値をコピーして、一時的に保存します。
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
要求に対してチェックされ、ポート:443
はhttps
要求に対して使用されます。 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暗号化を使用してすべての交換が行われるので安心できます。 それに加えて、環境にはクラウドベースのサーバーのすべての利点があります。