# ADR 0005 — Visio de classe : Jitsi auto-hébergé, jetons du portail, prof seul modérateur - **Date** : 2026-10-12 - **Statut** : accepté ## Contexte Étape 15 : une visio pour la classe, sur le même serveur, où seuls les élèves de la classe entrent (nom non modifiable), où tout le monde arrive en sourdine et où seul le prof donne la parole. ## Décisions 1. **Jitsi Meet en Docker** (docker-jitsi-meet, version figée `stable-11248`), rôle Ansible `visio`, derrière le Nginx de l'hôte sur `meet.syllabuslab.fr`. 2. **JVB sur le réseau de l'hôte** : Docker tourne sans pont par défaut ni règles iptables (étape 5), donc la publication de l'UDP 10000 par NAT Docker est impossible. JVB écoute directement l'UDP 10000 (ouvert dans nftables, accord d'Adam) et joint Prosody par `127.0.0.1:5222`. 3. **Pont interne `br-visio` autorisé** dans la chaîne `forward` (accord d'Adam) : avec `br_netfilter`, le trafic entre conteneurs d'un même réseau Docker passe par `forward`, dont la politique `drop` bloquait Jicofo et le conteneur web. Seul le trafic qui entre ET ressort par `br-visio` est accepté. 4. **Accès par jeton JWT (HS256) signé par le portail**, un par personne, pour une salle au nom imprévisible ; pas d'invités (`ENABLE_GUESTS=0`). Le secret est généré sur le serveur et copié dans le `.env` du portail par Ansible. 5. **Rôle de modérateur lu dans le jeton** (`context.user.moderator`, module natif `token_affiliation`) ; `ENABLE_AUTO_OWNER=0` et **`JICOFO_ENABLE_AUTH=0`** : sinon Jicofo authentifie chaque participant et donne le rôle de propriétaire à tous (constaté : un élève pouvait ouvrir son micro sans la parole). 6. **Modération du micro** activée par la page du prof à son arrivée (`toggleModeration`), « Donner la parole » = `askToUnmute` (qui autorise le micro quand la modération est active, d'après la documentation de l'IFrame API). 7. **État de la classe tenu par le portail** (cache Redis, verrou) : mains levées par ordre d'arrivée, correspondance élève ↔ participant Jitsi, salle d'attente. La main levée suit toujours l'événement Jitsi (`raiseHandUpdated`) : une seule source. ## Alternatives écartées - **Publier l'UDP 10000 par Docker** : demande de rendre à Docker la main sur iptables, ce qu'on a refusé dès l'étape 5. - **Mettre tous les conteneurs sur le réseau de l'hôte** : conflits de ports avec Kolla (ex. 10.10.0.1:8000) et services internes exposés sur toutes les interfaces. - **Relais TURN sur 443** pour les réseaux qui bloquent l'UDP : impose de restructurer l'entrée HTTPS (aiguillage par nom) ; reporté (choix d'Adam). ## Conséquences - Réseaux scolaires qui bloquent l'UDP : pas de son ni d'image tant que le relais TURN sur 443 n'existe pas (`docs/dette.md`). - Capacité ramenée de 22 à 20 VM (`docs/capacite.md`). - `Permissions-Policy` du portail délègue caméra, micro et partage d'écran au seul `meet.syllabuslab.fr` ; le site `meet` n'est intégrable que dans le portail (`frame-ancestors`).