JupyterLab


Установка

sudo apt install python3-pip

# устанавливаем pipenv
pip3 install pipenv

# если будет ошибка "pipenv: команда не найдена", то устанавливаем командой:
# sudo -H pip3 install -U pipenv

# создаем каталог для приложения
mkdir ./env
cd ./env/

# узнаем версию python
python3 --version

# активируем виртуальное окружение проекта
pipenv --python 3.5
pipenv shell

# устанавливаем приложения
(env)$  pipenv install jupyterlab

# устанавливаем ядро (python3)
(env)$  pipenv install ipykernel

# доступные ядра
(env)$  jupyter kernelspec list

# запуск приложения
(env)$  pipenv run jupyter lab

Конфигурация

(env)$  pipenv run jupyter notebook --generate-config

После выполнения команды, будет создан файл /home/< USER >/.jupyter/jupyter_notebook_config.py. Добавляем следущие строки:

# запускаем сервер локально
c.NotebookApp.ip = 'localhost'
c.NotebookApp.port = 12345

# на сервере нет браузера
c.NotebookApp.open_browser = False

# разрешаем удаленный доступ
c.NotebookApp.allow_remote_access = True

# устанавливаем пароль
from IPython.lib import passwd
password = passwd(u'XXXXXXXXXXXXXXXXXXXX')
c.NotebookApp.password = password
c.NotebookApp.allow_password_change = False

# включаем js библиотеку для Math/TeX
c.NotebookApp.enable_mathjax = True

Nginx (as reverse proxy)

Кофигурационный файл взят из: eploy the Jupyter Notebook container on VPS and use Nginx as the reverse proxy

server {
        listen 80;
        # Change the server name {some.domain} !!!
        server_name some.domain;
        location / {
                # Change the {host} and {port} !!!
                proxy_pass http://127.0.0.1:12345;

                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_read_timeout 86400;
        }

        client_max_body_size 50M;
        error_log /var/log/nginx/error.log;

        location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? {
                # Change the {host} and {port} !!!
                proxy_pass http://127.0.0.1:12345;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_http_version 1.1;

                #proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Upgrade "websocket";
                proxy_set_header Connection "upgrade";
                proxy_read_timeout 86400;
        }
}

Установка расширений

Большинство расширений требует устновленного пакета npm. Но в debian это, как правило, устаревшие версии – во время установки, в логах будет строка, наподобие:

...
error get-caller-file@2.0.5: The engine "node" is incompatible with this module. Expected version "6.* || 8.* || >= 10.*". Got "9.11.2"
...

Удаляем из системы старую версию nodejs и устанавливаем по инструкции Node.js Binary Distributions свежую (на момент написания статьи это была версия 13).

# Math
(env)$  pipenv install numpy
(env)$  pipenv install scipy
(env)$  pipenv install pandas

# Bokeh
(env)$  pipenv install bokeh
#(env)$  pipenv run jupyter labextension install @bokeh/jupyter_bokeh

# Widgets
(env)$  pipenv run jupyter labextension install @jupyter-widgets/jupyterlab-manager

Автозагрузка

Systemd

# пути запуска скриптов и размещения конфигурационных файйлов
(env)$  jupyter --paths

Создаем файл /etc/systemd/system/jupyterlab.service.

[Unit]
Description=JupyterLab
After=syslog.target
After=multi-user.target

[Service]
Type=simple
PIDFile=/var/run/jupyter.pid
ExecStart=/usr/local/bin/pipenv run jupyter lab
WorkingDirectory=/PATH/TO/ENV/
User=USER
Group=USER
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

В WorkingDirectory должен быть указан путь к каталогу, в котором находится Pipfile-файл.

Monit

check process jupyter-lab
  matching "jupyter-lab"
  start program = "/bin/sh -c 'cd /PATH/TO/ENV/ && /usr/local/bin/pipenv run jupyter lab'" as uid USER and gid USER
  stop program = "/usr/bin/killall jupyter-lab"
  if cpu usage > 90% for 10 cycles then restart

Troubles

Файл после перезапуска пуст (в JupyterLab), хотя содержимое в нем есть и, например, vscode его рендерит.

Если посмотреть этот файл в json фомате, то листинг python-кода не должен быть разбит на строки (json файл невалидный).

Решение: “Kernel -> Restart & Run All”, then “File -> Save and Checkpoint”

Jupyter Notebook JSON is invalid

Дополнительная литература

PipEnv

JupyterLab