Salut à tous, aujourd’hui on continue sur la série des trucs utile à déployer avec docker et portainer (et qui se font bien). Aujourd’hui on va faire un truc qui je pense va voir servir fort beaucoup en 2021 (même si je préférerai le contraire) et on va voir comment déployer un serveur jitsi meet avec docker.
Rappel des articles de la série « Docker et Portainer » :
- Docker et Portainer part 1 – Les conteneurs pour les nuls ;
- Docker et Portainer part 2 – Stack vsftpd mono-image ;
- Docker et Portainer part 3 – Docker Guacamole via une Stack multi-images ;
- Docker et Portainer part 4 – OpenVPN, Network et Splunk ;
- Docker et Portainer part 5 – Customiser un conteneur PHP-FPM ;
- Docker et Portainer part 6 – NextCloud avec Docker, Déployer un « Cloud » personnel ;
- Docker et Portainer part 7 – Mettre à jour Portainer ;
- Docker et Portainer part 8 – Déployer un jitsi meet avec docker ;
- Docker et Portainer part 9 – Monitoring des performances docker avec Splunk.
- Docker et Portainer part 10 – The Hive & Cortex et installation Docker….
JITSI ?
Jitsi est une vieille application « SIP » qui a évoluée pour intégrer la vidéoconférence. Un peu réservée au connaisseurs jusqu’en 2019, elle a étrangement connus une belle croissance en 2020… L’application est libre est le code source d’ailleurs sur github sous licence apache2, même s’il existe une version payante packagée et éditée par la société 8×8.
Bref, c’est plutôt apprécié comme solution dans le milieu, surtout face au MS Teams et autres Zoom dont on ne maitrise pas forcément toujours bien ce qui se passe dedans… Jitsi vous donne l’accès aux sources, du coup : on est plus serein sur ce qui se passe, en contrepartie la qualité audio et vidéo est (je trouve) un peu moindre qu’avec des logiciels éditeurs payant (notamment sur l’écho des micro par exemple), mai globalement ça reste tout à fait utilisable rassurez vous !
Docker meet Jitsi – Jitsi meet docker
Et on y arrive… il y a un joli guide officiel qui est prêt pour le déployer avec docker ici. Pour le coup c’est un des guides docker les plus velus que j’ai vu jusqu’ici. En grattant un peu, j’ai fini pas tomber sur celui de scaleway (l’herbegeur de mon serveur actuel pour info) qui est beaucoup plus épuré et plus compréhensible. Comme d’habitude, je vous renvoi vers mes précédents article sur ces sujet, et je vous donne directement un exemple de docker-compose.yml à déployer ci-dessous.
version: '3'
services:
# Frontend
web:
image: jitsi/web:latest
restart: ${RESTART_POLICY}
expose:
- '${HTTP_PORT}'
- '${HTTPS_PORT}'
volumes:
- ${CONFIG}/web:/config:Z
- ${CONFIG}/web/letsencrypt:/etc/letsencrypt:Z
- ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z
environment:
- ENABLE_LETSENCRYPT
- ENABLE_HTTP_REDIRECT
- DISABLE_HTTPS
- LETSENCRYPT_DOMAIN
- LETSENCRYPT_EMAIL
- PUBLIC_URL
- TZ
- AMPLITUDE_ID
- ANALYTICS_SCRIPT_URLS
- ANALYTICS_WHITELISTED_EVENTS
- BRIDGE_CHANNEL
- BRANDING_DATA_URL
- CALLSTATS_CUSTOM_SCRIPT_URL
- CALLSTATS_ID
- CALLSTATS_SECRET
- CHROME_EXTENSION_BANNER_JSON
- CONFCODE_URL
- CONFIG_BOSH_HOST
- CONFIG_EXTERNAL_CONNECT
- DEPLOYMENTINFO_ENVIRONMENT
- DEPLOYMENTINFO_ENVIRONMENT_TYPE
- DEPLOYMENTINFO_USERREGION
- DIALIN_NUMBERS_URL
- DIALOUT_AUTH_URL
- DIALOUT_CODES_URL
- DROPBOX_APPKEY
- DROPBOX_REDIRECT_URI
- ENABLE_AUDIO_PROCESSING
- ENABLE_AUTH
- ENABLE_CALENDAR
- ENABLE_FILE_RECORDING_SERVICE
- ENABLE_FILE_RECORDING_SERVICE_SHARING
- ENABLE_GUESTS
- ENABLE_IPV6
- ENABLE_LIPSYNC
- ENABLE_NO_AUDIO_DETECTION
- ENABLE_P2P
- ENABLE_PREJOIN_PAGE
- ENABLE_RECORDING
- ENABLE_REMB
- ENABLE_REQUIRE_DISPLAY_NAME
- ENABLE_SIMULCAST
- ENABLE_STATS_ID
- ENABLE_STEREO
- ENABLE_SUBDOMAINS
- ENABLE_TALK_WHILE_MUTED
- ENABLE_TCC
- ENABLE_TRANSCRIPTIONS
- ENABLE_WEBSOCKETS
- ETHERPAD_PUBLIC_URL
- ETHERPAD_URL_BASE
- GOOGLE_ANALYTICS_ID
- GOOGLE_API_APP_CLIENT_ID
- INVITE_SERVICE_URL
- JICOFO_AUTH_USER
- MATOMO_ENDPOINT
- MATOMO_SITE_ID
- MICROSOFT_API_APP_CLIENT_ID
- NGINX_RESOLVER
- PEOPLE_SEARCH_URL
- RESOLUTION
- RESOLUTION_MIN
- RESOLUTION_WIDTH
- RESOLUTION_WIDTH_MIN
- START_AUDIO_ONLY
- START_AUDIO_MUTED
- START_BITRATE
- START_VIDEO_MUTED
- TESTING_CAP_SCREENSHARE_BITRATE
- TESTING_OCTO_PROBABILITY
- XMPP_AUTH_DOMAIN
- XMPP_BOSH_URL_BASE
- XMPP_DOMAIN
- XMPP_GUEST_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_RECORDER_DOMAIN
networks:
custom_net:
ipv4_address: 172.20.42.1
aliases:
- ${XMPP_DOMAIN}
# XMPP server
prosody:
image: jitsi/prosody:latest
restart: ${RESTART_POLICY}
expose:
- '5222'
- '5347'
- '5280'
volumes:
- ${CONFIG}/prosody/config:/config:Z
- ${CONFIG}/prosody/prosody-plugins-custom:/prosody-plugins-custom:Z
environment:
- AUTH_TYPE
- ENABLE_AUTH
- ENABLE_GUESTS
- ENABLE_LOBBY
- GLOBAL_MODULES
- GLOBAL_CONFIG
- LDAP_URL
- LDAP_BASE
- LDAP_BINDDN
- LDAP_BINDPW
- LDAP_FILTER
- LDAP_AUTH_METHOD
- LDAP_VERSION
- LDAP_USE_TLS
- LDAP_TLS_CIPHERS
- LDAP_TLS_CHECK_PEER
- LDAP_TLS_CACERT_FILE
- LDAP_TLS_CACERT_DIR
- LDAP_START_TLS
- XMPP_DOMAIN
- XMPP_AUTH_DOMAIN
- XMPP_GUEST_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_MODULES
- XMPP_MUC_MODULES
- XMPP_INTERNAL_MUC_MODULES
- XMPP_RECORDER_DOMAIN
- JICOFO_COMPONENT_SECRET
- JICOFO_AUTH_USER
- JICOFO_AUTH_PASSWORD
- JVB_AUTH_USER
- JVB_AUTH_PASSWORD
- JIGASI_XMPP_USER
- JIGASI_XMPP_PASSWORD
- JIBRI_XMPP_USER
- JIBRI_XMPP_PASSWORD
- JIBRI_RECORDER_USER
- JIBRI_RECORDER_PASSWORD
- JWT_APP_ID
- JWT_APP_SECRET
- JWT_ACCEPTED_ISSUERS
- JWT_ACCEPTED_AUDIENCES
- JWT_ASAP_KEYSERVER
- JWT_ALLOW_EMPTY
- JWT_AUTH_TYPE
- JWT_TOKEN_AUTH_MODULE
- LOG_LEVEL
- TZ
networks:
custom_net:
ipv4_address: 172.20.42.2
aliases:
- ${XMPP_SERVER}
# Focus component
jicofo:
image: jitsi/jicofo:latest
restart: ${RESTART_POLICY}
volumes:
- ${CONFIG}/jicofo:/config:Z
environment:
- AUTH_TYPE
- ENABLE_AUTH
- XMPP_DOMAIN
- XMPP_AUTH_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_SERVER
- JICOFO_COMPONENT_SECRET
- JICOFO_AUTH_USER
- JICOFO_AUTH_PASSWORD
- JICOFO_RESERVATION_REST_BASE_URL
- JVB_BREWERY_MUC
- JIGASI_BREWERY_MUC
- JIGASI_SIP_URI
- JIBRI_BREWERY_MUC
- JIBRI_PENDING_TIMEOUT
- TZ
depends_on:
- prosody
networks:
custom_net:
ipv4_address: 172.20.42.3
aliases:
- jicofo.meet.jitsi
# Video bridge
jvb:
image: jitsi/jvb:latest
restart: ${RESTART_POLICY}
ports:
- '${JVB_PORT}:${JVB_PORT}/udp'
- '${JVB_TCP_PORT}:${JVB_TCP_PORT}'
volumes:
- ${CONFIG}/jvb:/config:Z
environment:
- DOCKER_HOST_ADDRESS
- XMPP_AUTH_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_SERVER
- JVB_AUTH_USER
- JVB_AUTH_PASSWORD
- JVB_BREWERY_MUC
- JVB_PORT
- JVB_TCP_HARVESTER_DISABLED
- JVB_TCP_PORT
- JVB_TCP_MAPPED_PORT
- JVB_STUN_SERVERS
- JVB_ENABLE_APIS
- JVB_WS_DOMAIN
- JVB_WS_SERVER_ID
- PUBLIC_URL
- TZ
depends_on:
- prosody
networks:
custom_net:
ipv4_address: 172.20.42.4
aliases:
- jvb.meet.jitsi
# Etherpad: real-time collaborative document editing
etherpad:
image: jitsi/etherpad:latest
restart: ${RESTART_POLICY}
networks:
custom_net:
ipv4_address: 172.20.42.5
aliases:
- etherpad.meet.jitsi
# Custom network so all services can communicate using a FQDN
networks:
custom_net:
external:
name: custom_net
Notez que le déploiement ne se fait pas au travers de portainer et qu’il est nécessaire de passer par la ligne de commande et les sources pour gérer les différentes variables dans le fichier (mais vous retrouverez bien ensuite votre stack dans portainer, hein). C’est bien mieux expliqué dans les docs que je vous ai pointé au dessus. Pareil pour la création des utilisateurs ou le changement du logo du serveur (via le reverse proxy Npm par exemple), ça se fait bien en en lisant la doc : vous êtes des grand.e.s garçons/filles ), je vous laisse vous débrouiller avec Google pour ça 🙂 !
Bon voilà, comme vous le voyez il y a quelques images à caler quand même mais en lisant un peu la doc, c’est plutôt clair et ça se fait bien. Notez également que la partie réseau est « importante à comprendre » mais entièrement fonctionnelle derrière le reverse proxy nginx, firewall et ips que j’utilise depuis le début avec le serveur.
Et ça tient la charge un jitsi meet avec docker ?
Étonnamment bien, oui ! Pour rappel mon serveur actuel c’est pas une bête de guerre : 8 CPU, 16Go RAM et 250Go de SSD. C’est bien mais on est pas non plus un tueur professionnel et avec cette petite machine j’ai tapé sans broncher les 16 utilisateurs en vidéo mi-décembre en ne mangeant finalement qu’un peu moins de la moitié des ressource (en gros), sans instabilité des connexions ou de baisse de qualité audio vidéo. Par contre, ça mange de la bande passante réseau hein : on a rapidement des pics à 30-40Mb/s en entrée et en sortie quand tout le monde met la vidéo. Alors pour un serveur en datacenter chez scaleway, ça passe tout seul mais allez pas me mettre ça derrière votre box ADSL à qui plafonne à 8 Mb/s et moins quand le voisin regarde la télé.
Conclusion
Bon voilà, c’est tout pour jitsi meet et docker pour moi. Je vous garanti que ça s’est avéré très très utile pour moi ces derniers mois. Un peu pour du perso avec les copains et les « visio-apéros », un peu pour du pro avec systemesec et puis récemment avec la FFME et ligue Ile de France où j’ai pu faire le test « à balles réelles » à 16 en simultanés. Voilà, c’est cool, moi je suis content et je me suis dis que ça valait le coup de vous partager ça que ça pourrait servir à droite à gauche ou au milieu… Voilà geekez bien avec vos jitsi perso du coup !