docker.recipes

Jitsi Meet Video Conferencing

advanced

Self-hosted video conferencing with Jitsi Meet, Jibri recording, and Jigasi.

Overview

Jitsi Meet is an open-source video conferencing platform that provides secure, browser-based communication without requiring user registration or software downloads. Originally developed by Emil Ivov and later acquired by 8x8, Jitsi has become a leading alternative to commercial video conferencing solutions, offering end-to-end encryption and complete control over data privacy. The platform leverages WebRTC technology to deliver high-quality audio and video directly through web browsers, making it accessible across all major operating systems and devices. This comprehensive Jitsi stack combines five essential components that work together to create a complete video conferencing infrastructure. The jitsi-web container serves the web interface and client application, while Prosody acts as the XMPP server handling user authentication and messaging. Jicofo (JItsi COnference FOcus) manages conference sessions and participant coordination, JVB (Jitsi Videobridge) handles the actual media routing and streaming, and Jibri provides recording and live streaming capabilities to external platforms like YouTube or file storage. This deployment is ideal for organizations requiring complete control over their video conferencing infrastructure, including educational institutions conducting remote learning, healthcare providers needing HIPAA-compliant communication, and enterprises with strict data sovereignty requirements. The inclusion of Jibri recording capabilities makes it particularly valuable for businesses needing to archive meetings for compliance or training purposes, while the Prosody XMPP server enables custom authentication integration with existing enterprise systems.

Key Features

  • WebRTC-based peer-to-peer video conferencing with automatic quality adaptation based on network conditions
  • Jibri integration for recording meetings to local storage and live streaming to YouTube, Facebook, or custom RTMP endpoints
  • Prosody XMPP server with internal authentication and support for LDAP, JWT, and SAML integration
  • JVB media routing with support for simulcast, VP8/VP9 video codecs, and Opus audio encoding
  • Jicofo conference management with automatic load balancing across multiple JVB instances
  • Built-in screen sharing, chat messaging, and whiteboard collaboration tools
  • End-to-end encryption support with configurable security policies and lobby mode
  • REST API access for programmatic room creation, participant management, and recording control

Common Use Cases

  • 1Enterprise video conferencing with meeting recording for compliance and training documentation
  • 2Educational institutions hosting virtual classrooms with lecture recording and screen sharing capabilities
  • 3Healthcare organizations requiring HIPAA-compliant video consultations with encrypted communication
  • 4Government agencies needing self-hosted communication platforms with complete data sovereignty control
  • 5Software development teams conducting daily standups, code reviews, and sprint planning meetings
  • 6Event organizers hosting virtual conferences with live streaming to social media platforms
  • 7Customer support teams providing face-to-face technical assistance with screen sharing functionality

Prerequisites

  • Minimum 4GB RAM and 2 CPU cores for basic deployment, 8GB+ for recording with Jibri
  • UDP port 10000 open on firewall for JVB media traffic and TCP ports 80/443 for web access
  • Valid SSL certificate for production deployment (Let's Encrypt integration available)
  • TURN server configuration for participants behind restrictive NATs or corporate firewalls
  • Docker host with sufficient /dev/shm space (2GB+) for Jibri Chrome browser instances
  • Domain name with proper DNS A records pointing to your server's public IP address

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 - "8443:443"
6 - "8080:80"
7 environment:
8 - ENABLE_LETSENCRYPT=0
9 - PUBLIC_URL=https://localhost:8443
10 - TZ=UTC
11 volumes:
12 - ./web:/config
13 - ./transcripts:/usr/share/jitsi-meet/transcripts
14 networks:
15 jitsi:
16 aliases:
17 - meet.jitsi
18
19 prosody:
20 image: jitsi/prosody:latest
21 environment:
22 - ENABLE_AUTH=1
23 - AUTH_TYPE=internal
24 - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
25 - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
26 - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
27 volumes:
28 - ./prosody/config:/config
29 - ./prosody/prosody-plugins-custom:/prosody-plugins-custom
30 networks:
31 jitsi:
32 aliases:
33 - xmpp.meet.jitsi
34
35 jicofo:
36 image: jitsi/jicofo:latest
37 environment:
38 - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
39 - TZ=UTC
40 volumes:
41 - ./jicofo:/config
42 depends_on:
43 - prosody
44 networks:
45 - jitsi
46
47 jvb:
48 image: jitsi/jvb:latest
49 ports:
50 - "10000:10000/udp"
51 environment:
52 - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
53 - JVB_PORT=10000
54 - JVB_TCP_PORT=4443
55 - TZ=UTC
56 volumes:
57 - ./jvb:/config
58 depends_on:
59 - prosody
60 networks:
61 - jitsi
62
63 jibri:
64 image: jitsi/jibri:latest
65 cap_add:
66 - SYS_ADMIN
67 environment:
68 - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
69 - DISPLAY=:0
70 volumes:
71 - ./jibri:/config
72 - /dev/shm:/dev/shm
73 - ./recordings:/recordings
74 depends_on:
75 - jicofo
76 networks:
77 - jitsi
78
79volumes:
80 web:
81 prosody:
82 jicofo:
83 jvb:
84 jibri:
85
86networks:
87 jitsi:

.env Template

.env
1# Jitsi Meet
2JICOFO_PASSWORD=secure_jicofo_password
3JVB_PASSWORD=secure_jvb_password
4JIBRI_PASSWORD=secure_jibri_password
5
6# Jitsi at https://localhost:8443
7# UDP 10000 for video bridge

Usage Notes

  1. 1Jitsi at https://localhost:8443
  2. 2Jibri for recording/streaming
  3. 3UDP port 10000 required for video
  4. 4Configure TURN server for NAT
  5. 5Internal auth by default

Individual Services(5 services)

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

web
web:
  image: jitsi/web:latest
  ports:
    - "8443:443"
    - "8080:80"
  environment:
    - ENABLE_LETSENCRYPT=0
    - PUBLIC_URL=https://localhost:8443
    - TZ=UTC
  volumes:
    - ./web:/config
    - ./transcripts:/usr/share/jitsi-meet/transcripts
  networks:
    jitsi:
      aliases:
        - meet.jitsi
prosody
prosody:
  image: jitsi/prosody:latest
  environment:
    - ENABLE_AUTH=1
    - AUTH_TYPE=internal
    - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
    - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
    - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
  volumes:
    - ./prosody/config:/config
    - ./prosody/prosody-plugins-custom:/prosody-plugins-custom
  networks:
    jitsi:
      aliases:
        - xmpp.meet.jitsi
jicofo
jicofo:
  image: jitsi/jicofo:latest
  environment:
    - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
    - TZ=UTC
  volumes:
    - ./jicofo:/config
  depends_on:
    - prosody
  networks:
    - jitsi
jvb
jvb:
  image: jitsi/jvb:latest
  ports:
    - 10000:10000/udp
  environment:
    - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
    - JVB_PORT=10000
    - JVB_TCP_PORT=4443
    - TZ=UTC
  volumes:
    - ./jvb:/config
  depends_on:
    - prosody
  networks:
    - jitsi
jibri
jibri:
  image: jitsi/jibri:latest
  cap_add:
    - SYS_ADMIN
  environment:
    - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
    - DISPLAY=:0
  volumes:
    - ./jibri:/config
    - /dev/shm:/dev/shm
    - ./recordings:/recordings
  depends_on:
    - jicofo
  networks:
    - jitsi

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 - "8443:443"
8 - "8080:80"
9 environment:
10 - ENABLE_LETSENCRYPT=0
11 - PUBLIC_URL=https://localhost:8443
12 - TZ=UTC
13 volumes:
14 - ./web:/config
15 - ./transcripts:/usr/share/jitsi-meet/transcripts
16 networks:
17 jitsi:
18 aliases:
19 - meet.jitsi
20
21 prosody:
22 image: jitsi/prosody:latest
23 environment:
24 - ENABLE_AUTH=1
25 - AUTH_TYPE=internal
26 - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
27 - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
28 - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
29 volumes:
30 - ./prosody/config:/config
31 - ./prosody/prosody-plugins-custom:/prosody-plugins-custom
32 networks:
33 jitsi:
34 aliases:
35 - xmpp.meet.jitsi
36
37 jicofo:
38 image: jitsi/jicofo:latest
39 environment:
40 - JICOFO_AUTH_PASSWORD=${JICOFO_PASSWORD}
41 - TZ=UTC
42 volumes:
43 - ./jicofo:/config
44 depends_on:
45 - prosody
46 networks:
47 - jitsi
48
49 jvb:
50 image: jitsi/jvb:latest
51 ports:
52 - "10000:10000/udp"
53 environment:
54 - JVB_AUTH_PASSWORD=${JVB_PASSWORD}
55 - JVB_PORT=10000
56 - JVB_TCP_PORT=4443
57 - TZ=UTC
58 volumes:
59 - ./jvb:/config
60 depends_on:
61 - prosody
62 networks:
63 - jitsi
64
65 jibri:
66 image: jitsi/jibri:latest
67 cap_add:
68 - SYS_ADMIN
69 environment:
70 - JIBRI_RECORDER_PASSWORD=${JIBRI_PASSWORD}
71 - DISPLAY=:0
72 volumes:
73 - ./jibri:/config
74 - /dev/shm:/dev/shm
75 - ./recordings:/recordings
76 depends_on:
77 - jicofo
78 networks:
79 - jitsi
80
81volumes:
82 web:
83 prosody:
84 jicofo:
85 jvb:
86 jibri:
87
88networks:
89 jitsi:
90EOF
91
92# 2. Create the .env file
93cat > .env << 'EOF'
94# Jitsi Meet
95JICOFO_PASSWORD=secure_jicofo_password
96JVB_PASSWORD=secure_jvb_password
97JIBRI_PASSWORD=secure_jibri_password
98
99# Jitsi at https://localhost:8443
100# UDP 10000 for video bridge
101EOF
102
103# 3. Start the services
104docker compose up -d
105
106# 4. View logs
107docker 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-complete/run | bash

Troubleshooting

  • Participants can't join meetings: Verify UDP port 10000 is open and accessible from external networks
  • Jibri recording fails with Chrome crashes: Increase /dev/shm size to at least 2GB and ensure SYS_ADMIN capability
  • Audio/video quality issues: Configure TURN server settings and check bandwidth between JVB and participants
  • Prosody authentication errors: Verify JICOFO_PASSWORD and JVB_PASSWORD match across all service configurations
  • Web interface shows 'connection failed': Check that prosody container is healthy and XMPP domain resolution works
  • Recordings have no audio: Ensure PulseAudio is properly configured in Jibri container and ALSA devices are accessible

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