Instalar Jitsi en Ubuntu 18.04 con Docker y Let’s Encrypt

Aprendemos a instalar el servicio de chat y vídeo conferencia Jitsi, sobre un sistema operativo con Ubuntu 18.04, además utilizaremos la tecnología de contenedores con Docker y los certificados SSL con Let’s Encrypt.

A raíz de las crisis del Covid-19 y el confinamiento al que nos hemos visto obligados, este tipo de herramientas puede hacernos la vida más fácil. Ya sea por motivos laborales, debido al teletrabajo, o bien porque queremos charlar con nuestros seres queridos.

Me saltaré las partes descriptivas de las diferentes piezas que vamos a utilizar, ya que esta entrada es sobre todo práctica, y está enfocada a públicos con conocimientos medios o avanzados. Véase que también le sirve a este que escribe para sus notas.

Al igual que en otras entradas en la web utilizaré el VPS que tengo montado en Clouding.io utilizando una distribución GNU/Linux con Ubuntu 18.04

Descargar e instalar Jitsi

Para esta ocasión nos vamos a servidor del repositorio oficial ubicado en Github. Lo primero que haremos es clonarlo:

git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet

Obvio que debemos tener git previamente instalado y debemos tener permisos de administrador en el servidor.

Una vez clonado el repositorio nos encontramos con el fichero env.example, en este fichero se indican los parámetros principales de la apliación. Por lo que lo usaremos de plantila:

cp env.example .env

En este fichero nos encontraremos varios parámetros, como por ejemplo los puertos a utilizar, además de la zona horaria:

# Directory where all configuration will be stored.
CONFIG=~/.jitsi-meet-cfg
# Exposed HTTP port.
HTTP_PORT=19000
# Exposed HTTPS port.
HTTPS_PORT=19443
# System time zone.
TZ=Europe/Madrid

Otro parámetros importantes, son los que respectan a los certificados SSL para la conexión HTTPS:

# Enable Let's Encrypt certificate generation.
ENABLE_LETSENCRYPT=1
# Domain for which to generate the certificate.
LETSENCRYPT_DOMAIN=meet.bitsandlinux.com
# E-Mail for receiving important account notifications (mandatory).
LETSENCRYPT_EMAIL=davidochobits@colaboratorio.net

Una vez lo hemos adaptado a nuestras necesidades, guardamos y salimos.

Creamos las rutas y ficheros de configuración necesarios:

mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}

Desplegamos:

docker-compose up -d

Los podemos ver en funcionamiento:

root@servubuntu01:/home/davidochobits/docker-jitsi-meet# docker ps | grep -i jitsi
15028dd6493e   jitsi/jvb       "/init"    2 hours ago Up 2 hours   \
0.0.0.0:4443->4443/tcp, 0.0.0.0:10000->10000/udp   dockerjitsimeet_jvb_1
f2d9cc97deb8   jitsi/jicofo    "/init"    2 hours ago Up 2 hours    \
                                                  dockerjitsimeet_jicofo_1
d2c8a4dc2cd3   jitsi/prosody   "/init"    2 hours ago Up 2 hours   \
5222/tcp, 5269/tcp, 5280/tcp, 5347/tcp             dockerjitsimeet_prosody_1
d6dbf6f616c0   jitsi/web       "/init"    2 hours ago Up 2 hours  \
0.0.0.0:19000->80/tcp, 0.0.0.0:19443->443/tcp      dockerjitsimeet_web_

Apertura de puertos

Ahora biene una parte muy importante. Debemos abrir una serie de puertos, tanto en el cortafuegos de nuestro proveedor, en este claso Clouding.io, como si lo tenemos habilitado, en el propio servidor.

Los puertos en cuestión son:

  • El puerto 80/tcp o el que utilicemos para acceder vía web por HTTP
  • El puerto 443/tcp o el que utilicemos para acceder vía web por HTTPS
  • El puerto 4443/udp para RTP por TCP
  • El puerto 10000/tcp para RTP por UDP

Si tenemos el cortafuegos habilitado en el host también debemos añadir las reglas, por ejemplo si usamos UFW

Proxy inverso con Nginx

Para la ocasión en mi proveedor de DNS he creado un nuevo registro «A», que apunta a la IP del VPS, con el nombre «meet.bitsandlinux.com» De esta manera, escribiendo la url en el navegador, podré acceder sin problemas a la plataforma.

Para ello en el VPS tengo instalado Nginx, que lo voy a utilizar como proxy inverso. Para ello en la ruta /etc/nginx/sites-availables, he creado el fichero meet.bitsandlinux.com, con el contenido:

server {
    listen 80;
    listen [::]:80;    
    server_name meet.bitsandlinux.com;   
    location / {
        proxy_pass http://localhost:19000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Una vez hecho esto, guardamos y creamos el correspondiente enlace simbólico:

ln -s /etc/nginx/sites-available/meet.bitsandlinux.com /etc/nginx/sites-enabled/

Para que los cambios tengan efecto reiniciamos el servicio:

systemctl restart nginx

Ahora nos falta una parte fundamental, que es habilitar el acceso HTTPS por el puerto 443, para ello utilizaremos las herramientas y certificados que nos ofrece la iniciativa Let’s Encrypt.

Recordar, además, que a Jitsi le hemos indicado que utilizaremos certificados SSL, por lo que si no los configuramos no funcionará correctamente.

Habilitar HTTPS con Lets Encrypt

Para poder habilitar la conexión HTTPS, debemos instalar la herramienta Certbot:

  1. sudo apt-get install python-certbot-nginx

De esta manera ya podemos utilizar la herramienta:

  1. sudo certbot --nginx

Nos hará una serie de preguntas y al final listará los proyectos web que ha detectado y debemos seleccionar cuál de ellos será al que se le añadirán los certificados. Todo bastante fácil la verdad.

Los paquetes de Certbot vienen con un trabajo cron o un temporizador systemd que renovará los certificados automáticamente antes de que caduquen. No necesitaremos ejecutar Certbot nuevamente, a menos que cambiemos su configuración. Puede probar la renovación automática de los certificados ejecutando este comando:

  1. sudo certbot renew --dry-run

La herramienta añadira la tarea programada en algún de los siguientes lugares:

  1. /etc/crontab/
  2. /etc/cron.*/*
  3. systemctl list-timers

Podemos comprobar el certificado desde la siguiente URL: https://www.ssllabs.com/ssltest/

Una vez hecho, para que el contenedor que se encarga de la parte web de Jitsi funcione correctamente, lo hemos de reiniciar:

docker restart $(docker ps | grep -i jitsi| grep -i web)

Creo que no me he dejado nada, de esta forma ya podmeos acceder a la web sin problema: https://meet.bitsandlinux.com

Realmente la herramienta tiene muchas posibilidades, se le pueden añadir funcionalidades adicionales o por ejemplo restringuir el acceso con usuario o contraseña, pero eso quizás os lo explico otro día 🙂 Espero que os sea de utilidad en algún momento.