В настоящее время в поле данных более распространена работа в среде для совместной работы для обмена информацией и знаниями в команде, и существует множество облачных решений, которые могут предоставить все функции, удовлетворяющие потребности команды, такие как Google Colab или блокноты Azure. Несмотря на то, что существуют облачные решения, иногда компании хотят начать глубоко понимать, как эти экосистемы работают и на уровне приложений, прежде чем переходить к облачным службам.

Эта документация предназначена для создания экземпляра Jupyterhub и его настройки в качестве решения для предприятий для поддержки профилей в поле данных.

Но что такое Jupyterhub?

JupyterHub предоставляет возможности блокнотов группам пользователей. Это дает пользователям доступ к вычислительным средам и ресурсам, не обременяя пользователей задачами по установке и обслуживанию. Пользователи, в том числе студенты, исследователи и специалисты по данным, могут выполнять свою работу в своих рабочих местах на общих ресурсах, которыми могут эффективно управлять системные администраторы.

JupyterHub работает в облаке или на вашем собственном оборудовании и позволяет предоставлять предварительно настроенную среду обработки данных любому пользователю в мире. Его можно настраивать и масштабировать, он подходит для небольших и больших команд, академических курсов и крупномасштабной инфраструктуры.

Как установить и развернуть Jupyterhub

Эта установка ориентирована на Linux/Unix.

Предпосылки:

Подготовьте систему

sudo apt-get update && sudo apt-get upgrade

Установить питон3

sudo apt-get install python3

Установить узел/npm

sudo apt-get install nodejs npm

Установить Юпитерхаб

npm install -g configurable-http-proxy
python3 -m pip install jupyterhub
python3 -m pip install --upgrade jupyterlab
python3 -m pip install --upgrade notebook

Проверьте установку

jupyterhub -h
configurable-http-proxy -h

Создайте сервисы для автоматического запуска в Ubuntu/Debian:

Необходимо создать файл с именем jupyterhub по следующему пути /etc/init.d/jupyterhub.

sudo nano /etc/init.d/jupyterhub

Информация о файле.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          jupyterhub
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start jupyterhub
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
# Do NOT "set -e"
 
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Multi-user server for Jupyter notebooks"
NAME=jupyterhub
DAEMON=/usr/local/bin/jupyterhub
DAEMON_ARGS="--config=/etc/jupyterhub/jupyterhub_config.py"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
 
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
 
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
 
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
 
#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --background --make-pidfile --quiet --pidfile $PIDFILE --exec $DAEMON -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}
 
#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}
 
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}
 
case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
    status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac
 
:

Выполните следующие команды.

sudo chmod +x /etc/init.d/jupyterhub
# Create a default config to /etc/jupyterhub/jupyterhub_config.py
sudo jupyterhub --generate-config -f /etc/jupyterhub/jupyterhub_config.py
# Reload systemctl daemon to notice the init.d script
sudo systemctl daemon-reload
# Start jupyterhub
sudo service jupyterhub start
# Stop jupyterhub
sudo service jupyterhub stop
# Start jupyterhub on boot
sudo update-rc.d jupyterhub defaults
# Or use rcconf to manage services http://manpages.ubuntu.com/manpages/natty/man8/rcconf.8.html
sudo rcconf

Создайте сервисы для автоматического запуска в CentOS/Fedora/Generic systemd:

Предполагая, что вы используете /etc/jupyterhub для своих конфигураций, сохраните это как /lib/systemd/system/jupyterhub.service:

[Unit]
Description=Jupyterhub
 
[Service]
User=jupyterhub
ExecStart=/usr/bin/jupyterhub --JupyterHub.spawner_class=sudospawner.SudoSpawner
WorkingDirectory=/etc/jupyterhub
 
[Install]
WantedBy=multi-user.target

ПРИМЕЧАНИЕ. Возможно, вам потребуется добавить After=network-online.target в раздел [Unit], в противном случае включение этого в качестве службы при загрузке не удастся, если сеть еще не загружена. Настройте правильного пользователя с правильными разрешениями для запуска /usr/bin/jupyterhub.

Теперь запустите: sudo systemctl daemon-reload. Вот и все! Теперь вы можете использовать sudo systemctl ‹start|stop|status› jupyterhub.

ПРИМЕЧАНИЕ. Обязательно установите sudospawner.SudoSpawner, запустив: pip3 install git+https://github.com/jupyter/sudospawner

после создания службы:

sudo reboot now

Затем, когда система снова заработает, проверьте состояние службы.

sudo service jupyterhub status

Конфигурация предприятия:

Создание конфигурации Jupyter необходимо для редактирования файла jupyterhub_config.py, расположенного в /etc/jupyterhub/jupyterhub_config.py.

1. Конфигурация LDAP:

Добавьте следующую информацию в файл конфигурации, чтобы разрешить подключение LDAP.

c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
c.LDAPAuthenticator.server_address = 'ldap://host'
c.LDAPAuthenticator.server_port=389
c.LDAPAuthenticator.bind_dn_template = ['domain/{username}']
c.LDAPAuthenticator.lookup_dn = False
c.LDAPAuthenticator.user_search_base = 'OU=User,OU=ASZ,OU=Accounts,DC=domain,DC=domain,DC=domain'
c.LDAPAuthenticator.lookup_dn_search_filter = '(sAMAccountName={login})'
c.LDAPAuthenticator.lookup_dn_user_dn_attribute = 'CN'
c.LDAPAuthenticator.user_attribute = 'sAMAccountName'
c.LDAPAuthenticator.use_ssl = False
c.LDAPAuthenticator.escape_userdn = False
c.LDAPAuthenticator.valid_username_regex="^.*$"
#Allocate the Admin User
c.Authenticator.admin_users = {'User'}

Примечание. Очень важно с самого начала выделить пользователя-администратора для доступа к системе. Пользователь должен быть в LDAP и в качестве пользователя на машине, если пользователь не существует, необходимо будет создать пользователя в ОС (операционной системе) и с его домашним каталогом. Если пользователь будет иметь доступ только через Jupyter, не нужно будет создавать пароль ОС.

sudo useradd -m username

2. Использование SSL-сертификата:

Использование SSL-сертификата Для этого потребуется получить официальный доверенный SSL-сертификат или создать самозаверяющий сертификат. После того, как вы получили и установили ключ и сертификат, вам необходимо указать их расположение в файле конфигурации jupyterhub_config.py следующим образом:

c.JupyterHub.ssl_key = '/path/to/my.key'
c.JupyterHub.ssl_cert = '/path/to/my.cert'

3. Совместная папка:

Создайте папку.

sudo mkdir /home/foldername

Создайте группу, чтобы иметь права для людей, с которыми будете работать.

groupadd mygroup

Назначить папку группе

#sudo chgrp {-R} [group] [file|directory]
sudo chgrp -R mygroup /home/foldername

Необходимо внести пользователя в группу

sudo usermod -a -G mygroup newuser

Для отображения папки в доме пользователя и в браузере Jupyter необходимо создать символическую ссылку.

sudo ln -s /home/foldername /home/user/foldername

4. Добавьте больше пользователей:

Большая часть администрирования и настройки JupyterHub может быть выполнена непосредственно из веб-интерфейса. Но перед этим необходимо создать пользователей в ОС, как было упомянуто ранее.

sudo useradd -m username
  1. Откройте Панель управления, нажав кнопку панели управления в правом верхнем углу JupyterHub.

  1. В панели управления откройте ссылку Администрирование в левом верхнем углу.

  1. Это открывает страницу администрирования JupyterHub, где вы можете добавлять/удалять пользователей, запускать/останавливать серверы людей и видеть, кто находится в сети.
  2. Нажмите кнопку Добавить пользователей.

  1. Откроется диалоговое окно Добавить пользователей.
  2. Введите имена пользователей, которых вы хотите добавить в этот JupyterHub, в диалоговом окне, по одному в каждой строке.

  1. Вы можете установить флажок Администратор, если хотите также предоставить права администратора всем этим пользователям.
  2. Нажмите кнопку Добавить пользователей в диалоговом окне. Теперь ваши пользователи добавлены в JupyterHub! При первом входе в систему они могут установить свой пароль и использовать его для повторного входа в будущем.
  3. Поздравляем, теперь у вас есть многопользовательский JupyterHub, в который вы можете добавлять произвольных пользователей.

Возобновить

Это основная информация для работы в среде Jupyterhub.
Я покидаю свой GitHub и Linkedin, если у вас есть дополнительные вопросы.