En medio de la cuarentena actual, han proliferado las reuniones en línea. En verdad, a veces tengo 2 ó 3 invitaciones en el día para asistir a alguno de estos eventos en línea, el 95% de ellos es COVID-19 e «inserte aquí una patología adicional». La mayoría en Zoom, Microsoft Teams, Adobe Connect, Bluejeans, GoToWebinar, Veeva Engage y otras que he usado menos veces. En común estas aplicaciones tienen que son propietarias y en la mayoría de los casos, el host tiene que pagar por ciertas características para superar ciertas limitaciones. Me ha tocado entonces hacer posible una actividad de educación médica continua en línea y he elegido Jitsi Meet para cumplir este objetivo.
Jitsi Meet es una aplicación de software libre y de código abierto diseñada para videoconferencias y que usa el protocolo webRTC, por esta razón solamente es necesario utilizar un navegador para poder conectarse. En dispositivos móviles tenemos la opción de instalar la aplicación nativa tanto para Android como iOS.
La limitante es aquí entonces los recursos que tengas disponibles en el servidor. Evidentemente a más recursos, mejor calidad y más usuarios podrán conectarse. Pero también hay que tener en cuenta que quien actúa de host de la reunión debe tener un buen ancho de banda para transmitir con la mejor calidad posible y tener un buen equipo para videoconferencia.
Para empezar, debemos tener en cuenta el tope de usuarios que vamos a manejar y que un sistema de videoconferencia en verdad devora recursos. En mi caso hay que mantener 50 usuarios simultáneos, médicos igual que yo, hambrientos de educación médica continua.
Apuntar un subdominio hacia el servidor que se va a utilizar. Por razones de comodidad, Debian 10 es una buena elección para mí así que un VPS optimizado para tareas en CPU debe hacer el trabajo. Hay que tener en cuenta el tiempo de propagación de un dominio ya que casi 24 horas después hay algunos DNS que aún no reconocían la dirección.
Para verificar si un DNS reconoce una dirección solo hace falta usar el comando dig
de esta manera:
Respuesta adecuada
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | dig @1.1.1.1 meet.nombrededominio.com A ; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> @1.1.1.1 meet.nombrededominio.com A ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58223 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1452 ;; QUESTION SECTION: ;meet.nombrededominio.com. IN A ;; ANSWER SECTION: meet.nombrededominio.com. 3600 IN A 167.70.90.200 ;; Query time: 261 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) ;; WHEN: Sun Jun 14 07:30:35 EST 2020 ;; MSG SIZE rcvd: 97 |
Respuesta denegada
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> @200.75.200.2 meet.nombrededominio.com A ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 12552 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;meet.nombrededominio.com. IN A ;; AUTHORITY SECTION: nombrededominio.com. 1800 IN SOA ns1.digitalocean.com. hostmaster.nombrededominio.com. 1580200932 10800 3600 604800 1800 ;; Query time: 230 msec ;; SERVER: 200.75.200.2#53(200.75.200.2) ;; WHEN: Sun Jun 14 07:37:54 EST 2020 ;; MSG SIZE rcvd: 109 |
También podemos hacer uso de herramientas de verificación geográfica que lo único que hacen es ejecutar el mismo comando contra una serie de servidores DNS en varios lugares del mundo. Estos son los 3 que más uso:
Casi todas esas herramientas traen un mapa, así podemos darnos cuenta que por ejemplo en New York, quienes usen ese servidor DNS que está siendo comprobado no les cargará la web.
Este paso es importante ya que la instalación de Jitsi se fija en estos cambios para generar los archivos de configuración. Primero cambiar el nombre de hostname.
1 | $ sudo hostnamectl set-hostname meet.nombrededominio.com |
Ahora necesitamos editar el archivo /etc/hosts
para apuntar el localhost al mismo nombre de dominio.
1 | 127.0.0.1 localhost meet.nombrededominio.com |
Con este último paso nos aseguramos que las conexiones locales internas utilicen también el certificado TLS que generaremos más adelante garantizando así la encriptación de las comunicaciones.
Para evitar complicaciones con reglas y demás hierbas aromáticas que pueda necesitar saber para administrar un firewall, usando ufw
se puede lograr mucho en pocas líneas.
Para instalar ufw
en caso que aún no esté instalado
1 | sudo apt install ufw |
Luego abrimos los puertos 80, 443, 4443 y 10000 de esta manera
1 2 3 4 | sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 4443/tcp sudo ufw allow 10000/udp |
Y activamos ufw
1 | sudo systemctl enable ufw |
Luego de tener nuestro servidor funcionando a nuestro gusto. La rutina de actualizar todo será necesaria.
1 2 | sudo apt update sudo apt upgrade |
Lo siguiente será entonces agregar el repositorio estable de Jitsi al sistema. El primer paso sería instalar gnupg
para descargar y añadir la llave criptográfica.
1 | sudo apt install gnupg |
Ahora descargamos la clave GPG
1 | wget https://download.jitsi.org/jitsi-key.gpg.key |
Y la añadimos mediante apt-key
1 | sudo apt-key add jitsi-key.gpg.key |
Ya podemos eliminar la clave descargada después de haberla añadido al sistema y creamos un archivo sources.list
para el repositorio de Jitsi.
1 | sudo nano /etc/apt/sources.list.d/jitsi-stable.list |
Y añadimos este contenido
1 | deb https://download.jitsi.org stable/ |
Ahora actualizamos el repositorio e instalamos Jitsi.
1 2 | sudo apt update sudo apt install jitsi-meet |
Luego la instalación lanzará un asistente que preguntará el hostname que usaremos y que ya configuramos
Y luego sobre usar un certificado autofirmado. Aceptamos está opción ya que después podemos usar uno de letsencrypt
generado por certbot
.
Solo necesitaremos instalar certbot
1 | sudo apt install certbot |
Y ejecutar el script de instalación que ya trae Jitsi que autoconfigura el certificado, nos preguntará por una dirección de correo electrónico donde nos notificará la expiración del certificado cuando este próxima la fecha.
1 | sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh |
Al finalizar el script se añade automáticamente una tarea cron
que renueve el certificado antes de su expiración y se ejecuta semanalmente.
Por defecto cualquier usuario que entre a la web en su estado por defecto podrá crear una videoconferencia. Para prevenir este comportamiento podemos añadir usuarios a través de prosody
. De este modo también podemos garantizar que pueda haber más de un moderador en una reunión.
Los archivos de configuración de esta parte son autogenerados durante la instalación, por lo que toca buscar individualmente cada uno.
1 | sudo nano /etc/prosody/conf.avail/meet.nombrededominio.com.cfg.lua |
Una vez abierto el archivo, cambiamos la línea authentication = "anonymous"
por authentication = "internal_plain"
y al final del archivo añadimos este bloque
1 2 3 4 | ... VirtualHost "guest.meet.nombrededominio.com" authentication = "anonymous" c2s_require_encryption = false |
Ahora editamos el achivo /etc/jitsi/meet/meet.nombrededominio.com-config.js
y cambiamos la línea
1 | // anonymousdomain: 'guest.example.com', |
por esta
1 | anonymousdomain: 'guest.meet.nombrededominio.com', |
Ahora abrimos el archivo /etc/jitsi/jicofo/sip-communicator.properties
y añadimos esta línea
1 | org.jitsi.jicofo.auth.URL=XMPP:meet.nombrededominio.com |
Lo siguiente será añadir los usuarios que deseamos a Jitsi usando prosody
1 | sudo prosodyctl register usuario meet.nombrededominio.com contraseña |
Una vez hemos terminado aquí, reiniciamos Jitsi y sus servicios asociados.
1 2 3 4 | sudo systemctl restart prosody.service sudo systemctl restart jicofo.service sudo systemctl restart jitsi-videobridge2.service sudo systemctl restart nginx |
Ahora, al intentar crear una sala de conferencia, Jitsi te pedirá un usuario y contraseña. El usuario se escribe como si fuera un correo electrónico. Este usuario ingresará automáticamente como moderador.
Si deseas iniciar sesión como un segundo moderador, solo hay que presionar en la rueda del engrane en la esquina superior derecha, y en la ventana que aparece en el acápite «Perfil» hay un enlace que dice «Iniciar sesión«. Ya solo será cuestión de ingresar a la sala de videoconferencia.
El aspecto de Jitsi una vez instalado es bastante limpio, pero siempre podemos añadir al menos nuestro propio logo y texto a la web.
Para cambiar el logo, lo recomendable es utilizar una imagen monocrómatica blanca con 60% de transparencia a un tamaño de 612x272px en formato png. De este modo se presentará en Jitsi como una mosca audiovisual en la esquina superior izquierda.
Solo será cuestión de reemplazar el archivo /usr/share/jitsi-meet/images/watermark.png
por el nuevo.
Como el texto se carga a través de un archivo json y existen múltiples para varios idiomas que se cargan dependiendo de la configuración de idioma del navegador con que visitemos el sitio. Solo es cuestión de editar el archivo correspondiente:
1 | sudo nano /usr/share/jitsi-meet/lang/main-es.json |
Solo es cuestión de buscar y reemplazar los bloques de texto que deseamos personalizar. Ahora solo debemos forzar que se muestre solo el que editamos al cargar la página web. Editamos el archivo /etc/jitsi/meet/meet.nombrededominio.com-config.js
1 | defaultLanguage: 'es' |
Al finalizar todo este procedimiento tenemos un servidor web con capacidad para alojar videoconferencias entre usuarios sin necesidad de instalar aplicaciones adicionales. El único paso que tal vez podría limitar es otorgar permisos para uso de micrófono y cámara.
La seguridad y anonimato ofrecido por Jitsi son un punto fuerte a favor del sistema luego de conocer ciertas flaquezas y dudas en cuanto al tratamiento de datos que otorga por lo menos Zoom a sus usuarios. Sin tomar en cuenta que cada usuario también tendría que estar registrado. En Jitsi, es opcional que coloques tus datos (nombre, apellido, correo) pues la plataforma funciona muy bien. La opción de compartir pantalla es útil si deseamos hacer una presentación en línea y como moderador podemos silenciar a todos los usuarios de un solo click o centrar la atención únicamente en un usuario.
Si en el peor de los casos, existe algún problema de incompatibilidad con algún usuario también tenemos la opción de transmitir en vivo a un canal de YouTube y así también queda nuestra sesión disponible en un archivo histórico. O bien, podemos hacer que se grabe el vídeo de la misma sesión para editarlo después u subirlo al servicio de streaming de nuestra preferencia.
@linkmoises
se ve clara la guía, estoy buscando un servidor de VOIP para montarlo en debian para comunicación en la oficina. probare jitsi también
Buenas estimado;
Agradezco el tutorial, gracias a el pude montar un servidor Jitsi.
Ahora, siguiendo las indicaciones para que la creación de salas no quede abierta a todos, he notado que cuando se invita a una persona cualquiera (no moderador, un usuario no creado usando prosodyctl register), también le pide usuario y contraseña.
Cómo se debe hacer para que en las invitaciones, los usuarios directamente pasen a sala de espera y esperen a ser aceptados?
Es decir, a un usuario que desee ingresar no le pida usuario y contraseña? en todo caso solamente la contraseña fijada en la sala?
Desde ya muchas gracias y saludos desde Uruguay.
El moderador/host/anfitrión o como desees llamarlo debe ingresar antes que cualquiera de los invitados. De lo contrario se le mostrará la pantalla para inicio de sesión. Incluso el invitado puede ignorarla y mantenerse ahí pues apenas inicie sesión el host, ingresará automáticamente a la sesión.
¡Saludos Marcos!
Excelente publicación y súper bien explicado.
Pero tengo una duda, si quisiera transmitir en vivo o hacer una grabación del meet como lo puedo realizar sale una leyenda que dice error.
Saludos.
Con esta configuración se puede transmitir en vivo. Para hacer grabaciones hacia la nube hay que configurar algunos otros servicios que se salen de lo básico que quería mostrar en el tutorial. Intentaré crear uno nuevo cubriendo estos detalles en cuanto tenga algo de tiempo. Saludos!