Instalación de Jitsi Meet CT Ubuntu 18.04

Instalaciónde Jitsi Meet en debian 9

Instalación de dependencias

  • Instalamos sudo y dependencias
apt install sudo ssh apt-transport-https gnupg2 curl -y

Definición de nombre de dominio

  • Aseguramos que la máquina tenga el nombre correcto dependiendo del dominio qu se selecciono para la aplicación; por ejemplo en nuestro caso deseamos que sea https://conferencias.siua.ac.cr
  • Por tanto si ejecutamos el siguiente comando debe devolver el nombre de host «conferencias»
sudo hostnamectl
  • Resultado:
   Static hostname: conferencias
         Icon name: computer-container
           Chassis: container
        Machine ID: c5b67cb2fb4c49678a4fd62f7e4a2b20
           Boot ID: 8609819a8f4c4f15b606a833a48ead01
    Virtualization: lxc
  Operating System: Debian GNU/Linux 10 (buster)
            Kernel: Linux 5.4.44-2-pve
      Architecture: x86-64
  • Si no lo podemos modificar con el comando
sudo hostnamectl set-hostname conferencias
  • Además debemos asegurar que en el archivo /etc/hosts tenga tambien el nombre
nano /etc/hosts
  • Debe contener:
10.20.200.74 conferencias.siua.ac.cr.cr conferencias
  • Finalmente verificamos todo con
ping "$(hostname)"

Agregar Repositorio

  • Agregamos el repositporio de jitsi videoBridge, Meet Jicofo Jigasi
curl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor > /usr/share/keyrings/jitsi-keyring.gpg'
echo 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list > /dev/null

# update all package sources
sudo apt update

Configurar firewall

  • Debemos habilitar los siguientes puerto para el correcto funcionamiento
  • 80 TCP – for SSL certificate verification / renewal with Let’s Encrypt
  • 443 TCP – for general access to Jitsi Meet
  • 4443 TCP – for fallback network video/audio communications (when UDP is blocked for example)
  • 10000 UDP – for general network video/audio communications
  • 22 TCP – if you access you server using SSH (change the port accordingly if it’s not 22)

Instalación

  • Instalamos JITSI MEET
sudo apt install jitsi-meet
  • En la primera ventana nos pide el FQDN el servidor
  • A continuación no dice que si quiere generar un certificado o quiere utilizar uno propio, seleccionamos la primera opción luego lo podemos modificar por uno de letsencrypt

Letsencrypt

  • Para crear un certificado por letsencrypt
/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
  • Resultado
-------------------------------------------------------------------------
This script will:
- Need a working DNS record pointing to this machine(for domain conferencias.siua.ac.cr)
- Download certbot-auto from https://dl.eff.org to /usr/local/sbin
- Install additional dependencies in order to request Let’s Encrypt certificate
- If running with jetty serving web content, will stop Jitsi Videobridge
- Configure and reload nginx or apache2, whichever is used

You need to agree to the ACME server's Subscriber Agreement (https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf) 
by providing an email address for important account notifications
Enter your email and press [ENTER]: interuniversitariadealajuela@gmail.com

Si esta detras de NAT

  • Si la aplicación se encuentra detrás de un NAT, debe aplicar los siguientes comandos
nano /etc/jitsi/videobridge/sip-communicator.properties
  • Y agregar las siguientes lineas
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=<Local.IP.Address>
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=<Public.IP.Address>

Ejemplo:
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=10.20.200.74      
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=186.15.227.78
  • Y comentar la siguiente linea
#org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
  • ARCHIVO QUEDA ASÍ:
org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER=true
#org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
org.jitsi.videobridge.ENABLE_STATISTICS=true
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc
org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=localhost
org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.conferencias.siua.ac.cr
org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=PASSSSSSSSSSSS
org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=JvbBrewery@internal.auth.conferencias.siua.ac.cr
org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=94173669-4daf-4ba5-a7a1-4f77f517d89f

org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=10.20.200.74      
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=186.15.227.78

Cantidad de participantes

  • Por defecto el sistema soporta bien menos de 100 participantes si desea aumentar este número, abra el archivo
nano /etc/systemd/system.conf
  • Y modifique estos valores
DefaultLimitNOFILE=65000
DefaultLimitNPROC=65000
DefaultTasksMax=65000
  • ARCHIVO QUEDANDO ASÍ:
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.

[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#ShowStatus=yes
#CrashChangeVT=no
#CrashShell=no
#CrashReboot=no
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
#JoinControllers=cpu,cpuacct net_cls,net_prio
#RuntimeWatchdogSec=0
#ShutdownWatchdogSec=10min
#CapabilityBoundingSet=
#SystemCallArchitectures=
#TimerSlackNSec=
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultIOAccounting=no
#DefaultIPAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=no
#DefaultTasksAccounting=yes
#DefaultTasksMax=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
#DefaultLimitNOFILE=
#DefaultLimitAS=
#DefaultLimitNPROC=
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=
#IPAddressAllow=
#IPAddressDeny=
DefaultLimitNOFILE=65000
DefaultLimitNPROC=65000
DefaultTasksMax=65000
  • Para aplicar recargue el sistema y aplique los cambios
systemctl daemon-reload
systemctl restart jitsi-videobridge2
  • Podemos consultar esos valores con
systemctl show --property DefaultLimitNPROC
systemctl show --property DefaultLimitNOFILE
systemctl show --property DefaultTasksMax
  • Podemos verificar el estado del servicio
systemctl status jitsi-videobridge2
  • Y ejecutar el siguiente comando para ver la cantidad de procesos soportados
cat /proc/`cat /var/run/jitsi-videobridge/jitsi-videobridge.pid`/limits
  • Resultado:
Max processes             65000                65000                processes 
Max open files            65000                65000                files

SIP-Gateway

  • Si tiene una cuenta de SIP, instale jigasi
apt-get -y install jigasi
  • Durante la instalación le pedirá su usuario y contraseña de su cuenta SIP

Instalar Jibri para live stremming y recording MV Ubuntu 16.04

GUIA: https://github.com/jitsi/jibri

Dependencias

apt install unzip

Instalación

  • para hacer live stremmming y grabar su conferencias es necesario instalar Jibri
  • Requisitos el modulo ALSA and Loopback Device deben estar activados
  • Para probarlos ejecute el comando
lsmod | grep snd_aloop
  • Si muestra la salida
snd-aloop module loaded
  • El módulo esta activado
  • Sino haga
apt install linux-image-extra-virtual
  • hacemos que se cargue el modulo en el arranque
echo "snd-aloop" >> /etc/modules
  • cargamos el modulo
modprobe snd-aloop
  • verificamos que el modulo se cargo
lsmod | grep snd_aloop
  • resultado
snd_aloop              24576  0
snd_pcm               106496  1 snd_aloop
snd                    86016  3 snd_aloop,snd_timer,snd_pcm
  • Habilitamos la carga de Ffmpeg with X11 capture support
  • este viene habilitado por defecto en ubuntu 16.04
  • Si utiliza unio anterior debe hacer
sudo add-apt-repository ppa:mc3man/gstffmpeg-keep
sudo apt-get update
sudo apt-get install ffmpeg
  • Debemos habilitar los puertos en firewall
    • SSH (22/44)
    • Web 80 y 443 (TCP)
    • 10000:60000 (TCP/UDP)
    • 5222 y 5347

Google Chrome stable & Chromedriver

  • Dependencias

apt install unzip

  • ahora dentro del servidor debemos instalar la ultima versión de chrome
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-get -y update
apt-get -y install google-chrome-stable
  • Add chrome managed policies file and set
mkdir -p /etc/opt/chrome/policies/managed
echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json
  • Ahora instalamos el Chromedriver
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
sudo mv -f ~/chromedriver /usr/local/bin/chromedriver
sudo chown root:root /usr/local/bin/chromedriver
sudo chmod 0755 /usr/local/bin/chromedriver
  • Instalamos otras dependencias
sudo apt-get install default-jre-headless ffmpeg curl alsa-utils icewm xdotool xserver-xorg-input-void xserver-xorg-video-dummy
  • Agregamos el repositorio de Jitsi
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
  • Ceamos un sources.list.d
sudo sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
  • Actualizamos
sudo apt-get update
  • Instalamos JIBRI
sudo apt-get install jibri
  • Al instalarse se crea el usuario «jibri» y el grupo «jibri» por defecto
  • Debemos incluir este usuario a los siguientes grupos
sudo usermod -aG adm,audio,video,plugdev jibri
  • por defecto jibri utiliza el siguiente directorio para el log, verifique que se creó
/var/log/jitsi/jibri
  • Ahora respaldamos el archivo de configuración
cp /etc/jitsi/jibri/config.json /etc/jitsi/jibri/config.json.bak
  • Ahora abrimos el siguiente archivo para configurarlo
nano /etc/jitsi/jibri/config.json
  • Vamos a modificar
-----------------------
-----------------------
"recording_directory":"/tmp/recordings",
X
"recording_directory":"/srv/recordings",

-----------------------
-----------------------

"finalize_recording_script_path": "/srv/recordings/finalize_recording.sh",
X
"finalize_recording_script_path": "/path/to/finalize_recording.sh",

-----------------------
-----------------------
"xmpp_server_hosts": [
   "prod.xmpp.host.net"
],
X
"xmpp_server_hosts": [
    "conferencias.siua.ac.cr"
],
-----------------------
-----------------------


-----------------------
-----------------------
"xmpp_domain": "xmpp.domain",
X
"xmpp_domain": "conferencias.siua.ac.cr",
-----------------------
-----------------------




-----------------------
-----------------------
"control_login": {
  // The domain to use for logging in
  "domain": "auth.xmpp.domain",
  // The credentials for logging in
  "username": "username",
  "password": "password"
},
X
"control_login": {
  // The domain to use for logging in
  "domain": "auth.conferencias.siua.ac.cr",
  // The credentials for logging in
  "username": "jibri",
  "password": "AC2"
},

-----------------------
-----------------------

-----------------------
-----------------------
"control_muc": {
  "domain": "internal.auth.xmpp.domain",
  "room_name": "JibriBrewery",
  "nickname": "jibri-nickname"
},
X
"control_muc": {
  "domain": "internal.auth.conferencias.siua.ac.cr",
  "room_name": "JibriBrewery",
  "nickname": "jibri-nickname"
},

-----------------------
-----------------------


-----------------------
-----------------------
"call_login": {
  "domain": "recorder.xmpp.domain",
  "username": "username",
  "password": "password"
},
X
"call_login": {
  "domain": "recorder.conferencias.siua.ac.cr",
  "username": "recorder",
  "password": "AC2"
},

-----------------------
-----------------------
  • ARCHIVO QUEDANDO ASÍ:
{
    // 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": "/srv/recordings/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": [
                "conferencias.siua.ac.cr"
            ],
            // The xmpp domain we'll connect to on the XMPP server
            "xmpp_domain": "conferencias.siua.ac.cr",
            // Jibri will login to the xmpp server as a privileged user 
            "control_login": {
                // The domain to use for logging in
                "domain": "auth.conferencias.siua.ac.cr",
                // The credentials for logging in
                "username": "jibri",
                "password": "Apolo_COR_2"
            },
            // 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.conferencias.siua.ac.cr",
                "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.conferencias.siua.ac.cr",
                "username": "recorder",
                "password": "Apolo_COR_2"
            },
            // 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"
        }
    ]
}
  • Creamos la carpeta
mkdir /srv/recordings
  • Creamos el archivo que se va ejecutar después de terminar una grabación
nano /srv/recordings/finalize_recording.sh
  • Le agregamos el siguiente contenido, esto por que jibri crea carpetas con nombres aleatorios, entonces para queden con el nombre de la conferencias, modificamos el nombre de la carpeta al finalizar la grabación
#!/bin/bash

#Recibimos el directorio donde se almaceno el video
nombreDirectorioAnterior=$1                               

#Ingresamos al directorio pasado como parametro
cd $nombreDirectorioAnterior

#Listamos los archivos que tengan extensión .mp4 y se lo asignamos a la variable
nombreVideo=$(ls *.mp4)

#Cortamos la extesión del archivo
nombreCarpeta=$(echo "$nombreVideo" | cut -f 1 -d '.')

#Nos devolvemos un nivel en los directorio
cd ..

#Renombramos la carpeta
mv $nombreDirectorioAnterior "/srv/recordings/siuaCONFE_"$nombreCarpeta

exit 0

  • Y le asignamos un dueño
chown jibri:jitsi /srv/recordings/
  • Agreamos el usuario www-data al grupo jibri para que se puedan eliminar conferencias desde la web
usermod -a -G www-data jibri
setfacl -d -m o::rwx recordings/
  • Reiniciamos el servicio
sudo systemctl restart jibri 
service jibri restart
service jibri status
  • Habilitamnos que el servicio para arranque el iniciar el sistema operativo
systemctl enable jibri-xorg
systemctl enable jibri-icewm
systemctl enable jibri
  • para poder descargar los videos instalamos php7.0 y apache2
apt install apache2 php libapache2-mod-php php-mcrypt php-mysql
  • Habilitamos UTF-8
nano /etc/apache2/conf-available/charset.conf
#Descomentamos
AddDefaultCharset UTF-8
  • Como las conferencias pueden pesar bastante es necesario modificar el archivo php.ini para que de soporte a la descarga de archivos grandes, abrimos el archivo
nano /etc/php/7.0/apache2/php.ini
  • Modificamos los siguientes valores
max_execution_time = 30
X
max_execution_time = 300000

memory_limit = 128M
X
memory_limit = 1024M
  • Instalamos módulos
a2enmod ssl
a2enmod headers
service apache2 restart
  • Ahora creamos las carpetas para almacenar los certificados
mkdir -p /etc/apache2/certificados/jibri.siua.ac.cr
  • Ahora pasamos del proxy los certificados
scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/fullchain.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem
scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/privkey.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/privkey.pem
  • ahora seguimos la guia para crear un dominio con letsencrypt y proxy- reverso y creamos los hvost
nano /etc/apache2/sites-available/jibri.siua.ac.cr.conf
  • Contenido
<VirtualHost *:80>

    #************************************************************************
    #******************* DATOS DEL SITIO WEB ********************************
    #************************************************************************
    ServerName jibri.siua.ac.cr
    ServerAlias www.jibri.siua.ac.cr
    ErrorLog /var/log/apache2/jibri_80.siua.ac.cr-error.log
    CustomLog /var/log/apache2/jibri_80.siua.ac.cr-access.log common

    #************************************************************************
    #********************** DATOS DEL WEBMASTER *****************************
    #************************************************************************
    ServerAdmin interuniversitariadealajuela@gmail.com
    Header add Author "Unidad de Gestion e Innovacion Tecnologica"

    #************************************************************************
    #********************* DATOS DEL REDIRECIONAMIENTO **********************
    #************************************************************************
    RedirectMatch permanent ^/(.*) https://jibri.siua.ac.cr/$1


    #************************************************************************
    #************************* DATOS DEL SITIO WEB **************************
    #************************************************************************
    DocumentRoot /var/www/html/

</VirtualHost>
  • Luego el ssl
nano /etc/apache2/sites-available/jibri.siua.ac.cr-le-ssl.conf
  • Contenido
 scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/fullchain.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/fullchain.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/fullchain.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem<IfModule mod_ssl.c>

   #************************************************************************
   #HTTPS://www.jibri.siua.ac.cr
   #************************************************************************
   <VirtualHost *:443>
        ServerName www.jibri.siua.ac.cr
        RedirectMatch permanent ^/(.*) https://jibri.siua.ac.cr/$1
        #************************************************************************
        #*************************** DATOS DEL CERTIFICADO **********************
        #************************************************************************
        SSLEngine on
        SSLCertificateFile /etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem
        SSLCertificateKeyFile /etc/apache2/certificados/jibri.siua.ac.cr/privkey.pem
   </VirtualHost>

   #************************************************************************
   #HTTPS://jibri.siua.ac.cr
   #************************************************************************
   <VirtualHost *:443>

        #************************************************************************
        #******************* DATOS DEL SITIO WEB ********************************
        #************************************************************************
        ServerName jibri.siua.ac.cr
        ErrorLog /var/log/apache2/jibri_443.siua.ac.cr-error.log
        CustomLog /var/log/apache2/jibri_443.siua.ac.cr-access.log common

        #************************************************************************
        #********************** DATOS DEL WEBMASTER *****************************
        #************************************************************************
        ServerAdmin interuniversitariadealajuela@gmail.com
        Header add Author "Unidad de Gestion e Innovacion Tecnologica"


        #************************************************************************
        #************************** DATOS DEL CERTIFICADO ***********************
        #************************************************************************
        SSLEngine on
        SSLCertificateFile /etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem
        SSLCertificateKeyFile /etc/apache2/certificados/jibri.siua.ac.cr/privkey.pem

        #************************************************************************
        #************************** DATOS DEL SITIO WEB *************************
        #************************************************************************
        DocumentRoot /var/www/html/conferencias/conferencias

	<Directory "/var/www/html/conferencias">
	  Options Indexes SymLinksIfOwnerMatch FollowSymLinks 
        </Directory>
  </VirtualHost>
</IfModule>
  • Activamos los sitios
a2ensite jibri.siua.ac.cr.conf
a2ensite jibri.siua.ac.cr-le-ssl.conf
service apache2 reload
  • Creamos la carpeta
mkdir /var/www/html/conferencias
  • Luego creamos un enlace simbolico a /srv/recordings dentro de conferencias
ln -s /srv/recordings/ /var/www/html/conferencias/conferencias
  • Ingresamos al directorio
cd /var/www/html/conferencias/
  • cambiamos el usuario del enlace
chown -R jibri:www-data conferencias
  • Finalmente conamos el proyecto y lo pegamos dentro de /var/www/html/conferencias/conferencias
cd /var/www/html/conferencias/conferencias
git clone https://git.siua.ac.cr/siua/jibri.siua.ac.cr.git
  • Luego hacemos que los archivos de jibri.siua.ac.cr esten directamente dentro de
cd jibri.siua.ac.cr
cp -R * /var/www/html/conferencias/conferencias
cd ..
rm -R jibri.siua.ac.cr/

Servidor Jitsi-meet

  • Ahora vamos a configurar jitsi-meet para soportar jibri
  • Abrimos el archivo
nano /etc/prosody/conf.d/conferencias.siua.ac.cr.cfg.lua
  • Verificamos que estos 2 esten así
cross_domain_bosh = false;
consider_bosh_secure = true;
  • Después de «consider_bosh_secure = true;», agregamos (ESTO LO QUITE PARA PROBAR SI ES NECESARIO)
bosh_ports = {
                 {
                    port = 5280;
                    path = "http-bind";
                 },
                 {
                    port = 5281;
                    path = "http-bind";
                    ssl = {
    				certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
    				key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
                          }
                 }
              }

http_ports = { 5280 }
http_interfaces = { "localhost" }
 
https_ports = { 5281 }
https_interfaces = { "localhost" }

https_ssl = {
    certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
    key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
}
  • Agregamos el siguiente codigo al final (cambiar el dominio)
-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.conferencias.siua.ac.cr" "muc"
    modules_enabled = {
      "ping";
    }
    storage = "internal"
    muc_room_cache_size = 1000

VirtualHost "recorder.conferencias.siua.ac.cr"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"
  • ARCHIVO QUEDANDO ASÍ:
plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "conferencias.siua.ac.cr";

turncredentials_secret = "xxxxxxxxxxxxxxxxxxxxDymaBxlWNdbcoB0dDymaBxlWNdbcoB0dDymaBxlWNdbcoB0dDymaBxlWNdbcoB0d";

turncredentials = {
  { type = "stun", host = "conferencias.siua.ac.cr", port = "3478" },
  { type = "turn", host = "conferencias.siua.ac.cr", port = "3478", transport = "udp" },
  { type = "turns", host = "conferencias.siua.ac.cr", port = "443", transport = "tcp" }
};

cross_domain_bosh = false;
consider_bosh_secure = true;

bosh_ports = {
                 {
                    port = 5280;
                    path = "http-bind";
                 },
                 {
                    port = 5281;
                    path = "http-bind";
                    ssl = {
    				certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
    				key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
                          }
                 }
              }

http_ports = { 5280 }
http_interfaces = { "localhost" }
 
https_ports = { 5281 }
https_interfaces = { "localhost" }

https_ssl = {
    certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
    key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
}
-- https_ports = { }; -- Remove this line to prevent listening on port 5284

-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
  protocol = "tlsv1_2+";
  ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}

VirtualHost "conferencias.siua.ac.cr"
        -- enabled = false -- Remove this line to enable this host
        authentication = "anonymous"
        -- Properties below are modified by jitsi-meet-tokens package config
        -- and authentication above is switched to "token"
        --app_id="example_app_id"
        --app_secret="example_app_secret"
        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
                certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
        }
        speakerstats_component = "speakerstats.conferencias.siua.ac.cr"
        conference_duration_component = "conferenceduration.conferencias.siua.ac.cr"
        -- we need bosh
        modules_enabled = {
            "bosh";
            "pubsub";
            "ping"; -- Enable mod_ping
            "speakerstats";
            "turncredentials";
            "conference_duration";
            "muc_lobby_rooms";
        }
        c2s_require_encryption = false
        lobby_muc = "lobby.conferencias.siua.ac.cr"
        main_muc = "conference.conferencias.siua.ac.cr"
        -- muc_lobby_whitelist = { "recorder.conferencias.siua.ac.cr" } -- Here we can whitelist jibri to enter lobby enabled rooms


Component "conference.conferencias.siua.ac.cr" "muc"
    storage = "none"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        -- "token_verification";
    }
    admins = { "focus@auth.conferencias.siua.ac.cr" }
    muc_room_locking = false
    muc_room_default_public_jids = true

-- internal muc component
Component "internal.auth.conferencias.siua.ac.cr" "muc"
    storage = "none"
    modules_enabled = {
      "ping";
    }
    admins = { "focus@auth.conferencias.siua.ac.cr", "jvb@auth.conferencias.siua.ac.cr" }
    muc_room_locking = false
    muc_room_default_public_jids = true

VirtualHost "auth.conferencias.siua.ac.cr"
    ssl = {
        key = "/etc/prosody/certs/auth.conferencias.siua.ac.cr.key";
        certificate = "/etc/prosody/certs/auth.conferencias.siua.ac.cr.crt";
    }
    authentication = "internal_plain"

Component "focus.conferencias.siua.ac.cr"
    component_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Component "speakerstats.conferencias.siua.ac.cr" "speakerstats_component"
    muc_component = "conference.conferencias.siua.ac.cr"

Component "conferenceduration.conferencias.siua.ac.cr" "conference_duration_component"
    muc_component = "conference.conferencias.siua.ac.cr"

Component "lobby.conferencias.siua.ac.cr" "muc"
    storage = "none"
    restrict_room_creation = true
    muc_room_locking = false
    muc_room_default_public_jids = true

-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.conferencias.siua.ac.cr" "muc"
    modules_enabled = {
      "ping";
    }
    storage = "internal"
    muc_room_cache_size = 1000

VirtualHost "recorder.conferencias.siua.ac.cr"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"


  • Recagargamos
/etc/init.d/prosody reload
  • Ahora cremos las cuentas que jibri utilizará
prosodyctl register jibri auth.conferencias.siua.ac.cr AC2
prosodyctl register recorder recorder.conferencias.siua.ac.cr AC2
  • La primera cuenta es la que Jibri usará para iniciar sesión en el MUC de control (donde Jibri enviará su estado y esperará comandos). La segunda cuenta es la que Jibri usará como cliente en selenio cuando se una a la llamada para que pueda ser tratada de manera especial por la interfaz de usuario web de Jitsi Meet.
  • Podemos ver los usuarios creados para auth y recorder en
cd /var/lib/prosody/auth%2econferencias%2esiua%2eac%2ecr/accounts/
cd /var/lib/prosody/recorder%2econferencias%2esiua%2eac%2ecr/
  • Ahora editamos
nano /etc/jitsi/jicofo/sip-communicator.properties
  • Agregamos al final
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.conferencias.siua.ac.cr
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
org.jitsi.jicofo.HEALTH_CHECK_INTERVAL=-1
  • ARCHIVO QUEDANDO ASÍ:
org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.conferencias.siua.ac.cr

org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.conferencias.siua.ac.cr
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=120
  • Reiniciamos
/etc/init.d/jicofo restart
  • Ahora modificamos el archivo
nano /etc/jitsi/meet/conferencias.siua.ac.cr-config.js
  • Descomentamos y modificamos
// fileRecordingsEnabled: false,
X
fileRecordingsEnabled: true,


// liveStreamingEnabled: false,
X
liveStreamingEnabled: true,

//enableNoisyMicDetection: true,
X
enableNoisyMicDetection: false,
  • Agregamos
hiddenDomain: 'recorder.conferencias.siua.ac.cr',
  • ARCHIVO QUEDANDO ASÍ
/* eslint-disable no-unused-vars, no-var */

var config = {
    // Connection
    //

    hosts: {
        // XMPP domain.
        domain: 'conferencias.siua.ac.cr',

        // When using authentication, domain for guest users.
        // anonymousdomain: 'guest.example.com',

        // Domain for authenticated users. Defaults to <domain>.
        // authdomain: 'conferencias.siua.ac.cr',

        // Jirecon recording component domain.
        // jirecon: 'jirecon.conferencias.siua.ac.cr',

        // Call control component (Jigasi).
        // call_control: 'callcontrol.conferencias.siua.ac.cr',

        // Focus component domain. Defaults to focus.<domain>.
        // focus: 'focus.conferencias.siua.ac.cr',

        // XMPP MUC domain. FIXME: use XEP-0030 to discover it.
        muc: 'conference.<!--# echo var="subdomain" default="" -->conferencias.siua.ac.cr'
    },

    // BOSH URL. FIXME: use XEP-0156 to discover it.
    bosh: '//conferencias.siua.ac.cr/http-bind',

    // Websocket URL
    // websocket: 'wss://conferencias.siua.ac.cr/xmpp-websocket',

    // The name of client node advertised in XEP-0115 'c' stanza
    clientNode: 'http://jitsi.org/jitsimeet',

    // The real JID of focus participant - can be overridden here
    // focusUserJid: 'focus@auth.conferencias.siua.ac.cr',


    // Testing / experimental features.
    //

    testing: {
        // Disables the End to End Encryption feature. Useful for debugging
        // issues related to insertable streams.
        // disableE2EE: false,

        // P2P test mode disables automatic switching to P2P when there are 2
        // participants in the conference.
        p2pTestMode: false

        // Enables the test specific features consumed by jitsi-meet-torture
        // testMode: false

        // Disables the auto-play behavior of *all* newly created video element.
        // This is useful when the client runs on a host with limited resources.
        // noAutoPlayVideo: false

        // Enable / disable 500 Kbps bitrate cap on desktop tracks. When enabled,
        // simulcast is turned off for the desktop share. If presenter is turned
        // on while screensharing is in progress, the max bitrate is automatically
        // adjusted to 2.5 Mbps. This takes a value between 0 and 1 which determines
        // the probability for this to be enabled.
        // capScreenshareBitrate: 1 // 0 to disable
    },

    // Disables ICE/UDP by filtering out local and remote UDP candidates in
    // signalling.
    // webrtcIceUdpDisable: false,

    // Disables ICE/TCP by filtering out local and remote TCP candidates in
    // signalling.
    // webrtcIceTcpDisable: false,


    // Media
    //

    // Audio

    // Disable measuring of audio levels.
    // disableAudioLevels: false,
    // audioLevelsInterval: 200,

    // Enabling this will run the lib-jitsi-meet no audio detection module which
    // will notify the user if the current selected microphone has no audio
    // input and will suggest another valid device if one is present.
    enableNoAudioDetection: true,

    // Enabling this will run the lib-jitsi-meet noise detection module which will
    // notify the user if there is noise, other than voice, coming from the current
    // selected microphone. The purpose it to let the user know that the input could
    // be potentially unpleasant for other meeting participants.
    enableNoisyMicDetection: false,

    // Start the conference in audio only mode (no video is being received nor
    // sent).
    // startAudioOnly: false,

    // Every participant after the Nth will start audio muted.
    // startAudioMuted: 10,

    // Start calls with audio muted. Unlike the option above, this one is only
    // applied locally. FIXME: having these 2 options is confusing.
    // startWithAudioMuted: false,

    // Enabling it (with #params) will disable local audio output of remote
    // participants and to enable it back a reload is needed.
    // startSilent: false

    // Sets the preferred target bitrate for the Opus audio codec by setting its
    // 'maxaveragebitrate' parameter. Currently not available in p2p mode.
    // Valid values are in the range 6000 to 510000
    // opusMaxAvgBitrate: 20000,

    // Video

    // Sets the preferred resolution (height) for local video. Defaults to 720.
    // resolution: 720,

    // w3c spec-compliant video constraints to use for video capture. Currently
    // used by browsers that return true from lib-jitsi-meet's
    // util#browser#usesNewGumFlow. The constraints are independent from
    // this config's resolution value. Defaults to requesting an ideal
    // resolution of 720p.
    // constraints: {
    //     video: {
    //         height: {
    //             ideal: 720,
    //             max: 720,
    //             min: 240
    //         }
    //     }
    // },

    // Enable / disable simulcast support.
    // disableSimulcast: false,

    // Enable / disable layer suspension.  If enabled, endpoints whose HD
    // layers are not in use will be suspended (no longer sent) until they
    // are requested again.
    // enableLayerSuspension: false,

    // Every participant after the Nth will start video muted.
    // startVideoMuted: 10,

    // Start calls with video muted. Unlike the option above, this one is only
    // applied locally. FIXME: having these 2 options is confusing.
    // startWithVideoMuted: false,

    // If set to true, prefer to use the H.264 video codec (if supported).
    // Note that it's not recommended to do this because simulcast is not
    // supported when  using H.264. For 1-to-1 calls this setting is enabled by
    // default and can be toggled in the p2p section.
    // preferH264: true,

    // If set to true, disable H.264 video codec by stripping it out of the
    // SDP.
    // disableH264: false,

    // Desktop sharing

    // Optional desktop sharing frame rate options. Default value: min:5, max:5.
    // desktopSharingFrameRate: {
    //     min: 5,
    //     max: 5
    // },

    // Try to start calls with screen-sharing instead of camera video.
    // startScreenSharing: false,

    // Recording

    // Whether to enable file recording or not.
    fileRecordingsEnabled: true,
    // Enable the dropbox integration.
    // dropbox: {
    //     appKey: '<APP_KEY>' // Specify your app key here.
    //     // A URL to redirect the user to, after authenticating
    //     // by default uses:
    //     // 'https://conferencias.siua.ac.cr/static/oauth.html'
    //     redirectURI:
    //          'https://conferencias.siua.ac.cr/subfolder/static/oauth.html'
    // },
    // When integrations like dropbox are enabled only that will be shown,
    // by enabling fileRecordingsServiceEnabled, we show both the integrations
    // and the generic recording service (its configuration and storage type
    // depends on jibri configuration)
    // fileRecordingsServiceEnabled: false,
    // Whether to show the possibility to share file recording with other people
    // (e.g. meeting participants), based on the actual implementation
    // on the backend.
    // fileRecordingsServiceSharingEnabled: false,

    // Whether to enable live streaming or not.
    liveStreamingEnabled: true,

    // Transcription (in interface_config,
    // subtitles and buttons can be configured)
    // transcribingEnabled: false,

    // Enables automatic turning on captions when recording is started
    // autoCaptionOnRecord: false,

    // Misc

    // Default value for the channel "last N" attribute. -1 for unlimited.
    channelLastN: -1,

    // // Options for the recording limit notification.
    // recordingLimit: {
    //
    //    // The recording limit in minutes. Note: This number appears in the notification text
    //    // but doesn't enforce the actual recording time limit. This should be configured in
    //    // jibri!
    //    limit: 60,
    //
    //    // The name of the app with unlimited recordings.
    //    appName: 'Unlimited recordings APP',
    //
    //    // The URL of the app with unlimited recordings.
    //    appURL: 'https://unlimited.recordings.app.com/'
    // },

    // Disables or enables RTX (RFC 4588) (defaults to false).
    // disableRtx: false,

    // Disables or enables TCC (the default is in Jicofo and set to true)
    // (draft-holmer-rmcat-transport-wide-cc-extensions-01). This setting
    // affects congestion control, it practically enables send-side bandwidth
    // estimations.
    // enableTcc: true,

    // Disables or enables REMB (the default is in Jicofo and set to false)
    // (draft-alvestrand-rmcat-remb-03). This setting affects congestion
    // control, it practically enables recv-side bandwidth estimations. When
    // both TCC and REMB are enabled, TCC takes precedence. When both are
    // disabled, then bandwidth estimations are disabled.
    // enableRemb: false,

    // Enables ICE restart logic in LJM and displays the page reload overlay on
    // ICE failure. Current disabled by default because it's causing issues with
    // signaling when Octo is enabled. Also when we do an "ICE restart"(which is
    // not a real ICE restart), the client maintains the TCC sequence number
    // counter, but the bridge resets it. The bridge sends media packets with
    // TCC sequence numbers starting from 0.
    // enableIceRestart: false,

    // Defines the minimum number of participants to start a call (the default
    // is set in Jicofo and set to 2).
    // minParticipants: 2,

    // Use the TURN servers discovered via XEP-0215 for the jitsi-videobridge
    // connection
    useStunTurn: true,

    // Use TURN/UDP servers for the jitsi-videobridge connection (by default
    // we filter out TURN/UDP because it is usually not needed since the
    // bridge itself is reachable via UDP)
    // useTurnUdp: false

    // Enables / disables a data communication channel with the Videobridge.
    // Values can be 'datachannel', 'websocket', true (treat it as
    // 'datachannel'), undefined (treat it as 'datachannel') and false (don't
    // open any channel).
    // openBridgeChannel: true,


    // UI
    //

    // Require users to always specify a display name.
    // requireDisplayName: true,

    // Whether to use a welcome page or not. In case it's false a random room
    // will be joined when no room is specified.
    enableWelcomePage: true,

    // Enabling the close page will ignore the welcome page redirection when
    // a call is hangup.
    // enableClosePage: false,

    // Disable hiding of remote thumbnails when in a 1-on-1 conference call.
    // disable1On1Mode: false,

    // Default language for the user interface.
    // defaultLanguage: 'en',

    // If true all users without a token will be considered guests and all users
    // with token will be considered non-guests. Only guests will be allowed to
    // edit their profile.
    enableUserRolesBasedOnToken: false,

    // Whether or not some features are checked based on token.
    // enableFeaturesBasedOnToken: false,

    // Enable lock room for all moderators, even when userRolesBasedOnToken is enabled and participants are guests.
    // lockRoomGuestEnabled: false,

    // When enabled the password used for locking a room is restricted to up to the number of digits specified
    // roomPasswordNumberOfDigits: 10,
    // default: roomPasswordNumberOfDigits: false,

    // Message to show the users. Example: 'The service will be down for
    // maintenance at 01:00 AM GMT,
    // noticeMessage: '',

    // Enables calendar integration, depends on googleApiApplicationClientID
    // and microsoftApiApplicationClientID
    // enableCalendarIntegration: false,

    // When 'true', it shows an intermediate page before joining, where the user can configure their devices.
    // prejoinPageEnabled: false,

    // If true, shows the unsafe room name warning label when a room name is
    // deemed unsafe (due to the simplicity in the name) and a password is not
    // set or the lobby is not enabled.
    // enableInsecureRoomNameWarning: false,

    // Stats
    //

    // Whether to enable stats collection or not in the TraceablePeerConnection.
    // This can be useful for debugging purposes (post-processing/analysis of
    // the webrtc stats) as it is done in the jitsi-meet-torture bandwidth
    // estimation tests.
    // gatherStats: false,

    // The interval at which PeerConnection.getStats() is called. Defaults to 10000
    // pcStatsInterval: 10000,

    // To enable sending statistics to callstats.io you must provide the
    // Application ID and Secret.
    // callStatsID: '',
    // callStatsSecret: '',

    // Enables sending participants' display names to callstats
    // enableDisplayNameInStats: false,

    // Enables sending participants' emails (if available) to callstats and other analytics
    // enableEmailInStats: false,

    // Privacy
    //

    // If third party requests are disabled, no other server will be contacted.
    // This means avatars will be locally generated and callstats integration
    // will not function.
    // disableThirdPartyRequests: false,


    // Peer-To-Peer mode: used (if enabled) when there are just 2 participants.
    //

    p2p: {
        // Enables peer to peer mode. When enabled the system will try to
        // establish a direct connection when there are exactly 2 participants
        // in the room. If that succeeds the conference will stop sending data
        // through the JVB and use the peer to peer connection instead. When a
        // 3rd participant joins the conference will be moved back to the JVB
        // connection.
        enabled: true,

        // Use XEP-0215 to fetch STUN and TURN servers.
        useStunTurn: true,

        // The STUN servers that will be used in the peer to peer connections
        stunServers: [

            // { urls: 'stun:conferencias.siua.ac.cr:3478' },
            { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
        ]

        // Sets the ICE transport policy for the p2p connection. At the time
        // of this writing the list of possible values are 'all' and 'relay',
        // but that is subject to change in the future. The enum is defined in
        // the WebRTC standard:
        // https://www.w3.org/TR/webrtc/#rtcicetransportpolicy-enum.
        // If not set, the effective value is 'all'.
        // iceTransportPolicy: 'all',

        // If set to true, it will prefer to use H.264 for P2P calls (if H.264
        // is supported).
        // preferH264: true

        // If set to true, disable H.264 video codec by stripping it out of the
        // SDP.
        // disableH264: false,

        // How long we're going to wait, before going back to P2P after the 3rd
        // participant has left the conference (to filter out page reload).
        // backToP2PDelay: 5
    },

    analytics: {
        // The Google Analytics Tracking ID:
        // googleAnalyticsTrackingId: 'your-tracking-id-UA-123456-1'

        // Matomo configuration:
        // matomoEndpoint: 'https://your-matomo-endpoint/',
        // matomoSiteID: '42',

        // The Amplitude APP Key:
        // amplitudeAPPKey: '<APP_KEY>'

        // Configuration for the rtcstats server:
        // In order to enable rtcstats one needs to provide a endpoint url.
        // rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,

        // The interval at which rtcstats will poll getStats, defaults to 1000ms.
        // If the value is set to 0 getStats won't be polled and the rtcstats client
        // will only send data related to RTCPeerConnection events.
        // rtcstatsPolIInterval: 1000

        // Array of script URLs to load as lib-jitsi-meet "analytics handlers".
        // scriptURLs: [
        //      "libs/analytics-ga.min.js", // google-analytics
        //      "https://example.com/my-custom-analytics.js"
        // ],
    },

    // Information about the jitsi-meet instance we are connecting to, including
    // the user region as seen by the server.
    deploymentInfo: {
        // shard: "shard1",
        // region: "europe",
        // userRegion: "asia"
    },

    // Decides whether the start/stop recording audio notifications should play on record.
    // disableRecordAudioNotification: false,

    // Information for the chrome extension banner
    // chromeExtensionBanner: {
    //     // The chrome extension to be installed address
    //     url: 'https://chrome.google.com/webstore/detail/jitsi-meetings/kglhbbefdnlheedjiejgomgmfplipfeb',

    //     // Extensions info which allows checking if they are installed or not
    //     chromeExtensionsInfo: [
    //         {
    //             id: 'kglhbbefdnlheedjiejgomgmfplipfeb',
    //             path: 'jitsi-logo-48x48.png'
    //         }
    //     ]
    // },

    // Local Recording
    //

    // localRecording: {
    // Enables local recording.
    // Additionally, 'localrecording' (all lowercase) needs to be added to
    // TOOLBAR_BUTTONS in interface_config.js for the Local Recording
    // button to show up on the toolbar.
    //
    //     enabled: true,
    //

    // The recording format, can be one of 'ogg', 'flac' or 'wav'.
    //     format: 'flac'
    //

    // },

    // Options related to end-to-end (participant to participant) ping.
    // e2eping: {
    //   // The interval in milliseconds at which pings will be sent.
    //   // Defaults to 10000, set to <= 0 to disable.
    //   pingInterval: 10000,
    //
    //   // The interval in milliseconds at which analytics events
    //   // with the measured RTT will be sent. Defaults to 60000, set
    //   // to <= 0 to disable.
    //   analyticsInterval: 60000,
    //   },

    // If set, will attempt to use the provided video input device label when
    // triggering a screenshare, instead of proceeding through the normal flow
    // for obtaining a desktop stream.
    // NOTE: This option is experimental and is currently intended for internal
    // use only.
    // _desktopSharingSourceDevice: 'sample-id-or-label',

    // If true, any checks to handoff to another application will be prevented
    // and instead the app will continue to display in the current browser.
    // disableDeepLinking: false,

    // A property to disable the right click context menu for localVideo
    // the menu has option to flip the locally seen video for local presentations
    // disableLocalVideoFlip: false,

    // Mainly privacy related settings

    // Disables all invite functions from the app (share, invite, dial out...etc)
    // disableInviteFunctions: true,

    // Disables storing the room name to the recents list
    // doNotStoreRoom: true,

    // Deployment specific URLs.
    // deploymentUrls: {
    //    // If specified a 'Help' button will be displayed in the overflow menu with a link to the specified URL for
    //    // user documentation.
    //    userDocumentationURL: 'https://docs.example.com/video-meetings.html',
    //    // If specified a 'Download our apps' button will be displayed in the overflow menu with a link
    //    // to the specified URL for an app download page.
    //    downloadAppsUrl: 'https://docs.example.com/our-apps.html'
    // },

    // Options related to the remote participant menu.
    // remoteVideoMenu: {
    //     // If set to true the 'Kick out' button will be disabled.
    //     disableKick: true
    // },

    // If set to true all muting operations of remote participants will be disabled.
    // disableRemoteMute: true,

    /**
     External API url used to receive branding specific information.
     If there is no url set or there are missing fields, the defaults are applied.
     None of the fields are mandatory and the response must have the shape:
     {
         // The hex value for the colour used as background
         backgroundColor: '#fff',
         // The url for the image used as background
         backgroundImageUrl: 'https://example.com/background-img.png',
         // The anchor url used when clicking the logo image
         logoClickUrl: 'https://example-company.org',
         // The url used for the image used as logo
         logoImageUrl: 'https://example.com/logo-img.png'
     }
    */
    // brandingDataUrl: '',

    // The URL of the moderated rooms microservice, if available. If it
    // is present, a link to the service will be rendered on the welcome page,
    // otherwise the app doesn't render it.
    // moderatedRoomServiceUrl: 'https://moderated.conferencias.siua.ac.cr',

    // List of undocumented settings used in jitsi-meet
    /**
     _immediateReloadThreshold
     autoRecord
     autoRecordToken
     debug
     debugAudioLevels
     deploymentInfo
     dialInConfCodeUrl
     dialInNumbersUrl
     dialOutAuthUrl
     dialOutCodesUrl
     disableRemoteControl
     displayJids
     etherpad_base
     externalConnectUrl
     firefox_fake_device
     googleApiApplicationClientID
     iAmRecorder
     iAmSipGateway
     microsoftApiApplicationClientID
     peopleSearchQueryTypes
     peopleSearchUrl
     requireDisplayName
     tokenAuthUrl
     */

    // List of undocumented settings used in lib-jitsi-meet
    /**
     _peerConnStatusOutOfLastNTimeout
     _peerConnStatusRtcMuteTimeout
     abTesting
     avgRtpStatsN
     callStatsConfIDNamespace
     callStatsCustomScriptUrl
     desktopSharingSources
     disableAEC
     disableAGC
     disableAP
     disableHPF
     disableNS
     enableLipSync
     enableTalkWhileMuted
     forceJVB121Ratio
     hiddenDomain
     ignoreStartMuted
     nick
     startBitrate
     */

    hiddenDomain: 'recorder.conferencias.siua.ac.cr',

    // Allow all above example options to include a trailing comma and
    // prevent fear when commenting out the last value.
    makeJsonParserHappy: 'even if last key had a trailing comma'

    // no configuration value should follow this line.
};

/* eslint-enable no-unused-vars, no-var */
  • Reiniciamos servicios
/etc/init.d/jicofo restart
/etc/init.d/jitsi-videobridge2 restart
/etc/init.d/prosody restart
  • Actualizamos certificados
sudo update-ca-certificates -f

Personalización

  • Para personalizar ingrese a /usr/share/jitsi-meet
cd /usr/share/jitsi-meet
  • Titulo pagina
nano /usr/share/jitsi-meet/interface_config.js
  • Cambiamos
-------------------------------------------
DEFAULT_LOCAL_DISPLAY_NAME: 'me',
X
DEFAULT_LOCAL_DISPLAY_NAME: 'Yo',
-------------------------------------------
DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster',
X
DEFAULT_REMOTE_DISPLAY_NAME: 'Nuevo Miembro',
-------------------------------------------
JITSI_WATERMARK_LINK: 'https://jitsi.org',
X
JITSI_WATERMARK_LINK: '/?p=3233',
-------------------------------------------
APP_NAME: 'Jitsi Meet',
X
APP_NAME: 'Conferencias SIUA',
-------------------------------------------
NATIVE_APP_NAME: 'Jitsi Meet',
X
NATIVE_APP_NAME: 'Conferencias SIUA',
-------------------------------------------
PROVIDER_NAME: 'Jitsi',
X
PROVIDER_NAME: 'SIUA',

-------------------------------------------
LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live',
X
LIVE_STREAMING_HELP_LINK: 'https://ugit.siua.ac.cr',
-------------------------------------------
SUPPORT_URL: 'https://community.jitsi.org/',
X
SUPPORT_URL: 'https://ugit.siua.ac.cr',
-------------------------------------------
  • ARCHIVO QUEDANDO ASÍ
/* eslint-disable no-unused-vars, no-var, max-len */
/* eslint sort-keys: ["error", "asc", {"caseSensitive": false}] */

var interfaceConfig = {
    APP_NAME: 'Conferencias SIUA',
    AUDIO_LEVEL_PRIMARY_COLOR: 'rgba(255,255,255,0.4)',
    AUDIO_LEVEL_SECONDARY_COLOR: 'rgba(255,255,255,0.2)',

    /**
     * A UX mode where the last screen share participant is automatically
     * pinned. Valid values are the string "remote-only" so remote participants
     * get pinned but not local, otherwise any truthy value for all participants,
     * and any falsy value to disable the feature.
     *
     * Note: this mode is experimental and subject to breakage.
     */
    AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only',
    BRAND_WATERMARK_LINK: '',

    CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it
    /**
     * Whether the connection indicator icon should hide itself based on
     * connection strength. If true, the connection indicator will remain
     * displayed while the participant has a weak connection and will hide
     * itself after the CONNECTION_INDICATOR_HIDE_TIMEOUT when the connection is
     * strong.
     *
     * @type {boolean}
     */
    CONNECTION_INDICATOR_AUTO_HIDE_ENABLED: true,

    /**
     * How long the connection indicator should remain displayed before hiding.
     * Used in conjunction with CONNECTION_INDICATOR_AUTOHIDE_ENABLED.
     *
     * @type {number}
     */
    CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT: 5000,

    /**
     * If true, hides the connection indicators completely.
     *
     * @type {boolean}
     */
    CONNECTION_INDICATOR_DISABLED: false,

    DEFAULT_BACKGROUND: '#474747',
    DEFAULT_LOCAL_DISPLAY_NAME: 'Yo',
    DEFAULT_LOGO_URL: 'images/watermark.png',
    DEFAULT_REMOTE_DISPLAY_NAME: 'Nuevo miembro',

    DISABLE_DOMINANT_SPEAKER_INDICATOR: false,

    DISABLE_FOCUS_INDICATOR: false,

    /**
     * If true, notifications regarding joining/leaving are no longer displayed.
     */
    DISABLE_JOIN_LEAVE_NOTIFICATIONS: false,

    /**
     * If true, presence status: busy, calling, connected etc. is not displayed.
     */
    DISABLE_PRESENCE_STATUS: false,

    /**
     * Whether the ringing sound in the call/ring overlay is disabled. If
     * {@code undefined}, defaults to {@code false}.
     *
     * @type {boolean}
     */
    DISABLE_RINGING: false,

    /**
     * Whether the speech to text transcription subtitles panel is disabled.
     * If {@code undefined}, defaults to {@code false}.
     *
     * @type {boolean}
     */
    DISABLE_TRANSCRIPTION_SUBTITLES: false,

    /**
     * Whether or not the blurred video background for large video should be
     * displayed on browsers that can support it.
     */
    DISABLE_VIDEO_BACKGROUND: false,

    DISPLAY_WELCOME_PAGE_CONTENT: true,
    DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false,

    ENABLE_DIAL_OUT: true,

    ENABLE_FEEDBACK_ANIMATION: false, // Enables feedback star animation.

    FILM_STRIP_MAX_HEIGHT: 120,

    /**
     * Whether to only show the filmstrip (and hide the toolbar).
     */
    filmStripOnly: false,

    GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,

    /**
     * Hide the invite prompt in the header when alone in the meeting.
     */
    HIDE_INVITE_MORE_HEADER: false,

    INITIAL_TOOLBAR_TIMEOUT: 20000,
    JITSI_WATERMARK_LINK: '/?p=3233',

    LANG_DETECTION: true, // Allow i18n to detect the system language
    LIVE_STREAMING_HELP_LINK: 'https://ugit.siua.ac.cr', // Documentation reference for the live streaming feature.
    LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9

    /**
     * Maximum coefficient of the ratio of the large video to the visible area
     * after the large video is scaled to fit the window.
     *
     * @type {number}
     */
    MAXIMUM_ZOOMING_COEFFICIENT: 1.3,

    /**
     * Whether the mobile app Jitsi Meet is to be promoted to participants
     * attempting to join a conference in a mobile Web browser. If
     * {@code undefined}, defaults to {@code true}.
     *
     * @type {boolean}
     */
    MOBILE_APP_PROMO: true,

    NATIVE_APP_NAME: 'Conferencias SIUA',

    // Names of browsers which should show a warning stating the current browser
    // has a suboptimal experience. Browsers which are not listed as optimal or
    // unsupported are considered suboptimal. Valid values are:
    // chrome, chromium, edge, electron, firefox, nwjs, opera, safari
    OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'nwjs', 'electron', 'safari' ],

    POLICY_LOGO: null,
    PROVIDER_NAME: 'SIUA',

    /**
     * If true, will display recent list
     *
     * @type {boolean}
     */
    RECENT_LIST_ENABLED: true,
    REMOTE_THUMBNAIL_RATIO: 1, // 1:1

    SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
    SHOW_BRAND_WATERMARK: false,

    /**
    * Decides whether the chrome extension banner should be rendered on the landing page and during the meeting.
    * If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s)
    * being already installed is done before rendering.
    */
    SHOW_CHROME_EXTENSION_BANNER: false,

    SHOW_DEEP_LINKING_IMAGE: false,
    SHOW_JITSI_WATERMARK: true,
    SHOW_POWERED_BY: false,
    SHOW_PROMOTIONAL_CLOSE_PAGE: false,
    SHOW_WATERMARK_FOR_GUESTS: true, // if watermark is disabled by default, it can be shown only for guests

    /*
     * If indicated some of the error dialogs may point to the support URL for
     * help.
     */
    SUPPORT_URL: 'https://ugit.siua.ac.cr',

    TOOLBAR_ALWAYS_VISIBLE: false,

    /**
     * The name of the toolbar buttons to display in the toolbar, including the
     * "More actions" menu. If present, the button will display. Exceptions are
     * "livestreaming" and "recording" which also require being a moderator and
     * some values in config.js to be enabled. Also, the "profile" button will
     * not display for users with a JWT.
     * Notes:
     * - it's impossible to choose which buttons go in the "More actions" menu
     * - it's impossible to control the placement of buttons
     * - 'desktop' controls the "Share your screen" button
     */
    TOOLBAR_BUTTONS: [
        'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen',
        'fodeviceselection', 'hangup', 'profile', 'chat', 'recording',
        'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
        'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
        'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone', 'security'
    ],

    TOOLBAR_TIMEOUT: 4000,

    // Browsers, in addition to those which do not fully support WebRTC, that
    // are not supported and should show the unsupported browser page.
    UNSUPPORTED_BROWSERS: [],

    /**
     * Whether to show thumbnails in filmstrip as a column instead of as a row.
     */
    VERTICAL_FILMSTRIP: true,

    // Determines how the video would fit the screen. 'both' would fit the whole
    // screen, 'height' would fit the original video height to the height of the
    // screen, 'width' would fit the original video width to the width of the
    // screen respecting ratio.
    VIDEO_LAYOUT_FIT: 'both',

    /**
     * If true, hides the video quality label indicating the resolution status
     * of the current large video.
     *
     * @type {boolean}
     */
    VIDEO_QUALITY_LABEL_DISABLED: false,

    /**
     * When enabled, the kick participant button will not be presented for users without a JWT
     */
    // HIDE_KICK_BUTTON_FOR_GUESTS: false,

    /**
     * How many columns the tile view can expand to. The respected range is
     * between 1 and 5.
     */
    // TILE_VIEW_MAX_COLUMNS: 5,

    /**
     * Specify custom URL for downloading android mobile app.
     */
    // MOBILE_DOWNLOAD_LINK_ANDROID: 'https://play.google.com/store/apps/details?id=org.jitsi.meet',

    /**
     * Specify URL for downloading ios mobile app.
     */
    // MOBILE_DOWNLOAD_LINK_IOS: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905',

    /**
     * Specify Firebase dynamic link properties for the mobile apps.
     */
    // MOBILE_DYNAMIC_LINK: {
    //    APN: 'org.jitsi.meet',
    //    APP_CODE: 'w2atb',
    //    CUSTOM_DOMAIN: undefined,
    //    IBI: 'com.atlassian.JitsiMeet.ios',
    //    ISI: '1165103905'
    // },

    /**
     * Specify mobile app scheme for opening the app from the mobile browser.
     */
    // APP_SCHEME: 'org.jitsi.meet',

    /**
     * Specify the Android app package name.
     */
    // ANDROID_APP_PACKAGE: 'org.jitsi.meet',

    /**
     * Override the behavior of some notifications to remain displayed until
     * explicitly dismissed through a user action. The value is how long, in
     * milliseconds, those notifications should remain displayed.
     */
    // ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000,

    // List of undocumented settings
    /**
     INDICATOR_FONT_SIZES
     PHONE_NUMBER_REGEX
    */

    // Allow all above example options to include a trailing comma and
    // prevent fear when commenting out the last value.
    // eslint-disable-next-line sort-keys
    makeJsonParserHappy: 'even if last key had a trailing comma'

    // No configuration value should follow this line.
};

/* eslint-enable no-unused-vars, no-var, max-len */
  • para modificar lso texto
nano /usr/share/jitsi-meet/lang/main-es.json
  • Modificamos
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas"
X
"title": "Bienvenido, Conferencias SIUA"

-----------------------------------------------------
"appDescription": "Adelante, video chat con todo el equipo. De hecho, invita a todos los que conozcas. {{app}} es una solución de videoconferencia de código abierto de 100%, totalmente encriptada, que puede usar todo el día, todos los días, de forma gratuita, sin necesidad de contar con ninguna cuenta.",
X
"appDescription": "La Sede Interuniversitaria de Alajuela (SIUA) le da la bienvenida. El sistema '{{app}}'  es una solución de videoconferencias disponible para la comunidad universitaria de la SIUA. Para crear o unirse a una conferencia, simplemente digite el nombre de la conferencia, si esta existe, se unirá o en caso contrario se creará. Se le recomienda establecer una contraseña para la conferencia y compartirla con sus usuarios, de otra forma cualquier persona se podrá unir. Para descargar la conferencia ingrese a https://jibri.siua.ac.cr",


-----------------------------------------------------
"enterRoomTitle": "Comenzar una reunión",
X
"enterRoomTitle": "Crear o unirse a una conferencia",

-----------------------------------------------------
"setDisplayNameLabel": "Establecer nombre a mostrar",
X
"setDisplayNameLabel": "Digite su nombre",
-----------------------------------------------------
"setEmailInput": "Introducir e-mail",
X
"setEmailInput": "Digite su e-mail",
-----------------------------------------------------
"setEmailLabel": "Establecer su gravatar",
X
"setEmailLabel": "Digite su e-mail",
  • ARCHIVO QUEDANDO ASÍ:
{
    "addPeople": {
        "add": "Invitar",
        "addContacts": "Invitar a sus contactos",
        "copyInvite": "Copiar la invitación a la reunión",
        "copyLink": "Copiar el link de la reunión",
        "copyStream": "Copiar el link de la transmisión en vivo",
        "countryNotSupported": "Aun no contamos con soporte a este destino.",
        "countryReminder": "¿Llamando fuera de los Estados Unidos? ¡Por favor, asegúrese de empezar con el código de país!",
        "defaultEmail": "Dirección de correo por defecto",
        "disabled": "No puede invitar a otras personas.",
        "failedToAdd": "Error al agregar participantes",
        "footerText": "La marcación está desactivada.",
        "googleEmail": "Correo electrónico de Google",
        "inviteMoreHeader": "Usted se encuentra solo en la reunión",
        "inviteMoreMailSubject": "Unirse a la reunion {{appName}}",
        "inviteMorePrompt": "Invitar a más personas",
        "linkCopied": "Link copiado al portapapeles",
        "loading": "Buscando por contacto y número telefónico",
        "loadingNumber": "Validando el número telefónico",
        "loadingPeople": "Buscando contactos a invitar",        
        "noResults": "No se encontraron coincidencias",
        "noValidNumbers": "Por favor ingrese un número de teléfono",
        "outlookEmail": "Correo de Outlook",
        "searchNumbers": "Agregar números telefónicos",
        "searchPeople": "Búscar personas",
        "searchPeopleAndNumbers": "Buscar personas o añadir sus números de teléfono",
        "shareInvite": "Compartir la invitación a la reunión",
        "shareLink": "Compartir el link de la reunion",
        "shareStream": "Compartie el link de la transmición en vivo",
        "telephone": "Teléfono: {{number}}",
        "title": "Invitar a otras personas a esta reunión",
        "yahooEmail": "Correo de Yahoo"
    },
    "audioDevices": {
        "bluetooth": "Bluetooth",
        "headphones": "Auriculares",
        "phone": "Teléfono",
        "speaker": "Altavoz",
        "none": "No hay dispositivos de audio disponibles"
    },
    "audioOnly": {
        "audioOnly": "Bajo consumo de Ancho de Banda"
    },
    "calendarSync": {
        "addMeetingURL": "Agregar un vínculo a la reunión",
        "confirmAddLink": "¿Quiere añadir un enlace de Jitsi a este evento?",
        "error": {
            "appConfiguration": "La integración del calendario no está configurada correctamente",
            "generic": "Se ha producido un error. Compruebe la configuración del calendario o pruebe cargarlo nuevamente.",
            "notSignedIn": "Se ha producido un error de autenticación para ver los eventos del calendario. Compruebe la configuración del calendario e intente iniciar sesión de nuevo"
        },
        "join": "Unirse",
        "joinTooltip": "Unirse a la reunión",
        "nextMeeting": "próxima reunión",
        "noEvents": "No hay eventos próximos programados.",
        "ongoingMeeting": "reunión en curso",
        "permissionButton": "Abrir ajustes",
        "permissionMessage": "Los permisos al calendario son necesarios para ver sus reuniones en la aplicación.",
        "refresh": "Actualizar calendario",
        "today": "Hoy"
    },
    "chat": {
        "error": "Error: su mensaje no se envío. Motivo: {{error}}",
        "fieldPlaceHolder": "Escriba su mensaje aquí",
        "messagebox": "Escriba un mensaje",
        "messageTo": "Mensaje privado para {{recipient}}",
        "noMessagesMessage": "No hay mensajes en la reunión. ¡Inicie una conversación!",
        "nickname": {
            "popover": "Seleccione un apodo",
            "title": "Introduzca un apodo para usar el chat"
        },
        "privateNotice": "Mensaje privado para {{recipient}}",
        "title": "Chat",
        "you": "usted"
    },
    "chromeExtensionBanner": {
        "installExtensionText": "Instalar la extensión para Google Calendar y la integración con Office 365",
        "buttonText": "Instalar extensión de Chrome",
        "dontShowAgain": "No mostrar nuevamente"
    },
    "connectingOverlay": {
        "joiningRoom": "Conectándose a su reunión…"
    },
    "connection": {
        "ATTACHED": "Adjunto",
        "AUTHENTICATING": "Autenticando",
        "AUTHFAIL": "Falló la autenticación",
        "CONNECTED": "Conectado",
        "CONNECTING": "Conectando",
        "CONNFAIL": "Conexión fallida",
        "DISCONNECTED": "Desconectado",
        "DISCONNECTING": "Desconectando",
        "ERROR": "Error",
        "RECONNECTING": "Ocurrió un problema en la red. Reconectando...",
        "FETCH_SESSION_ID": "Obteniendo session-ID…",
        "GET_SESSION_ID_ERROR": "Obtener session-id error: {{code}}",
        "GOT_SESSION_ID": "Obteniendo session-ID… Listo",
        "LOW_BANDWIDTH": "Video para {{displayName}} ha sido deshabilitado para economizar ancho de banda"
    },
    "connectionindicator": {
        "address": "Dirección:",
        "bandwidth": "Ancho de banda estimado:",
        "bitrate": "Tasa de transferencia:",
        "bridgeCount": "Contador del servidor: ",
        "connectedTo": "Conectado a:",
        "e2e_rtt": "E2E RTT:",
        "framerate": "Fotogramas por segundo:",
        "less": "Mostrar menos",
        "localaddress": "Dirección local:",
        "localaddress_plural": "Direcciones locales:",
        "localport": "Puerto local:",
        "localport_plural": "Puertos locales:",
        "more": "Mostrar más",
        "packetloss": "Pérdida de paquetes:",
        "quality": {
            "good": "Bueno",
            "inactive": "Inactivo",
            "lost": "Perdido",
            "nonoptimal": "No óptimo",
            "poor": "Pobre"
        },
        "remoteaddress": "Dirección remota:",
        "remoteaddress_plural": "Direcciones remotas:",
        "remoteport": "Puerto remoto:",
        "remoteport_plural": "Puertos remotos:",
        "resolution": "Resolución:",
        "status": "Estado:",
        "transport": "Transporte:",
        "transport_plural": "Transportes:"
    },
    "dateUtils": {
        "earlier": "Anterior",
        "today": "Hoy",
        "yesterday": "Ayer"
    },
    "deepLinking": {
        "appNotInstalled": "Necesita la aplicación móvil {{app}} para unirse a esta reunión en su teléfono.",
        "description": "¿No pasó nada? Hemos intentado iniciar su reunión en la aplicación de escritorio {{app}}. intente de nuevo o inicie en la aplicación web {{app}}.",
        "descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación de escritorio {{app}}.",
        "downloadApp": "Descargar la app",
        "launchWebButton": "Iniciar en web",
        "ifDoNotHaveApp": "Si aún no tienes la app:",
        "ifHaveApp": "Si ya tienes la app:",
        "joinInApp": "Unirse a la reunion usando la app",
        "launchWebButton": "Iniciar en la Web",
        "openApp": "Continuar a la aplicación",
        "title": "Iniciar su reunión en {{app}}…",
        "tryAgainButton": "Intentar de nuevo en el escritorio"
    },
    "defaultLink": "ej. {{url}}",
    "defaultNickname": "ej. Juana Rosas",
    "deviceError": {
        "cameraError": "Error al acceder a su cámara",
        "cameraPermission": "Error al obtener permiso de la cámara",
        "microphoneError": "Error al acceder a tu micrófono",
        "microphonePermission": "Error al obtener permiso del micrófono"
    },
    "deviceSelection": {
        "noPermission": "Permiso no concedido",
        "previewUnavailable": "Vista previa no disponible",
        "selectADevice": "Seleccionar un dispositivo",
        "testAudio": "Reproducir un sonido de prueba"
    },
    "dialog": {
        "accessibilityLabel": {
            "liveStreaming": "Transmisión en Vivo"
        },
        "allow": "Permitir",
        "alreadySharedVideoMsg": "Otro participante esta compartiendo un video. Esta conferencia solo permite compartir un video a la vez.",
        "alreadySharedVideoTitle": "Solo se permite un video compartido a la vez",
        "applicationWindow": "Ventana de aplicación",
        "Back": "Anterior",
        "cameraConstraintFailedError": "Su cámara no satisface algunos de los requerimientos.",
        "cameraNotFoundError": "No se encontró la cámara.",
        "cameraNotSendingData": "No podemos acceder a su cámara. Verifique si otra aplicación está usando este dispositivo, seleccione otro dispositivo en el menú de configuración o intente volver a cargar la aplicación.",
        "cameraNotSendingDataTitle": "No se puede acceder a la cámara",
        "cameraPermissionDeniedError": "No ha otorgado permisos para usar su cámara. Puede unirse a la conferencia, pero no lo podrán ver. Utilice el botón en la barra de dirección para solucionar esto.",
        "cameraUnknownError": "No se puede usar su cámara por motivos desconocidos.",
        "cameraUnsupportedResolutionError": "Su cámara no soporta la resolución de video.",
        "Cancel": "Cancelar",
        "close": "Cerrar",
        "conferenceDisconnectMsg": "Es posible que desee comprobar la conexión de red. Reconectando en {{seconds}} segundos…",
        "conferenceDisconnectTitle": "Ha sido desconectado.",
        "conferenceReloadMsg": "Estamos tratando de arreglar esto. Reconectando en {{seconds}} segundos…",
        "conferenceReloadTitle": "Desafortunadamente, algo salió mal.",
        "confirm": "Confirmar",
        "confirmNo": "No",
        "confirmYes": "Sí",
        "connectError": "¡Oops! Algo salio mal y no fue posible conectarnos a la conferencia.",
        "connectErrorWithMsg": "¡Oops! Algo salio mal y no fue posible conectarnos a la conferencia: {{msg}}",
        "connecting": "Conectando",
        "contactSupport": "Contacte al soporte técnico",
        "copy": "Copiar",
        "dismiss": "Descartar",
        "displayNameRequired": "¡Hola! ¿Cuál es tu nombre?",
        "done": "Listo",
        "e2eeDescription": "El cifrado Extremo-a-Extremo es actualmente EXPERIMENTAL. Tenga en cuenta que activar el cifrado extremo-a-extremo puede deshabilitar servicios en el servidor como: grabación, transmisión en vivo y participación telefónica. Sin embargo tenga en cuenta que esta reunion solo funcionará con personas que se unan usando un navegador.",
        "e2eeWarning": "ATENCION: No todos los participantes de esta reunión soportan cifrado Extremo-a-Extremo. Si usted habilita el cifrado ellos no podrán verlo ni oirlo.",
        "enterDisplayName": "Por favor ingresa tu nombre aquí",
        "error": "Error",
        "externalInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
        "externalInstallationTitle": "Extensión requerida",
        "goToStore": "Ir al webstore",
        "gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
        "IamHost": "Yo soy el anfitrión",
        "incorrectRoomLockPassword": "Contraseña incorrecta",
        "incorrectPassword": "Nombre de usuario o contraseña incorrecta",
        "inlineInstallationMsg": "Necesita instalar nuestra extensión para compartir escritorio.",
        "inlineInstallExtension": "Instalar ahora",
        "internalError": "¡Oops! Algo salió mal. El siguiente error ocurrió: {{error}}",
        "internalErrorTitle": "Error interno",
        "kickMessage": "Puede ponerse en contacto con {{participantDisplayName}} para obtener más detalles.",
        "kickParticipantButton": "Expulsar",
        "kickParticipantDialog": "¿Seguro que quiere expulsar a este participante?",
        "kickParticipantTitle": "¿Expulsar a este participante?",
        "kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
        "liveStreaming": "Emisión en Directo",
        "liveStreamingDisabledForGuestTooltip": "Los invitados no pueden iniciar transmisiones en vivo.",
        "liveStreamingDisabledTooltip": "Iniciar transmisión en vivo deshabilitado.",
        "lockMessage": "No se pudo bloquear la conferencia.",
        "lockRoom": "Agregar reunion $t(lockRoomPasswordUppercase)",
        "lockTitle": "El bloqueo falló",
        "logoutQuestion": "¿Está seguro que desea salir y detener la conferencia?",
        "logoutTitle": "Cerrar sesión",
        "maxUsersLimitReached": "El límite máximo de participantes ha sido alcanzado. La conferencia está llena. Por favor contacta al organizador o intenta mas tarde.",
        "maxUsersLimitReachedTitle": "Se ha alcanzado el límite máximo de participantes",
        "micConstraintFailedError": "El micrófono no satisface algunos de los requerimientos.",
        "micNotFoundError": "No se encontró el micrófono.",
        "micNotSendingData": "Vaya a la configuración de su computadora para activar el micrófono y ajustar su nivel",
        "micNotSendingDataTitle": "Su micrófono está silenciado en la configuración de su sistema",
        "micPermissionDeniedError": "No ha otorgado permisos para usar su micrófono. Puede unirse a la conferencia, pero no lo podrán escuchar. Utilice el botón en la barra de dirección para solucionar esto.",
        "micUnknownError": "No se puede usar el micrófono por motivos desconocidos.",
        "muteEveryoneElseDialog": "Una vez silenciados, no podrás quitarles el modo silencio, pero ellos podrán hacerlo en cualquier momento.",
        "muteEveryoneElseTitle": "¿Silenciar a todos los participantes excepto a {{whom}}?",
        "muteEveryoneDialog": "¿Estás seguro de silenciar a todos los participantes? No podrás quitarles el modo en silencio, pero ellos podrán hacerlo en cualquier momento.",
        "muteEveryoneTitle": "¿Silenciar a todos los participantes?",
        "muteEveryoneSelf": "A ti mismo",
        "muteEveryoneStartMuted": "Todos los participantes comienzan silenciados a partir de ahora",
        "muteParticipantBody": "No podrás quitarles el modo en silencio, pero ellos pueden quitárselo en cualquier momento.",
        "muteParticipantButton": "Silenciar",
        "muteParticipantDialog": "¿Seguro que quiere silenciar a este participante? No podrá revertir esta acción, pero el participante podrá hacerlo en cualquier momento",
        "muteParticipantTitle": "¿Silenciar a este participante?",
        "Ok": "Aceptar",
        "passwordLabel": "$t(lockRoomPasswordUppercase)",
        "passwordNotSupported": "No se soporta $t(lockRoomPassword) en la reunión",
        "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) no es compatible",
        "passwordRequired": "$t(lockRoomPasswordUppercase) necesario",
        "popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Habilite las ventanas emergentes en la configuración de seguridad de su navegador y vuelva a intentarlo.",
        "popupErrorTitle": "Ventana emergente bloqueada",
        "recording": "Grabando",
        "recordingDisabledForGuestTooltip": "Los huéspedes no pueden iniciar grabaciones.",
        "recordingDisabledTooltip": "Inicio de grabación desactivado.",
        "rejoinNow": "Reunirse ahora",
        "remoteControlAllowedMessage": "{{user}} ha aceptado tu solicitud de control remoto!",
        "remoteControlDeniedMessage": "{{user}} ha rechazado tu solicitud de control remoto!",
        "remoteControlErrorMessage": "Ha ocurrido un error tratando de solicitar permiso de control remoto de {{user}}!",
        "remoteControlRequestMessage": "¿Permitirá que {{user}} controle remotamente su escritorio?",
        "remoteControlShareScreenWarning": "¡Tenga en cuenta que si presiona \"Permitir\" usted compartirá su pantalla!",
        "remoteControlStopMessage": "La sesión de control remoto ha finalizado!",
        "remoteControlTitle": "Control de escritorio remoto",
        "Remove": "Eliminar",
        "removePassword": "Eliminar $t(lockRoomPassword)",
        "removeSharedVideoMsg": "¿Está seguro que desea eliminar su vídeo compartido?",
        "removeSharedVideoTitle": "Eliminar video compartido",
        "reservationError": "Error del sistema de reservación",
        "reservationErrorMsg": "Código de error: {{code}}, message: {{msg}}",
        "retry": "Reintentar",
        "screenSharingAudio": "Compartir audio",
        "screenSharingFailedToInstall": "Oops! Su extensión de uso compartido de pantalla no se pudo instalar.",
        "screenSharingFailedToInstallTitle": "La extensión para compartir la pantalla no se pudo instalar",
        "screenSharingFirefoxPermissionDeniedError": "Algo salió mal mientras tratábamos de compartir la pantalla. Por favor, asegúrese de que nos ha dado permiso para hacerlo. ",
        "screenSharingFirefoxPermissionDeniedTitle": "OOPS! ¡ No pudimos empezar a compartir la pantalla!",
        "screenSharingPermissionDeniedError": "Oops! Algo salió mal con sus permisos de extensión para compartir pantalla. Por favor, vuelva a cargar e intente de nuevo.",
        "sendPrivateMessage": "Acaba de recibir un mensaje privado. ¿Desea responder de forma privada?, ¿Desea responder al grupo?",
        "sendPrivateMessageCancel": "Enviar al grupo",
        "sendPrivateMessageOk": "Enviar privado",
        "sendPrivateMessageTitle": "¿Enviar privado?",
        "serviceUnavailable": "Servicio no disponible",
        "sessTerminated": "Llamada terminada",
        "Share": "Compartir",
        "shareVideoLinkError": "Por favor introduzca un enlace correcto de Youtube.",
        "shareVideoTitle": "Compartir un vídeo",
        "shareYourScreen": "Compartir su pantalla",
        "shareYourScreenDisabled": "Pantalla compartida desactivada.",
        "shareYourScreenDisabledForGuest": "Los huéspedes no pueden compartir la pantalla.",
        "startLiveStreaming": "Iniciar transmisión en vivo",
        "startRecording": "Iniciar la grabación",
        "startRemoteControlErrorMessage": "¡Se ha producido un error al intentar iniciar la sesión de control remoto!",
        "stopLiveStreaming": "Detener transmisión en vivo",
        "stopRecording": "Parar grabación",
        "stopRecordingWarning": "¿Estás seguro que quieres parar la grabación?",
        "stopStreamingWarning": "¿Estas seguro que quieres parar la retransmisión en directo?",
        "streamKey": "Tecla de transmisión en directo",
        "Submit": "Enviar",
        "thankYou": "¡Gracias por usar {{appName}}!",
        "token": "token",
        "tokenAuthFailed": "Lo siento, usted no tiene permiso para unirse a este llamada.",
        "tokenAuthFailedTitle": "Falló la autenticación",
        "transcribing": "Transcribiendo",
        "unlockRoom": "Eliminar reunión $t(lockRoomPassword)",
        "userPassword": "contraseña del usuario",
        "WaitForHostMsg": "La conferencia <b> {{room}} </b> aún no ha comenzado. Si usted es el anfitrión, por favor autentíquese. De lo contrario, espere a que llegue el anfitrión.",
        "WaitForHostMsgWOk": "La conferencia <b> {{room}} </b> aún no ha comenzado. Si usted es el anfitrión, presione Ok para autenticar. De lo contrario, espere a que llegue el anfitrión.",
        "WaitingForHost": "Esperando al anfitrión …",
        "Yes": "Sí",
        "yourEntireScreen": "Su pantalla completa",
        "muteEveryoneDialog": "Silenciar a todos"
    },
    "dialOut": {
        "statusMessage": "está {{status}}"
    },
    "documentSharing": {
        "title": "Compartir documento"
    },
    "e2ee": {
        "labelToolTip": "La comunicación de Audio y Video en esta reunión está cifrada Extremo-a-Extremo"
    },
    "feedback": {
        "average": "Promedio",
        "bad": "Malo",
        "detailsLabel": "Nos puede decir más al respecto.",
        "good": "Bueno",
        "rateExperience": "Valore la experiencia de su reunión.",
        "veryBad": "Muy Mal",
        "veryGood": "Muy Bien"
    },
    "incomingCall": {
        "answer": "Contestar",
        "audioCallTitle": "Llamada entrante",
        "decline": "Descartar",
        "productLabel": "de Jitsi Meet",
        "videoCallTitle": "Llamada de vídeo"
    },
    "info": {
        "accessibilityLabel": "Mostrar Información",
        "addPassword": "Agregar $t(lockRoomPassword)",
        "cancelPassword": "Cancelar $t(lockRoomPassword)",
        "conferenceURL": "Enlace:",
        "country": "País",
        "dialANumber": "Para unirse a la reunión, marque uno de estos números e introduzca el PIN",
        "dialInConferenceID": "PIN:",
        "dialInNotSupported": "Lo sentimos, actualmente no se admite la marcación.",
        "dialInNumber": "Marcar:",
        "dialInSummaryError": "Se ha producido un error al capturar la información de marcación. Vuelva a intentarlo más tarde",
        "dialInTollFree": "Número gratuito",
        "genericError": "Ups, algo salió mal.",
        "inviteLiveStream": "Marcado de un solo toque: {{number}},,{{conferenceID}}#",
        "invitePhone": "Para unirse por teléfono, presione: {{number}},,{{conferenceID}}#\n",
        "invitePhoneAlternatives": "¿Busca un número de marcación diferente?\nConsulte los números de marcación de la reunión: {{url}}\n\n\nSi está marcando a través del teléfono de otra reunión, únase sin conectarse al audio: {{silentUrl}}",
        "inviteURLFirstPartGeneral": "Le han invitado a unirse a una reunión",
        "inviteURLFirstPartPersonal": "{{name}} te esta invitando a una sesión.\n",
        "inviteURLSecondPart": "\nUnirse a la reunión:\n{{url}}\n",
        "liveStreamURL": "Transmisión en vivo:",
        "moreNumbers": "Más números",
        "noNumbers": "Sin números a marcar.",
        "noPassword": "Ninguno",
        "noRoom": "No se especificó la sala a marcar.",
        "numbers": "Números de marcado",
        "password": "$t(lockRoomPasswordUppercase):",
        "title": "Compartir",
        "tooltip": "Compartir el enlace y acceso telefónico para esta reunión",
        "label": "Información de la reunión"
    },
    "inviteDialog": {
        "alertText": "Se ha producido un error al invitar a algunos participantes",
        "header": "Invitar",
        "searchCallOnlyPlaceholder": "Introduzca número de télefono",
        "searchPeopleOnlyPlaceholder": "Buscar participantes",
        "searchPlaceholder": "Participante o número de teléfono",
        "send": "Enviar"
    },
    "inlineDialogFailure": {
        "msg": "Tuvimos un pequeño tropiezo.",
        "retry": "Intentar de nuevo",
        "support": "Soporte",
        "supportMsg": "Si esto sigue ocurriendo, contáctenos para"
    },
    "keyboardShortcuts": {
        "focusLocal": "Enfócate en tu video",
        "focusRemote": "Centrarse en el vídeo de otra persona",
        "fullScreen": "Ver o salir de pantalla completa",
        "keyboardShortcuts": "Atajos de teclado",
        "localRecording": "Mostrar u ocultar controles de grabación locales",
        "mute": "Activar o silenciar el micrófono",
        "pushToTalk": "Presione para hablar",
        "raiseHand": "Levantar o bajar la mano",
        "showSpeakerStats": "Estadísticas de participantes",
        "toggleChat": "Abrir o cerrar panel de chat",
        "toggleFilmstrip": "Mostrar/Ocultar miniaturas de video",
        "toggleScreensharing": "Cambiar entre cámara y compartir pantalla",
        "toggleShortcuts": "Mostrar/ocultar atajos del teclado",
        "videoMute": "Activar o desactivar tu cámara",
        "videoQuality": "Administrar la calidad de llamadas"
    },
    "liveStreaming": {
        "busy": "Estamos trabajando para liberar recursos de transmisión. Por favor, inténtelo de nuevo en unos minutos.",
        "busyTitle": "Todos los streamers están ocupados actualmente",
        "changeSignIn": "Cambiar cuentas.",
        "choose": "Elija una secuencia en directo",
        "chooseCTA": "Elija una opción de streaming. Actualmente está registrado como {{email}}.",
        "enterStreamKey": "Ingrese su clave de YouTube live stream aquí.",
        "error": "La transmisión en vivo falló. Por favor, inténtelo de nuevo.",
        "errorAPI": "Se produjo un error al acceder a las transmisiones de YouTube. Por favor intente iniciando sesión nuevamente.",
        "errorLiveStreamNotEnabled": "La transmisión en vivo no está activada en {{email}}. Por favor, active la transmisión en vivo o inicie sesión en una cuenta con transmisión en vivo activada.",
        "expandedOff": "La transmisión en vivo se ha detenido",
        "expandedOn": "La reunión se está transmitiendo a YouTube.",
        "expandedPending": "La transmisión en vivo se está iniciando …",
        "failedToStart": "La transmisión en vivo no se puso iniciar",
        "getStreamKeyManually": "No pudimos buscar ninguna transmisión en vivo. Trate de obtener su clave de transmisión en vivo de YouTube.",
        "invalidStreamKey": "Es posible que la clave de transmisión sea incorrecta",
        "off": "Transmisión en vivo detenida",
        "offBy": "{{name}} transmisión en directo",
        "on": "Emisión en Directo",
        "onBy": "{{name}} transmisión en directo iniciada",
        "pending": "Iniciando Emisión en Directo…",
        "serviceName": "Servicio de streaming en vivo",
        "signedInAs": "Actualmente está conectado como:",
        "signIn": "Iniciar sesión con Google",
        "signInCTA": "Iniciar sesión o ingrese su clave de transmisión en vivo de YouTube.",
        "signOut": "Cerrar sesión",
        "start": "Iniciar una transmisión en vivo",
        "streamIdHelp": "¿Qué es esto?",
        "unavailableTitle": "Transmisión en vivo no disponible"
    },
    "localRecording": {
        "clientState": {
            "off": "Apagado",
            "on": "Encendido",
            "unknown": "Desconocido"
        },
        "dialogTitle": "Controles de grabación local",
        "duration": "Duración",
        "durationNA": "N/A",
        "encoding": "Codificación",
        "label": "GLO",
        "labelToolTip": "Grabación local activada",
        "localRecording": "Grabación local",
        "me": "Yo",
        "messages": {
            "engaged": "Grabación local activada.",
            "finished": "Sesión de grabación {{token}} terminada. Por favor, envíe el archivo grabado al moderador.",
            "finishedModerator": "Sesión de grabación {{token}} terminado. Se ha guardado la grabación de la pista local. Por favor pida a los demás participantes que presenten sus grabaciones.",
            "notModerator": "Usted no es el moderador. No puede iniciar o detener la grabación local."
        },
        "moderator": "Moderador",
        "no": "No",
        "participant": "Participante",
        "participantStats": "Estadística de participantes",
        "sessionToken": "Token de sesión",
        "start": "Iniciar grabación",
        "stop": "Detener grabación",
        "yes": "Sí"
    },
    "lockRoomPassword": "contraseña",
    "lockRoomPasswordUppercase": "Contraseña",
    "me": "yo",
    "notify": {
        "connectedOneMember": "{{name}} se unió a la sesión ",
        "connectedThreePlusMembers": "{{name}} and {{count}} otros se unieron a la sesión",
        "connectedTwoMembers": "{{first}} and {{second}} se han unido a la sesión",
        "disconnected": "desconectado",
        "focus": "Enfocar conferencia",
        "focusFail": "{{component}} no disponible - reintentar en {{ms}} seg",
        "grantedTo": "¡Se otorgaron privilegios de moderador a {{to}}!",
        "invitedOneMember": "{{displayName}} ha sido invitado",
        "invitedThreePlusMembers": "{{name}} y otros {{count}} fueron invitados",
        "invitedTwoMembers": "{{first}} y {{second}} fueron invitados",
        "kickParticipant": "{{kicked}} desalojado por {{kicker}}",
        "me": "Yo",
        "moderator": "¡Se otorgaron privilegios de moderador!",
        "muted": "Has iniciado la conversación silenciado.",
        "mutedTitle": "¡Estás silenciado!",
        "mutedRemotelyTitle": "¡{{Nombre del participante}} te ha silenciado!",
        "mutedRemotelyDescription": "Siempre puedes quitar el silencio cuando estés listo para hablar. Silencie cuando termine para mantener el ruido alejado de la reunión.",
        "passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) eliminado por otro participante",
        "passwordSetRemotely": "$t(lockRoomPasswordUppercase) establecido por otro participante",
        "raisedHand": "{{name}} quisiera hablar.",
        "somebody": "Alguien",
        "startSilentTitle": "¡Te uniste sin salida de audio!",
        "startSilentDescription": "Vuelva a unirse a la reunión para habilitar el audio",
        "suboptimalBrowserWarning": "Tememos que su experiencia en la reunión no sea tan buena. Estamos buscando formas de mejorar esto, pero hasta entonces intente utilizar uno de los <a href='{{recommendedBrowserPageLink}}' target='_blank'>navegadores totalmente compatibles</a>.",
        "suboptimalExperienceTitle": "Advertencia del Explorador",
        "unmute": "Dejar de silenciar",
        "newDeviceCameraTitle": "Se ha detectado una nueva cámara",
        "newDeviceAudioTitle": "Se ha detectado un nuevo dispositivo de audio",
        "newDeviceAction": "Usar",
        "OldElectronAPPTitle": "Vulnerabilidades de Seguridad!",
        "oldElectronClientDescription1": "Aparentemente usted está usuado una versión antigua de Jitsi Meet que tiene problemas de seguridad. Por favor actualice la versión con nuestra ",
        "oldElectronClientDescription2": "ultima versión",
        "oldElectronClientDescription3": " ahora!"
    },
    "passwordSetRemotely": "definida por otro participante",
    "passwordDigitsOnly": "Hasta {{number]] cifras",
    "poweredby": "con tecnología de",
    "prejoin": {
        "audioAndVideoError": "Error en Audio y video:",
        "audioOnlyError": "Error en Audio:",
        "audioTrackError": "No se pured crear la pista de Audio.",
        "callMe": "Llámame",
        "callMeAtNumber": "Llamame a este número:",
        "configuringDevices": "Configurando dispositivos...",
        "connectedWithAudioQ": "Usted está conectado con Audio?",
        "copyAndShare": "Cipie y comparta el link de la reuinión",
        "dialInMeeting": "Marcar a la reunión",
        "dialInPin": "Marcar a la reunión e ingresarel código PIN:",
        "dialing": "Marcando",
        "doNotShow": "No mostrar nuevamente",
        "errorDialOut": "Could not dial out",
        "errorDialOutDisconnected": "Could not dial out. Disconnected",
        "errorDialOutFailed": "Could not dial out. Call failed",
        "errorDialOutStatus": "Error getting dial out status",
        "errorStatusCode": "Error dialing out, status code: {{status}}",
        "errorValidation": "Number validation failed",
        "iWantToDialIn": "I want to dial in",
        "joinAudioByPhone": "Join with phone audio",
        "joinMeeting": "Join meeting",
        "joinWithoutAudio": "Join without audio",
        "initiated": "Call initiated",
        "linkCopied": "Link copied to clipboard",
        "lookGood": "It sounds like your microphone is working properly",
        "or": "or",
        "calling": "Calling",
        "startWithPhone": "Start with phone audio",
        "screenSharingError": "Screen sharing error:",
        "videoOnlyError": "Video error:",
        "videoTrackError": "Could not create video track.",
        "viewAllNumbers": "view all numbers"
    },
    "presenceStatus": {
        "busy": "Ocupado",
        "calling": "Llamando…",
        "connected": "Conectado",
        "connecting": "Conectando…",
        "connecting2": "Conectando*…",
        "disconnected": "Desconectado",
        "expired": "Expirado",
        "ignored": "Ignorado",
        "initializingCall": "Iniciando llamada…",
        "invited": "Invitado",
        "rejected": "Rechazado",
        "ringing": "Timbrando…"
    },
    "profile": {
        "setDisplayNameLabel": "Digite su nombre",
        "setEmailInput": "Digite su e-mail",
        "setEmailLabel": "Digite su e-mail",
        "title": "Perfil"
    },
    "raisedHand": "Desea hablar",
    "recording": {
        "authDropboxText": "Subir a Dropbox",
        "availableSpace": "Espacio disponible: {{spaceLeft}} MB (aproximadamente {{duration}} minutos de grabación)",
        "beta": "BETA",
        "busy": "Estamos trabajando para liberar recursos de grabación. Por favor, inténtelo de nuevo en unos minutos.",
        "busyTitle": "Todas las grabadoras están actualmente ocupadas",
        "error": "Falla de grabación. Vuelva a intentarlo.",
        "expandedOff": "Grabación detenida",
        "expandedOn": "La reunión está siendo grabada.",
        "expandedPending": "La grabación se está inciando…",
        "failedToStart": "No se pudo iniciar la grabación",
        "fileSharingdescription": "Compartir la grabación con los participantes de la reunión",
        "live": "Directo",
        "loggedIn": "Sesión iniciada como {{userName}}",
        "off": "Grabación detenida",
        "offBy": "{{name}} detuvo la grabación",
        "on": "Grabando",
        "onBy": "{{name}} comenzó la grabación",
        "pending": "Preparando para grabar la reunión…",
        "rec": "REC",
        "serviceDescription": "El servicio de grabación guardará la grabación",
        "serviceName": "Servicio de grabación",
        "signIn": "Iniciar sesión",
        "signOut": "Cerrar sesión",
        "unavailable": "Oops! El {{serviceName}} no está disponible actualmente. Estamos trabajando para resolver la situación. Por favor intente más tarde.",
        "unavailableTitle": "Grabación no disponible"
    },
    "sectionList": {
        "pullToRefresh": "Actualizar"
    },
    "security": {
        "about": "Usted puede agregar una contraseña a la reunión. Los participantes necesitaran la contraseña para unirse a la reunión.",
        "insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no desseados pueden llegar a unirse a la reunión.",
        "securityOptions": "Opciones de seguridad"
    },
    "settings": {
        "calendar": {
            "about": "La integración del calendario {{appName}} se utiliza para acceder de forma segura a su calendario para que pueda leer los próximos eventos.",
            "disconnect": "Desconectar",
            "microsoftSignIn": "Iniciar sesión con Microsoft",
            "signedIn": "Actualmente accediendo a eventos de calendario para {{email}}. Haga clic en el botón desconectar de abajo para detener el acceso a eventos de calendario.",
            "title": "Calendario"
        },
        "devices": "Dispositivos",
        "followMe": "Todos me siguen",
        "language": "Idioma",
        "loggedIn": "Sesión iniciada como {{name}}",
        "microphones": "Micrófono",
        "moderator": "Moderador",
        "more": "Más",
        "name": "Nombre",
        "noDevice": "Ninguno",
        "selectAudioOutput": "Salida de audio",
        "selectCamera": "Cámara",
        "selectMic": "Micrófono",
        "startAudioMuted": "Todos inician silenciados",
        "startVideoMuted": "Todos inician con cámara desactivada",
        "title": "Ajustes"
    },
    "settingsView": {
        "advanced": "Avanzado",
        "alertOk": "OK",
        "alertCancel": "Cancelar",
        "alertTitle": "Aviso",
        "alertURLText": "La dirección URL del servidor no es válida",
        "buildInfoSection": "Información de la compilación",
        "conferenceSection": "Conferencia",
        "disableCallIntegration": "Deshabilitar la integración nativa de llamadas",
        "disableP2P": "Deshabilitar el modo punto a punto",
        "displayName": "Nombre a mostrar",
        "email": "Email",
        "header": "Ajustes",
        "email": "Correo electrónico",
        "header": "Configuración",
        "profileSection": "Perfil",
        "serverURL": "URL del servidor",
        "showAdvanced": "Mostrar configuración avanzada",
        "startWithAudioMuted": "Inicio con audio en silencio",
        "startWithVideoMuted": "Iniciar con el vídeo en silencio",
        "version": "Versión"
    },
    "share": {
        "dialInfoText": "\n\n=====\n\n¿Solo quieres marcar en tu teléfono?\n\n{{defaultDialInNumber}} Haga clic en este enlace para ver el marcado en los números de teléfono de esta reunión\n{{dialInfoPageUrl}}",
        "mainText": "Presione en el siguiente enlace para unirse a la reunión:\n{{roomUrl}}"
    },
    "speaker": "Participante",
    "speakerStats": {
        "hours": "{{count}}h",
        "minutes": "{{count}}m",
        "name": "Nombre",
        "seconds": "{{count}}s",
        "speakerStats": "Estadísticas de participantes",
        "speakerTime": "Tiempo hablado"
    },
    "startupoverlay": {
        "policyText": " ",
        "title": "La video llamada se interrumpió porque se detuvo este equipo."
    },
    "suspendedoverlay": {
        "rejoinKeyTitle": "Volver",
        "text": "Presione el botón <i>Reunir</i> para reconectarse.",
        "title": "La video llamada se interrumpió porque se detuvo este equipo."
    },
    "toolbar": {
        "accessibilityLabel": {
            "audioOnly": "Alternar sólo audio",
            "audioRoute": "Seleccione el dispositivo de sonido",
            "callQuality": "Administrar la calidad del video",
            "cc": "Alternar subtítulos",
            "chat": "Alternar ventana de chat",
            "document": "Alternar documento compartido",
            "download": "Descarga nuestras aplicaciones",
            "e2ee": "Cifrado Extremo-a-Extremo",
            "feedback": "Dejar comentarios",
            "fullScreen": "Alternar pantalla completa",
            "hangup": "Dejar la llamada",
            "help": "Ayuda",
            "invite": "Invitar personas",
            "kick": "Expulsar participante",
            "localRecording": "Alternar controles de grabación locales",
            "lockRoom": "Activar o desactivar contraseña de la reunión",
            "moreActions": "Menú alternar más acciones",
            "moreActionsMenu": "Menú más acciones",
            "mute": "Alternar audio mudo",
            "pip": "Alternar modo de Picture-in-Picture",
            "privateMessage": "Enviar mensaje privado",
            "profile": "Editar tu perfil",
            "raiseHand": "Levantar / Bajar tu mano",
            "recording": "Activar grabación",
            "remoteMute": "Silenciar participante",
            "security": "Opciones de seguridad",
            "Settings": "Alternar configuración",
            "sharedvideo": "Alternar compartir un vídeo de YouTube",
            "shareRoom": "Invitar a alguien",
            "shareYourScreen": "Alternar compartir pantalla",
            "shortcuts": "Alternar accesos directos",
            "show": "Mostrar en escena",
            "speakerStats": "Alternar estadísticas del orador",
            "tileView": "Alternar vista de mosaico",
            "toggleCamera": "Alternar cámara",
            "toggleFilmstrip": "Alternar mosaicos",
            "videomute": "Alternar silencio de video",
            "videoblur": "Alternar desenfoque de video"
        },
        "addPeople": "Agregar personas a su llamada",
        "audioOnlyOff": "Deshabilitar el modo de ancho de banda bajo",
        "audioOnlyOn": "Habilitar el modo de ancho de banda bajo",
        "audioRoute": "Seleccione el dispositivo de sonido",
        "authenticate": "Autenticar",
        "callQuality": "Administrar la calidad del video",
        "chat": "Abrir / cerrar sala de charla",
        "closeChat": "Cerrar chat",
        "documentClose": "Cerrar documento compartido",
        "documentOpen": "Abrir documento compartido",
        "download": "Descarga nuestras aplicaciones",
        "e2ee": "Cifrado Extremo-a-Extremo",
        "enterFullScreen": "Ver pantalla completa",
        "enterTileView": "Entrar en vista de mosaico",
        "exitFullScreen": "Salir de pantalla completa",
        "exitTileView": "Salir de vista de mosaico",
        "feedback": "Dejar comentarios",
        "hangup": "Salir",
        "help": "Ayuda",
        "invite": "Invitar personas",
        "login": "Inicio de sesión",
        "logout": "Cerrar sesión",
        "lowerYourHand": "Bajar la mano",
        "moreActions": "Más acciones",
        "moreOptions": "Más opciones",
        "mute": "Activar o silenciar el micrófono",
        "muteEveryone": "Silenciar a todos",
        "noAudioSignalTitle": "¡No hay entrada proveniente de su micrófono!",
        "noAudioSignalDesc": "Si no lo silenció a propósito desde la configuración del sistema o el dispositivo, considere cambiar el dispositivo.",
        "noAudioSignalDescSuggestion": "Si no lo silenció a propósito desde la configuración del sistema o el dispositivo, considere usar el siguiente dispositivo:",
        "noAudioSignalDialInDesc": "Usted puede además llamar usando:",
        "noAudioSignalDialInLinkDesc": "Números de llamada",
        "noisyAudioInputTitle": "Su micrófono parece estar ruidoso",
        "noisyAudioInputDesc": "Parece que su micráfono está haciendo ruido, por favor considere silenciarlo o cambiar de dispositivo.",
        "openChat": "Abrir chat",
        "pip": "Entra en el modo Picture-in-Picture",
        "privateMessage": "Enviar mensaje privado",
        "profile": "Editar tu perfil",
        "raiseHand": "Levantar / Bajar tu mano",
        "raiseYourHand": "Alzar la mano",
        "security": "Opciones de seguridad",
        "Settings": "Ajustes",
        "sharedvideo": "Compartir un vídeo de YouTube",
        "shareRoom": "Invitar a alguien",
        "shortcuts": "Ver accesos directos",
        "speakerStats": "Estadísticas del locutor",
        "startScreenSharing": "Comenzar a compartir pantalla",
        "startSubtitles": "Iniciar subtítulos",
        "stopScreenSharing": "Dejar de compartir pantalla",
        "stopSubtitles": "Detener subtítulos",
        "stopSharedVideo": "Detener vídeo de YouTube",
        "talkWhileMutedPopup": "¿Tratas de hablar? Estás silenciado.",
        "tileViewToggle": "Alternar vista de mosaico",
        "toggleCamera": "Alternar cámara",
        "videomute": "Iniciar / detener cámara",
        "startvideoblur": "Desenfocar mi fondo",
        "stopvideoblur": "Desactivar desenfoque de fondo"
    },
    "transcribing": {
        "ccButtonTooltip": "Iniciar / Detener subtítulos",
        "error": "La Transcripción falló. Por favor, inténtelo nuevamente.",
        "expandedLabel": "Transcripción encendida",
        "failedToStart": "No es posible iniciar la transcripción",
        "labelToolTip": "La reunión se esta transcribiendo",
        "off": "Transcripción detenida",
        "pending": "Preparando la transcripción de la reunión…",
        "start": "Mostrar subtítulos",
        "stop": "Dejar de mostrar subtítulos",
        "tr": "TR"
    },
    "userMedia": {
        "androidGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
        "chromeGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
        "edgeGrantPermissions": "Seleccione <b><i>Sí</i></b> cuando su navegador pida permisos.",
        "electronGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono",
        "firefoxGrantPermissions": "Seleccione <b><i>Compartir Dispositivo Seleccionado</i></b> cuando su navegador pida permisos.",
        "iexplorerGrantPermissions": "Seleccione <b><i>OK</i></b> cuando su navegador pida permisos.",
        "nwjsGrantPermissions": "Por favor, conceda permisos para utilizar su cámara y micrófono",
        "operaGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
        "react-nativeGrantPermissions": "Seleccione <b><i>Permitir</i></b> cuando su navegador pida permisos.",
        "safariGrantPermissions": "Seleccione <b><i>OK</i></b> cuando su navegador pida permisos."
    },
    "videoSIPGW": {
        "busy": "Estamos trabajando en liberar recursos. Por favor intente nuevamente en unos minutos.",
        "busyTitle": "El servicio de las salas está actualmente ocupado",
        "errorAlreadyInvited": "{{displayName}} ya ha sido invitado",
        "errorInvite": "La conferencia no se ha establecido aun. Por favor intente más tarde.",
        "errorInviteFailed": "Estamos trabajando en resolver la situación. Por favor intente de nuevo más tarde.",
        "errorInviteFailedTitle": "Invitar a {{displayName}} falló",
        "errorInviteTitle": "Error al invitar a la sala",
        "pending": "{{displayName}} ha sido invitado"
    },
    "videoStatus": {
        "audioOnly": "AUD",
        "audioOnlyExpanded": "Estás en modo de ancho de banda bajo. En este modo, solo recibirá audio y pantalla compartida.",
        "callQuality": "Calidad de video",
        "hd": "HD",
        "hdTooltip": "Visualizando vídeo en alta definición",
        "highDefinition": "Alta definición",
        "labelTooiltipNoVideo": "No hay vídeo",
        "labelTooltipAudioOnly": "Modo de ancho de banda bajo habilitado",
        "ld": "LD",
        "ldTooltip": "Visualizando vídeo en baja definición",
        "lowDefinition": "Baja definición",
        "onlyAudioAvailable": "Solo hay audio disponible",
        "onlyAudioSupported": "Solo soportamos audio en este navegador.",
        "sd": "SD",
        "sdTooltip": "Visualizando vídeo en definición estándar",
        "standardDefinition": "Definición estándar"
    },
    "videothumbnail": {
        "domute": "Silenciar",
        "domuteOthers": "Silenciar a todos",
        "flip": "Voltear",
        "kick": "Expulsar",
        "moderator": "Moderador",
        "mute": "Participante está silenciado",
        "muted": "Silenciado",
        "remoteControl": "Control remoto",
        "show": "Mostrar en escena",
        "videomute": "El participante ha detenido la cámara."
    },
    "welcomepage": {
        "accessibilityLabel": {
            "join": "Toque para unirse",
            "roomname": "Introduzca un nombre de sala"
        },
        "appDescription": "La Sede Interuniversitaria de Alajuela (SIUA) le da la bienvenida. El sistema '{{app}}'  es una solución de videoconferencias disponible para la comunidad universitaria de la SIUA. Para crear o unirse a una conferencia, simplemente digite el nombre de la conferencia, si esta existe, se unirá o en caso contrario se creará. Se le recomienda establecer una contraseña para la conferencia y compartirla con sus usuarios, de otra forma cualquier persona se podrá unir. Para descargar la conferencia ingrese a https://jibri.siua.ac.cr",
        "audioVideoSwitch": {
            "audio": "Voz",
            "video": "Video"
        },
        "calendar": "Calendario",
        "connectCalendarButton": "Conecte su calendario",
        "connectCalendarText": "Conecte su calendario para ver todas sus reuniones en {{app}}. Plus, add {{provider}}reuniones a tu calendario e iniciarlas con un solo clic.",
        "enterRoomTitle": "Crear o unirse a una conferencia",
        "getHelp": "Obtener ayuda",
        "roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
        "go": "IR",
        "goSmall": "IR",
        "join": "CREAR / UNIRSE",
        "info": "Información",
        "privacy": "Privacidad",
        "recentList": "Reciente",
        "recentListDelete": "Borrar",
        "recentListEmpty": "Su lista de recientes está actualmente vacía. Chatea con tu equipo y encontrarás todas tus reuniones aquí.",
        "reducedUIText": "¡Bienvenido a {{app}}!",
        "roomname": "Introduzca un nombre de sala",
        "roomnameHint": "Introduce el nombre o URL de la sala a la que quieres unirte. Puedes crear un nombre nuevo, sólo tienes que hacer llegar este nombre al resto de participantes para que puedan unirse a esta sala.",
        "sendFeedback": "Enviar comentarios",
        "terms": "Términos",
        "title": "Bienvenido, Conferencias SIUA"
    },
    "lonelyMeetingExperience": {
        "button": "Invitar a otros",
        "youAreAlone": "Eres el único en la reunión"
    },
    "helpView": {
        "header": "Centro de ayuda"
    }
}
  • Modifiicar la imagen
  • Y remplazar la /usr/share/jitsi-meet/images/watermark.png
  • Para modificar los meta data abra
nano /usr/share/jitsi-meet/title.html
  • Modifique
<title>Jitsi Meet</title>
<meta property="og:title" content="Jitsi Meet"/>
<meta property="og:image" content="images/jitsilogo.png?v=1"/>
<meta property="og:description" content="Join a WebRTC video conference powered by the Jitsi Videobridge"/>
<meta description="Join a WebRTC video conference powered by the Jitsi Videobridge"/>
<meta itemprop="name" content="Jitsi Meet"/>
<meta itemprop="description" content="Join a WebRTC video conference powered by the Jitsi Videobridge"/>
<meta itemprop="image" content="images/jitsilogo.png?v=1"/>
<link rel="icon" type="image/png" href="images/favicon.ico?v=1"/>
X
<title>Conferencias SIUA</title>
<meta property="og:title" content="Conferencias SIUA"/>
<meta property="og:image" content="images/jitsilogo.png?v=1"/>
<meta property="og:description" content="Sistema de video conferencias SIUA"/>
<meta description="Sistema de video conferencias SIUA"/>
<meta itemprop="name" content="Conferencias SIUA"/>
<meta itemprop="description" content="Sistema de video conferencias SIUA"/>
<meta itemprop="image" content="images/jitsilogo.png?v=1"/>
<link rel="icon" type="image/png" href="images/favicon.ico?v=1"/>
  • ARCHIVO QUEDANDO ASÍ
<title>Conferencias SIUA</title>
<meta property="og:title" content="Conferencias SIUA"/>
<meta property="og:image" content="images/jitsilogo.png?v=1"/>
<meta property="og:description" content="Sistema de video conferencias SIUA"/>
<meta description="Sistema de video conferencias SIUA"/>
<meta itemprop="name" content="Conferencias SIUA"/>
<meta itemprop="description" content="Sistema de video conferencias SIUA"/>
<meta itemprop="image" content="images/jitsilogo.png?v=1"/>
<link rel="icon" type="image/png" href="images/favicon.ico?v=1"/>

Adicionales

  • Verificar los servicios
service prosody status
service jitsi-videobridge2 status
service jicofo status
service jibri status
  • Reiniciar servicios
service prosody restart
service jitsi-videobridge2 restart
service jicofo restart
service jibri restart

Errores en prosody

  • si el estado de prosody dice
service prosody status
 modulemanager: Unable to load module 'storage_memory': /usr/lib/prosody/modules/mod_storage_memory.lua:
  • Corrección, modificar memory x internal
Component "internal.auth.conferencias.siua.ac.cr" "muc"
    modules_enabled = {
      "ping";
    }
    storage = "memory"
    muc_room_cache_size = 1000

VirtualHost "recorder.conferencias.siua.ac.cr"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"


X


Component "internal.auth.conferencias.siua.ac.cr" "muc"
    modules_enabled = {
      "ping";
    }
    storage = "internal"
    muc_room_cache_size = 1000

VirtualHost "recorder.conferencias.siua.ac.cr"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"
  • Si el error dice
portmanager: Error binding encrypted port for https: No key present in SSL/TLS configuration for https port 5281
  • Abirmos el archivo
nano /etc/prosody/conf.d/conferencias.siua.ac.cr.cfg.lua
  • Y despues de esta línea
consider_bosh_secure = true;
  • Agregamos
bosh_ports = {
                 {
                    port = 5280;
                    path = "http-bind";
                 },
                 {
                    port = 5281;
                    path = "http-bind";
                    ssl = {
                                certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
                                key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
                          }
                 }
              }
http_ports = { 5280 }
http_interfaces = { "localhost" }

https_ports = { 5281 }
https_interfaces = { "localhost" }

https_ssl = {
   certificate = "/etc/prosody/certs/conferencias.siua.ac.cr.crt";
   key = "/etc/prosody/certs/conferencias.siua.ac.cr.key";
}
  • Aplicamos
service prosody restart
service prosody status

Comprobación de contraseñas

  • Usuario jvb
#Verificar en:
grep JVB_SECRET /etc/jitsi/videobridge/config 

#RESULTADO
JVB_SECRET=anzz9aLK

#Comparar con:
grep password /var/lib/prosody/auth%2econferencias%2esiua%2eac%2ecr/accounts/jvb.dat

#RESULTADO:
["password"] = "anzz9aLK";


nano /etc/jitsi/videobridge/sip-communicator.properties

org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=anzz9aLK
  • Usuario focus
nano /etc/prosody/conf.d/conferencias.siua.ac.cr.cfg.lua

#RESULTADO:
Component "focus.conferencias.siua.ac.cr"
    component_secret = "YHZt2RZt"

nano /etc/jitsi/jicofo/config 

JICOFO_AUTH_PASSWORD=YHZt2RZt
  • Otros
scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/fullchain.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/fullchain.pem
scp -P 44 -r /etc/letsencrypt/live/jibri.siua.ac.cr/privkey.pem root@10.20.200.75:/etc/apache2/certificados/jibri.siua.ac.cr/privkey.pem


ERRO#

systemctl status prosody.service jitsi-videobridge2.service

Aug 18 15:06:53 conferencias prosody[36633]: portmanager: Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281
Aug 18 15:06:53 conferencias prosody[36633]: portmanager: Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281
Aug 18 15:07:15 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:19 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:23 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:24 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:29 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:34 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:39 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active
Aug 18 15:07:44 conferencias prosody[36633]: internal.auth.conferencias.siua.ac.cr:muc: Error restoring room jvbbrewery@internal.auth.conferencias.siua.ac.cr from storage: no data storage active




******************************************
ERROR2: 
******************************************
nano /var/log/jitsi/jicofo.log

*Error presentado:
org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Can not invite participant -- no bridge available.

* Si ejecutamos 
-----------------------------------------------
grep JVB_SECRET /etc/jitsi/videobridge/config 
Da:
JVB_SECRET=anzz9aLK

* Si ejecutamos
-------------------------------------------------
grep 'org.jitsi.videobridge.xmpp.user.shard.PASSWORD' /etc/jitsi/videobridge/sip-communicator.properties
Da:
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=anzz9aLK

* Si ejecutamos
-------------------------------------------------
grep password /var/lib/prosody/auth%2econferencias%2esiua%2eac%2ecr/accounts/jvb.dat
DA:
["password"] = "anzz9aLK";



Component "focus.conferencias.siua.ac.cr"
    component_secret = "YHZt2RZt"


Y vemos que los usuarios son focus y jvb 

Component "internal.auth.conferencias.siua.ac.cr" "muc"
    storage = "memory"
    modules_enabled = {
      "ping";
    }
    admins = { "focus@auth.conferencias.siua.ac.cr", "jvb@auth.conferencias.siua.ac.cr" }
    muc_room_locking = false
    muc_room_default_public_jids = true


dentro de este archivo agregamos
nano /etc/jitsi/jicofo/sip-communicator.properties
*Y modificamos

#org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.conferencias.siua.ac.cr
X
org.jitsi.jicofo.jibri.BREWERY=jvb@internal.auth.conferencias.siua.ac.cr




Verificamos el archivo
/etc/prosody/conf.d/conferencias.siua.ac.cr.cfg.lua

EN:



*******************************
Se puede forza con
prosodyctl passwd jvb@auth.mydomain.org
*******************************

nano /etc/prosody/conf.d/videoconf-test.mydomain.cfg.lua



Error
jitsi meet CONFERENCE FAILED: conference.videobridgeNotAvailable


https://community.jitsi.org/t/saslerror-using-scram-sha-1-not-authorized-on-debian-buster-system-with-existing-prosody/26775/9

Paso1: Comprobar que 
--------------------------------------------------------------
nano /etc/prosody/conf.d/conferencias.siua.ac.cr.cfg.lua

en Component "focus.conferencias.siua.ac.cr"
    component_secret = "YHZt2RZt"

--------------------------------------------------------------
Tenga la misma contraseña que
--------------------------------------------------------------
nano /etc/jitsi/jicofo/config 

JICOFO_AUTH_PASSWORD=YHZt2RZt


---------------------------
PASO2: comprobar que 
---------------------------
nano /etc/jitsi/videobridge/sip-communicator.properties
-----
org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=anzz9aLK
-----

Tegan la misma contaseña que
nano /etc/jitsi/videobridge/config

# sets the shared secret used to authenticate to the XMPP server
JVB_SECRET=anzz9aLK

MODIFICAMOS
nano /etc/jitsi/videobridge/config

JVB_OPTS="--apis=,"
X
JVB_OPTS="--apis=xmpp,rest"


---------------------------
PASO3: comprobar que 
---------------------------
nano /etc/jitsi/jicofo/config 

# sets the password to use for XMPP user logins
JICOFO_AUTH_PASSWORD=vjnxpdkV

Tenga la misma contraseña que

nano /var/lib/prosody/auth%2econferencias%2esiua%2eac%2ecr/accounts/focus.dat 

return {
        ["password"] = "vjnxpdkV";
};


Y que 
nano /var/lib/prosody/auth%2econferencias%2esiua%2eac%2ecr/accounts/jvb.dat 



return {
        ["password"] = "fq0aFMqd";
};




 cat /etc/jitsi/videobridge/config | grep JVB_SECRET
JVB_SECRET=MySecretIsHere

than:
prosodyctl passwd jvb@auth.your.domain.com
Enter JVB_SECRET twice here

followed by
prosodyctl restart


 
 


/etc/init.d/jicofo restart
/etc/init.d/jitsi-videobridge2 restart
/etc/init.d/prosody restart
  • NUEVA VERSION el archivo de idioma se cambia en libs/app.bundle.min.js
  • Corregir errores de jibri
  • https://community.jitsi.org/t/tutorial-jibri-overview-troubleshooting-tips-tricks-solve-your-jibri-problems-quickly/86054
  • Error al grabar con jibri el driver de chrome estaba viejo para actualilzarlo
sudo apt-get install unzip && a=$(uname -m) && rm -r /tmp/chromedriver/ mkdir /tmp/chromedriver/ && wget -O /tmp/chromedriver/LATEST_RELEASE http://chromedriver.storage.googleapis.com/LATEST_RELEASE && if [ $a == i686 ]; then b=32; elif [ $a == x86_64 ]; then b=64; fi && latest=$(cat /tmp/chromedriver/LATEST_RELEASE) && wget -O /tmp/chromedriver/chromedriver.zip 'http://chromedriver.storage.googleapis.com/'$latest'/chromedriver_linux'$b'.zip' && sudo unzip /tmp/chromedriver/chromedriver.zip chromedriver -d /usr/local/bin/ && echo 'success?'