linux:jitsi
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| linux:jitsi [2021/08/13 19:58] – créée root | linux:jitsi [2026/09/07 07:10] (Version actuelle) – root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Jitsi Meet ====== | + | ====== |
| + | |||
| + | Guide d' | ||
| + | |||
| + | * **Cible** : réunions clients en ligne (2 à ~20 participants) | ||
| + | * **OS** : Debian 12 | ||
| + | * **Reverse proxy** : Caddy (gère le TLS) | ||
| + | * **FQDN d' | ||
| + | |||
| + | ===== 1. Prérequis ===== | ||
| + | |||
| + | ^ Élément ^ Détail ^ | ||
| + | | FQDN | '' | ||
| + | | Port 443/tcp | Web + WebSocket (via Caddy) | | ||
| + | | Port 10000/udp | Média JVB — **direct vers la VM**, ne passe PAS par Caddy | | ||
| + | | Port 5349/ | ||
| + | | Ressources | 4 vCPU / 4–8 Go RAM recommandés | | ||
| + | |||
| + | <note warning> | ||
| + | Le média audio/ | ||
| + | </ | ||
| + | |||
| + | ===== 2. Préparation système | ||
| - | ===== Serveur ===== | ||
| <code bash> | <code bash> | ||
| - | apt install gnupg2 nginx-full apt-transport-https | + | hostnamectl set-hostname meet.makeitsimple.be |
| + | # Vérifier /etc/hosts : | ||
| + | # | ||
| + | apt update && apt upgrade | ||
| + | apt install | ||
| + | </ | ||
| - | curl https:// | + | ===== 3. Dépôts Jitsi ===== |
| - | echo 'deb [signed-by=/ | + | |
| + | <code bash> | ||
| + | curl -sL https:// | ||
| + | | ||
| + | |||
| + | echo "deb [signed-by=/ | ||
| + | > / | ||
| apt update | apt update | ||
| - | apt install jitsi-meet | ||
| </ | </ | ||
| - | ===== Sources | + | ===== 4. Installation |
| - | https:// | + | |
| + | <code bash> | ||
| + | apt install -y jitsi-meet | ||
| + | </ | ||
| + | |||
| + | Pendant l' | ||
| + | |||
| + | - **Hostname** : saisir '' | ||
| + | - **Certificat** : choisir **« I want to use my own certificate »** — c'est Caddy qui gère le TLS, il ne faut PAS laisser Jitsi tenter Let's Encrypt. On peut pointer vers un certificat existant ou bidon, il sera contourné. | ||
| + | |||
| + | Cette commande installe : '' | ||
| + | |||
| + | ===== 5. Basculer le web Jitsi en HTTP local ===== | ||
| + | |||
| + | Par défaut nginx écoute en 443 et se battra avec Caddy. On le fait écouter en local uniquement. | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | <code nginx> | ||
| + | server { | ||
| + | listen 127.0.0.1: | ||
| + | server_name meet.makeitsimple.be; | ||
| + | |||
| + | # ... conserver tout le reste de la conf générée par Jitsi ... | ||
| + | # (locations /, /http-bind, / | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * Faire écouter nginx sur '' | ||
| + | * Supprimer / commenter les blocs '' | ||
| + | |||
| + | <code bash> | ||
| + | nginx -t && systemctl restart nginx | ||
| + | </ | ||
| + | |||
| + | ===== 6. Caddy en frontal ===== | ||
| + | |||
| + | Dans le '' | ||
| + | |||
| + | < | ||
| + | meet.makeitsimple.be { | ||
| + | reverse_proxy 127.0.0.1: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | caddy validate --config / | ||
| + | systemctl reload caddy | ||
| + | </ | ||
| + | |||
| + | Caddy récupère le certificat Let's Encrypt automatiquement et proxifie HTTP + WebSocket (BOSH/ | ||
| + | |||
| + | ===== 7. Configuration du média (JVB) ===== | ||
| + | |||
| + | **Point de rupture le plus fréquent.** Le JVB doit annoncer les bonnes adresses IP pour la négociation ICE. | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | <code properties> | ||
| + | org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=< | ||
| + | org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=< | ||
| + | </ | ||
| + | |||
| + | * **VM derrière NAT** : renseigner l'IP privée locale ET l'IP publique. | ||
| + | * **VM en IP publique directe** : les deux valeurs peuvent être identiques (l'IP publique). | ||
| + | |||
| + | Ouvrir **10000/ | ||
| + | |||
| + | <code bash> | ||
| + | systemctl restart jitsi-videobridge2 | ||
| + | </ | ||
| + | |||
| + | ===== 8. Configuration TURN (coturn) — TURN/UDP sans TLS ===== | ||
| + | |||
| + | Le TURN sert de **relais média** quand un participant est derrière un NAT/ | ||
| + | |||
| + | Cette section décrit un TURN **sans TLS**, en TURN/UDP sur le port **3478** uniquement. Avantage : **aucun certificat à gérer** côté coturn (pas de synchro depuis Caddy, pas de renouvellement à automatiser). Le TURN/UDP 3478 couvre la grande majorité des NAT restrictifs. | ||
| + | |||
| + | < | ||
| + | **Limite** : le TURN over TLS (5349) n'est utile que pour traverser les firewalls corporate les plus verrouillés, | ||
| + | </ | ||
| + | |||
| + | ==== 8.1 Config coturn ==== | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | < | ||
| + | listening-port=3478 | ||
| + | listening-ip=< | ||
| + | relay-ip=< | ||
| + | external-ip=< | ||
| + | |||
| + | # Auth partagée avec Jitsi | ||
| + | use-auth-secret | ||
| + | static-auth-secret=< | ||
| + | realm=meet.makeitsimple.be | ||
| + | |||
| + | # Pas de TLS : on ne définit ni tls-listening-port, | ||
| + | no-tls | ||
| + | no-dtls | ||
| + | |||
| + | # Durcissement | ||
| + | no-tcp-relay | ||
| + | no-multicast-peers | ||
| + | no-cli | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Le '' | ||
| + | </ | ||
| + | |||
| + | ==== 8.2 Pointer Jitsi vers le TURN/UDP ==== | ||
| + | |||
| + | Vérifier dans ''/ | ||
| + | |||
| + | <code lua> | ||
| + | turncredentials = { | ||
| + | { type = " | ||
| + | { type = " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ouvrir **3478/ | ||
| + | |||
| + | <code bash> | ||
| + | systemctl restart coturn prosody | ||
| + | </ | ||
| + | |||
| + | ===== 9. Redémarrage complet ===== | ||
| + | |||
| + | <code bash> | ||
| + | systemctl restart prosody jicofo jitsi-videobridge2 coturn nginx | ||
| + | systemctl reload caddy | ||
| + | </ | ||
| + | |||
| + | ===== 10. Récapitulatif pare-feu ===== | ||
| + | |||
| + | ^ Port ^ Proto ^ Sens ^ Rôle ^ | ||
| + | | 443 | tcp | Externe → VM | Web + WebSocket (Caddy) | | ||
| + | | 80 | tcp | Externe → VM | ACME / redirection (Caddy) | | ||
| + | | 10000 | udp | Externe → VM | Média JVB (direct) | | ||
| + | | 3478 | udp | Externe → VM | STUN / TURN (relais fallback) | | ||
| + | |||
| + | ===== 11. Checklist de test de bout en bout ===== | ||
| + | |||
| + | - [ ] **DNS** : '' | ||
| + | - [ ] **HTTPS** : la page d' | ||
| + | - [ ] **Création de salle** : créer une réunion, la page se charge, caméra/ | ||
| + | - [ ] **Test à 2 participants** sur réseaux différents (ex. un en 4G, un en fibre) → audio + vidéo OK dans les deux sens. | ||
| + | - [ ] **Test NAT restrictif** : un participant sur réseau d' | ||
| + | - [ ] **Partage d' | ||
| + | - [ ] **Invité sans compte** : ouvrir le lien en navigation privée → accès direct sans login. | ||
| + | - [ ] **Vérif média** : sur '' | ||
| + | |||
| + | <note tip> | ||
| + | Pour diagnostiquer un problème "je vois mais pas de son" : ouvrir les stats de connexion dans Jitsi (icône '' | ||
| + | </ | ||
| + | |||
| + | ===== 12. Vérification des logs ===== | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -u jitsi-videobridge2 -f # média | ||
| + | journalctl -u jicofo -f # orchestration des conférences | ||
| + | journalctl -u prosody | ||
| + | journalctl | ||
| + | journalctl -u caddy -f # reverse proxy / TLS | ||
| + | </ | ||
| + | |||
| + | ===== 13. Restreindre la création de réunions (secure domain) ===== | ||
| + | |||
| + | Objectif : seuls les **hôtes authentifiés** peuvent créer une réunion. Les invités rejoignent librement une salle **déjà ouverte** par un hôte, sans compte. | ||
| + | |||
| + | **Comportement :** | ||
| + | * Un invité qui tente de créer une salle → écran « en attente de l' | ||
| + | * Un hôte se connecte (login/mot de passe) → la salle s' | ||
| + | |||
| + | ==== 13.1 Prosody ==== | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | Le VirtualHost principal passe en authentification interne : | ||
| + | |||
| + | <code lua> | ||
| + | VirtualHost " | ||
| + | authentication = " | ||
| + | </ | ||
| + | |||
| + | Ajouter un VirtualHost anonyme pour les invités (à créer s'il n' | ||
| + | |||
| + | <code lua> | ||
| + | VirtualHost " | ||
| + | authentication = " | ||
| + | c2s_require_encryption = false | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | '' | ||
| + | </ | ||
| + | |||
| + | ==== 13.2 Jicofo ==== | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | < | ||
| + | jicofo { | ||
| + | authentication { | ||
| + | enabled = true | ||
| + | type = XMPP | ||
| + | login-url = " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== 13.3 Config web ==== | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | <code javascript> | ||
| + | var config = { | ||
| + | hosts: { | ||
| + | domain: ' | ||
| + | anonymousdomain: | ||
| + | // ... | ||
| + | }, | ||
| + | // ... | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | ==== 13.4 Créer les comptes hôtes ==== | ||
| + | |||
| + | <code bash> | ||
| + | prosodyctl register vincent meet.makeitsimple.be < | ||
| + | </ | ||
| + | |||
| + | * Un hôte = un compte. | ||
| + | * Révoquer un hôte : '' | ||
| + | * Changer un mot de passe : '' | ||
| + | |||
| + | ==== 13.5 Redémarrer ==== | ||
| + | |||
| + | <code bash> | ||
| + | systemctl restart prosody jicofo jitsi-videobridge2 | ||
| + | </ | ||
| + | |||
| + | ==== 13.6 Test ==== | ||
| + | |||
| + | - [ ] En navigation privée (non authentifié), | ||
| + | - [ ] Se connecter avec un compte hôte → la salle s' | ||
| + | - [ ] Un second onglet anonyme rejoint la salle ouverte → accès direct sans login. | ||
| + | |||
| + | ===== 14. Cacher le formulaire de la page d' | ||
| + | |||
| + | Objectif : sur la racine '' | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | <code javascript> | ||
| + | // Masque la zone de saisie / le bouton de création sur la page d' | ||
| + | enableWelcomePage: | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | |||
| + | <note tip> | ||
| + | Variante douce si tu veux garder une page d' | ||
| + | </ | ||
| + | |||
| + | Rediriger éventuellement la racine vers ta vitrine (au niveau Caddy) si tu veux que ''/'' | ||
| + | |||
| + | < | ||
| + | meet.makeitsimple.be { | ||
| + | @root path / | ||
| + | redir @root https:// | ||
| + | |||
| + | handle { | ||
| + | reverse_proxy 127.0.0.1: | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Aucun redémarrage de service nécessaire pour '' | ||
| + | |||
| + | <code bash> | ||
| + | systemctl reload caddy | ||
| + | </ | ||
| + | |||
| + | ===== 15. Personnalisation (logo, taille, favicon, nom) ===== | ||
| + | |||
| + | ==== 15.1 Remplacer le logo (watermark en haut à gauche) ==== | ||
| + | |||
| + | Par défaut Jitsi utilise ''/ | ||
| + | |||
| + | <code bash> | ||
| + | # Sauvegarde de l' | ||
| + | cp / | ||
| + | # Déployer le logo (garder une copie source HORS du dossier packagé, cf. 15.5) | ||
| + | cp / | ||
| + | </ | ||
| + | |||
| + | ==== 15.2 Lien, affichage et logo par défaut ==== | ||
| + | |||
| + | Éditer ''/ | ||
| + | |||
| + | <code javascript> | ||
| + | var interfaceConfig = { | ||
| + | JITSI_WATERMARK_LINK: | ||
| + | SHOW_JITSI_WATERMARK: | ||
| + | DEFAULT_LOGO_URL: | ||
| + | DEFAULT_WELCOME_PAGE_LOGO_URL: | ||
| + | // ... | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | ==== 15.3 Modifier la taille du logo ==== | ||
| + | |||
| + | La taille du watermark est **contrôlée en CSS**, pas par les dimensions du fichier image. Le watermark est affiché par la classe '' | ||
| + | |||
| + | Créer un CSS de surcharge, ex. ''/ | ||
| + | |||
| + | <code css> | ||
| + | .watermark.leftwatermark { | ||
| + | width: 160px !important; | ||
| + | height: 60px !important; | ||
| + | background-size: | ||
| + | background-repeat: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Puis référencer ce CSS dans ''/ | ||
| + | |||
| + | <code html> | ||
| + | <link rel=" | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Ajuster '' | ||
| + | </ | ||
| + | |||
| + | ==== 15.4 Favicon, nom de l' | ||
| + | |||
| + | Dans '' | ||
| + | |||
| + | <code javascript> | ||
| + | APP_NAME: 'Make IT Simple Meet', | ||
| + | NATIVE_APP_NAME: | ||
| + | PROVIDER_NAME: | ||
| + | </ | ||
| + | |||
| + | Favicon : remplacer ''/ | ||
| + | |||
| + | <code bash> | ||
| + | cp / | ||
| + | </ | ||
| + | |||
| + | ==== 15.5 Préserver la personnalisation aux mises à jour ==== | ||
| + | |||
| + | <note warning> | ||
| + | '' | ||
| + | </ | ||
| + | |||
| + | Garder les sources de branding dans un dossier dédié (idéalement versionné en git) : | ||
| + | |||
| + | < | ||
| + | / | ||
| + | ├── watermark.svg | ||
| + | ├── favicon.ico | ||
| + | ├── custom.css | ||
| + | └── redeploy.sh | ||
| + | </ | ||
| + | |||
| + | Script ''/ | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -e | ||
| + | DST=/ | ||
| + | cp / | ||
| + | cp / | ||
| + | cp / | ||
| + | |||
| + | # Ré-injecter le lien CSS dans base.html s'il a été écrasé | ||
| + | grep -q ' | ||
| + | sed -i ' | ||
| + | |||
| + | echo " | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | chmod +x / | ||
| + | # À relancer après chaque mise à jour de jitsi-meet-web | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | Aucun redémarrage de service : les fichiers sont statiques (servis par nginx → Caddy) et rechargés côté navigateur. Vider le cache pour tester. | ||
| + | </ | ||
| + | ===== Notes de maintenance ===== | ||
| + | * **TURN** : configuration en TURN/UDP sans TLS (section 8) → **aucun certificat coturn à gérer ni à renouveler**. Si un client tombe sur un firewall corporate bloquant l'UDP, prévoir l' | ||
| + | * **Personnalisation** : après chaque '' | ||
| + | * **Montée en charge** : au-delà de ~20–25 participants simultanés sur une salle, envisager un JVB supplémentaire (scaling horizontal). | ||
| + | * **Mises à jour** : '' | ||
linux/jitsi.1628884725.txt.gz · Dernière modification : (modification externe)
