Free video calls come with strings attached. Zoom ends your meeting at 40 minutes, Google Meet wants everyone on a Google account, and every call runs through somebody else's servers. Jitsi Meet removes all three problems: it is a fully open-source video conferencing platform you can run on your own Ubuntu 24.04 server, with no accounts required for guests and no artificial time limits.
This guide installs a production-ready Jitsi Meet server with HTTPS, a locked-down firewall, and optional authentication so strangers cannot start meetings on your server.
What you need
- A VPS or home server running Ubuntu 24.04 LTS (2 GB RAM minimum, 4 GB recommended for real meetings)
- A domain or subdomain pointed at your server's public IP, for example
meet.example.com - Sudo access
- Ports 80, 443, and 10000/UDP reachable from the internet
Jitsi's own packages officially support Ubuntu 24.04, so the whole install is apt-based and upgrades arrive like any other package.
Point DNS and set the hostname
Create an A record for your subdomain before touching the server. The installer and Let's Encrypt both need it.
Then set the fully qualified domain name on the server itself:
sudo hostnamectl set-hostname meet.example.com
Add it to /etc/hosts so the machine can resolve itself:
127.0.0.1 localhost
YOUR_SERVER_IP meet.example.com
Verify with ping "$(hostname)" — it should print meet.example.com.
Add the Prosody and Jitsi repositories
Jitsi uses Prosody as its XMPP signaling server, and the Ubuntu repositories ship a version that is too old for features like the lobby. Add both upstream repositories:
sudo apt update
sudo apt install -y apt-transport-https curl gnupg2
sudo add-apt-repository -y universe
# Prosody repository
sudo curl -sL https://prosody.im/files/prosody-debian-packages.key \
-o /usr/share/keyrings/prosody-debian-packages.key
echo "deb [signed-by=/usr/share/keyrings/prosody-debian-packages.key] http://packages.prosody.im/debian $(lsb_release -sc) main" \
| sudo tee /etc/apt/sources.list.d/prosody-debian-packages.list
# Jitsi repository
curl -sL https://download.jitsi.org/jitsi-key.gpg.key \
| sudo sh -c 'gpg --dearmor > /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
sudo apt update
Open the firewall
Jitsi needs web traffic plus one UDP port for the actual audio and video media:
sudo ufw allow 80/tcp # Let's Encrypt verification
sudo ufw allow 443/tcp # Web interface and signaling
sudo ufw allow 10000/udp # Jitsi Videobridge media — the important one
sudo ufw allow 22/tcp # SSH
sudo ufw allow 3478/udp # STUN via coturn
sudo ufw allow 5349/tcp # Media over TCP fallback when UDP is blocked
sudo ufw enable
sudo ufw status verbose
If the server sits behind a home router, forward 443 TCP and 10000 UDP to the server. Nearly every "I can join but nobody can see or hear each other" report comes down to port 10000/UDP being blocked somewhere.
Install Jitsi Meet
sudo apt install -y jitsi-meet
The installer asks two questions:
-
Hostname — enter your FQDN exactly as configured in DNS:
meet.example.com - SSL certificate — choose the Let's Encrypt option. Only pick self-signed for a quick lab test; browsers will warn about it, and the Jitsi mobile apps flat-out refuse to connect with a self-signed certificate.
The installer detects Nginx or Apache and configures the virtual host for you. If you ever need to issue or renew the certificate manually:
sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
Confirm the videobridge is listening for media:
sudo ss -ulpn | grep 10000
You should see a Java process bound to UDP port 10000.
Test with three people, not two
Open https://meet.example.com and start a room. Here is the detail most guides skip: test with three participants. Two-person calls in Jitsi often run peer-to-peer directly between browsers and can work even when the videobridge is unreachable. The moment a third person joins, media switches to the videobridge — so a broken bridge only shows up in three-way calls. If video dies when the third person joins, your firewall or NAT rules for 10000/UDP are wrong.
Stop strangers from starting meetings
By default, anyone who finds your server can create rooms and consume your bandwidth. Lock room creation to registered users while keeping guests able to join:
In /etc/prosody/conf.avail/meet.example.com.cfg.lua, change the main VirtualHost authentication:
VirtualHost "meet.example.com"
authentication = "internal_hashed"
Then add a guest VirtualHost below it:
VirtualHost "guest.meet.example.com"
authentication = "anonymous"
c2s_require_encryption = false
Tell jicofo to require authentication. In /etc/jitsi/jicofo/jicofo.conf, add inside the top-level jicofo { ... } block:
jicofo {
authentication {
enabled = true
type = XMPP
login-url = "meet.example.com"
}
}
Finally, point the web frontend at the guest domain. In /etc/jitsi/meet/meet.example.com-config.js, add anonymousdomain to the hosts section:
var config = {
hosts: {
domain: 'meet.example.com',
anonymousdomain: 'guest.meet.example.com',
// ...
},
};
Then create your moderator account and restart everything:
sudo prosodyctl register admin meet.example.com 'a-strong-password'
sudo systemctl restart prosody jicofo jitsi-videobridge2
Now only you can create rooms; anyone with the link can still join as a guest.
Running behind NAT
Two-way calls work but three-way calls fail on a home server? Tell the videobridge its public IP explicitly in /etc/jitsi/videobridge/jvb.conf:
ice4j {
harvest {
mapping {
static-mappings = [
{
local-address = "192.168.1.50"
public-address = "YOUR_PUBLIC_IP"
}
]
}
}
}
Restart with sudo systemctl restart jitsi-videobridge2.
When something breaks, read these logs
-
/var/log/jitsi/jvb.log— media and videobridge issues -
/var/log/jitsi/jicofo.log— conference focus and room management -
/var/log/prosody/prosody.log— authentication and signaling
Planning meetings over 100 participants? Raise the systemd defaults in /etc/systemd/system.conf (DefaultLimitNOFILE=65000, DefaultLimitNPROC=65000, DefaultTasksMax=65000), then sudo systemctl daemon-reload and restart the videobridge.
The payoff
You now have a video conferencing service with no meeting time limits, no forced accounts for guests, encrypted media on infrastructure you control, and upgrades through plain apt. Pair it with the other pieces of a self-hosted stack — your own file sharing with Filux, photos with Nextcloud or Immich, and a proper 3-2-1 backup strategy — and the subscription pile shrinks one service further.
Top comments (0)