2. Configuration de Jupyterhub#

La documentation générale sur jupyterhub se trouve ici:

Le système nécessite que les paquets python suivants sont installés:

jupyter
jupyterhub
jupyterlab
nbgrader

Les fichiers et programmes de configuration sont dans le déport git:

2.1. systemd jupyterhub.service#

Le fichier de service systemd pour lancer jupyterd est jupyterhub.service.

Le système lance le programme start_jupyterhub qui se trouve sous etc/jupyter dans l’environnement virtuel. Ce programme python a pour objectif de configurer l’environnement virtuel puis de lancer jupyterhub

On précise dans ces fichiers l’emplacement de l’environnement virtuel utilisé.

Indication

en cas de problème, augmenter le niveau de log avec le paramétre –log-level=40 dans jupyterhub.service

2.2. configuration jupyterhub#

La configuration de jupyterhub se trouve sous l’environnement virtuel $VIRTUAL_ENV$/etc/jupyter avec la structure suivante:

.
├── conf.d
│   ├── 00Flask_cours_config.py -> /home/cours/FlaskApp/jupyterhub_config.py
│   ├── 01MGCtest_config.py -> /home/cours/MGCtest/hub_config.py
│   └── admin_access_config.py
├── instructor-config.py
├── jupyterhub_config.py
├── jupyter_nbconvert_config.json
├── jupyter_notebook_config.d
│   ├── jupyterlab.json
│   ├── jupyterlab_latex.json
│   ├── jupyter-server-proxy-notebookserverextension.json
│   └── serverextension.json
├── jupyter_notebook_config.json
├── jupyter_notebook_config.py
├── jupyter_server_config.d
│   ├── jupyterlab.json
│   ├── jupyterlab_latex.json
│   ├── jupyter-server-proxy-jupyterserverextension.json
│   ├── nbclassic.json
│   └── notebook_shim.json
├── nbgrader_config.py
└── start_jupyterhub

Vérifier le fichier de configuration principal jupyterhub_config.py, en particulier le nom de la machine. Dans ce fichier, on définit aussi la liste des utilisateurs admin qui ont accès au menu Admin permettant d’avoir accès en live à la session des étudiants.

Dans ce fichier, il faut aussi les ressources maxi par utilisateur

  • c.SystemdSpawner.mem_limit = “1G”

  • c.SystemdSpawner.cpu_limit = 1

Dans le répertoire conf.d, il faut indiquer les liens vers la gestion du meta cours (application flask 00Flask) et les cours rattachés (01MGCtest dans l’exemple).

2.3. installation d’un menu de choix de l’interface#

Pour permettre à l’utilisateur de choisir son interface au démarrage de la session on modifie le fichier jupyterhub_config.py en remplaçant la ligne

c.Spawner.cmd = [VIRTUAL_ENV + '/bin/jupyterhub-singleuser',
                  '--SingleUserNotebookApp.default_url=/tree', # comment if using form (done in form)
                ]

par

c.Spawner.cmd = [VIRTUAL_ENV + '/bin/jupyterhub-singleuser',
                  # '--SingleUserNotebookApp.default_url=/tree', # comment if using form (done in form)
                ]

et en ajoutant le fichier form_config.py dans conf.d

"""
Allow launching /tree or /lab
https://github.com/jupyterhub/jupyterhub/tree/444f0ba0
"""
import shlex

from systemdspawner import SystemdSpawner

class FormSpawner(SystemdSpawner):
    def _options_form_default(self):
        return """
        <div class="form-group">
          <label for="args">Choix du type de serveur</label>
          <select id="args" class="form-control" name="args">
            <option value="--SingleUserNotebookApp.default_url=/tree">Notebook classique</option>
            <option value="--SingleUserNotebookApp.default_url=/lab">Jupyter Lab</option>
          </select>
          <h4>Cliquez sur Start. Actualiser (ou Ctrl+R) pour mettre  à jour si nécéssaire</h4>
        </div>"""

    def options_from_form(self, formdata):
        options = {}
        arg_s = formdata.get('args', [''])[0].strip()
        if arg_s:
            options['argv'] = shlex.split(arg_s)
        return options

    def get_args(self):
        """Return arguments to pass to the notebook server"""
        argv = super().get_args()
        if self.user_options.get('argv'):
            argv.extend(self.user_options['argv'])
        return argv

# comment if using defaut notebook interface
c.JupyterHub.spawner_class = FormSpawner

2.4. vérification des services#

la commande systemctl status jupyterhub.service permet de vérifier l’état du service jupyterhub et doit renvoyer une information du type ci-dessous

● jupyterhub.service - JupyterHub Daemon
   Loaded: loaded (/etc/systemd/system/jupyterhub.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/jupyterhub.service.d
           └─shell.conf, validation.conf
   Active: active (running) since Fri 2022-07-22 11:48:25 CEST; 31s ago
 Main PID: 640 (python3)
    Tasks: 90 (limit: 4915)
   Memory: 880.4M
      CPU: 20.763s
   CGroup: /system.slice/jupyterhub.service
           ├─ 640 /var/lib/jupyterhub/venvs/py3/bin/python3 /var/lib/jupyterhub/venvs/py3/etc/jupyter/start_jupyterhub --config=/var/
           ├─ 996 node /usr/bin/configurable-http-proxy --ip 127.0.0.1 --port 8000 --api-ip 127.0.0.1 --api-port 8001 --error-target 
           ├─1003 /var/lib/jupyterhub/venvs/py3//bin/python3 -m jupyterhub_idle_culler --timeout=43200
           ├─1004 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/flask run --port=10101
           ├─1007 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=MGCtest
           ├─1032 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=IntroIA
           ├─1057 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=MGC2367
           ├─1082 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=MGC2014
           ├─1107 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=MGC2028
           ├─1132 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/flask run --port=10111
           └─1134 /var/lib/jupyterhub/venvs/py3/bin/python3.9 /var/lib/jupyterhub/venvs/py3/bin/jupyterhub-singleuser --group=MGC0000

avec les services de gestion des méta-cours flask et des serveurs jupyterhub-singleuser associés à chacun des cours.

2.5. configuration de services annexes#

pour le bon fonctionnement du système, des services supplémentaires sont installées:

  1. jupyterhub-restart qui redémarre tous les soirs le service jupyterhub pour déactiver tous les serveurs jupyter lancés par les utilisateurs et qui n’ont pas été arrêtés.

  2. apache2-restart qui redémarre tous les soirs le service apache pour mettre à jour flask après jupyterhub.

  3. update-validation.service qui teste si une mise à jour des outils de validation et de l’application Flask est nécessaire en comparant avec la version des dépôts git.

Commandes de gestion des services systemctl utiles pour vérifier:

  • systemctl list-timers

  • systemctl start apache2-restart.timer

  • systemctl start jupyterhub-restart.timer

  • systemctl –failed

  • journalctl -xe

2.6. jupyter extension#

liste des extensions

  • jupyter-nbextension list

pour les dictionnaires français

  • spellchecker installer les dictionnaires dans /var/lib/jupyterhub/venvs/py3/share/jupyter/nbextensions/spellchecker