Privacy Tools #jitsi meet#self-hosted#video conferencing

Self-Host Jitsi Meet for Private Video Calls: Full Guide

Run your own private Jitsi Meet video conferencing server on a VPS. Full installation, TURN server setup, and security hardening guide for 2026.

7 min read

Video conferencing platforms like Zoom, Google Meet, and Teams collect metadata, record calls, and process data through corporate servers. Jitsi Meet is a fully open-source, end-to-end encrypted video conferencing solution you can self-host on your own server. Once set up, you control the infrastructure — no third party has access to your calls.

Why Self-Host Jitsi?

  • No accounts required — guests join with a link
  • End-to-end encryption available for calls up to 200 participants
  • No data collection — you own the server and logs
  • Custom domain — host at meet.yourdomain.com
  • Free and open source — Apache 2.0 licensed

Server Requirements

ComponentMinimumRecommended
CPU2 cores4+ cores
RAM4 GB8 GB
Storage20 GB40 GB
Bandwidth1 Gbps1 Gbps
OSUbuntu 22.04 LTSUbuntu 22.04 LTS

A VPS from Hetzner, DigitalOcean, or Vultr with 4 GB RAM handles 10–15 simultaneous participants comfortably. Scale up for larger calls.

Prerequisites

  • A domain name pointed to your server (e.g., meet.example.com)
  • DNS A record: meet.example.com → your.server.ip
  • A fresh Ubuntu 22.04 server
  • Root or sudo access

Installation

Step 1: Set Hostname

sudo hostnamectl set-hostname meet.example.com
echo "your.server.ip meet.example.com" | sudo tee -a /etc/hosts

Step 2: Add Jitsi Repository

curl 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

sudo apt update

Step 3: Install Jitsi Meet

sudo apt install jitsi-meet

During installation, you will be prompted for:

  • Hostname: Enter meet.example.com
  • SSL certificate: Choose “Generate a new self-signed certificate” — you’ll replace this with Let’s Encrypt next

Step 4: Install Let’s Encrypt SSL Certificate

sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh

Enter your email when prompted. This installs Certbot and configures automatic renewal.

Firewall Configuration

Open the required ports:

sudo ufw allow 80/tcp     # HTTP (Let's Encrypt renewal)
sudo ufw allow 443/tcp    # HTTPS
sudo ufw allow 10000/udp  # Jitsi media (JVB)
sudo ufw allow 4443/tcp   # Jitsi fallback (TCP media)
sudo ufw enable

Configuring the TURN Server (Critical for NAT Traversal)

Without a TURN server, users behind strict firewalls or NAT cannot connect. Install coturn:

sudo apt install coturn

Edit /etc/turnserver.conf:

listening-port=3478
tls-listening-port=5349
fingerprint
lt-cred-mech
realm=meet.example.com
server-name=meet.example.com
cert=/etc/letsencrypt/live/meet.example.com/fullchain.pem
pkey=/etc/letsencrypt/live/meet.example.com/privkey.pem
log-file=/var/log/turnserver/turnserver.log
no-multicast-peers
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=172.16.0.0-172.31.255.255

Generate a strong secret for TURN authentication:

openssl rand -hex 32

Add to /etc/turnserver.conf:

static-auth-secret=YOUR_GENERATED_SECRET_HERE

Enable and start coturn:

sudo systemctl enable coturn
sudo systemctl start coturn

Edit /etc/jitsi/meet/meet.example.com-config.js:

p2p: {
    enabled: true,
    stunServers: [
        { urls: 'stun:meet.example.com:3478' }
    ]
},

Edit /etc/jitsi/videobridge/sip-communicator.properties:

org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER=true
org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet.example.com:3478

Enabling End-to-End Encryption

Jitsi Meet supports E2EE using the Insertable Streams Web API. Enable it in the config:

// /etc/jitsi/meet/meet.example.com-config.js
e2eeLabels: {
    e2ee: 'Video Bridge Encryption',
    labelToolTip: 'Audio and Video Communication on this call is encrypted...',
    description: 'Enable end-to-end encryption.',
    label: 'Enable end-to-end encryption',
    warning: 'WARNING: End-to-end encryption is enabled...'
},

Users must click the lock icon in the Jitsi UI to enable E2EE for their session.

Restricting Room Creation (Authentication)

By default, anyone who knows your URL can create rooms. Restrict creation to authenticated users:

Edit /etc/prosody/conf.avail/meet.example.com.cfg.lua:

VirtualHost "meet.example.com"
    authentication = "internal_plain"

Add a guest domain below it:

VirtualHost "guest.meet.example.com"
    authentication = "anonymous"
    c2s_require_encryption = false

Create admin users:

sudo prosodyctl register admin meet.example.com STRONGPASSWORD

Restart services:

sudo systemctl restart prosody jicofo jitsi-videobridge2

Keeping Jitsi Updated

sudo apt update && sudo apt upgrade jitsi-meet jitsi-videobridge2 jicofo

Jitsi releases updates frequently — subscribe to their GitHub releases page or check monthly.

Testing Your Instance

Open https://meet.example.com in a browser. Create a room and invite a participant. Use WebRTC Internals (chrome://webrtc-internals or about:webrtc in Firefox) to verify ICE candidates are connecting correctly and media is flowing.

Final Thoughts

A self-hosted Jitsi Meet instance gives you complete control over your video communications with no data collected by third parties. The setup takes under an hour on a fresh server and produces a production-ready video conferencing platform with E2EE support, no account requirements, and full audit control over your infrastructure.

#secure communication #privacy #video conferencing #self-hosted #jitsi meet