Ceci est une ancienne révision du document !
Table des matières
Meet Jitsi dans un Docker et reverse-proxy avec Nginx
Tutoriel en cours d'écriture
Le but ici est d'avoir un container Docker pour Jitsi Meet, et de créer un reverse proxy dans Nginx vers ce container tout en ayant un certificat SSL.
Meet Jitsi sera accessible via l'url visio.mondomaine.org.
Install
Install nginx
apt install nginx
Install Docker
apt-get install ca-certificates curl gnupg install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg |gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Install Certbot
apt install certbot python3-certbot-nginx
Config
Config et démarrage du container de Jitsi
Doc officielle d'install via Docker.
On se place par exemple dans un home dédié à Jitsi, histoire de séparer les choses : /home/jitsi
On télécharge la dernière version, par exemple en ZIP et on décompresse.
Entrer dans le dossier obtenu, par exemple docker-jitsi-meet-stable-9111.
On copie le fichier env.example en .env :
cp env.example .env
Dans ce fichier .env, modifier les valeurs des variables suivantes :
TZ=Europe/Paris PUBLIC_URL=https://visio.mondomaine.org
On génère des passwords forts, qui seront ajoutés dans le fichier .env précédent :
./gen-passwords.sh
On crée le dossier recevant la config de Jitsi (en dehors du container) et tous ses sous-dossiers (remarquer que le dossier est un dossier caché : .jitsi-meet-cfg) :
mkdir -p /home/jitsi/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
Toujours depuis le dossier docker-jitsi-meet-stable-9111, démarrer le container :
docker compose up -d
Création du vhost temporaire
D'abord, on crée un vhost sur le port 80 qui permettra d'initialiser let's encrypt et de récupérer un certificat pour le sous domaine visio.mondomaine.org.
On veut que le certificat soit validé depuis un répertoire exterieur au Docker de Jistsi, on choisit : /var/www/certbot (créer le dossier).
Et pour le moment, on fait pointer le root du vhost sur /var/www/html.
Dans le dossier /etc/nginx/sites-available, créer un fichier visio.mondomaine.org qui contient donc :
server { listen [::]:80; listen 80; server_name visio.mondomaine.org; # Temporaire root /var/www/html; index index.html; location ~ /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/certbot; } }
Activer ce vhost :
ln -s /etc/nginx/sites-available/visio.mondomaine.org /etc/nginx/sites-enabled/visio.mondomaine.org
Rédemarrer nginx :
systemctl restart nginx.service
Création du certificat SSL
D'abord, lancer une demande de certificat automatisée pour générer les fichiers nécessaires : en lançant certbot avec le plugin nginx, cela créera 2 fichiers qui seront à inclure dans tous les les vhosts :
- /etc/letsencrypt/options-ssl-nginx.conf
- /etc/letsencrypt/ssl-dhparams.pem
Attention : en lançant cette commande, annuler le choix d'un vhost, on veut juste que les fichiers ci-dessus soient créés :
certbot --nginx
Lancer ensuite la commande créant les certificats SSL pour notre nom de domaine, en passant par nginx (`–webroot`) mais sans modifier le vhost (`certonly`). On pointe bien vers le dossier spécial configuré dans le vhost pour que certbot fasse sa vérification :
certbot certonly --webroot -w /var/www/certbot -d visio.mondomaine.org
Par ailleurs, il faut rédémarrer nginx lorsqu'un certificat est recréé. Pour ça, on ajoute un “post hook” qui s'éxecute après chaque recréation de certificat.
Aller dans /etc/letsencrypt/renewal-hooks/post et créer le fichier 01-restart-nginx (lui donner les droits 755) avec dedans :
#!/bin/bash
systemctl restart nginx.service
Modification du vhost
On va pouvoir finaliser le vhost pour :
- accepter les requêtes sur le port 443 (SSL)
- rediriger les requêtes sur le port 80 vers le 443
- ajouter les certificats et la config de let's encrypt
- créer des proxies vers le docker Jitsi pour tous les services
Le vhost doit ressembler à ça désormais :
# Port 443 server { # IPv6 then IPv4 listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot server_name visio.mondomaine.org; # For Certbot renew (outside Docker) location ~ /.well-known/acme-challenge/ { allow all; root /var/www/certbot; } # All traffic goes to Docker Jitsi location / { proxy_pass https://localhost:8443; } # For websocket location /xmpp-websocket { proxy_pass https://localhost:8443; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # For websocket too location /colibri-ws { proxy_pass https://localhost:8443; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # SSL ssl_certificate /etc/letsencrypt/live/visio.mondomaine.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/visio.mondomaine.org/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot # Logs access_log /var/log/nginx/visio.mondomaine.org.access.log; error_log /var/log/nginx/visio.mondomaine.org.error.log; } # Port 80 server { # IPv6 then IPv4 listen [::]:80; listen 80; server_name visio.mondomaine.org; # For Certbot renew (outside Docker) location ~ /.well-known/acme-challenge/ { allow all; root /var/www/certbot; } # Redirect to https if ($host = visio.mondomaine.org) { return 301 https://$host$request_uri; } # managed by Certbot # Everything else not expected return 404; # managed by Certbot }
Rédemarrer nginx :
systemctl restart nginx.service
Normalement Jitsi est visible sur https://visio.mondomaine.org.
Installer un Firewall
On utilise ufw :
apt install ufw
On autorise les ports :
ufw allow XXX
Remplacer XXX par :
- 22 (SSH ou autre c'est mieux)
- 80 (http)
- 443 (https)
- 3478 (requêtes vers serveur STUN)
- 5349 (fallback TCP si 10000 UDP est bloqué)
- 10000 (audio / video network)