Docker et Portainer part 8 – Déployer un jitsi meet avec docker

jitsi meet avec docker

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 » :

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é.

jitsi meet avec docker - charge CPU et RAM

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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.