Habilitar Jupyter Notebook en formato server

Cómo activar el jupyter notebook como servidor y para que arranque en el systemd en Ubuntu 20.04. Todo esto a través de CLI.

Jupyter Notebook suele ejecutarse por defecto como localhost y para poder activarlo para acceso remoto es necesario antes hacer unos ajustes.

Antes de nada partimos de tener instalado los paquetes necesarios de jupyter. En mi caso he usado miniconda y he creado un entorno con python 3.9. Una vez instalado, ejecutamos el comando

$ jupyter notebook --generate-config

Este comando genera la carpeta y fichero de configuración necesarios para poder activar el servicio servidor, llamado jupyter_notebook_config.py

Una vez creado, he decidido usar el acceso solo con contraseña, ya que voy a ser el usuario único de Jupyter.

Antes de entrar en el fichero de configuración necesitaremos preparar dos cosas importantes para tener una seguridad mínima:

  • Un password hasheado (hashed)
  • Un certificado autofirmado

Hashed password

Ejecuto el siguiente código en una libreta que haya creado previamente o en el terminal con python:

from notebook.auth import passwd
passwd()

Pide un password y una contraseña que devuelve un SHA1. Este SHA1, tiene un formato algo así

'argon2:$argon2id$v=19$m=10240,t=10,p=8$0POp0vMjQPyPtjqCr0AYKQ$lyVtO5DUW5XpNQBUcGluWGZbgMP/TiW4xL1jgDn17jo'

Lo guardamos para cuando toquemos el fichero de configuración.

Certificado SSL

Lo siguiente es generar los certificados SSL autofirmado, lo hago via terminal con el siguiente comando:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

Puedes poner el nombre que necesites para la .key y para el .pem

Copia los ficheros de .pem en /etc/ssl y la .key guardadita en otro folder.

Configurar Jupyter en formato server

Con esto ya estamos listos para configurar el fichero de configuración, que se encuentra en la ruta

sudo nano /home/user/.jupyter/jupyter_notebook_config.py

Donde user es el nombre de tu usuario. Una vez dentro, configuramos los siguientes campos.

  • certfile: ruta donde has puesto el .pem
  • .ip: deja asterisko para que coja la ip del server.
  • keyfile: ruta donde has puesto el .key
  • openbrowser: pon False para que al arrancar no abra una ventana, esto sirve para luego en el systemd.
  • password: pues el password que has generado antes, copia el troncho entero entre comillas.
  • port: por si quieres cambiar el puerto por defecto.

Para que no te pierdas:

c.NotebookApp.certfile = ‘/etc/ssl/mycert.pem’

c.NotebookApp.ip = ‘*’

c.NotebookApp.keyfile = ‘/home/user/Documents/mykey.key’

c.NotebookApp.open_browser = False

c.NotebookApp.password = ‘argon2:$argon2id$v=19$m=10240,t=10,p=8$0POp0vMjQPyPtjqCr0AYKQ$lyVtO5DUW5XpNQBUcGluWGZbgMP/TiW4xL1jgDn17jo’

c.NotebookApp.port = 8888

h3. Configurar el firewall

The firewall must also allow connections from 127.0.0.1 (localhost) on ports from 49152 to 65535. These ports are used by the server to communicate with the notebook kernels.

No te olvides abrir el firewall al mundo exterior:

sudo ufw allow 8888/tcp

h3. Activar el systemd

Ya queda poco, ahora a configurar el systemd.

Accedemos a /etc/systemd/system

Creamos un fichero llamado jupyter.service

sudo nano jupyter.service

Copiamos el troncho de a continuación, peeero importante el «ExecStart» ya que es la ruta donde ejecutaremos el software que queremos arrancar con el systemd.

[Unit]
Description=Jupyter Notebook

[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart= /home/user/miniconda3/envs/p39/bin/jupyter-notebook –notebook-dir=/home/user
User=tususuario
Group=tusuario
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Aquí el tema tiene miga, porque si has creado un entorno y quieres que se abra la libreta con ese entorno, tienes que buscar la ruta del «environment» (en mi caso yo he creado uno llamado p39, de python 3.9) y finalmente jupyter-notebook como ejecutable.

Luego el –notebook-dir= es la ruta de donde querras que arranque tu libreta.

Luego User y Group, escribe el nombre del user que arrancará el servicio.

Y con todo esto ya está listo para arrancar el servicio. Ejecuta el siguiente comando:

sudo systemctl daemon-reload
sudo systemctl enable jupyter
sudo systemctl start jupyter
sudo systemctl status jupyter

Y ha disfrutar…

Ah, una última cosa, no te olvides de poner https:// porque sin ella el servicio no te arrancará.

Fuentes:

Dejar un comentario

Tu dirección de correo electrónico no será publicada.