docker.recipes

Jitsi Meet Video Conferencing

advanced

Self-hosted video conferencing with Jitsi Meet, Jicofo, JVB, and Prosody XMPP.

Overview

Jitsi Meet is an open-source video conferencing solution that enables secure, high-quality virtual meetings without requiring user registration or software downloads. Originally developed by Jitsi and now maintained by 8x8, it provides a complete WebRTC-based communication platform that can be self-hosted for full privacy control. The stack consists of four essential components: jitsi-web serves the browser-based meeting interface, Prosody handles XMPP messaging and authentication, Jicofo (Jitsi Conference Focus) manages conference sessions and participant coordination, and JVB (Jitsi Videobridge) routes media streams efficiently between participants. This multi-container deployment creates a production-grade video conferencing infrastructure that rivals commercial solutions like Zoom or Teams. The architecture separates concerns effectively - the web frontend handles user interactions, Prosody manages secure messaging protocols, Jicofo orchestrates meeting logistics, and JVB optimizes bandwidth usage through selective forwarding unit technology. Unlike traditional conferencing systems that route all media through central servers, JVB intelligently forwards only necessary streams to each participant, dramatically reducing server load and improving call quality. Organizations seeking complete control over their communication infrastructure will find this stack invaluable, particularly those in healthcare, government, or finance where data sovereignty is critical. Educational institutions benefit from unlimited meeting duration and participant counts, while development teams appreciate the ability to customize features and integrate with existing authentication systems. The combination eliminates recurring subscription costs while providing enterprise-grade features like recording, screen sharing, and mobile compatibility.

Key Features

  • WebRTC-based real-time communication with automatic codec negotiation and adaptive bitrate streaming
  • Prosody XMPP server integration for secure messaging, presence, and multi-user chat functionality
  • Jicofo conference orchestration with automatic participant load balancing and session management
  • JVB selective forwarding unit technology that reduces bandwidth usage by up to 90% compared to traditional MCUs
  • Built-in screen sharing, virtual backgrounds, and recording capabilities without third-party plugins
  • Guest access support allowing anonymous users to join meetings without account creation
  • JWT authentication integration for enterprise single sign-on and user management systems
  • Multi-language interface support with real-time transcription and closed captioning features

Common Use Cases

  • 1Enterprise organizations replacing Zoom or Teams with self-hosted infrastructure for complete data control
  • 2Healthcare providers conducting HIPAA-compliant telemedicine consultations with encrypted communications
  • 3Educational institutions hosting unlimited-duration classes and webinars without per-user licensing costs
  • 4Government agencies requiring air-gapped video conferencing solutions for classified or sensitive meetings
  • 5Open source communities hosting public meetings and conferences with customizable branding and features
  • 6Development teams integrating video calling capabilities into custom applications via Jitsi's APIs
  • 7Remote teams in privacy-conscious organizations avoiding data sharing with commercial conferencing providers

Prerequisites

  • Minimum 4GB RAM and 2 CPU cores for small deployments (up to 20 participants simultaneously)
  • Port 10000/UDP open for JVB media traffic and port 8080/8443 for web interface access
  • Valid SSL certificate and domain name configured for PUBLIC_URL environment variable
  • Generated authentication passwords using openssl rand -hex 16 for JICOFO_AUTH_PASSWORD and JVB_AUTH_PASSWORD
  • Understanding of XMPP protocols and WebRTC networking for advanced configuration and troubleshooting
  • Firewall configuration allowing UDP traffic on port 10000 and TCP traffic on configured web ports

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 web:
3 image: jitsi/web:latest
4 ports:
5 - "8080:80"
6 - "8443:443"
7 volumes:
8 - web_config:/config:Z
9 - web_crontabs:/var/spool/cron/crontabs:Z
10 - web_transcripts:/usr/share/jitsi-meet/transcripts:Z
11 environment:
12 ENABLE_AUTH: ${ENABLE_AUTH}
13 ENABLE_GUESTS: ${ENABLE_GUESTS}
14 ENABLE_TRANSCRIPTIONS: ${ENABLE_TRANSCRIPTIONS}
15 PUBLIC_URL: ${PUBLIC_URL}
16 TZ: ${TZ}
17 networks:
18 meet.jitsi:
19
20 prosody:
21 image: jitsi/prosody:latest
22 volumes:
23 - prosody_config:/config:Z
24 - prosody_plugins:/prosody-plugins-custom:Z
25 environment:
26 AUTH_TYPE: ${AUTH_TYPE}
27 ENABLE_AUTH: ${ENABLE_AUTH}
28 ENABLE_GUESTS: ${ENABLE_GUESTS}
29 PUBLIC_URL: ${PUBLIC_URL}
30 TZ: ${TZ}
31 networks:
32 meet.jitsi:
33 aliases:
34 - xmpp.meet.jitsi
35
36 jicofo:
37 image: jitsi/jicofo:latest
38 volumes:
39 - jicofo_config:/config:Z
40 environment:
41 AUTH_TYPE: ${AUTH_TYPE}
42 TZ: ${TZ}
43 JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD}
44 depends_on:
45 - prosody
46 networks:
47 meet.jitsi:
48
49 jvb:
50 image: jitsi/jvb:latest
51 ports:
52 - "10000:10000/udp"
53 - "4443:4443"
54 volumes:
55 - jvb_config:/config:Z
56 environment:
57 PUBLIC_URL: ${PUBLIC_URL}
58 TZ: ${TZ}
59 JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD}
60 JVB_PORT: 10000
61 JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302
62 depends_on:
63 - prosody
64 networks:
65 meet.jitsi:
66
67volumes:
68 web_config:
69 web_crontabs:
70 web_transcripts:
71 prosody_config:
72 prosody_plugins:
73 jicofo_config:
74 jvb_config:
75
76networks:
77 meet.jitsi:
78 driver: bridge

.env Template

.env
1# Public URL
2PUBLIC_URL=https://meet.example.com
3
4# Authentication
5ENABLE_AUTH=1
6ENABLE_GUESTS=1
7AUTH_TYPE=internal
8
9# Component Passwords (generate with: openssl rand -hex 16)
10JICOFO_AUTH_PASSWORD=your_jicofo_password
11JVB_AUTH_PASSWORD=your_jvb_password
12
13# Timezone
14TZ=UTC
15
16# Optional Features
17ENABLE_TRANSCRIPTIONS=0

Usage Notes

  1. 1Jitsi Meet at https://meet.example.com
  2. 2Port 10000/UDP required for video
  3. 3Generate passwords with openssl rand -hex 16
  4. 4Use Jitsi official docker-compose for production

Individual Services(4 services)

Copy individual services to mix and match with your existing compose files.

web
web:
  image: jitsi/web:latest
  ports:
    - "8080:80"
    - "8443:443"
  volumes:
    - web_config:/config:Z
    - web_crontabs:/var/spool/cron/crontabs:Z
    - web_transcripts:/usr/share/jitsi-meet/transcripts:Z
  environment:
    ENABLE_AUTH: ${ENABLE_AUTH}
    ENABLE_GUESTS: ${ENABLE_GUESTS}
    ENABLE_TRANSCRIPTIONS: ${ENABLE_TRANSCRIPTIONS}
    PUBLIC_URL: ${PUBLIC_URL}
    TZ: ${TZ}
  networks:
    meet.jitsi: null
prosody
prosody:
  image: jitsi/prosody:latest
  volumes:
    - prosody_config:/config:Z
    - prosody_plugins:/prosody-plugins-custom:Z
  environment:
    AUTH_TYPE: ${AUTH_TYPE}
    ENABLE_AUTH: ${ENABLE_AUTH}
    ENABLE_GUESTS: ${ENABLE_GUESTS}
    PUBLIC_URL: ${PUBLIC_URL}
    TZ: ${TZ}
  networks:
    meet.jitsi:
      aliases:
        - xmpp.meet.jitsi
jicofo
jicofo:
  image: jitsi/jicofo:latest
  volumes:
    - jicofo_config:/config:Z
  environment:
    AUTH_TYPE: ${AUTH_TYPE}
    TZ: ${TZ}
    JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD}
  depends_on:
    - prosody
  networks:
    meet.jitsi: null
jvb
jvb:
  image: jitsi/jvb:latest
  ports:
    - 10000:10000/udp
    - "4443:4443"
  volumes:
    - jvb_config:/config:Z
  environment:
    PUBLIC_URL: ${PUBLIC_URL}
    TZ: ${TZ}
    JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD}
    JVB_PORT: 10000
    JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302
  depends_on:
    - prosody
  networks:
    meet.jitsi: null

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 web:
5 image: jitsi/web:latest
6 ports:
7 - "8080:80"
8 - "8443:443"
9 volumes:
10 - web_config:/config:Z
11 - web_crontabs:/var/spool/cron/crontabs:Z
12 - web_transcripts:/usr/share/jitsi-meet/transcripts:Z
13 environment:
14 ENABLE_AUTH: ${ENABLE_AUTH}
15 ENABLE_GUESTS: ${ENABLE_GUESTS}
16 ENABLE_TRANSCRIPTIONS: ${ENABLE_TRANSCRIPTIONS}
17 PUBLIC_URL: ${PUBLIC_URL}
18 TZ: ${TZ}
19 networks:
20 meet.jitsi:
21
22 prosody:
23 image: jitsi/prosody:latest
24 volumes:
25 - prosody_config:/config:Z
26 - prosody_plugins:/prosody-plugins-custom:Z
27 environment:
28 AUTH_TYPE: ${AUTH_TYPE}
29 ENABLE_AUTH: ${ENABLE_AUTH}
30 ENABLE_GUESTS: ${ENABLE_GUESTS}
31 PUBLIC_URL: ${PUBLIC_URL}
32 TZ: ${TZ}
33 networks:
34 meet.jitsi:
35 aliases:
36 - xmpp.meet.jitsi
37
38 jicofo:
39 image: jitsi/jicofo:latest
40 volumes:
41 - jicofo_config:/config:Z
42 environment:
43 AUTH_TYPE: ${AUTH_TYPE}
44 TZ: ${TZ}
45 JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD}
46 depends_on:
47 - prosody
48 networks:
49 meet.jitsi:
50
51 jvb:
52 image: jitsi/jvb:latest
53 ports:
54 - "10000:10000/udp"
55 - "4443:4443"
56 volumes:
57 - jvb_config:/config:Z
58 environment:
59 PUBLIC_URL: ${PUBLIC_URL}
60 TZ: ${TZ}
61 JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD}
62 JVB_PORT: 10000
63 JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302
64 depends_on:
65 - prosody
66 networks:
67 meet.jitsi:
68
69volumes:
70 web_config:
71 web_crontabs:
72 web_transcripts:
73 prosody_config:
74 prosody_plugins:
75 jicofo_config:
76 jvb_config:
77
78networks:
79 meet.jitsi:
80 driver: bridge
81EOF
82
83# 2. Create the .env file
84cat > .env << 'EOF'
85# Public URL
86PUBLIC_URL=https://meet.example.com
87
88# Authentication
89ENABLE_AUTH=1
90ENABLE_GUESTS=1
91AUTH_TYPE=internal
92
93# Component Passwords (generate with: openssl rand -hex 16)
94JICOFO_AUTH_PASSWORD=your_jicofo_password
95JVB_AUTH_PASSWORD=your_jvb_password
96
97# Timezone
98TZ=UTC
99
100# Optional Features
101ENABLE_TRANSCRIPTIONS=0
102EOF
103
104# 3. Start the services
105docker compose up -d
106
107# 4. View logs
108docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/jitsi-meet-stack/run | bash

Troubleshooting

  • Participants cannot join meetings or see black screens: Verify JVB_STUN_SERVERS are accessible and port 10000/UDP is properly forwarded through firewalls and NAT
  • Authentication failures between Jicofo and Prosody: Ensure JICOFO_AUTH_PASSWORD matches across containers and Prosody has fully initialized before Jicofo starts
  • Audio/video quality issues or frequent disconnections: Check JVB memory allocation and increase container resources, verify network stability between JVB and participants
  • Web interface loads but meetings fail to start: Confirm PUBLIC_URL matches your actual domain and SSL certificates are valid for the configured hostname
  • XMPP connection errors in Prosody logs: Verify prosody container has proper DNS resolution for xmpp.meet.jitsi alias and authentication credentials are correctly configured
  • Recording or transcription features not working: Check web_transcripts volume permissions and ensure ENABLE_TRANSCRIPTIONS is set to 1 in environment variables

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space