Salta el contingut

Pràctica: Videoconferència amb Jitsi Meet i Docker

Objectius

En aquesta pràctica aprendràs a:

  • Configurar un servidor de videoconferència amb Jitsi Meet
  • Entendre el funcionament de WebRTC per comunicacions P2P
  • Configurar autenticació i moderació de sales
  • Personalitzar la interfície i les opcions de Jitsi
  • Treballar amb múltiples components (Prosody, Jicofo, JVB, Web)

Durada estimada

4-5 hores

Requisits previs

  • Docker i Docker Compose instal·lats
  • Coneixements bàsics de xarxes i protocols
  • Webcam i micròfon funcionals
  • Mínim 2 dispositius per provar les videoconferències

Introducció

Jitsi Meet és una solució de videoconferència de codi obert que permet:

  • Videoconferències il·limitades sense límit de participants
  • Compartició de pantalla i presentacions
  • Xat integrat durant les conferències
  • Gravació de sessions
  • Qualitat adaptativa segons l'ample de banda

Components de Jitsi:

  • Jitsi Meet (web): Interfície web d'usuari
  • Jitsi Videobridge (JVB): Enrutador de vídeo/àudio WebRTC
  • Jicofo: Component de control de conferències
  • Prosody: Servidor XMPP per senyalització

WebRTC (Web Real-Time Communication) és l'estàndard que permet comunicacions d'àudio/vídeo P2P directament entre navegadors.


Part 1: Configuració del Servidor Jitsi Meet

Pas 1: Crear l'estructura de directoris

mkdir -p jitsi-NOMCOGNOM/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,.jigasi,.jibri}
cd jitsi-NOMCOGNOM

IMPORTANT: Substitueix NOMCOGNOM pel teu nom i cognom en minúscules sense espais (exemple: jitsi-fbarragan).

Pas 2: Crear el fitxer .env

Crea el fitxer .env amb les variables d'entorn:

# Configuració bàsica
COMPOSE_PROJECT_NAME=jitsi-NOMCOGNOM

# Configuració de xarxa
PUBLIC_URL=https://meet.NOMCOGNOM.local:8443
ENABLE_HTTP_REDIRECT=1

# Configuració d'autenticació (opcional, deixa-ho comentat inicialment)
#ENABLE_AUTH=1
#ENABLE_GUESTS=1
#AUTH_TYPE=internal

# Configuració de la sala
ENABLE_LOBBY=1
ENABLE_RECORDING=0

# Zona horària
TZ=Europe/Madrid

# Seguretat (IMPORTANT: canvia aquestes contrasenyes)
JICOFO_COMPONENT_SECRET=jicofosecret_NOMCOGNOM_2024
JICOFO_AUTH_PASSWORD=jicofopass_NOMCOGNOM_2024
JVB_AUTH_PASSWORD=jvbpass_NOMCOGNOM_2024
JIGASI_XMPP_PASSWORD=jigasipass_NOMCOGNOM_2024
JIBRI_RECORDER_PASSWORD=jibrirecorderpass_NOMCOGNOM_2024
JIBRI_XMPP_PASSWORD=jibripass_NOMCOGNOM_2024

# Configuració de resolució i qualitat
ENABLE_SIMULCAST=1
RESOLUTION=720
ENABLE_PREJOIN_PAGE=1

# Configuració de moderació
ENABLE_BREAKOUT_ROOMS=1
ENABLE_AV_MODERATION=1

Pas 3: Crear el docker-compose.yml

services:
  # Frontend
  web-NOMCOGNOM:
    image: jitsi/web:stable-9258
    container_name: jitsi-web-NOMCOGNOM
    restart: unless-stopped
    ports:
      - '8000:80'
      - '8443:443'
    volumes:
      - ./web:/config:Z
      - ./web/crontabs:/var/spool/cron/crontabs:Z
      - ./transcripts:/usr/share/jitsi-meet/transcripts:Z
    environment:
      - ENABLE_AUTH
      - ENABLE_GUESTS
      - ENABLE_LOBBY
      - ENABLE_HTTP_REDIRECT
      - ENABLE_TRANSCRIPTIONS
      - DISABLE_HTTPS
      - JICOFO_AUTH_USER
      - LETSENCRYPT_DOMAIN
      - LETSENCRYPT_EMAIL
      - PUBLIC_URL
      - XMPP_DOMAIN=meet-NOMCOGNOM.local
      - XMPP_AUTH_DOMAIN=auth.meet-NOMCOGNOM.local
      - XMPP_BOSH_URL_BASE=http://prosody-NOMCOGNOM.meet.NOMCOGNOM.local:5280
      - XMPP_MUC_DOMAIN=muc.meet-NOMCOGNOM.local
      - TZ
      - ENABLE_PREJOIN_PAGE
      - ENABLE_BREAKOUT_ROOMS
    networks:
      jitsi-net-NOMCOGNOM:
        aliases:
          - meet-NOMCOGNOM.local

  # XMPP server
  prosody-NOMCOGNOM:
    image: jitsi/prosody:stable-9258
    container_name: jitsi-prosody-NOMCOGNOM
    restart: unless-stopped
    expose:
      - '5222'
      - '5347'
      - '5280'
    volumes:
      - ./prosody/config:/config:Z
      - ./prosody/prosody-plugins-custom:/prosody-plugins-custom:Z
    environment:
      - AUTH_TYPE
      - ENABLE_AUTH
      - ENABLE_GUESTS
      - ENABLE_LOBBY
      - ENABLE_XMPP_WEBSOCKET
      - GLOBAL_MODULES
      - GLOBAL_CONFIG
      - LDAP_URL
      - LDAP_BASE
      - XMPP_DOMAIN=meet-NOMCOGNOM.local
      - XMPP_AUTH_DOMAIN=auth.meet.NOMCOGNOM.local
      - XMPP_GUEST_DOMAIN=guest.meet.NOMCOGNOM.local
      - XMPP_MUC_DOMAIN=muc.meet.NOMCOGNOM.local
      - XMPP_INTERNAL_MUC_DOMAIN=internal-muc.meet.NOMCOGNOM.local
      - XMPP_MODULES
      - XMPP_MUC_MODULES
      - XMPP_INTERNAL_MUC_MODULES
      - XMPP_RECORDER_DOMAIN=recorder.meet.NOMCOGNOM.local
      - JICOFO_COMPONENT_SECRET
      - JICOFO_AUTH_USER=focus
      - JICOFO_AUTH_PASSWORD
      - JVB_AUTH_USER=jvb
      - JVB_AUTH_PASSWORD
      - JIGASI_XMPP_USER=jigasi
      - JIGASI_XMPP_PASSWORD
      - JIBRI_XMPP_USER=jibri
      - JIBRI_XMPP_PASSWORD
      - JIBRI_RECORDER_USER=recorder
      - JIBRI_RECORDER_PASSWORD
      - TZ
    networks:
      jitsi-net-NOMCOGNOM:
        aliases:
          - xmpp.meet.NOMCOGNOM.local

  # Focus component
  jicofo-NOMCOGNOM:
    image: jitsi/jicofo:stable-9258
    container_name: jitsi-jicofo-NOMCOGNOM
    restart: unless-stopped
    volumes:
      - ./jicofo:/config:Z
    environment:
      - AUTH_TYPE
      - ENABLE_AUTH
      - XMPP_DOMAIN=meet.NOMCOGNOM.local
      - XMPP_AUTH_DOMAIN=auth.meet.NOMCOGNOM.local
      - XMPP_INTERNAL_MUC_DOMAIN=internal-muc.meet.NOMCOGNOM.local
      - XMPP_SERVER=prosody-NOMCOGNOM.meet.NOMCOGNOM.local
      - JICOFO_COMPONENT_SECRET
      - JICOFO_AUTH_USER=focus
      - JICOFO_AUTH_PASSWORD
      - JVB_BREWERY_MUC=jvbbrewery
      - JIGASI_BREWERY_MUC=jigasibrewery
      - JIBRI_BREWERY_MUC=jibribrewery
      - JIBRI_PENDING_TIMEOUT
      - TZ
      - ENABLE_BREAKOUT_ROOMS
    depends_on:
      - prosody-NOMCOGNOM
    networks:
      - jitsi-net-NOMCOGNOM

  # Video bridge
  jvb-NOMCOGNOM:
    image: jitsi/jvb:stable-9258
    container_name: jitsi-jvb-NOMCOGNOM
    restart: unless-stopped
    ports:
      - '10000:10000/udp'
    volumes:
      - ./jvb:/config:Z
    environment:
      - XMPP_AUTH_DOMAIN=auth.meet.NOMCOGNOM.local
      - XMPP_INTERNAL_MUC_DOMAIN=internal-muc.meet.NOMCOGNOM.local
      - XMPP_SERVER=prosody-NOMCOGNOM.meet.NOMCOGNOM.local
      - JVB_AUTH_USER=jvb
      - JVB_AUTH_PASSWORD
      - JVB_BREWERY_MUC=jvbbrewery
      - JVB_PORT=10000
      - JVB_STUN_SERVERS=meet-jit-si-turnrelay.jitsi.net:443
      - JVB_ENABLE_APIS=rest
      - TZ
    depends_on:
      - prosody-NOMCOGNOM
    networks:
      - jitsi-net-NOMCOGNOM

networks:
  jitsi-net-NOMCOGNOM:
    driver: bridge

Pas 4: Iniciar el servidor

docker-compose up -d

Verifica que tots els contenidors estan funcionant:

docker ps

Hauries de veure 4 contenidors en execució:

  • jitsi-web-NOMCOGNOM
  • jitsi-prosody-NOMCOGNOM
  • jitsi-jicofo-NOMCOGNOM
  • jitsi-jvb-NOMCOGNOM

Pas 5: Accedir a la interfície web

Obre el navegador a: https://localhost:8443

Image title

NOTA: Accepta el certificat SSL autosignat (afegeix una excepció de seguretat).


Part 2: Crear i Personalitzar Sales

Pas 1: Crear la teva primera sala

  1. A la pàgina principal, introdueix el nom de la sala: sala-NOMCOGNOM
  2. Fes clic a GO o prem Enter
  3. Permet l'accés a la càmera i micròfon quan el navegador ho demani
  4. Configura el teu nom visible: VOSTRENOM VOSTRECOGNOM

Pas 2: Explorar les opcions de configuració

Durant la conferència, explora aquestes funcionalitats:

A. Configuració d'àudio/vídeo

  • Botó de micròfon (activar/desactivar)
  • Botó de càmera (activar/desactivar)
  • Configuració → Dispositius → Selecciona micròfon/càmera
  • Configuració → Qualitat de vídeo (alta, mitjana, baixa)

B. Compartició de contingut

  • Botó Comparteix pantalla
  • Selecciona: Pantalla completa, Finestra específica o Pestanya del navegador
  • Prova compartir una presentació o document

C. Funcions de sala

  • Xat: Envia missatges de text
  • Aixecar la mà: Senyalització de participació
  • Vista en graella: Canvia entre vista de parlant i graella

D. Opcions de moderador

  • Silenciar tothom: Silencia tots els participants
  • Expulsar participant: Treu algú de la sala
  • Contrasenya de sala: Protegeix la sala amb contrasenya

Pas 3: Proves amb múltiples dispositius

  1. Uneix-te a la mateixa sala des d'un altre dispositiu (mòbil, tauleta, altre PC)
  2. Verifica que pots veure i escoltar tots els participants
  3. Prova compartir pantalla des d'un dispositiu i visualitzar des de l'altre
  4. Envia missatges pel xat i verifica que arriben a tots els participants

Part 3: Activar Autenticació (Opcional Avançat)

Pas 1: Modificar el fitxer .env

Descomenta aquestes línies al fitxer .env:

ENABLE_AUTH=1
ENABLE_GUESTS=1
AUTH_TYPE=internal

Pas 2: Reiniciar els contenidors

docker-compose down
docker-compose up -d

Pas 3: Crear un usuari moderador

docker exec -it jitsi-prosody-NOMCOGNOM prosodyctl --config /config/prosody.cfg.lua register VOSTRENOM meet.NOMCOGNOM.local CONTRASENYASEGURA

Exemple:

docker exec -it jitsi-prosody-fbarragan prosodyctl --config /config/prosody.cfg.lua register joan meet.fbarragan.local Joan2024!

Pas 4: Provar l'autenticació

  1. Obre una sala: https://localhost:8443/sala-NOMCOGNOM
  2. Hauries de veure una pantalla demanant autenticació
  3. Introdueix:
  4. Usuari: VOSTRENOM
  5. Contrasenya: CONTRASENYASEGURA
  6. Ara ets el moderador de la sala
  7. Els convidats poden unir-se sense autenticar-se però amb permisos limitats

Part 4: Personalització de la Interfície

Pas 1: Modificar el títol i descripció

Crea el fitxer web/interface_config.js dins del directori jitsi-NOMCOGNOM/web:

var interfaceConfig = {
    APP_NAME: 'Videoconferència NOMCOGNOM',
    DEFAULT_BACKGROUND: '#474747',
    DEFAULT_LOGO_URL: 'images/watermark.svg',
    DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.svg',

    DISPLAY_WELCOME_FOOTER: true,
    GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true,

    HIDE_INVITE_MORE_HEADER: false,

    JITSI_WATERMARK_LINK: 'https://jitsi.org',

    PROVIDER_NAME: 'Institut Sa Palomera - VOSTRENOM VOSTRECOGNOM',

    SHOW_JITSI_WATERMARK: false,
    SHOW_WATERMARK_FOR_GUESTS: false,

    TOOLBAR_BUTTONS: [
        'microphone', 'camera', 'closedcaptions', 'desktop',
        'fullscreen', 'fodeviceselection', 'hangup', 'chat',
        'recording', 'livestreaming', 'etherpad', 'sharedvideo',
        'settings', 'raisehand', 'videoquality', 'filmstrip',
        'feedback', 'stats', 'shortcuts', 'tileview', 'download',
        'help', 'mute-everyone'
    ],
};

Pas 2: Reiniciar el contenidor web

docker restart jitsi-web-NOMCOGNOM

Part 5: Proves i Verificació

1. Verifica l'estat dels components

Consulta l'estat del Jitsi Videobridge:

docker exec jitsi-jvb-NOMCOGNOM curl http://localhost:8080/colibri/stats

Hauries de veure estadístiques JSON amb informació de:

  • Nombre de conferències actives
  • Nombre de participants
  • Bitrate total
  • Paquets enviats/rebuts

2. Prova de latència i qualitat

Durant una videoconferència, obre Configuració → Més → Estadístiques

Verifica:

  • Frame rate: Ha de ser propera a 30 fps
  • Resolution: Depèn de la teva configuració (720p per defecte)
  • Packet loss: Ha de ser < 1%
  • Bitrate: Varia segons el nombre de participants

3. Prova amb diferents navegadors

Verifica la compatibilitat amb:

  • Chrome/Chromium (recomanat)
  • Firefox
  • Edge
  • Safari (macOS/iOS)

4. Consulta els logs

docker logs jitsi-web-NOMCOGNOM
docker logs jitsi-prosody-NOMCOGNOM
docker logs jitsi-jicofo-NOMCOGNOM
docker logs jitsi-jvb-NOMCOGNOM

Qüestions

Qüestió 1: Protocols i Tecnologies

Completa la següent taula comparativa:

Característica Jitsi Meet Zoom Google Meet Microsoft Teams
Tecnologia base (WebRTC, propietari)
Codi obert
Límit de participants (gratuït)
Autohospedable
Encriptació E2E

Qüestió 2: Arquitectura de Components

Explica la funció de cada component de Jitsi Meet:

a) Jitsi Meet (web):

b) Jitsi Videobridge (JVB):

c) Jicofo:

d) Prosody:

e) Per què és necessari un servidor XMPP per a videoconferències basades en WebRTC?

Qüestió 3: Càlculs d'Amplada de Banda

Calcula l'amplada de banda necessària per:

a) Una videoconferència de 5 participants a 720p@30fps amb bitrate mitjà de 1,5 Mbps per participant. Quina amplada de banda total necessita el servidor?

b) Si tens 10 conferències simultànies amb una mitjana de 4 participants cadascuna, quina amplada de banda total necessita el servidor?

c) Quin seria l'ample de banda per participant en una conferència de 20 persones si el servidor té un enllaç de 100 Mbps?

Qüestió 4: WebRTC

Explica:

a) Què és WebRTC i quins són els seus 3 components principals (API)?

b) Diferència entre connexió P2P (peer-to-peer) i SFU (Selective Forwarding Unit). Quin model utilitza Jitsi?

c) Per què WebRTC necessita servidors STUN i TURN? Quan s'utilitza cadascun?


Lliurament

Captures de pantalla obligatòries

  1. docker ps mostrant els 4 contenidors Jitsi en execució amb el teu nom
  2. Pàgina d'inici de Jitsi (https://localhost:8443) amb el títol personalitzat
  3. Sala de conferència activa amb el teu nom visible i mínim 2 dispositius connectats
  4. Compartició de pantalla en funcionament
  5. Configuració → Més → Estadístiques mostrant frame rate, resolution, bitrate
  6. Xat de la sala amb missatges enviats des de diferents dispositius
  7. Logs del JVB (docker logs jitsi-jvb-NOMCOGNOM) mostrant tràfic actiu
  8. Estadístiques del Videobridge (output de /colibri/stats)

Si has activat autenticació: 9. Pantalla de login demanant credencials 10. Creació d'usuari amb prosodyctl mostrant el teu nom

Fitxers a incloure

  • docker-compose.yml personalitzat
  • .env personalitzat (IMPORTANT: oculta les contrasenyes abans de lliurar)
  • web/interface_config.js personalitzat (si l'has creat)

Document PDF

Crea un document que inclogui:

  1. Portada amb el teu nom complet i data
  2. Captures de pantalla amb el teu nom visible
  3. Fitxers de configuració (YAML, .env amb contrasenyes amagades)
  4. Respostes a les qüestions amb taules i càlculs detallats
  5. Reflexió final (200-300 paraules):
  6. Diferències entre Jitsi i altres plataformes (Zoom, Meet, Teams)
  7. Avantatges i desavantatges d'autohospedar videoconferències
  8. Problemes de latència o qualitat trobats
  9. Casos d'ús adequats per Jitsi Meet
  10. Millores o optimitzacions possibles

Criteris d'Avaluació

Criteri Puntuació
Servidor Jitsi Meet funcional amb 4 components 2,5 punts
Sala de videoconferència operativa amb múltiples dispositius 2,0 punts
Compartició de pantalla i xat funcionant 1,0 punt
Personalització de la interfície (títol, nom) 1,0 punt
Autenticació configurada correctament (opcional) +0,5 punts (bonus)
Captures de pantalla completes i amb personalització 1,5 punts
Respostes a qüestions correctes 1,5 punts
Reflexió final ben argumentada 0,5 punts
TOTAL 10,0 punts

Penalitzacions: - -2,0 punts si no hi ha personalització amb el nom de l'estudiant - -1,5 punts si només funciona amb 1 dispositiu (no proves amb múltiples participants) - -1,0 punt si no funciona la compartició de pantalla - -0,5 punts si falten captures d'estadístiques

Bonificacions: - +0,5 punts per autenticació funcional amb usuaris creats - +0,5 punts per personalització avançada (interface_config.js)


Recursos Addicionals


Data de creació: Gener 2025 Autor: Curs M0375 - Serveis de Xarxa i Internet