Zelf een Jitsi-server draaien
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:
- een front-end
- een xmpp-server (prosody)
- een video-bridge (jvb)
- een koppeling tussen/een manager van deelnemers en de video-bridge (jicofo)
- 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}"