Настройка среды JupyterLab в Ubuntu 18.04
Python, Ubuntu | Комментировать запись
JupyterLab – это многофункциональный пользовательский интерфейс, который упрощает выполнение задач, особенно в областях науки о данных и искусственного интеллекта. Среда JupyterLab – это редизайн Jupyter Notebook, ориентированный на производительность. Он предлагает такие инструменты, как встроенное средство просмотра HTML и CSV, а также функции, объединяющие несколько отдельных функций Jupyter Notebooks на одном экране.
В этом мануале вы узнаете, как установить и настроить JupyterLab на сервере Ubuntu 18.04. Мы также покажем, как настроить сервер так, чтобы он мог подключаться к JupyterLab удаленно, по домену с помощью любого веб-браузера.
Требования
- Сервер Ubuntu 18.04 с пользователем sudo, настроенный согласно этому мануалу.
- Установка Python Anaconda (читайте мануал Установка Anaconda в Ubuntu 18.04).
- Зарегистрированный домен или субдомен, чьи DNS-записи вы можете редактировать. В этом руководстве мы будем использовать условное обозначение your_domain.
- DNS-записи A для your_domain и www.your_domain, направленные на внешний IP-адрес вашего сервера.
1: Установка пароля
Давайте установим пароль для среды JupyterLab. Это важно, потому что экземпляр JupyterLab будет доступен в сети.
Для начала убедитесь, что ваша среда Anaconda активирована. Согласно руководству по установке Anaconda среда называется base.
Чтобы активировать среду, используйте следующую команду:
conda activate base
Командная строка изменится, чтобы показать, что вы находитесь в среде Anaconda:
8host@your_server:~$
Все дальнейшие команды в этом мануале будут выполняться в среде base.
Активировав среду Anaconda, вы можете установить пароль для JupyterLab.
Давайте сначала сгенерируем конфигурационный файл для Jupyter:
jupyter notebook --generate-config
Вы получите такой вывод:
Writing default config to: /home/8host/.jupyter/jupyter_notebook_config.py
JupyterLab и Jupyter Notebook используют один и тот же конфигурационный файл.
Теперь используйте следующую команду, чтобы установить пароль для удаленного доступа к экземпляру JupyterLab:
jupyter notebook password
Jupyter предложит выбрать и ввести пароль:
Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /home/8host/.jupyter/jupyter_notebook_config.json
Jupyter сохранит пароль в хешированном формате в файле /home/8host/.jupyter/jupyter_notebook_config.json. Это хешированное значение понадобится вам в будущем.
Затем используйте команду cat, чтобы просмотреть хешированный пароль в только что созданном файле:
cat /home/8host/.jupyter/jupyter_notebook_config.json
Вы получите следующий результат:
{
"NotebookApp": {
"password": "sha1:your_hashed_password"
}
}
Скопируйте значение ключа password и временно сохраните его.
Читайте также: Использование JSON в JavaScript
Итак, вы защитили среду JupyterLab паролем. На следующем этапе мы создадим сертификат Let’s Encrypt для сервера.
2: Настройка Let’s Encrypt
Давайте создадим сертификат Let’s Encrypt для своего домена. Это защитит данные при доступе к среде JupyterLab из браузера.
Сначала установите клиент Certbot. Добавьте его репозиторий в исходники apt:
sudo add-apt-repository ppa:certbot/certbot
При выполнении команды вам будет предложено нажать Enter, чтобы завершить добавление PPA:
This 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, чтобы продолжить.
После выполнения команды обновите исходники 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
Вы получите следующий вывод:
Rule added
Rule added (v6)
Затем разрешите доступ к порту 443:
sudo ufw allow 443
Rule added
Rule added (v6)
Наконец, запустите Certbot, чтобы сгенерировать сертификаты для вашего экземпляра. Для этого используйте следующую команду:
sudo certbot certonly --standalone
Флаг standalone запускает сервер на время процесса проверки.
Вам будет предложено ввести адрес электронной почты:
Saving 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’s Encrypt. Просмотрите условия, введите A, если вы принимаете их, и нажмите Enter:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
Теперь Certbot предложит вам поделиться своей электронной почтой с Electronic Frontier Foundation. Введите свой ответ и нажмите Enter:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
В конце вам нужно ввести свой домен. Укажите домен без протоколов:
Please 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, чтобы добавить в нее созданный только что сертификат Let’s Encrypt. Сейчас вам также понадобится пароль, который вы установили в разделе 1.
Откройте конфигурационный файл JupyterLab, /home/8host/.jupyter/jupyter_notebook_config.py:
nano /home/8host/.jupyter/jupyter_notebook_config.py
Теперь найдите строку c.NotebookApp.certfile и обновите ее следующим образом:
...
## The full path to an SSL/TLS certificate file.
c.NotebookApp.certfile = '/etc/letsencrypt/live/your_domain/fullchain.pem'
...
Затем найдите переменную c.NotebookApp.keyfile и отредактируйте ее так:
...
## 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 относятся к SSL-сертификату, который будет использоваться при попытке удаленного доступа к серверу по протоколу https.
Затем перейдите к строке c.NotebookApp.ip и обновите ее следующим образом:
...
## The IP address the notebook server will listen on.
c.NotebookApp.ip = '*'
...
c.NotebookApp.ip определяет IP-адреса, которые могут получить доступ к JupyterLab на вашем сервере. Установите здесь подстановочный знак *, чтобы разрешить доступ к среде с любого компьютера.
Затем найдите конфигурацию c.NotebookApp.open_browser и обновите ее следующим образом:
...
## 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 и измените ее таким образом:
...
## 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:
...
## The port the notebook server will listen on.
c.NotebookApp.port = 9000
...
c.NotebookApp.port устанавливает фиксированный порт для доступа к среде выполнения JupyterLab. Так вы можете разрешить доступ только через один порт в брандмауэре ufw.
Когда вы закончите, сохраните изменения и выйдите из файла.
Теперь откройте трафик на порт 9000:
sudo ufw allow 9000
Вы получите следующий результат:
Rule added
Rule added (v6)
Теперь можно запустить JupyterLab.
4: Запуск JupyterLab
На этом этапе мы выполним тестовый запуск JupyterLab.
Сначала перейдите из текущего рабочего каталога в домашний каталог пользователя:
cd ~
Теперь измените права доступа к файлам сертификатов, чтобы позволить JupyterLab использовать их. Измените права доступа к папке /etc/letsencrypt:
sudo chmod 750 -R /etc/letsencrypt
sudo chown 8host:8host -R /etc/letsencrypt
Затем запустите экземпляр JupyterLab:
jupyter lab
Эта команда принимает несколько параметров. Однако мы уже внесли эти значения в конфигурации, нам не нужно указывать их в команде. Вы можете предоставить их в качестве аргументов команды, если хотите переопределить какие-то значения в конфигурационном файле.
Теперь вы можете перейти по адресу https://your_domain:9000, чтобы открыть форму входа в JupyterLab.
Если вы войдете в систему с помощью пароля, который вы установили для JupyterLab в разделе 2, вы получите доступ к интерфейсу JupyterLab.
Дважды нажмите Ctrl+C, чтобы остановить сервер JupyterLab.
На следующем этапе мы настроим системный сервис, чтобы сервер JupyterLab мог непрерывно работать в фоновом режиме.
5: Создание сервиса systemd
Давайте настроим сервис systemd, чтобы среда JupyterLab могла работать, даже если окно терминала закрыто.
Читайте также: Основы Systemd: управление сервисами и журналирование
Сначала нам нужно создать файл .service:
sudo nano /etc/systemd/system/jupyterlab.service
Добавьте следующий код в этот файл:
[Unit]
Description=Jupyter Lab Server
[Service]
User=8host
Group=8host
Type=simple
WorkingDirectory=/home/8host/
ExecStart=/home/8host/anaconda3/bin/jupyter-lab --config=/home/8host/.jupyter/jupyter_notebook_config.py
StandardOutput=null
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Сохраните файл и выйдите из редактора, когда закончите.
Файл с расширением service автоматически регистрируется в системе как демон. Однако по умолчанию он не запускается.
Используйте команду systemctl, чтобы запустить сервис:
sudo systemctl start jupyterlab
Это запустит сервер JupyterLab в фоновом режиме. Вы можете проверить, запущен ли сервер, используя следующую команду:
sudo systemctl status jupyterlab
Вы получите следующий результат:
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/8host/anaconda3/bin/python3.7 /home/8host/anaconda3/bin/jupyter-lab --config=/home/
Теперь вы можете перейти по адресу https://your_domain:9000 в любом браузере, указать пароль и получить доступ к среде JupyterLab, запущенной на вашем сервере.
6: Автоматическое продление сертификата Let’s Encrypt
На этом этапе мы настроим автоматическое обновление SSL-сертификатов по истечении срока их действия (каждый сертификат действителен в течение 90 дней) и перезапуск сервера для загрузки новых сертификатов.
Хотя Certbot берет продление срока сертификатов на себя, он не перезагружает сервер автоматически. Чтобы настроить сервер для перезапуска с обновленными сертификатами, вам нужно добавить renew_hook в конфигурации Certbot вашего сервера.
Отредактируйте файл /etc/letsencrypt/renewal/your_domain.conf:
sudo nano /etc/letsencrypt/renewal/your_domain.conf
В конце файла поместите такую строку:
...
renew_hook = systemctl reload jupyterlab
Сохраните и закройте файл.
Запустите сухой прогон процесса обновления. Чтобы убедиться, что в файле нет ошибок и все работает.
sudo certbot renew --dry-run
Если команда не выдает ошибок, значит, процесс обновления Certbot успешно настроен и будет автоматически перезагружать сервер, когда срок действия сертификата приблизится к истечению.
Заключение
В этом мануале вы настроили среду JupyterLab на своем сервере и открыли удаленный доступ к ней. Среда JupyterLab обладает всеми преимуществами облачных серверов. Теперь вы можете работать над проектами, связанными с машинным обучением или наукой о данных, из любого браузера. При этом все операции по обмену данными будут защищены SSL-шифрованием.
Tags: Anaconda, Jupyter Notebook, JupyterLab, Let's Encrypt, Python, Ubuntu 18.04