Doordat Zoom de afgelopen (corona-)tijd erg veel gebruikt is, is gebleken dat er toch wel het e.e.a. niet in orde is met de veiligheid ervan. Ondanks dat Zoom beterschap beloofd heeft en erg hard werkt om alle problemen/lekken op te lossen, kan het geen kwaad om eens naar alternatieven te kijken. Één van deze alternatieven is Jitsi. Er zijn veel publieke servers opgericht, waaronder bijv. die door Jitsi zelf gehost wordt, maar het is ook vrij eenvoudig op er zelf 1 op te tuigen.

De makkelijkste manier is (weer) om dit in een container te proppen, zie hieronder mijn docker-compose file.

Het is handig om te weten dat Jitsi uit een aantal onderdelen bestaat:

  1. een front-end
  2. een xmpp-server (prosody)
  3. een video-bridge (jvb)
  4. een koppeling tussen/een manager van deelnemers en de video-bridge (jicofo)
  5. eventueel nog een sip-server, zodat er ook ingebeld kan worden.

Je kunt eventueel de traefik-settings en -network weg laten, maar dan mis je het handig kunnen benaderen via een subdomein met https. Overigens ga ik proberen nog een aparte Traefik-howto te maken, maar dat kost wat meer tijd.

Behalve onderstaande compose-file, heb je ook nog een .env file nodig. Die knal je in dezelfde folder, in mijn geval is dat ${USERDIR}/docker/jitsi. Een voorbeeld staat hier.

docker-compose.yml

version: '3'

# Network definition
networks:
  # Network for jitsi internal communication
  meet.jitsi:
  # Traefik network
  traefik_proxy:
    external: true
  # Additional non exposed network
  default:
    external: false

services:
  # Frontend
  frontend:
    image: jitsi/web
    ports:
      - '${HTTP_PORT}:80'
    volumes:
      - ${USERDIR}/docker/jitsi/web:/config
      - ${USERDIR}/docker/jitsi/web/letsencrypt:/etc/letsencrypt
      - ${USERDIR}/docker/jitsi/transcripts:/usr/share/jitsi-meet/transcripts
    environment:
      - ENABLE_AUTH
      - ENABLE_GUESTS
      - ENABLE_LETSENCRYPT
      - ENABLE_HTTP_REDIRECT
      - ENABLE_TRANSCRIPTIONS
      - DISABLE_HTTPS
      - JICOFO_AUTH_USER
      - LETSENCRYPT_DOMAIN
      - LETSENCRYPT_EMAIL
      - PUBLIC_URL
      - XMPP_DOMAIN
      - XMPP_AUTH_DOMAIN
      - XMPP_BOSH_URL_BASE
      - XMPP_GUEST_DOMAIN
      - XMPP_MUC_DOMAIN
      - XMPP_RECORDER_DOMAIN
      - ETHERPAD_URL_BASE
      - TZ
      - JIBRI_BREWERY_MUC
      - JIBRI_PENDING_TIMEOUT
      - JIBRI_XMPP_USER
      - JIBRI_XMPP_PASSWORD
      - JIBRI_RECORDER_USER
      - JIBRI_RECORDER_PASSWORD
      - ENABLE_RECORDING
    networks:
      default:
      traefik_proxy:
      meet.jitsi:
        aliases:
          - ${XMPP_DOMAIN}
    labels:
      - "traefik.enable=true"
      - "traefik.backend=jitsi"
      - "traefik.frontend.rule=Host:jitsi.domein.nl"
      - "traefik.docker.network=traefik_proxy"
      - "traefik.port=80"
  # XMPP server
  prosody:
    image: jitsi/prosody
    expose:
      - '5222'
      - '5347'
      - '5280'
    volumes:
      - ${USERDIR}/docker/jitsi/prosody:/config
    environment:
      - AUTH_TYPE
      - ENABLE_AUTH
      - ENABLE_GUESTS
      - 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:
      default:
      meet.jitsi:
        aliases:
          - ${XMPP_SERVER}
    labels:
      - "traefik.enable=false"
  # Focus component
  jicofo:
    image: jitsi/jicofo
    volumes:
      - ${USERDIR}/docker/jitsi/jicofo:/config
    environment:
      - ENABLE_AUTH
      - XMPP_DOMAIN
      - XMPP_AUTH_DOMAIN
      - XMPP_INTERNAL_MUC_DOMAIN
      - XMPP_SERVER
      - JICOFO_COMPONENT_SECRET
      - JICOFO_AUTH_USER
      - JICOFO_AUTH_PASSWORD
      - JICOFO_RESERVATION_REST_BASE_URL
      - JVB_BREWERY_MUC
      - JIGASI_BREWERY_MUC
      - JIBRI_BREWERY_MUC
      - JIBRI_PENDING_TIMEOUT
      - TZ
    depends_on:
      - prosody
    networks:
      default:
      meet.jitsi:
    labels:
      - "traefik.enable=false"
  # Video bridge
  jvb:
    image: jitsi/jvb
    ports:
      - '${JVB_PORT}:${JVB_PORT}/udp'
      - '${JVB_TCP_PORT}:${JVB_TCP_PORT}'
    volumes:
      - ${USERDIR}/docker/jitsi/jvb:/config
    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_STUN_SERVERS
      - JVB_ENABLE_APIS
      - TZ
    depends_on:
      - prosody
    networks:
      default:
      traefik_proxy:
      meet.jitsi:
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_proxy"
      - "traefik.udp.routers.jvb.entrypoints=jvb_udp"
      - "traefik.udp.routers.jvb.service=jvb"
      - "traefik.udp.services.jvp.loadbalancer.server.port=${JVB_PORT}"