Vous connaissez sans doute déjà les notebooks Jupyter [1], ces documents web où l'on peut rédiger du contenu en Markdown, pouvant contenir des formules mathématiques en LaTeX, mêlées à des cellules de code Python, (ou R, Julia etc.) que l'on peut exécuter au cas par cas de façon interactive. Ils sont pas mal utilisés en data science pour explorer un jeu de données où créer un modèle de machine learning progressivement, par exemple.
Il existe de nombreux outils en ligne comme Google Colab, Kaggle, CoCalc ou encore Binder qui implémentent leur versions de Jupyter.
Installer JupyterHub sur votre serveur rendra vos notebooks accessibles aux gens avec qui vous travaillez et vous permettra d'avoir un accès complet sur les paramètres. Cela sera peut être l'occasion de convaincre votre labo ou votre université d'en créer une instance ouverte à tous (étudiants compris ;-).
Comment Installer JupyterHub ?
Il y a différentes façons d'installer JupyterHub sur votre serveur, j'ai choisi une façon relativement standard, mais si cela ne vous convient pas n'hésitez surtout pas à aller voir la documentation de JupyterHub [3] pour vous renseigner davantage.
On distingue deux techniques légèrement différentes, suivant le gestionnaire de paquets python que vous utilisez : Anaconda ou pip.
Pour la présente démonstration, j'ai choisi une installation sur Debian. Il vous faudra adapter les commandes en fonction de l'OS, ou de la distribution que vous avez sous la main…
Les droits administrateur sur la machine sont requis pour installer JupyterHub.
Anaconda
Pour installer Anaconda3 [2], entrez les commandes suivantes dans votre terminal :
1 2 |
[crayon-674f44a39bf08084606756 ]wget https ://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh sudo bash Anaconda3-2020.11-Linux-x86_64.sh |
Préférez une installation globale dans /opt/anaconda3 pour qu'il n'y ait pas de problème de droit (ce qui peut arriver avec l'option par défaut /root/anaconda3).
1 2 |
[crayon-674f44a39bf0d238765657 ]conda install -c conda-forge jupyterhub # installe jupyterhub et le proxy nodejs http conda install notebook # utile si vous lancez des notebooks en local |
Pip
1 2 3 |
[crayon-674f44a39bf10461229709 ]curl -o- https ://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash # installe le gestionnaire de version de nodejs sudo nvm install v12.0.0 # choisir une version qui va bien... sudo apt install npm # installe le gestionnaire de packet de nodejs |
1 2 3 |
[crayon-674f44a39bf14235071775 ]sudo python3 -m pip install jupyterhub sudo npm install -g configurable-http-proxy sudo python3 -m pip install notebook # utile si vous lancez des notebooks en local |
Comment créer le fichier de configuration jupyterhub_config.py ?
Dans tous les cas, générez le fichier de configuration dans /etc/jupyterhub en entrant les commandes suivante dans le terminal :
1 2 3 |
[crayon-674f44a39bf17083956866 ]sudo mkdir /etc/jupyterhub cd /etc/jupyterhub sudo jupyterhub –generate-config |
Comment gérér JupyterHub à l'aide d'un service Systemd ?
Pareillement, le service diffère suivant la procédure que vous avez menée jusqu'alors.
Pour éditer le fichier de configuration du service, tapez la commande suivante (pour les fan de Vim 😉 )
1 |
[crayon-674f44a39bf1b200812835 ]sudo vim /etc/systemd/system/jupyterhub.service |
Puis copiez l'une de configurations suivantes, en fonction de votre installation.
Anaconda
1 2 3 4 5 6 7 8 9 10 11 |
[crayon-674f44a39bf1e935100777 ][Unit] Description=Jupyterhub After=syslog.target network.target [Service] User=root Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/anaconda3/bin" ExecStart=/opt/anaconda3/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py [Install] WantedBy=multi-user.target |
Pip
1 2 3 4 5 6 7 8 9 |
[crayon-674f44a39bf21155601383 ][Unit] Description=Jupyterhub After=multi-user.target [Service] User=root ExecStart=/usr/local/bin/jupyterhub -f /etc/jupyterhub/jupyterhub_config.py Restart=on-failure [Install] WantedBy=multi-user.target |
Comment lancer le service Systemd ?
1 2 3 |
[crayon-674f44a39bf25870381931 ]sudo systemctl daemon-reload # recharge les services disponibles après leur édition sudo systemctl start jupyterhub.service # lance le service jupyterhub sudo systemctl enable –now jupyterhub.service # ajoute le service jupyterhub aux applications se lançant au démarrage du serveur et lance le service |
1 |
[crayon-674f44a39bf28490465466 ]systemctl status jupyterhub.service # Vérifie que le service s'est bien lancé et qu'il est actif |
Comment installer et configurer un serveur proxy HTTP avec Nginx ?
Pour accéder au notebooks depuis une URL spécifique, il vous faudra enregistrer un nouveau nom de domaine, ou de sous-domaine chez votre registrar, et configurer votre serveur pour renvoyer cette adresse vers le port où écoute JupyterHub.
1 2 |
[crayon-674f44a39bf2c641959416 ]sudo apt install -y nginx sudo systemctl enable –now nginx |
1 |
[crayon-674f44a39bf2f042558869 ]sudo vim /etc/nginx/sites-available/jupyterhub.example.com.conf |
Contenu du fichier de configuration du serveur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
[crayon-674f44a39bf32578382280 ]# top-level http config for websocket headers # If Upgrade is defined, Connection = upgrade # If Upgrade is empty, Connection = close map $http_upgrade $connection_upgrade { default upgrade ; '' close ; } # HTTP server to redirect all 80 traffic to SSL/HTTPS server { listen 80 ; server_name HUB.DOMAIN.TLD ; # Tell all requests to port 80 to be 302 redirected to HTTPS return 302 https ://$host$request_uri ; } # HTTPS server to handle JupyterHub server { listen 443 ; ssl on ; server_name HUB.DOMAIN.TLD ; ssl_certificate /etc/letsencrypt/live/HUB.DOMAIN.TLD/fullchain.pem ; ssl_certificate_key /etc/letsencrypt/live/HUB.DOMAIN.TLD/privkey.pem ; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 ; ssl_prefer_server_ciphers on ; ssl_dhparam /etc/ssl/certs/dhparam.pem ; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d ; ssl_session_cache shared :SSL :50m ; ssl_stapling on ; ssl_stapling_verify on ; add_header Strict-Transport-Security max-age=15768000 ; # Managing literal requests to the JupyterHub front end location / { proxy_pass http ://127.0.0.1 :8000 ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header Host $host ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; # websocket headers proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection $connection_upgrade ; proxy_set_header X-Scheme $scheme ; proxy_buffering off ; } # Managing requests to verify letsencrypt host location ~ /.well-known { allow all ; } } |
N'oubliez pas de remplacer 'HUB.DOMAIN.TLD' par le nom de domaine que vous avez enregistrer dans votre DNS, et qui pointe vers l'IP publique du serveur, par exemple dans mon cas, c'est hub.ortion.xyz.
Si vous préférez utiliser Apache, allez voir la configuration recommandée sur la doc de jupyterhub [4].
Comment générer les certificat SSL avec Letsencrypt ?
1 2 3 4 |
[crayon-674f44a39bf37748267646 ]sudo add-apt-repository ppa :certbot/certbot # ajoute le dépôt PPA de certbot sudo apt-get install certbot sudo systemctl stop nginx certbot certonly –standalone # génère les certificats ; nginx ne doit pas fonctionner en parallèle |
Relancer Nginx
1 |
[crayon-674f44a39bf3b088480822 ]sudo systemctl restart nginx |
Et voilà, normalement, si tout s'est déroulé comme prévu vous pouvez dorénavant accéder à votre serveur JupyterHub via le domaine que vous avez spécifié avec Nginx, ou via http://localhost:8000 si vous êtes en local, et commencer à créer des cellules et coder dans vos notebooks.
Les identifiants de connection sont ceux des utilisateurs UNIX de votre serveur.
Si l'installation s'est mal passée et que vous n'arrivez pas à cette page, n'hésitez pas à demander du support sur le forum de JupyterHub [5].
Bonus : Comment installer le Kernel R — IRKernel ?
Pour exécuter du code R dans vos notebooks, il faut installer le Kernel R.
Il faut installer une version de R >= 3.5.0 pour le paquet pbdZMQ.
1 2 3 |
[crayon-674f44a39bf3e678875590 ]sudo apt install -y r-base sudo apt install -y libssl-dev # requis pour installer dev-tools R # lance l'interpréteur de commande R |
Si vous travailler avec Anaconda, il est peut être plus simple d'installer R avec la commande suivante : (qui installe la version 3.5.1)
1 2 |
[crayon-674f44a39bf42990552847 ]conda install -c r r R |
1 2 3 |
[crayon-674f44a39bf45047923564 ]install.packages(c('repr', 'IRdisplay', 'crayon', 'pbdZMQ', 'devtools')) devtools::install_github('IRkernel/IRkernel') IRkernel::installspec() # pour enregistrer le Kernel R dans l'installation actuelle de R |
Pour plus de détail rendez vous sur la doc de IRKernel [6] .
1 |
[crayon-674f44a39bf48083940099 ]sudo systemctl restart jupyterhub |
Rendez vous sur la liste complète des Kernels disponibles sur Jupyter [7] pour voir l’étendue des possibilités.
Nota bene
Malheureusement, JupyterHub ne permet pas l'édition collaborative en simultané des notebooks. Cette fonctionnalité est encore en développement.
Pour accéder à cette fonctionnalité, il faudra plutôt se diriger vers une solution alternative telle que CoCalc.
J'ai installé Open CoCalc sur le serveur de Liness, (Linux Essonne, un GULL — Groupe d'Utilisateurs de Logiciels Libres), et ça marche bien [8]. Il y a même un éditeur de document LaTeX intégré ainsi que de nombreux langages de programmations supportés par défaut.
Merci beaucoup aux relecteurs (azerin, Olivier Dameron et Yoann M.) pour leurs avis éclairés et leur suggestions !
Références
- [1] Le projet Jupyter
- [2] Anaconda
- [3] La documentation de JupyterHub
- [4] La documentation de la configuration des proxy
- [5] Le forum discourse de JupyterHub
- [6] La documentation de IRKernel
- [7] La liste des kernels disponibles
- [8] Le serveur CoCalc de Liness, le GULL de l'Essonne
Laisser un commentaire