This guide provides a full Ansible playbook to deploy Jitsi Meet with Docker Compose on Debian 10+, Ubuntu LTS, and RHEL 9+ compatible hosts.
| Attribute | Details |
|---|---|
| License | Apache-2.0 |
| Technical Stack | Lua, JavaScript, Java |
| Docker Images | jitsi/web, jitsi/jvb, jitsi/jicofo, jitsi/prosody |
| Docker Repository | jitsi/docker-jitsi-meet |
- name: Deploy Jitsi Meet
hosts: jitsi-meet
become: true
vars:
app_root: /opt/jitsi-meet
public_url: "https://meet.example.com"
timezone: UTC
enable_letsencrypt: false
letsencrypt_domain: ""
letsencrypt_email: ""
tasks:
- name: Install Docker on Debian/Ubuntu
apt:
name:
- docker.io
- docker-compose-plugin
- git
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install Docker on RHEL family
dnf:
name:
- docker
- docker-compose-plugin
- git
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start Docker
service:
name: docker
state: started
enabled: true
- name: Create application directory
file:
path: "{{ app_root }}"
state: directory
mode: "0755"
- name: Clone Jitsi Meet Docker repository
git:
repo: https://github.com/jitsi/docker-jitsi-meet
dest: "{{ app_root }}/src"
version: stable
- name: Copy environment example file
copy:
src: "{{ app_root }}/src/env.example"
dest: "{{ app_root }}/.env"
remote_src: true
force: false
- name: Generate secure passwords
shell: |
cd {{ app_root }}/src
./gen-passwords.sh
args:
creates: "{{ app_root }}/.env"
- name: Configure environment variables
lineinfile:
path: "{{ app_root }}/.env"
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value }}"
loop:
- { key: 'PUBLIC_URL', value: '{{ public_url }}' }
- { key: 'TZ', value: '{{ timezone }}' }
- { key: 'ENABLE_LETSENCRYPT', value: '{{ enable_letsencrypt | ternary("1", "0") }}' }
when: letsencrypt_domain != ''
- name: Create configuration directories
file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- ~/.jitsi-meet-cfg/web
- ~/.jitsi-meet-cfg/transcripts
- ~/.jitsi-meet-cfg/prosody/config
- ~/.jitsi-meet-cfg/prosody/prosody-plugins-custom
- ~/.jitsi-meet-cfg/jicofo
- ~/.jitsi-meet-cfg/jvb
- name: Copy Docker Compose file
copy:
src: "{{ app_root }}/src/docker-compose.yml"
dest: "{{ app_root }}/docker-compose.yml"
remote_src: true
mode: "0644"
- name: Start Jitsi Meet stack
command: docker compose up -d
args:
chdir: "{{ app_root }}"
- name: Wait for services to be ready
wait_for:
timeout: 30
delegate_to: localhost
[jitsi-meet]
meet.example.com ansible_user=deploy
[jitsi-meet:vars]
ansible_python_interpreter=/usr/bin/python3
# Run the playbook
ansible-playbook -i inventory.ini jitsi-meet.yml
# With extra variables
ansible-playbook -i inventory.ini jitsi-meet.yml \
-e public_url=https://meet.example.com \
-e enable_letsencrypt=true \
-e letsencrypt_domain=meet.example.com \
-e letsencrypt_email=admin@example.com
| Variable | Default | Description |
|---|---|---|
app_root |
/opt/jitsi-meet |
Installation directory |
public_url |
Required | Public URL for your Jitsi instance |
timezone |
UTC |
Server timezone |
enable_letsencrypt |
false |
Enable Let’s Encrypt TLS |
letsencrypt_domain |
"" |
Domain for Let’s Encrypt |
letsencrypt_email |
"" |
Email for Let’s Encrypt |
The official Jitsi Meet Docker deployment uses these images:
| Image | Purpose |
|---|---|
jitsi/web |
Web UI (nginx) |
jitsi/jvb |
Jitsi Videobridge |
jitsi/jicofo |
Conference focus component |
jitsi/prosody |
XMPP server |
jitsi/jigasi |
SIP gateway (optional) |
jitsi/jibri |
Recording/streaming (optional) |
https://<your-domain>:8443 to verify installationjitsi/docker-jitsi-meet repositoryghcr.io/jitsi-meet/jitsi-meetAny questions?
Feel free to contact us. Find all contact information on our contact page.