Deployment guide

Jitsi Meet

Overview

Jitsi Meet is a fully encrypted, open-source video conferencing platform that runs entirely on your own infrastructure. There are no third-party accounts and no per-minute fees, and no data leaves your server. Participants join a meeting straight from their browser, with no plugin or app to install.

The SecureAnyCloud image installs the complete Jitsi Meet stack as system services and hardens it with secure-domain authentication. It generates a unique moderator account on the first boot of every VM.

What you get:

  • The complete Jitsi Meet stack from the official Jitsi repository, run as system services
  • prosody: the XMPP server that handles signalling and authentication
  • jicofo: the conference focus that allocates resources for each meeting
  • jitsi-videobridge2: the WebRTC video bridge that routes audio and video between participants
  • nginx: serves the meeting web app over HTTPS and proxies the signalling channel
  • Secure-domain authentication: only an authenticated moderator can open a room, while invited guests join freely
  • A per-VM moderator account with a strong, unique password generated on first boot and recorded in a root-only file
  • A dedicated Azure data disk at /var/lib/prosody for the XMPP authentication state
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_B2ms (2 vCPU / 8 GiB RAM) is a good starting size.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network, 443/tcp for the meeting web app and 10000/udp for video bridge media. If UDP 10000 is not open to your participants, browsers fall back to a TCP relay or fail to connect media.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Jitsi Meet by SecureAnyCloud, and select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTPS (443).

Review the dedicated data disk on the Disks tab, then select Review + create and Create. After the VM is created, add an inbound NSG rule for UDP 10000, the video bridge media port.

Step 2 - Deploy from the Azure CLI

Accept the Marketplace terms, create the VM and open ports 443 and 10000:

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:jitsi-meet-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name jitsi-meet \
  --image sac1647283583153:jitsi-meet-ubuntu-24-04:default:latest \
  --size Standard_B2ms \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name jitsi-meet --port 443 --priority 1001
az vm open-port --resource-group <your-rg> --name jitsi-meet --port 10000 --priority 1002

The video bridge uses UDP 10000. If az vm open-port creates a TCP-only rule, add a UDP rule for port 10000 with az network nsg rule create ... --protocol Udp --destination-port-ranges 10000.

Step 3 - Connect to your VM

Connect over SSH as azureuser:

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the four services are running

Check each service with systemd:

for s in prosody jicofo jitsi-videobridge2 nginx; do echo "$s=$(systemctl is-active $s)"; done

All four report active:

prosody=active jicofo=active jitsi-videobridge2=active nginx=active

Step 5 - Confirm the web app serves HTTPS

Request the meeting page from the VM itself:

curl -ks -o /dev/null -w 'GET https://127.0.0.1/ -> HTTP %{http_code}\n' https://127.0.0.1/

The page returns HTTP 200:

GET https://127.0.0.1/ -> HTTP 200

Step 6 - Retrieve your moderator credentials

Each VM generates a unique moderator account on first boot. Read it from the root-only credentials file:

sudo cat /root/jitsi-meet-credentials.txt

The file lists the meeting URL, the moderator user and a strong, unique password. It also shows the XMPP domain, which is set to your VM's public IP.

Only the moderator can open (create) a room. Once the room is open, guests join with a single link and no login.

Point the web app at your public address

On first boot, the image names the Jitsi deployment after the address Azure reports. With a Standard SKU public IP (the Azure default, and the --public-ip-sku Standard in Step 2), the current image uses the VM's private address (10.0.0.x). The meeting page at the public IP then tells your browser to connect to the private address, and nobody can join.

The current image also renames the deployment without moving the internal XMPP certificates and service accounts. As a result, the conference focus never signs in and no meeting can start, whatever the address. Check both conditions:

sudo grep -E '^jitsi.(meeting.url|xmpp.domain)=' /root/jitsi-meet-credentials.txt
sudo ls /etc/prosody/certs/

If the first line shows a 10. address, or the certificate list holds only jitsi.sac.invalid files, run the following script once. Azure's instance metadata service reports the public IP to the VM itself, so nothing leaves the VM:

PUBLIC_IP=$(curl -s -H Metadata:true 'http://169.254.169.254/metadata/loadbalancer?api-version=2020-10-01' | grep -o '"frontendIpAddress":"[^"]*"' | head -1 | cut -d'"' -f4)
H=$(sudo grep '^jitsi.xmpp.domain=' /root/jitsi-meet-credentials.txt | cut -d= -f2-); echo "public $PUBLIC_IP, xmpp domain $H"
# browser-facing address: connection URLs, certificate, credentials file
sudo sed -i -E "/^ *(bosh|websocket):/s/$H/$PUBLIC_IP/" /etc/jitsi/meet/$H-config.js
sudo sed -i "s/proxy_set_header Host \$http_host;/proxy_set_header Host $H;/" /etc/nginx/sites-available/$H.conf
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /etc/jitsi/meet/$H.key -out /etc/jitsi/meet/$H.crt \
  -subj "/CN=$PUBLIC_IP" -addext "subjectAltName=IP:$PUBLIC_IP,IP:$H"
sudo chmod 0640 /etc/jitsi/meet/$H.key
sudo sed -i -E "/^(jitsi.meeting.url=|#)/s/$H/$PUBLIC_IP/g" /root/jitsi-meet-credentials.txt
# internal XMPP: move the focus and bridge accounts, mint the certificates A="/var/lib/prosody/auth%2e${H//./%2e}"
sudo cp -a /var/lib/prosody/auth%2ejitsi%2esac%2einvalid "$A"
sudo grep -rl 'jitsi.sac.invalid' "$A" | xargs -r sudo sed -i "s/jitsi\.sac\.invalid/$H/g" for d in $H auth.$H; do
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /var/lib/prosody/$d.key \
  -out /var/lib/prosody/$d.crt -subj "/CN=$d" -addext "subjectAltName=DNS:$d"
sudo chown prosody:prosody /var/lib/prosody/$d.key /var/lib/prosody/$d.crt
sudo ln -sf /var/lib/prosody/$d.key /etc/prosody/certs/$d.key
sudo ln -sf /var/lib/prosody/$d.crt /etc/prosody/certs/$d.crt done
sudo ln -sf /var/lib/prosody/auth.$H.crt /usr/local/share/ca-certificates/auth.$H.crt
sudo update-ca-certificates -f >/dev/null 2>&1
sudo systemctl restart prosody jicofo jitsi-videobridge2 nginx

The XMPP domain keeps its first-boot name. Participants never see this internal name, the moderator account and password are unchanged, and Step 9 still finds its configuration through jitsi.xmpp.domain.

A guest who opens a room now sees Waiting for a moderator until the moderator signs in. The certificate is still self-signed. For a DNS name, set PUBLIC_IP to the name and write DNS:$PUBLIC_IP in place of IP:$PUBLIC_IP, or install a trusted certificate with Step 11.

Step 7 - Open the meeting web app

Browse to https://<vm-public-ip>/ in any modern browser. The image ships a self-signed certificate, so accept the browser warning, or follow Step 11 to install a trusted certificate. The Jitsi Meet welcome page opens, where you name a room to start a meeting.

Enter a room name to reach the prejoin screen. There you set your display name and check your camera and microphone before joining. You can also switch the camera, microphone and audio output.

The Settings dialog (the gear icon) covers audio, video, virtual backgrounds, notifications, your profile, keyboard shortcuts and general options.

Step 8 - Start a meeting as the moderator

Secure-domain authentication is enabled, so only the moderator can open a room. Browse to https://<vm-public-ip>/<your-room-name> and, when prompted, sign in with the moderator user and password from Step 6.

Once the room is open, share the room link (https://<vm-public-ip>/<your-room-name>) with anyone you want to invite. Guests join with one click and need no account.

Step 9 - Confirm secure-domain authentication is in effect

Check the prosody configuration for the XMPP domain:

HOST=$(sudo grep '^jitsi.xmpp.domain=' /root/jitsi-meet-credentials.txt | cut -d= -f2-); sudo grep -q 'authentication = "internal_hashed"' /etc/prosody/conf.avail/${HOST}.cfg.lua && echo "secure-domain: ENABLED" || echo "secure-domain: NOT enabled"

The output looks like this:

secure-domain: ENABLED

This confirms that the main XMPP virtual host requires an authenticated moderator to open a room. A separate anonymous guest domain lets invited participants join without a login.

Step 10 - Confirm the XMPP state lives on the dedicated disk

The prosody virtual-host data and the moderator account store live on a dedicated, independently resizable Azure data disk. It is mounted at /var/lib/prosody, separate from the OS disk. Confirm the mount:

df -h /var/lib/prosody | tail -1

Step 11 - Install a trusted TLS certificate (recommended for production)

The image ships a self-signed certificate. For production, point a DNS name at the VM and install a trusted Let's Encrypt certificate.

Jitsi includes a helper script that requests and installs the certificate and reconfigures nginx for your domain. Run it interactively as root and follow the prompts. It asks for your domain and an email address:

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

When the script completes, browse to https://<your-domain>/. The browser shows a valid certificate with no warning.

Maintenance

  • Restart the stack: sudo systemctl restart prosody jicofo jitsi-videobridge2 nginx
  • Follow the video bridge logs: sudo journalctl -u jitsi-videobridge2 -f
  • Follow the focus logs: sudo journalctl -u jicofo -f
  • The OS receives unattended security updates. For larger meetings, size up the VM and add video bridge capacity. Contact support for guidance.

Support

SecureAnyCloud provides 24/7 technical support by email and chat. We help with deployment, DNS and trusted TLS certificates, secure-domain and JWT authentication, the video bridge and firewall ports, recording and live streaming, mobile apps, and tuning for larger meetings. Contact sales@secureanycloud.com.

All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.

Deploy on Azure

Launch Jitsi Meet on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure