Jupyter Notebook и Anaconda. Удаленная разработка на Ubuntu Server
Jupyter Notebook и Anaconda для удаленной разработки на отдельном Ubuntu Server, нужны для облегчения себе жизни. А так же чтобы не таскать с места на место свои проектики или не работать с jupyter notebook через удалённый рабочий стол. Еще распространена ситуация, когда у вас дома, в офисе, на даче или в датацентре стоит мощная вычислительная нода, многопроцессорная, с профильными для машинного обучения картами. Доступ к ней напрямую по HTTPS всегда удобнее чем через какой-либо каскад графических удаленных рабочих столов.
Можно конечно всё поставить на масдай, но 1) нестабильно, 2) в случае работы в виртуальной среде еще и нарушает лицензию использования масдая. Ведь 99.9% желающих захотят запилить в виртуальную среду какую-нибудь обычную прошку да? А она даже с лицензионным валидным ключем — будет нарушать еулу. Собственно зачем жертвовать стабильностью работы, и нарушать лицензию, если этого можно избежать?
В данной статье не рассматриваются вопросы относительно проброса трафика из интернета до вашей ноды. Подразумевается что этот вопрос у вас уже решен и ваш трафик из интернета спокойно доходит до вашей ноды, хотя бы по одному TCP порту.
Что мы имеем?
Некий сервер, внутри нашей локальной сети, куда мы хотим запилить Ubuntu Server, на неё установить Anaconda и использовать идущей в комплекте Jupyter Notebook. Почему не голый Jupyter Notebook? Потому что у анаконды в комплекте куча еще всяких прочих плюшек.
Что нам надо?
Собственно только сервер (В моём случае виртуальная машина внутри бесплатного гипервизора ESXi). Чем мощнее тем лучшее, но всё зависит от того чем именно вы занимаетесь в Jupyter Notebook.
Я буду использовать виртмашину где:
- 4 vCPU от процессора Intel
- 8Gb Ram
- 16Gb Hdd
- IP 192.168.220.135 Вы свои параметры должны определить для себя самостоятельно
С чего стоит начать:
- Установка Ubuntu Server 18.04
Что может пригодиться:
- Ubuntu Server 18.04 — Установка статического IP
- Ubuntu Server 18.04 — Изменение имени сервера
Обновляем сервер для Jupyter Notebook
sudo apt update && sudo apt dist-upgrade -y
Скачиваем дистрибутив с официального сайта
wget https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh
Проверяем хеш скачанного файла
Открываем страницу с хешами, выбираем тип дистрибутива который качали, и там смотрим конкретную версию файла


В моём случае я скачивал в корень своей папки, поэтому у меня команда будет выглядеть так:
md5sum ~/Anaconda3-2019.07-Linux-x86_64.sh
Устанавливаем Anaconda
Вводим команду bash ~/Anaconda3-2019.07-Linux-x86_64.sh , принимаем лицензионное соглашение введя yes и ожидаем окончания установки
В конце инсталлятор спросит

Вводим yes и вуаля! С установкой Anaconda мы закончили.
Для того чтобы изменения вступили в силу, необходимо перелогиниться завершив сессию с помощью exit или просто перезагрузить сервер с помощью sudo reboot -h now
Настраиваем Jupyter Notebook
Генерируем конфиг файл
jupyter notebook --generate-config
Эта команда сгенерирует конфиг файл, в моём случае по следующему пути: /home/belfigor/.jupyter/jupyter_notebook_config.py
Генерируем ssl сертификат
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
Данная команда сгенерирует файлы сертификата в той же папке, которая была открыта в момент запуска. В моём случае это домашняя моя домашняя папка ~/ , полный путь выглядит как /home/belfigor
Изменяем конфигурацию Jupyter Notebook
Открываем на редактирование наш конфиг и ищим указанные ниже параметры
nano /home/belfigor/.jupyter/jupyter_notebook_config.py
Искать параметры в nano можно с помощью комбинации клавишь Ctrl+W. Сохранить изменения с помощью Ctrl+O, а завершить редактирование с помощью Ctrl+X.
Находим следующие строки и прописываем там путь до файлов сертификатов
c.NotebookApp.keyfile = '/home/belfigor/mykey.key'
c.NotebookApp.certfile = '/home/belfigor/mycert.pem'
Прописываем интерфейс на котором Jupyter Notebook будет принимать подключения
c.NotebookApp.ip = '192.168.220.135'
Я указываю ip интерфейса, которым сервер смотрит в локальную сеть, откуда из интернета прокинут порт 35344, для доступа из вне.
Если у сервера больше одного интерфейса и мы хотим чтобы Jupyter обрабатывал входящие подключения со всех, можно указать «*»
Задаем порт на котором будут обрабатываться подключения
c.NotebookApp.port = 35344
Отключаем автозапуск браузера
Так как у нас Ubuntu Server, обладающий лишь текстовой консолью, нам нет необходимости, чтобы он каждый раз пытался запустить браузер.
c.NotebookApp.open_browser = False
Дополнительные настройки
Так же внутри конфиг файла есть огромная куча настроек, ненужных для личного использования, но которые могут оказаться полезными при более глубоком изучении инфраструктуры Jupyter и построении какой-то «своей особенной не такой как у других» инфраструктуры 🙂
Задаем пароль от веб интерфейса
jupyter notebook password
Этой же командой его можно сбросить если он забыт.
Запускаем Jupyter Notebook
Т.к. в пункте 5.2 мы сгенерировали файла сертификата, а в пункте 5.3 указали путь к ним, чтобы запустить Jupyter Notebook с подключением по https, нам достаточно воспользоваться командой
jupyter notebook
Так же, запустить сервер с использованием сертификатов можно без пункта 2, но тогда нам нужно будет прямо в ней указать расположение файлов сертификата
jupyter notebook --certfile=mycert.pem --keyfile=mykey.key
Подключаемся к Jupyter Notebook
После запуска, в консоли мы увидим на каком ip и порту стартовал сервер:
(base) belfigor@adminguide-ru:~$ jupyter notebook
[I 10:19:50.263 NotebookApp] JupyterLab extension loaded from /home/belfigor/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 10:19:50.263 NotebookApp] JupyterLab application directory is /home/belfigor/anaconda3/share/jupyter/lab
[I 10:19:50.265 NotebookApp] Serving notebooks from local directory: /home/belfigor
[I 10:19:50.265 NotebookApp] The Jupyter Notebook is running at:
[I 10:19:50.265 NotebookApp] https://192.168.220.135:35344/
[I 10:19:50.266 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
Нам осталось только открыть браузер и подключиться по указанным реквизитам https://192.168.220.135:35344/ с другой машины внутри локальной сети и ввести пароль заданный в пункте 5.4 и уже можно приступать к работе.
Собственно если не терпится начать что-то запиливать, то можно всё бросать и набигать на jupyter notebook. Но если же есть еще лишние 5 минут, предлагаю сделать свою жизнь чуть лучше установив менеджер расширений для jupyter.
Устанавливаем Nbextensions
Если Jupyter Notebook сервер работает, завершаем его работу с помощью Ctrl+C => y и последовательно вводим команды:
conda install -c conda-forge jupyter_contrib_nbextensions
conda install -c conda-forge jupyter_nbextensions_configurator
jupyter contrib nbextension install --user
Когда запрашивает подтверждение, вводим [y]
По окончании установки, зайдя в Jupyter Notebook мы увидим следующее:

Скорее всего галочка disable configuration for… у вас стоит, снимаем её.
Теперь мы можем ставить представленные в списке расширения. Моё самое любимое — Table of Contents (2). Оно формирует из Markdown ячеек содержание, которе удобно использовать для быстрой навигации по проекту, когда счёт ячеек идёт на сотни.