Jitsi Meet es una plataforma de videoconferencia de código abierto basada en WebRTC: los participantes se unen desde el navegador o desde la app móvil sin crear cuenta, y el vídeo pasa por tu propio servidor. Se compone de varios servicios: Nginx sirve la web, Prosody hace de servidor XMPP para la señalización, Jicofo gestiona las conferencias y Jitsi Videobridge (JVB) reenvía el audio y el vídeo. En este tutorial instalarás todo el conjunto en Ubuntu 24.04 con los paquetes oficiales, obtendrás un certificado de Let's Encrypt y configurarás el servidor para que solo los usuarios autenticados puedan crear salas.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS dedicado a Jitsi, por ejemplo un VPS de CubePath, con un usuario no root con privilegios sudo. Jitsi configura su propio Nginx, así que es preferible no compartir el servidor con otros sitios web.
  • Al menos 4 GB de RAM y 2 vCPU para reuniones pequeñas. Para muchas reuniones simultáneas, 8 GB y 4 vCPU. El ancho de banda es el recurso que más se consume.
  • Un subdominio, por ejemplo meet.your_domain, con un registro DNS de tipo A que apunte a la IP pública del servidor. Let's Encrypt lo necesita durante la instalación.

A lo largo de la guía, sustituye meet.your_domain por tu subdominio y your_server_ip por la IP pública del servidor.

Paso 1: Configurar el nombre del servidor

Los servicios de Jitsi se comunican entre sí usando el nombre de dominio, así que el servidor debe resolver meet.your_domain hacia sí mismo. Comprueba primero que el DNS público ya apunta a tu IP:

dig +short meet.your_domain
203.0.113.10

Establece el nombre del host:

sudo hostnamectl set-hostname meet

Añade el dominio completo a /etc/hosts con la IP pública del servidor:

sudo nano /etc/hosts
your_server_ip meet.your_domain meet

Comprueba que el nombre se resuelve localmente:

ping -c 1 meet.your_domain

La respuesta debe venir de your_server_ip.

Paso 2: Abrir los puertos en el cortafuegos

Jitsi necesita HTTP y HTTPS para la web y Let's Encrypt, 10000/udp para el audio y el vídeo, y 3478/udp y 5349/tcp para el servidor TURN que instala el paquete y que ayuda a los participantes detrás de cortafuegos restrictivos:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 10000/udp
sudo ufw allow 3478/udp
sudo ufw allow 5349/tcp
sudo ufw enable

Comprueba las reglas:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
10000/udp                  ALLOW       Anywhere
3478/udp                   ALLOW       Anywhere
5349/tcp                   ALLOW       Anywhere

Paso 3: Añadir los repositorios de Prosody y Jitsi

Jitsi depende de versiones de Prosody más recientes que las de Ubuntu, así que se instalan desde el repositorio del propio proyecto Prosody. Instala las herramientas necesarias y activa el componente universe:

sudo apt update
sudo apt install gnupg2 curl lsb-release
sudo add-apt-repository universe
sudo mkdir -p /etc/apt/keyrings

Añade el repositorio de Prosody con su clave:

sudo curl -sL https://prosody.im/files/prosody-debian-packages.key -o /etc/apt/keyrings/prosody-debian-packages.key
echo "deb [signed-by=/etc/apt/keyrings/prosody-debian-packages.key] http://packages.prosody.im/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/prosody-debian-packages.list

Añade el repositorio de Jitsi. Su clave se convierte a formato binario con gpg --dearmor:

curl -sL https://download.jitsi.org/jitsi-key.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jitsi-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/" | sudo tee /etc/apt/sources.list.d/jitsi-stable.list

Actualiza el índice de paquetes e instala lua5.2, que Prosody necesita para los módulos de Jitsi:

sudo apt update
sudo apt install lua5.2

Comprueba que el paquete de Jitsi está disponible:

apt policy jitsi-meet
jitsi-meet:
  Installed: (none)
  Candidate: 2.0.10431-1
  Version table:
     2.0.10431-1 500
        500 https://download.jitsi.org stable/ Packages

Paso 4: Instalar Jitsi Meet

Instala el metapaquete jitsi-meet, que trae Prosody, Jicofo, Jitsi Videobridge, la web y la configuración de Nginx y del servidor TURN:

sudo apt install jitsi-meet

El instalador hace varias preguntas:

  1. Hostname: escribe meet.your_domain.
  2. SSL certificate: elige Let's Encrypt certificates.
  3. Email: una dirección válida para los avisos de caducidad de Let's Encrypt.
  4. Si pregunta por la integración de telefonía de JaaS, puedes responder que no.

Al terminar, comprueba que los cuatro servicios están activos:

systemctl is-active prosody jicofo jitsi-videobridge2 nginx
active
active
active
active

Comprueba también que Videobridge escucha en el puerto UDP de medios:

sudo ss -ulnp | grep 10000
UNCONN 0      0                  *:10000            *:*    users:(("java",pid=5213,fd=258))

Abre https://meet.your_domain en el navegador. Verás la página de bienvenida de Jitsi Meet con un certificado válido. Escribe un nombre de sala, entra, y únete a la misma sala desde otro dispositivo (por ejemplo, el móvil con datos). Si os veis y oís, la instalación funciona.

Paso 5: Exigir autenticación para crear salas

Tal como queda tras la instalación, cualquier persona que conozca la URL puede crear salas y usar tu servidor y tu ancho de banda. La configuración llamada secure domain exige usuario y contraseña para crear una sala, mientras que los invitados siguen pudiendo unirse a una sala ya iniciada sin cuenta.

Configurar Prosody

Abre la configuración de Prosody para tu dominio:

sudo nano /etc/prosody/conf.avail/meet.your_domain.cfg.lua

Dentro del bloque VirtualHost "meet.your_domain", cambia el método de autenticación de jitsi-anonymous a internal_hashed:

VirtualHost "meet.your_domain"
    authentication = "internal_hashed"

Deja el resto del bloque como está. Después, al final del archivo, añade un host virtual para los invitados:

VirtualHost "guest.meet.your_domain"
    authentication = "jitsi-anonymous"
    c2s_require_encryption = false

El dominio guest.meet.your_domain es interno de XMPP; no necesita registro DNS ni certificado.

Configurar la web

Indica a la aplicación web qué dominio usan los invitados:

sudo nano /etc/jitsi/meet/meet.your_domain-config.js

Dentro del objeto hosts, añade la línea anonymousdomain (en el archivo aparece comentada como ejemplo):

    hosts: {
        domain: 'meet.your_domain',
        anonymousdomain: 'guest.meet.your_domain',
        muc: 'conference.' + subdomain + 'meet.your_domain',
    },

No toques las demás líneas de hosts; solo añade o descomenta anonymousdomain.

Configurar Jicofo

Jicofo es quien decide si se puede crear una conferencia, así que también debe saber que la autenticación está activada:

sudo nano /etc/jitsi/jicofo/jicofo.conf

Dentro del bloque jicofo { ... } existente, añade el bloque authentication:

jicofo {
  authentication: {
    enabled: true
    type: XMPP
    login-url: meet.your_domain
  }

  // ... resto de la configuración existente (xmpp, etc.)
}

Crear usuarios y reiniciar

Crea un usuario para cada persona que deba poder abrir salas. prosodyctl pedirá la contraseña de forma interactiva, así no queda en el historial de la shell:

sudo prosodyctl adduser [email protected]_domain

Comprueba la configuración de Prosody y reinicia los servicios:

sudo prosodyctl check config
sudo systemctl restart prosody jicofo jitsi-videobridge2
Checking config...
Done.

Vuelve a abrir https://meet.your_domain en una ventana privada del navegador y entra en una sala nueva. Jitsi mostrará el aviso de que la reunión aún no ha empezado y un botón I am the host (o Soy el anfitrión) que pide usuario y contraseña. Con el usuario ana la sala se crea; a partir de ese momento, los invitados que abran el mismo enlace entran sin credenciales.

Para eliminar un usuario más adelante:

sudo prosodyctl deluser [email protected]_domain

Paso 6: Ajustar las opciones por defecto

La mayoría de opciones de la interfaz se configuran en el mismo archivo meet.your_domain-config.js, que Nginx sirve como archivo estático: los cambios se aplican al recargar la página, sin reiniciar servicios.

sudo nano /etc/jitsi/meet/meet.your_domain-config.js

Busca estas opciones (muchas están comentadas) y ajústalas según tus necesidades:

    // Idioma por defecto de la interfaz
    defaultLanguage: 'es',

    // A partir del participante número 10, entrar con micrófono y cámara apagados
    startAudioMuted: 10,
    startVideoMuted: 10,

    // En el móvil, abrir la reunión en el navegador en lugar de sugerir la app
    disableDeepLinking: true,

Guarda el archivo, recarga la página y comprueba que la interfaz aparece en español.

Solución de problemas

Los participantes se desconectan a los pocos segundos o no ven vídeo. El puerto 10000/udp no es accesible. Comprueba la regla de UFW y cualquier cortafuegos externo, y revisa el registro de Videobridge:

sudo journalctl -u jitsi-videobridge2 -n 50 --no-pager

Dos personas se ven entre ellas pero con tres o más falla. Con dos participantes Jitsi usa conexión directa entre navegadores; a partir de tres el tráfico pasa por Videobridge. Es el mismo problema de 10000/udp del punto anterior.

Error de autenticación al pulsar "I am the host". Revisa que el usuario existe y pertenece al dominio principal, no al de invitados, y consulta los registros de Prosody y Jicofo:

sudo tail -n 50 /var/log/prosody/prosody.log
sudo journalctl -u jicofo -n 50 --no-pager

El servidor está detrás de NAT (IP privada). Videobridge anuncia su IP privada y los clientes externos no pueden conectar. Edita /etc/jitsi/videobridge/sip-communicator.properties y añade la IP privada y la pública:

org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=your_private_ip
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=your_server_ip

Reinicia después con sudo systemctl restart jitsi-videobridge2. En un VPS con IP pública asignada directamente no hace falta.

Conclusión

Tienes un servidor Jitsi Meet propio en Ubuntu 24.04 con HTTPS, en el que solo los usuarios que tú creas pueden abrir reuniones y los invitados se unen con el enlace. Como siguientes pasos puedes activar la sala de espera (lobby) desde las opciones de seguridad de cada reunión, instalar Jibri en un servidor aparte para grabar reuniones o emitirlas en directo, o añadir más servidores Videobridge si necesitas más capacidad.