Cómo instalar y configurar un entorno JupyterLab en Rocky Linux 9
JupyterLab es un entorno de desarrollo de nueva generación basado en la web para el Proyecto Jupyter. El Proyecto Jupyter se desarrolló con el objetivo de desarrollar estándares y servicios de código abierto para la informática interactiva en múltiples lenguajes de programación. JupyterLab ofrece una interfaz flexible que permite a los desarrolladores trabajar con documentos y actividades como cuadernos Jupyter, editores de texto, terminales y componentes personalizados de forma flexible, integrada y extensible. JupyterLab es la próxima generación de Jupyter Notebook y se supone que acabará sustituyéndolo. Es compatible con más de 40 lenguajes de programación, incluidos R, Python, Scala y Julia.
Este tutorial te enseñará a instalar y configurar JupyterLab en un servidor Rocky Linux 9.
Requisitos previos
- Un servidor con Rocky Linux 9.
- Un usuario no root con privilegios sudo.
- Un nombre de dominio completo (FQDN) que apunte a tu servidor. Para nuestros propósitos, utilizaremos
jupyterlab.example.comcomo nombre de dominio. - SELinux está desactivado.
- Asegúrate de que todo está actualizado.
$ sudo dnf update
- Instala los paquetes de utilidades básicas. Puede que algunos ya estén instalados.
$ sudo dnf install wget curl nano unzip yum-utils -y
Paso 1 – Configurar el cortafuegos
El primer paso es configurar el cortafuegos. Rocky Linux utiliza el cortafuegos Firewalld. Comprueba el estado del cortafuegos.
$ sudo firewall-cmd --state running
El cortafuegos funciona con diferentes zonas, y la zona pública es la que utilizaremos por defecto. Enumera todos los servicios y puertos activos en el cortafuegos.
$ sudo firewall-cmd --permanent --list-services
Debería mostrar la siguiente salida.
cockpit dhcpv6-client ssh
Wiki.js necesita los puertos HTTP y HTTPS para funcionar. Ábrelos.
$ sudo firewall-cmd --add-service=http --permanent $ sudo firewall-cmd --add-service=https --permanent
Recarga el cortafuegos para aplicar los cambios.
$ sudo firewall-cmd --reload
Paso 2 – Instalar Nginx
Rocky Linux 9 viene con una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.
Crea y abre el archivo /etc/yum.repos.d/nginx.repo para crear el repositorio oficial de Nginx.
$ sudo nano /etc/yum.repos.d/nginx.repo
Pega en él el siguiente código.
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Instala el servidor Nginx.
$ sudo dnf install nginx -y
Verifica la instalación.
$ nginx -v nginx version: nginx/1.22.1
Habilita e inicia el servidor Nginx.
$ sudo systemctl enable nginx --now
Comprueba el estado del servidor.
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-12-13 06:07:05 UTC; 31s ago
Docs: http://nginx.org/en/docs/
Process: 146475 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 146476 (nginx)
Tasks: 2 (limit: 5911)
Memory: 1.9M
CPU: 15ms
CGroup: /system.slice/nginx.service
??146476 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??146477 "nginx: worker process"
Paso 3 – Instalar JupyterLab
Comprueba primero la versión de Python.
$ python -V Python 3.9.14
Instala el gestor de paquetes PIP.
$ sudo dnf install python3-pip
Crea un directorio para JupyterLab.
$ mkdir jupyterlab
Cambia al directorio recién creado.
$ cd ~/jupyterlab
Configura un entorno virtual llamado jupyterlab_env.
$ python3 -m venv --system-site-packages jupyterlab_env
Activa el entorno.
$ source jupyterlab_env/bin/activate
Actualiza el gestor de paquetes Pip.
(jupyterlab_env) $ pip install --upgrade pip
Instala JupyterLab.
(jupyterlab_env) $ pip install jupyterlab
Paso 4 – Configurar JupyterLab
Por defecto, JupyterLab genera un nuevo token, cada vez que lo inicias para dar acceso a la interfaz. Vamos a sustituirlo por la autenticación mediante contraseña.
Genera un hash de contraseña. Sustituye YOUR_PASSWORD por una contraseña segura de tu elección.
(jupyterlab_env) $ python3 -c "from jupyter_server.auth import passwd; print(passwd('YOUR_PASSWORD'))"
El comando anterior generará un hash de contraseña largo. Utiliza la función de hash de contraseñas Argon2. Anota el hash.
Crea un archivo de configuración de JupyterLab.
(jupyterlab_env) $ jupyter lab --generate-config
El comando anterior generará un archivo de configuración con valores por defecto y lo guardará en el directorio ~/.jupyter.
Abre el archivo para editarlo.
(jupyterlab_env) $ nano ~/.jupyter/jupyter_lab_config.py
Busca las siguientes variables, descoméntalas y cambia su valor como se indica a continuación. Sustituye PASSWORD_HASH por el hash generado anteriormente.
c.ServerApp.allow_remote_access = True c.ServerApp.password = 'PASSWORD_HASH'
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Abre el puerto 8888 en el cortafuegos.
$ sudo firewall-cmd --add-port=8888/tcp --permanent $ sudo firewall-cmd --reload
Ejecuta el servidor de JupyterLab. El parámetro --ip 0.0.0.0 le permite escuchar cualquier dirección IP y no sólo localhost.
$ jupyter lab --ip 0.0.0.0
El comando anterior genera un servidor JupyterLab en el puerto 8888 que hemos abierto por defecto. Inicia la URL http://<yourserverIP>:8888/ en tu navegador y verás la siguiente pantalla.

Introduce tu contraseña y pulsa el botón Acceder para abrir la interfaz de JupyterLab.

Ahora que el acceso está confirmado, pulsa Ctrl + C para detener el servidor e introduce y cuando se te pida que lo detengas.
Paso 5 – Crear el archivo de servicio de JupyterLab
Sal del entorno virtual.
(jupyterlab_env) $ deactivate
Crea un nuevo archivo de servicio para JupyterLab.
$ sudo nano /lib/systemd/system/jupyterlab.service
Pega en él el siguiente código.
[Unit] Description=JupyterLab Server [Service] User=USER Group=USER Type=simple WorkingDirectory=/home/USER/jupyterlab ExecStart=/home/USER/jupyterlab/jupyterlab_env/bin/jupyter-lab --config=/home/USER/.jupyter/jupyter_lab_config.py StandardOutput=null Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Sustituye USER por el usuario conectado actual de tu sistema.
Inicializa el servicio JupyterLab.
$ sudo systemctl daemon-reload
Habilita e inicia el servicio JupyterLab.
$ sudo systemctl enable jupyterlab --now
Comprueba el estado del servicio.
$ sudo systemctl status jupyterlab
? jupyterlab.service - JupyterLab Server
Loaded: loaded (/usr/lib/systemd/system/jupyterlab.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2022-12-13 11:45:26 UTC; 5s ago
Main PID: 151675 (jupyter-lab)
Tasks: 1 (limit: 5911)
Memory: 59.0M
CPU: 1.943s
CGroup: /system.slice/jupyterlab.service
??151675 /home/navjot/jupyterlab/jupyterlab_env/bin/python3 /home/navjot/jupyterlab/jupyterlab_env/bin/jupyter-lab --config=/home/navjot/.jupyter/jupyter_lab_config.py
Dec 13 11:45:26 jupyter.example.com systemd[1]: Started JupyterLab Server.
Paso 6 – Instalar SSL
Antes de continuar, necesitamos instalar la herramienta Certbot y un certificado SSL para nuestro dominio.
Para instalar Certbot, utilizaremos el instalador de paquetes Snapd. Snapd siempre lleva la última versión estable de Certbot y deberías utilizarla.
La herramienta Snapd necesita el repositorio Epel para funcionar.
$ sudo dnf install epel-release -y
Utilizaremos Snapd para instalar Certbot. Instala Snapd.
$ sudo dnf install snapd -y
Habilita e Inicia el servicio Snap.
$ sudo systemctl enable snapd.socket --now
Crea los enlaces necesarios para que Snapd funcione.
$ sudo ln -s /var/lib/snapd/snap /snap $ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Asegúrate de que tu versión de snapd está actualizada.
$ sudo snap install core $ sudo snap refresh core
Instala Certbot.
$ sudo snap install --classic certbot
Asegúrate de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Genera un certificado SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d jupyterlab.example.com
El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/jupyterlab.example.com de tu servidor.
Genera un certificado de grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Realiza un simulacro del proceso para comprobar si la renovación SSL funciona correctamente.
$ sudo certbot renew --dry-run
Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.
Paso 7 – Configurar Nginx
Crea y abre el archivo /etc/nginx/conf.d/jupyterlab.conf para editarlo.
$ sudo nano /etc/nginx/conf.d/jupyterlab.conf
Pega el siguiente código en el archivo jupyterlab.conf. Sustituye todas las instancias de jupyterlab.example.com por tu dominio.
## enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name jupyterlab.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jupyterlab.example.com;
access_log /var/log/nginx/jupyterlab.access.log;
error_log /var/log/nginx/jupyterlab.error.log;
client_max_body_size 20m;
http2_push_preload on; # Enable HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/jupyterlab.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jupyterlab.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/jupyterlab.example.com/chain.pem;
ssl_session_timeout 1d;
# Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
# prevent replay attacks.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
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;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8888;
}
}
# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
La configuración anterior redirigirá todas las peticiones HTTP a HTTPS y servirá como proxy para el servicio JupyterLab para servirlo a través de tu dominio.
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Abre el archivo /etc/nginx/nginx.conf para editarlo.
$ sudo nano /etc/nginx/nginx.conf
Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
Comprueba la configuración de Nginx.
$ sudo nginx -t
Si no ves ningún error, significa que puedes continuar. Recarga el servidor Nginx.
$ sudo systemctl reload nginx
Ahora puedes acceder a JupyterLab visitando la URL https://jupyterlab.example.com en tu navegador.
Conclusión
Con esto concluye nuestro tutorial sobre la instalación y configuración de JupyterLab en un servidor Rocky Linux 9 y cómo servirlo utilizando el servidor proxy Nginx. Si tienes alguna pregunta, publícala en los comentarios a continuación.