martes, 28 de abril de 2020

Instalación avanzada de Jitsi Meet


Manuales de instalación de Jitsi Meet hay muchos y buenos pero gran parte de la información esta desactualizada y hay que encontrarla en los foros empleando bastantes horas. Vamos a intentar unificar en esta entrada la experiencia obtenida tras varias instalaciones y muchas pruebas, así como de información dispersa por los foros y en github tras comprobar su correcto funcionamiento.

La ventaja principal de disponer de nuestro propio servidor es evitar los problemas que nos encontramos ocasionalmente con el servicio gratuito como que este saturado y que el funcionamiento sea molesto o, incluso, imposible de realizar.
Además proporciona una mayor seguridad y privacidad al no depender de servidores de terceros (debéis saber que el servicio de Jisti no se cifra extremo a extremo, sino que lo hace de participante X a servidor y de servidor a participante Y, es decir, en el servidor el contenido de las videoconferencias no esta cifrado). Estaremos de acuerdo que disponer de nuestro propio servidor nos proporciona mayor confianza.
El objetivo es obtener una instalación de Jitsi privada con dos posibles mecanismos de autenticación: vía LDAP o especifica de Jitsi.


Instalación básica

Configuración hostname:

  1. Revisión/configuración hostname
Comprobar que el fichero /etc/hosts tenga definida las ips correctamente:
192.168.X.X videoconf.midominio.net videoconf
  1. Comprobar que el fichero /etc/hostname este definido correctamente:
videoconf
También es válido:
videoconf.midominio.net

OJO: Cuidado con la elección de hostname, elegir el definitivo, cambiarlo posteriormente es muy complicado, valdría la pena comenzar de nuevo.

Configuración certificados:

Jitsi no funciona con certificados autofirmados, es necesario utilizar certificados obtenidos a través de una autoridad de certificación. En caso de utilizar certificados de Let’s encrypt saltar este paso y continuar con la instalación de Jitsi. En caso de tener certificados de otra autoridad de certificación copiarlos en el directorio /etc/ssl/ con, exactamente, el mismo nombre de máquina:
videoconf.midominio.net.crt
videoconf.midominio.net.key


OJO: Si se utilizan certificados de la ACCV se deben instalar los certificados ACCV Raíz 1 y ACCVCA-120 en los clientes que utilicen Jitsi o no funcionará ni el vídeo ni el audio pese a que si entrará en las salas. Este ocurre porque en los navegadores no están instalados alguno de estos certificados por defecto pero si lo están de las principales autoridades certificadoras.


Configuración del firewall:

Permitir el siguiente tráfico a través del firewall a nuestro Jitsi:
  • 80 TCP
  • 443 TCP
  • 10000-20000 UDP


Instalación de Jitsi:

apt install gnupg2
apt-get install apt-transport-https
wget -qO -  https://download.jitsi.org/jitsi-key.gpg.key | apt-key add -

sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
apt update
apt-get -y install jitsi-meet


En el asistente nos preguntará por la URL del servidor:
videoconf.midominio.net
OJO: Ni se os ocurra poner una mayúscula en la URL o no funcionará el asistente.


Después el asistente preguntará si queremos certificado propio o el de Let’s Encrypt.
  • Si se elige el primero y se han seguido las instrucciones anteriores funcionará correctamente dejando los nombres recomendados, en caso contrario el asistente fallará y no instalará correctamente todos los paquetes.
  • Si se elige Let’s Encrypt seguir con las instrucciones del asistente. (Recomendado, visto lo visto con la ACCV, personalmente he pasado a Let’s Encrypt en vez de utilizar el certificado wildcard que tenemos adquirido para el dominio).


Pasos finales de instalación:

Redirección http a https:
Editar /etc/nginx/sites-enabled/default y cambiar la parte inicial para activar la redirección por defecto:
server {
listen 80 default_server;
listen [::]:80 default_server;


add_header Strict-Transport-Security max-age=2592000;
rewrite ^/.*$ https://$host$request_uri? permanent;
[….]


Configuración para servidores tras NAT:
Para que el servidor sea accesible desde el exterior en servidores detrás de un NAT hay que editar el fichero /etc/jitsi/videobridge/sip-communicator.properties comentando la siguiente línea y añadiendo las dos siguientes:
#org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=ip_privada
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=ip_publica


Aumentar recursos disponibles:
Se recomienda aumentar el número máximo de procesos y ficheros abiertos que el sistema operativo es capaz de gestionar por defecto.
Editamos /etc/systemd/system.conf y añadimos la siguientes líneas al final:
DefaultLimitNOFILE=65000
DefaultLimitNPROC=65000
DefaultTasksMax=65000




Por último reiniciamos el servidor y ya podemos comprobar su funcionamiento.
Recordar probarlo desde dentro y fuera de la red. Y no olvidéis probarlo desde las apps móviles.

Configuraciones avanzadas

Autenticación integrada con LDAP:

En nuestro caso hemos habilitado la integración con el LDAP de nuestro servidor de correo, de este modo, cualquier usuario con una cuenta de correo activa podrá crear salas de conversación. Una vez creadas estas salas se podrá invitar a usuarios externos que no tengan cuenta de correo y podrán acceder a ellas directamente o mediante una contraseña especifica establecida para cada sala.
Procedemos con la instalación y configuración:
apt-get install prosody-modules lua-ldap
Creamos el siguiente fichero de configuración: /etc/prosody/conf.avail/ldap.cfg.lua
-- https://modules.prosody.im/mod_lib_ldap.html
-- https://modules.prosody.im/mod_auth_ldap2.html
authentication = 'ldap2'

ldap = {
    hostname = 'mail.midominio.net',
    bind_dn = 'cn=vmail,dc=midominio,dc=net',
    bind_password = 'xxxxxxxx',
    use_tls = false,
    user = {
        usernamefield = 'uid',
        basedn = 'ou=Users,domainName=midominio.net,o=domains,dc=midominio,dc=net',
        filter = '(&(objectclass=inetOrgPerson)(accountStatus=active)(enabledService=displayedInGlobalAddressBook))',
        -- admin?
        --namefield = 'cn',
    },
}


Para activar la nueva configuración:
ln -sf /etc/prosody/conf.avail/ldap.cfg.lua /etc/prosody/conf.d/


Al final del fichero de configuración /etc/prosody/prosody.cfg.lua añadimos consider_bosh_secure justo antes del último include:
consider_bosh_secure = true
Include "conf.d/*.cfg.lua"


Cambiamos el mecanismo de autenticación en el fichero /etc/prosody/conf.d/videoconf.midominio.net.cfg.lua comentamos y añadimos las siguientes líneas:
VirtualHost "videoconf.midominio.net"
-- enabled = false -- Remove this line to enable this host
-- authentication = "anonymous"
authentication = "ldap2"
[...]


Para finalizar reiniciamos el servicio:
service prosody restart




En este punto de la configuración solo los usuarios autenticados pueden crear salas y acceder a ellas. Nuestro objetivo es que también puedan entrar en las salas, una vez creadas, usuarios invitados. Para ello creamos un nuevo fichero de configuración /etc/prosody/conf.avail/guest.videoconf.midominio.net.cfg.lua con el siguiente contenido:
VirtualHost "guest.videoconf.midominio.net"
authentication = "anonymous"
c2s_require_encryption = false
allow_empty_token = true
ssl = {
key = "/etc/prosody/certs/videoconf.midominio.net.key";
certificate = "/etc/prosody/certs/videoconf.midominio.net.crt";
}


Activamos la nueva configuración:
ln -sf /etc/prosody/conf.avail/guest.videoconf.midominio.net.cfg.lua /etc/prosody/conf.d/


Configuramos y habilitamos la siguiente línea en /etc/jitsi/meet/videoconf.midominio.net-config.js:
anonymousdomain: 'guest.videoconf.midominio.net',


Añadimos la siguiente configuración al final del fichero /etc/jitsi/jicofo/sip-communicator.properties:
org.jitsi.jicofo.auth.URL=XMPP:videoconf.midominio.net


Por último reiniciamos el servicio y comprobamos el funcionamiento:
service prosody restart && service jicofo restart && service jitsi-videobridge2 restart


Autenticación interna de Jitsi:

Como alternativa podemos configurar un mecanismo de autenticación interna de Jitsi.


Cambiamos el mecanismo de autenticación en el fichero /etc/prosody/conf.d/videoconf.midominio.net.cfg.lua cambiamos las siguientes líneas:
-- authentication = "anonymous"
authentication = "internal_plain"
[...]


Creamos un nuevo fichero de configuración /etc/prosody/conf.avail/guest.videoconf.midominio.net.cfg.lua con el siguiente contenido:
VirtualHost "guest.videoconf.midominio.net"
authentication = "anonymous"
c2s_require_encryption = false


Nota editor: Ojo comprobar que así es correcto y no es necesaria la parte ssl del fichero superior.
Activamos la nueva configuración:
ln -sf /etc/prosody/conf.avail/guest.videoconf.midominio.net.cfg.lua /etc/prosody/conf.d/


Configuramos y habilitamos la siguiente línea en /etc/jitsi/meet/videoconf.midominio.net-config.js:
anonymousdomain: 'guest.videoconf.midominio.net',


Añadimos la siguiente configuración al final del fichero /etc/jitsi/jicofo/sip-communicator.properties:
org.jitsi.jicofo.auth.URL=XMPP:videoconf.midominio.net


Por último reiniciamos el servicio y comprobamos el funcionamiento:
service prosody restart && service jicofo restart && service jitsi-videobridge2 restart


Creamos el/los usuario/s de Jitsi que podrán crear salas:
prosodyctl register user midominio.net password


Limitar el número de micrófonos activados inicialmente:

Es bastante confuso y molesto la activación de muchos micrófonos, sobretodo conforme el número de participantes aumenta, para ello modificamos el siguiente atributo en /etc/jitsi/meet/videoconf.midominio.net-config.js:
startAudioMuted: 5,


De este modo solo los primeros cinco participantes tendrían el micrófono activado, el resto se conectarán con el micrófono desactivado hasta que lo activen manualmente.


Activar grabaciones de audio locales:

Habilitamos el siguiente bloque de configuración en /etc/jitsi/meet/videoconf.midominio.net-config.js:
localRecording: {
enabled: true,
format: 'flac'
},
Debemos asegurarnos que la herramienta “localrecording” aparezca en /usr/share/jitsi-meet/interface_config.js:
TOOLBAR_BUTTONS: [
'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen',
'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording',
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone',
'e2ee', 'localrecording'
],






En estos dos últimos ficheros de configuración podemos encontrar múltiples opciones de configuración de la interfaz interesantes como habilitar logos, herramientas, cambiar el aspecto visual de la interfaz, resoluciones de vídeo, idioma por defecto, activación inicial de cámara y micrófono, y muchas más, vale la pena dedicarles un tiempo a repasarlas:
/etc/jitsi/meet/videoconf.midominio.net-config.js
/usr/share/jitsi-meet/interface_config.js


Monitorizar salas activas:

Podemos monitorizar la utilización del servidor de manera sencilla con la utilidad Jitsihawk (Jitsi Meet log analysis tool) que podemos encontrar en: https://gitlab.com/jsnellink/jitsihawk/-/tree/master
Desde el propio servidor Jitsi la descargamos y la ejecutamos indicando nuestra URL:
wget https://gitlab.com/jsnellink/jitsihawk/-/archive/master/jitsihawk-master.tar.gz
tar xvzf jitsihawk-master
cd jitsihawk-master
./main -s videoconf.midominio.net
Podremos comprobar las salas en activo, el usuario que ha creado la sala y el número de participantes:

Limpiar instalación para volver a empezar:

Como es habitual podemos equivocarnos múltiples veces, llegar a callejones sin salida aparente o, simplemente, queremos dejar una instalación “limpia” cuando ya tenemos controlado el sistema, con el siguiente comando podemos volver a comenzar con la instalación ya que habremos eliminado el software instalado y sus configuraciones:
apt-get purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge2


Modificar textos página principal:

Editando el fichero /usr/share/jitsi-meet/lang/main-es.json encontramos variables como:

title: Texto de presentación de la página principal
appDescription: Texto secundario explicativo bajo el de presentación de la página principal.

Desde el fichero de configuración /usr/share/jitsi-meet/interface_config.js:

JITSI_WATERMARK_LINK: Configura la URL del enlace al pulsar sobre el logo.
APP_NAME: Variable para el “title” de la ventana del navegado y que también se utiliza como variables desde los ficheros de traducciones. (Enlaza con la variable {{app}} del fichero main-es.json.

Para modificar el pie de página, por ejemplo con una recomendación, editamos: /usr/share/jitsi-meet/static/welcomePageAdditionalContent.html:

Referencias: