miércoles, 6 de mayo de 2020

Instalación sistema de grabación para Jitsi – JIBRI


En este caso he realizado la instalación sobre una nueva VM con KVM debido a las limitaciones de LXC con el modulo snd-aloop. A esta nueva VM le he instalado una Ubuntu Server 18.04.


Configuración hostname:

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


Configuración java:

Jibri no funciona con muchas de las versiones y opciones de java disponibles, aseguraros de seguir las siguientes instrucciones para no tener problemas:
apt install wget gnupg software-properties-common -y
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public |apt-key add -
add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
apt update && apt install adoptopenjdk-8-hotspot -y
Editamos el siguiente fichero y añadimos la siguiente variable:
nano ~/.bash_profile
export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java
source ~/.bash_profile


Instalación de prerrequisitos:

Instalación de los siguientes paquetes extra:

apt update && install unzip ffmpeg curl alsa-utils icewm xdotool xserver-xorg-input-void xserver-xorg-video-dummy -y


Modulo ALSA:

echo "snd-aloop" >> /etc/modules
modprobe snd-aloop
Comprobar que el modulo se ha cargado:
lsmod | grep snd_aloop


Google Chrome stable & Chromedriver:

curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
apt update && apt install google-chrome-stable -y


mkdir -p /etc/opt/chrome/policies/managed
echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json


CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`
wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/
unzip ~/chromedriver_linux64.zip -d ~/
rm ~/chromedriver_linux64.zip
mv -f ~/chromedriver /usr/local/bin/chromedriver
chown root:root /usr/local/bin/chromedriver
chmod 0755 /usr/local/bin/chromedriver


Instalación y configuración del servidor Jibri:

wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
apt update && apt install jibri -y
usermod -aG adm,audio,video,plugdev jibri


Editamos/creamos el siguiente fichero de configuración:


nano /etc/jitsi/jibri/config.json
root@jibri:~# cat /etc/jitsi/jibri/config.json
{
// NOTE: this is a *SAMPLE* config file, it will need to be configured with
// values from your environment
// Where recording files should be temporarily stored
"recording_directory":"/srv/recordings",
// The path to the script which will be run on completed recordings
"finalize_recording_script_path": "/path/to/finalize_recording.sh",
"xmpp_environments": [
{
// A friendly name for this environment which can be used
// for logging, stats, etc.
"name": "prod environment",
// The hosts of the XMPP servers to connect to as part of
// this environment
"xmpp_server_hosts": [
"videoconf.midominio.net"
],
// The xmpp domain we'll connect to on the XMPP server
"xmpp_domain": "videoconf.midominio.net",
// Jibri will login to the xmpp server as a privileged user
"control_login": {
// The domain to use for logging in
"domain": "auth.videoconf.midominio.net",
// The credentials for logging in
"username": "Jibri",
"password": "JibriPassword"
},
// Using the control_login information above, Jibri will join
// a control muc as a means of announcing its availability
// to provide services for a given environment
"control_muc": {
"domain": "internal.auth.videoconf.midominio.net",
"room_name": "JibriBrewery",
"nickname": "jibri-nickname"
},
// All participants in a call join a muc so they can exchange
// information. Jibri can be instructed to join a special muc
// with credentials to give it special abilities (e.g. not being
// displayed to other users like a normal participant)
"call_login": {
"domain": "recorder.videoconf.midominio.net",
"username": "recorder",
"password": "RecorderPassword"
},
// When jibri gets a request to start a service for a room, the room
// jid will look like:
// roomName@optional.prefixes.subdomain.xmpp_domain
// We'll build the url for the call by transforming that into:
// https://xmpp_domain/subdomain/roomName
// So if there are any prefixes in the jid (like jitsi meet, which
// has its participants join a muc at conference.xmpp_domain) then
// list that prefix here so it can be stripped out to generate
// the call url correctly
"room_jid_domain_string_to_strip_from_start": "conference.",
// The amount of time, in minutes, a service is allowed to continue.
// Once a service has been running for this long, it will be
// stopped (cleanly). A value of 0 means an indefinite amount
// of time is allowed
"usage_timeout": "0"
}
]
}


mkdir /srv/recordings
chown jibri:jitsi /srv/recordings
service jibri restart
systemctl enable jibri


Configuración del servidor Jitsi Meet:

Añadimos la configuración para conectar con el grabador al final del siguiente fichero:
nano /etc/prosody/conf.d/videoconf.midominio.net.cfg.lua
-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.videoconf.midominio.net" "muc"
modules_enabled = {
"ping";
}
storage = "memory"
muc_room_cache_size = 1000


VirtualHost "recorder.videoconf.midominio.net"
modules_enabled = {
"ping";
}
authentication = "internal_plain"


Reiniciamos el servicio y creamos los siguientes usuarios:
/etc/init.d/prosody reload
prosodyctl register jibri auth.videoconf.midominio.net JibriPassword
prosodyctl register recorder recorder.videoconf.midominio.net RecorderPassword
OJO: Utilizar vuestros propios passwords en cada instalación.


Configuración para Jicofo, añadir al final del siguiente fichero de configuración:
nano /etc/jitsi/jicofo/sip-communicator.properties
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.videoconf.midominio.net
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
/etc/init.d/jicofo reload


Por último buscamos los siguientes parámetros de configuración en el fichero:
nano /etc/jitsi/meet/videoconf.midominio.net-config.js
fileRecordingsEnabled: true, // If you want to enable file recording
liveStreamingEnabled: true, // If you want to enable live streaming
hiddenDomain: 'recorder.videoconf.midominio.net',


Comprobar que en el parámetro TOOLBAR_BUTTONS del fichero de configuración /usr/share/jitsi-meet/interface_config.js contiene los valores recording y livestreaming.
Por último comprobar que el servidor Jitsi permite el acceso a su puerto 5222/tcp al servidor Jibri.


Comprobar funcionamiento:

Ya solo nos queda probar nuestras grabaciones.
Para ello pulsamos sobre “Iniciar la grabación”:
 

La grabación se detiene de forma similar.
Tras ello podemos encontrar nuestras grabaciones en el directorio /srv/recordings del servidor Jibri.

Referencias:




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 -
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: