Self-hosting9 min de lecture

Héberger Jitsi sur votre propre VPS

Jitsi Meet est une solution de visioconférence open source qui fonctionne directement dans le navigateur, sans installation côté participant. L'auto-héberger sur un VPS vous donne des salles sans limite, sans limite de durée ni collecte de données. Le déploiement est rapide — la configuration du serveur TURN (coturn), elle, est ce qui fait échouer la plupart des installations : sans lui, la vidéo passe en réseau local mais s'arrête dès qu'un participant est derrière un NAT d'entreprise ou un opérateur en CGN. Ce guide couvre l'installation complète, la config coturn et le dépannage des erreurs les plus fréquentes.

Jitsi self-hosted vs Zoom : ce qui change vraiment

Les services de visioconférence grand public (Zoom, Google Meet, Teams) imposent des limites de durée sur les plans gratuits, des quotas de participants, et conservent vos enregistrements sur leurs serveurs. Jitsi Meet, auto-hébergé, supprime ces contraintes : salles sans limite, durée sans limite, aucun compte requis pour rejoindre une réunion, flux vidéo qui restent sur votre infrastructure. C'est particulièrement pertinent pour une organisation soucieuse de la confidentialité de ses réunions, pour un cabinet qui traite des données sensibles, ou pour intégrer la visio dans une application tierce (Jitsi propose une API iframe stable). Le coût de fonctionnement se résume à la facture du VPS — aucun abonnement par siège, aucun surcoût logiciel.

Bénéfices concrets d'un Jitsi auto-hébergé

  • Réunions sans limite de durée ni de nombre de salles — aucun minuteur qui coupe la réunion.
  • Aucun compte requis pour les participants : un lien suffit pour rejoindre.
  • API iframe pour intégrer la visio directement dans votre application ou votre site.
  • Chiffrement du transport (DTLS-SRTP) et contrôle total sur les éventuels enregistrements.
  • Personnalisation complète de l'interface : logo, couleurs, nom de domaine des salles.
  • Aucune télémétrie envoyée à un tiers — les flux vidéo ne quittent pas votre VPS.

Prérequis chiffrés avant de commencer

Jitsi est dimensionné par la bande passante, pas par le CPU. Pour des réunions jusqu'à 10 participants : 2 vCPU, 4 Go de RAM minimum, trafic sortant généreux (100 Mbps conseillés). Au-delà de 20 participants simultanés, comptez 8 Go de RAM et surveillez la charge réseau du JVB. Trois ports doivent être joignables depuis internet : TCP 443 (HTTPS et TURN/TLS), TCP 80 (renouvellement Let's Encrypt), UDP 10000 (média JVB). Ajoutez TCP 3478 si vous exposez coturn sur son port natif. Il faut Docker 24+ et Compose V2, un nom de domaine meet.votredomaine.com avec un enregistrement A pointant vers l'IP publique du VPS, et une IP publique dédiée et stable — une IP partagée complique sérieusement la config coturn.

Déploiement pas à pas : Docker, .env, coturn et premier test

01

Récupérer docker-jitsi-meet

Clonez le dépôt officiel : git clone https://github.com/jitsi/docker-jitsi-meet. Copiez env.example vers .env, puis exécutez ./gen-passwords.sh — ce script génère tous les secrets internes (Prosody, Jicofo, JVB). Ne sautez pas cette étape : les valeurs par défaut ne sont pas des secrets.

02

Configurer PUBLIC_URL et DOCKER_HOST_ADDRESS

Dans .env, deux variables sont critiques : PUBLIC_URL=https://meet.votredomaine.com (utilisée par le client web pour construire les URL de salles) et DOCKER_HOST_ADDRESS=<IP_PUBLIQUE_DU_VPS> (l'adresse que le JVB annonce aux clients pour établir la connexion média directe). Sans DOCKER_HOST_ADDRESS, le JVB annonce une adresse interne Docker et aucun client extérieur ne peut l'atteindre.

03

Activer Let's Encrypt dans .env

Ajoutez dans .env : ENABLE_LETSENCRYPT=1, LETSENCRYPT_DOMAIN=meet.votredomaine.com, [email protected]. Vérifiez que le port 80 est bien ouvert avant de démarrer — Let's Encrypt utilise un challenge HTTP-01 qui requiert une réponse sur ce port.

04

Configurer coturn (TURN server)

C'est l'étape que la plupart des guides survolent et qui fait échouer l'installation. Dans .env, activez : ENABLE_TURN=1, TURN_HOST=meet.votredomaine.com, TURN_PORT=443, TURN_TRANSPORT=tls. Le port 443 en TLS permet de traverser les pare-feux les plus restrictifs, qui bloquent les ports non standard mais laissent passer ce qui ressemble à du HTTPS. Ajoutez ensuite dans la section coturn du fichier .env : TURN_CREDENTIALS=un_secret_fort et TURN_TLS_CERT=/etc/letsencrypt/live/meet.votredomaine.com/fullchain.pem, TURN_TLS_KEY=/etc/letsencrypt/live/meet.votredomaine.com/privkey.pem. Si coturn tourne dans un conteneur séparé, montez ces fichiers en volume. Dernier point souvent oublié : coturn bloque par défaut les plages RFC1918 (192.168.x.x, 10.x.x.x, 172.16.x.x). Si votre VPS a une interface réseau interne dans ces plages, ajoutez no-multicast-peers et vérifiez que denied-peer-ip n'inclut pas l'adresse du JVB.

05

Lancer la stack et vérifier le JVB

Exécutez docker compose up -d. Attendez 30 secondes, puis : docker compose logs jvb 2>&1 | grep -E 'register|connected|error'. Vous devez voir une ligne indiquant que le JVB s'est enregistré auprès de Jicofo. Si vous voyez Failed to register ou Connection refused, le Prosody n'est pas encore prêt — relancez après une minute. Vérifiez ensuite que coturn répond : nc -zv meet.votredomaine.com 443 (TCP) et nc -zvu meet.votredomaine.com 10000 (UDP).

06

Premier test vidéo depuis deux réseaux différents

Ouvrez https://meet.votredomaine.com depuis votre poste habituel et depuis un second appareil sur un réseau différent (téléphone en 4G par exemple). Si les deux participants se voient et s'entendent, le TURN fonctionne. Un test depuis deux postes sur le même réseau local ne valide pas coturn — il réussit en pair-à-pair sans jamais solliciter le relais.

Configuration avancée : enregistrement, authentification et limites

Enregistrement des réunions. Jitsi intègre Jibri pour l'enregistrement local ou le streaming RTMP. Jibri requiert un second VPS ou au minimum 4 vCPU supplémentaires, car il capture le rendu navigateur en temps réel. Activez ENABLE_RECORDING=1 dans .env et déployez un conteneur Jibri séparé pointant vers votre Jicofo. Authentification des organisateurs. Par défaut, n'importe qui peut créer une salle. Activez AUTH_TYPE=internal pour exiger un compte côté organisateur tout en laissant les invités rejoindre librement. Créez les comptes hôtes avec docker exec <prosody-container> prosodyctl --config /config/prosody.cfg.lua register admin meet.votredomaine.com motdepasse. Limiter les participants anonymes. Ajoutez ENABLE_LOBBY=1 pour qu'un modérateur valide chaque entrée avant d'accéder à la salle. Combiné à AUTH_TYPE=internal, cela donne un contrôle complet sur qui accède à quoi.

Durcissement : fail2ban sur le service TURN

coturn expose un service accessible depuis internet. Installez fail2ban et créez un filtre sur les tentatives d'authentification TURN échouées : les logs coturn écrivent ERROR: 401, realm à chaque échec. Une jail fail2ban avec maxretry=10 et bantime=600 suffit à décourager les scans automatiques sans impacter vos utilisateurs légitimes. Vérifiez que fail2ban surveille /var/log/coturn.log (chemin par défaut si coturn tourne en natif) ou montez ce fichier depuis le conteneur.

Dépannage : les quatre erreurs les plus fréquentes

Son absent ou vidéo bloquée sur « connecting » — coturn + UDP 10000. C'est la panne la plus fréquente. Vérifiez dans cet ordre : (1) ufw status — les ports TCP 443 et UDP 10000 sont-ils ouverts ? (2) docker compose logs coturn | grep -i error — coturn démarre-t-il sans erreur de certificat ? (3) Depuis une machine externe : curl -v telnet://meet.votredomaine.com:3478 — coturn répond-il ? (4) Dans les logs du navigateur (F12 → Console) : voyez-vous ICE failed ou failed to gather candidates ? Si oui, coturn n'est pas joignable depuis l'extérieur. Comparez TURN_HOST dans .env avec l'IP réelle du VPS. Connexion refusée sur TCP 443. Si le certificat Let's Encrypt n'a pas pu être émis (port 80 fermé lors du premier démarrage), le conteneur web tente de servir en HTTPS avec un certificat auto-signé que le navigateur refuse. Solution : ouvrez le port 80, supprimez le volume ~/.jitsi-meet-cfg/web et relancez docker compose up -d. Partage d'écran refusé par le navigateur. Le partage d'écran exige un contexte sécurisé (HTTPS valide). Si vous voyez getUserMedia is not supported, le certificat est invalide ou le domaine n'est pas en HTTPS. Vérifiez PUBLIC_URL — elle doit commencer par https:// avec un domaine dont le certificat est valide, pas une IP brute. Erreur « ICE failed » persistante malgré coturn opérationnel. Vérifiez la variable DOCKER_HOST_ADDRESS : elle doit contenir l'IP publique du VPS, pas l'IP interne du conteneur Docker (172.17.x.x). Si votre VPS est derrière un NAT cloud (rare mais existant), vous avez besoin de l'IP NAT externe, pas de l'IP de l'interface réseau.

Votre Jitsi est en place — gérez la bande passante

Jitsi fonctionne en mode SFU : le pont vidéo (JVB) relaie chaque flux vers chaque participant, donc la bande passante sortante grimpe proportionnellement au nombre de participants multiplié par le nombre de flux. Pour 10 participants à 720p, comptez 20 à 40 Mbps sortants en continu. Activez lastN=5 (dernières N vidéos actives) pour limiter les flux côté client sur les grosses réunions, et surveillez docker stats jvb pour anticiper la saturation. Au-delà d'une vingtaine de participants simultanés réguliers, déployez plusieurs instances JVB sur des VPS distincts derrière un seul Jicofo : c'est l'architecture de passage à l'échelle horizontale native de Jitsi.

Lancez votre serveur Jitsi sur un VPS Cloud ServOrbit

Un VPS Cloud avec IP publique dédiée, bande passante généreuse et accès root vous permet de déployer Jitsi Meet, coturn et Jibri sans limite de réunion. Vos visioconférences restent sur votre infrastructure.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.