Jitsi Meet Video Conference Integration
This integration connects your Vodia PBX with a self-hosted Jitsi Meet server, enabling one-click video conferencing directly from the web portal. Conferences are secured with JWT authentication — moderators receive a signed token while guests join via a shared link. Room names are generated automatically using the extension number and a random hash to prevent unauthorized access.
Enhance your experience by using this integration with our web portal features.
How It Works
- A user right-clicks an extension in the web portal and selects Video Conference (Jitsi)
- The PBX backend generates a JWT-authenticated moderator URL and an unauthenticated guest URL
- The moderator's browser opens the Jitsi conference room automatically
- The invited user receives a notification with the guest link to join the room
- When all participants leave, the Jitsi room is automatically destroyed (rooms are ephemeral)
Requirements
Jitsi Meet Server
- Ubuntu 24.04 LTS server (dedicated or virtual)
- DNS A record pointing to the server's public IP
- Firewall ports open: 80/TCP, 443/TCP, 10000/UDP
- Minimum 2 CPU cores and 4 GB RAM recommended
Vodia PBX
- Vodia PBX with integration plugin support
- Admin access to the tenant settings
Part 1: Jitsi Meet Server Setup
This section walks through installing Jitsi Meet with JWT authentication on a fresh Ubuntu 24.04 server. The example uses meet.example.com — replace this with your actual domain throughout.
Step 1 — Prepare the Server
Set the hostname and update the system:
sudo hostnamectl set-hostname meet.example.com
echo "127.0.0.1 meet.example.com" | sudo tee -a /etc/hosts
sudo apt update && sudo apt upgrade -y
Step 2 — Install Dependencies
Install the required packages for Jitsi and JWT authentication:
sudo apt install -y apt-transport-https curl gnupg2 lua5.4 liblua5.4-dev libssl-dev luarocks
Set Lua 5.4 as the default version (required by Prosody):
sudo update-alternatives --install /usr/bin/lua lua-interpreter /usr/bin/lua5.4 100
sudo update-alternatives --set lua-interpreter /usr/bin/lua5.4
sudo update-alternatives --install /usr/bin/luac lua-compiler /usr/bin/luac5.4 100
sudo update-alternatives --set lua-compiler /usr/bin/luac5.4
Do not remove lua5.1 — it breaks the alternatives system. Setting lua5.4 as preferred is sufficient.
Verify with lua -v — it should show Lua 5.4.x.
Step 3 — Add Package Repositories
Add the Prosody repository:
curl -fsSL https://prosody.im/files/prosody-debian-packages.key | sudo gpg --dearmor -o /etc/apt/keyrings/prosody-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/prosody-keyring.gpg] http://packages.prosody.im/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/prosody.list
If you get a GPG key error during apt update, the Prosody key may have changed. Try fetching it from a keyserver instead:
sudo gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys F7A37EB33D0B25D7
sudo gpg --export F7A37EB33D0B25D7 | sudo tee /etc/apt/keyrings/prosody-keyring.gpg > /dev/null
Add the Jitsi repository:
curl -sL https://download.jitsi.org/jitsi-key.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/jitsi-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/" | sudo tee /etc/apt/sources.list.d/jitsi-stable.list
Step 4 — Install Jitsi Meet
sudo apt update
sudo apt install -y jitsi-meet
When prompted during installation:
- Hostname: Enter your domain (e.g.,
meet.example.com) - SSL certificate: Select "Let's Encrypt certificates" and enter your email address
If dpkg errors occur (e.g., Lua version issues), run sudo dpkg --configure -a and retry.
Verify Prosody is running:
sudo systemctl status prosody
At this point, open https://meet.example.com in your browser to confirm Jitsi is working with open access (no authentication yet).
Step 5 — Install JWT Dependencies
sudo luarocks --lua-version=5.4 install luajwtjitsi
sudo luarocks --lua-version=5.4 install inspect
Step 6 — Generate a JWT Secret
Generate a secure secret and save it — you will need it for both the Prosody config and the Vodia PBX integration settings:
openssl rand -hex 32
Example output: 0b9780402cc144544e74ab27e0700f3b051dbb691907668b5807af5244e61b2f
Step 7 — Configure Prosody for JWT Authentication
Back up the original config:
sudo cp /etc/prosody/conf.avail/meet.example.com.cfg.lua /etc/prosody/conf.avail/meet.example.com.cfg.lua.bak
Edit the Prosody configuration:
sudo nano /etc/prosody/conf.avail/meet.example.com.cfg.lua
Make the following changes to the file:
Main VirtualHost — change authentication to token and add JWT settings:
VirtualHost "meet.example.com"
authentication = "token"
app_id = "vodia"
app_secret = "YOUR_SECRET_FROM_STEP_6"
allow_empty_token = false
MUC component — add restrict_room_creation to prevent unauthenticated room creation:
Component "conference.meet.example.com" "muc"
restrict_room_creation = true
Do not add token_verification to the MUC modules_enabled list. This would block anonymous guests from joining existing rooms.
Guest VirtualHost — add this at the end of the file to allow anonymous guest access:
VirtualHost "guest.meet.example.com"
authentication = "anonymous"
c2s_require_encryption = false
See the Full Prosody Configuration section at the end of this page for a complete reference file.
Step 8 — Configure Jitsi Meet for Guest Access
Edit the Jitsi Meet JavaScript configuration:
sudo nano /etc/jitsi/meet/meet.example.com-config.js
Find the hosts: block and add the anonymousdomain line:
hosts: {
domain: 'meet.example.com',
anonymousdomain: 'guest.meet.example.com',
// ... other settings
}
Optionally, disable the welcome page to prevent users from creating random rooms:
enableWelcomePage: false,
Step 9 — Configure Jicofo for Authentication
Edit the Jicofo configuration:
sudo nano /etc/jitsi/jicofo/jicofo.conf
Set the authentication block and ensure the focus user password is configured:
jicofo {
authentication: {
enabled = true
type = XMPP
login-url = "meet.example.com"
}
xmpp: {
client: {
client-proxy: "focus.meet.example.com"
xmpp-domain: "meet.example.com"
domain: "auth.meet.example.com"
username: "focus"
password: "YOUR_JICOFO_PASSWORD"
}
trusted-domains: [ "recorder.meet.example.com" ]
}
bridge: {
brewery-jid: "JvbBrewery@internal.auth.meet.example.com"
}
}
Choose a secure password for YOUR_JICOFO_PASSWORD — you will register it with Prosody in the next step.