DEV Community

Cover image for How to Install Jitsi Meet on Ubuntu 24.04: Self-Hosted Video Calls
FlatlinerAtheist | CLI-NERDS
FlatlinerAtheist | CLI-NERDS

Posted on Originally published at clinerds.com

How to Install Jitsi Meet on Ubuntu 24.04: Self-Hosted Video Calls

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
Enter fullscreen mode Exit fullscreen mode

Add it to /etc/hosts so the machine can resolve itself:

127.0.0.1 localhost
YOUR_SERVER_IP meet.example.com
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

The installer asks two questions:

  1. Hostname — enter your FQDN exactly as configured in DNS: meet.example.com
  2. 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
Enter fullscreen mode Exit fullscreen mode

Confirm the videobridge is listening for media:

sudo ss -ulpn | grep 10000
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Then add a guest VirtualHost below it:

VirtualHost "guest.meet.example.com"
    authentication = "anonymous"
    c2s_require_encryption = false
Enter fullscreen mode Exit fullscreen mode

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"
  }
}
Enter fullscreen mode Exit fullscreen mode

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',
        // ...
    },
};
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
        }
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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)