Jitsi autoalojado vs Zoom: lo que cambia de verdad
Los servicios de videoconferencia de consumo (Zoom, Google Meet, Teams) imponen límites de duración en los planes gratuitos, cuotas de participantes, y conservan sus grabaciones en sus propios servidores. Jitsi Meet, autoalojado, elimina estas restricciones: salas sin límite, duración sin límite, ninguna cuenta requerida para unirse a una reunión, flujos de video que permanecen en su infraestructura. Es especialmente pertinente para una organización preocupada por la confidencialidad de sus reuniones, para un despacho que trata datos sensibles, o para integrar la videoconferencia en una aplicación de terceros (Jitsi ofrece una API iframe estable). El coste de funcionamiento se reduce a la factura del VPS — ninguna suscripción por puesto, ningún sobrecoste de software.
Beneficios concretos de un Jitsi autoalojado
- Reuniones sin límite de duración ni de número de salas — ningún temporizador que corte la reunión.
- Ninguna cuenta requerida para los participantes: basta un enlace para unirse.
- API iframe para integrar la videoconferencia directamente en su aplicación o en su sitio web.
- Cifrado del transporte (DTLS-SRTP) y control total sobre las eventuales grabaciones.
- Personalización completa de la interfaz: logotipo, colores, nombre de dominio de las salas.
- Ninguna telemetría enviada a terceros — los flujos de video no salen de su VPS.
Requisitos previos con cifras antes de empezar
Jitsi se dimensiona por el ancho de banda, no por la CPU. Para reuniones de hasta 10 participantes: 2 vCPU, 4 GB de RAM como mínimo, tráfico saliente generoso (100 Mbps recomendados). Por encima de 20 participantes simultáneos, cuente con 8 GB de RAM y vigile la carga de red del JVB. Tres puertos deben ser accesibles desde internet: TCP 443 (HTTPS y TURN/TLS), TCP 80 (renovación de Let's Encrypt), UDP 10000 (medios JVB). Añada TCP 3478 si expone coturn en su puerto nativo. Se necesitan Docker 24+ y Compose V2, un nombre de dominio meet.sudominio.com con un registro A que apunte a la IP pública del VPS, y una IP pública dedicada y estable — una IP compartida complica seriamente la configuración de coturn.
Despliegue paso a paso: Docker, .env, coturn y primera prueba
Obtener docker-jitsi-meet
Clone el repositorio oficial:
git clone https://github.com/jitsi/docker-jitsi-meet. Copieenv.examplea.env, luego ejecute./gen-passwords.sh— este script genera todos los secretos internos (Prosody, Jicofo, JVB). No se salte este paso: los valores por defecto no son secretos. La ramastable-11146-2(agosto 2026) es la última estable; evitemainen producción — los componentes internos cambian sin previo aviso.Configurar PUBLIC_URL y DOCKER_HOST_ADDRESS
En
.env, dos variables son críticas:PUBLIC_URL=https://meet.sudominio.com(utilizada por el cliente web para construir las URL de las salas) yDOCKER_HOST_ADDRESS=<IP_PUBLICA_DEL_VPS>(la dirección que el JVB anuncia a los clientes para establecer la conexión de medios directa). SinDOCKER_HOST_ADDRESS, el JVB anuncia una dirección interna de Docker y ningún cliente externo puede alcanzarlo.Activar Let's Encrypt en .env
Añada en
.env:ENABLE_LETSENCRYPT=1,LETSENCRYPT_DOMAIN=meet.sudominio.com,[email protected]. Compruebe que el puerto 80 está realmente abierto antes de arrancar — Let's Encrypt utiliza un desafío HTTP-01 que requiere una respuesta en ese puerto. Para la renovación automática, el contenedor web de docker-jitsi-meet llama a certbot mediante un cron interno: verifique que el volumen~/.jitsi-meet-cfg/web/letsencryptestá montado y persiste entre reinicios.Configurar coturn (servidor TURN)
Es la etapa que la mayoría de las guías pasan por alto y la que hace fracasar la instalación. En
.env, active:ENABLE_TURN=1,TURN_HOST=meet.sudominio.com,TURN_PORT=443,TURN_TRANSPORT=tls. El puerto 443 en TLS permite atravesar los cortafuegos más restrictivos, que bloquean los puertos no estándar pero dejan pasar todo lo que se parece a HTTPS.Añada después:
TURN_CREDENTIALS=un_secreto_fuerte,TURN_TLS_CERT=/etc/letsencrypt/live/meet.sudominio.com/fullchain.pem,TURN_TLS_KEY=/etc/letsencrypt/live/meet.sudominio.com/privkey.pem. Si coturn se ejecuta en un contenedor separado, monte estos archivos como volumen.Último punto que a menudo se olvida: coturn bloquea por defecto los rangos RFC1918 (192.168.x.x, 10.x.x.x, 172.16.x.x). Si su VPS tiene una interfaz de red interna en esos rangos, añada
no-multicast-peersy compruebe quedenied-peer-ipno incluye la dirección del JVB.Arrancar la stack y comprobar el JVB
Ejecute
docker compose up -d. Espere 30 segundos, luego:docker compose logs jvb 2>&1 | grep -E 'register|connected|error'. Debe ver una línea que indique que el JVB se ha registrado en Jicofo. Si veFailed to registeroConnection refused, Prosody aún no está listo — vuelva a lanzarlo al cabo de un minuto. Compruebe después que coturn responde:nc -zv meet.sudominio.com 443(TCP) ync -zvu meet.sudominio.com 10000(UDP).Primera prueba de video desde dos redes diferentes
Abra
https://meet.sudominio.comdesde su equipo habitual y desde un segundo dispositivo en una red diferente (un teléfono con datos móviles, por ejemplo). Si ambos participantes se ven y se oyen, el TURN funciona. Una prueba desde dos equipos en la misma red local no valida coturn — tiene éxito en modo punto a punto sin solicitar nunca el relé.
Configuración avanzada: grabación, autenticación y límites
Grabación de las reuniones. Jitsi integra Jibri para la grabación local o el streaming RTMP. Jibri requiere un segundo VPS o, como mínimo, 4 vCPU adicionales, ya que captura el renderizado del navegador en tiempo real. Active ENABLE_RECORDING=1 en .env y despliegue un contenedor Jibri separado que apunte a su Jicofo. Autenticación de los organizadores. Por defecto, cualquiera puede crear una sala. Active AUTH_TYPE=internal para exigir una cuenta del lado del organizador dejando que los invitados se unan libremente. Cree las cuentas de anfitrión con docker exec <prosody-container> prosodyctl --config /config/prosody.cfg.lua register admin meet.sudominio.com contrasena. Limitar los participantes anónimos. Añada ENABLE_LOBBY=1 para que un moderador valide cada entrada antes de acceder a la sala. Combinado con AUTH_TYPE=internal, esto da un control completo sobre quién accede a qué.
Endurecimiento: fail2ban en el servicio TURN
coturn expone un servicio accesible desde internet. Instale fail2ban y cree un filtro sobre los intentos de autenticación TURN fallidos: los logs de coturn escriben ERROR: 401, realm en cada fallo. Una jail de fail2ban con maxretry=10 y bantime=600 basta para desalentar los escaneos automáticos sin afectar a sus usuarios legítimos. Compruebe que fail2ban vigila /var/log/coturn.log (ruta por defecto si coturn se ejecuta de forma nativa) o monte ese archivo desde el contenedor.
Solución de problemas: los cuatro errores más frecuentes
Sin sonido o video bloqueado en «connecting» — coturn + UDP 10000. Es la avería más frecuente. Compruebe en este orden: (1) ufw status — ¿están abiertos los puertos TCP 443 y UDP 10000? (2) docker compose logs coturn | grep -i error — ¿arranca coturn sin error de certificado? (3) Desde una máquina externa: curl -v telnet://meet.sudominio.com:3478 — ¿responde coturn? (4) En los logs del navegador (F12 → Consola): ¿ve ICE failed o failed to gather candidates? Si es así, coturn no es accesible desde el exterior. Compare TURN_HOST en .env con la IP real del VPS. Conexión rechazada en TCP 443. Si el certificado Let's Encrypt no pudo emitirse (puerto 80 cerrado en el primer arranque), el contenedor web intenta servir en HTTPS con un certificado autofirmado que el navegador rechaza. Solución: abra el puerto 80, elimine el volumen ~/.jitsi-meet-cfg/web y vuelva a lanzar docker compose up -d. Compartir pantalla rechazado por el navegador. Compartir la pantalla exige un contexto seguro (HTTPS válido). Si ve getUserMedia is not supported, el certificado no es válido o el dominio no está en HTTPS. Compruebe PUBLIC_URL — debe empezar por https:// con un dominio cuyo certificado sea válido, no una IP en bruto. Error «ICE failed» persistente pese a un coturn operativo. Compruebe la variable DOCKER_HOST_ADDRESS: debe contener la IP pública del VPS, no la IP interna del contenedor Docker (172.17.x.x). Si su VPS está detrás de un NAT cloud (raro pero existente), necesita la IP NAT externa, no la IP de la interfaz de red.
Monitoreo: vigilar el ancho de banda y los participantes
El puente de video JVB expone una API de estadísticas en tiempo real en http://localhost:8080/colibri/stats. Este endpoint JSON informa del número de conferencias activas, participantes, ancho de banda entrante y saliente en bits/s, y pérdida de paquetes. Para una vigilancia continua, active el soporte de Prometheus en .env (JVB_ENABLE_STATS=1, PROSODY_ENABLE_METRICS=1) y conecte una pila Prometheus + Grafana: hay un panel oficial de Jitsi disponible en Grafana Labs (ID 11925) que cubre CPU, memoria, ancho de banda y métricas de calidad de video.
Sin Prometheus, una vigilancia mínima se logra con un cron que consulta /colibri/stats y alerta cuando el rendimiento supera un umbral: docker exec jvb curl -s http://localhost:8080/colibri/stats | python3 -c "import json,sys; s=json.load(sys.stdin); print(s.get('bit_rate_download',0), s.get('bit_rate_upload',0))".
Para estimar la capacidad antes de la saturación: un JVB maneja cómodamente 200 a 250 participantes interactivos a calidad de video moderada en un VPS bien conectado. A partir de ahí, las métricas packet_loss_fraction y rtt_aggregate suben y la calidad percibida cae antes de que la CPU sature — esa es la señal para añadir otra instancia JVB.
Su Jitsi está en marcha — gestione el ancho de banda
Jitsi funciona en modo SFU: el puente de video (JVB) retransmite cada flujo hacia cada participante, por lo que el ancho de banda saliente crece proporcionalmente al número de participantes multiplicado por el número de flujos. Para 10 participantes a 720p, cuente con 20 a 40 Mbps salientes en continuo. Active lastN=5 (últimos N videos activos) para limitar los flujos del lado del cliente en las reuniones grandes, y vigile docker stats jvb para anticipar la saturación. Por encima de una veintena de participantes simultáneos regulares, despliegue varias instancias JVB en VPS distintos detrás de un único Jicofo: es la arquitectura de escalado horizontal nativa de Jitsi. Para despliegues multi-organización o multidominio, Jitsi admite múltiples entradas PUBLIC_URL mediante el mecanismo de tenant de Prosody: cada organización dispone de su propio espacio de salas aislado en la misma instalación, sin infraestructura adicional.