Video Conferencing
    WebRTC

    Deploy Jitsi Meet on a VPS

    Self-host Jitsi Meet video conferencing (Prosody, Jicofo, JVB, nginx) on a RamNode VPS with Let's Encrypt TLS and proper firewall setup.

    Jitsi Meet is a self-hosted video conferencing platform (nginx + Prosody + Jicofo + JVB). This guide covers a single-node install on Ubuntu 22.04 (the officially best-supported distro for the Jitsi installer).

    1. Prerequisites

    • A RamNode KVM VPS — minimum 2 vCPU / 4 GB RAM; 4 vCPU / 8 GB+ if you expect many concurrent participants (video is CPU/bandwidth heavy).
    • Ubuntu 22.04 LTS, fully updated. (20.04 also works; avoid very new/unsupported releases.)
    • A registered domain name — Jitsi Meet essentially requires this for TLS and proper WebRTC operation (e.g. meet.yourdomain.com).
    • DNS A record for that domain pointed at your VPS's public IPv4 address, propagated before you start.
    • Root or sudo access.
    • Ports 80 and 443 free (no other web server running), plus UDP 10000 for media.
    shell
    sudo apt update && sudo apt upgrade -y
    sudo hostnamectl set-hostname meet.yourdomain.com

    Make sure /etc/hosts resolves your hostname:

    shell
    echo "127.0.0.1 meet.yourdomain.com" | sudo tee -a /etc/hosts

    2. Add the Jitsi repository

    shell
    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
    
    sudo apt update

    3. Install Jitsi Meet

    shell
    sudo apt install -y jitsi-meet

    During install you'll be prompted for:

    • Hostname: enter your domain, e.g. meet.yourdomain.com
    • TLS certificate: choose "Generate a new self-signed certificate" for now — you'll replace it with Let's Encrypt next.

    The installer sets up Prosody (XMPP server), Jicofo (conference focus), JVB (Jitsi Videobridge), and an nginx vhost automatically.

    4. Enable Let's Encrypt TLS

    Jitsi ships a helper script for this:

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

    It will ask for an email (for renewal notices) and handle the cert issuance and nginx config automatically. Certs auto-renew via a cron job it installs.

    5. Configure the firewall

    shell
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw allow 10000/udp
    sudo ufw allow 22/tcp     # don't lock yourself out of SSH
    sudo ufw enable
    sudo ufw status

    Mirror these rules in RamNode's cloud firewall/security group if you use one. UDP 10000 is critical — this is the JVB media port and conferencing will fail or fall back badly without it open.

    6. Verify services are running

    shell
    sudo systemctl status prosody jicofo jitsi-videobridge2 nginx

    All four should show active (running).

    7. Test it

    Browse to https://meet.yourdomain.com, start a meeting, and join from a second device/browser to confirm audio/video/screen-share work.

    8. Harden and configure

    Require authentication to create rooms (recommended for public VPS)

    Edit /etc/prosody/conf.avail/meet.yourdomain.com.cfg.lua — change the main VirtualHost's authentication for the "guest" domain setup, or run the built-in helper:

    shell
    sudo /usr/share/jitsi-meet/scripts/install-user-auth.sh

    This switches to a mode where only authenticated users can start meetings (guests can still join with a link). Add users with:

    shell
    sudo prosodyctl register <username> meet.yourdomain.com <password>

    Restart services after config changes:

    shell
    sudo systemctl restart prosody jicofo jitsi-videobridge2 nginx

    Limit JVB media port range (optional, useful behind strict firewalls)

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

    shell
    org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=<private-ip-if-any>
    org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=<your-public-ip>

    This helps if your VPS uses NAT'd networking (rare on RamNode's standard KVM offerings, but relevant for some private-networking setups).

    Sizing guidance

    • Each active video participant roughly consumes 2–4 Mbps up/down through the bridge, plus CPU for encoding decisions (JVB does not transcode by default, so CPU load stays relatively low — network bandwidth is usually the first bottleneck).
    • For >20–30 concurrent participants regularly, plan to scale JVB horizontally (separate videobridge nodes) — beyond the scope of a single-node guide.

    9. Common troubleshooting

    SymptomLikely cause / fix
    Blank page / SSL errorCert didn't issue — check sudo certbot certificates and DNS propagation
    Can join but no audio/videoUDP 10000 blocked — check ufw and cloud firewall
    "Connection failed" on joinProsody/Jicofo down — check systemctl status prosody jicofo and sudo journalctl -u jicofo -f
    High latency / choppy videoInsufficient bandwidth or CPU on VPS — check htop and network throughput during a call

    10. Useful log locations

    shell
    sudo tail -f /var/log/jitsi/jicofo.log
    sudo tail -f /var/log/jitsi/jvb.log
    sudo tail -f /var/log/prosody/prosody.log

    11. Next steps

    • Set up recording/live-streaming via Jibri (separate, resource-heavy component — best on its own VPS).
    • Customize branding via /usr/share/jitsi-meet/interface_config.js.
    • Set up regular backups of /etc/prosody, /etc/jitsi, and TLS certs.