๐ Setting Up Jitsi Meet on Ubuntu: Avoid My Mistakes & Save Hours!
4 min read๐ ๏ธ Step 1: Add the Official Jitsi Repository & GPG Key
Before anything else, run this to get the required tools and add Jitsi's key:
~ sudo apt update && sudo apt install -y gnupg2 curl apt-transport-https
~ 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
โ
This prepares your system to fetch Jitsi Meet from its official source.
๐ฆ Step 2: Install Jitsi Meet
Now, install Jitsi Meet:
~ sudo apt install jitsi-meet
Here’s where I messed up (and you shouldn’t):
๐ด I hadn’t set up a domain before running this command. So when the installer asked for my domain name, I panicked and aborted the process mid-way.
This resulted in a half-baked installation, where most critical files were missing — causing a chain of issues later. I tried cleaning everything up and starting fresh, but in the process, I accidentally wiped my entire Nginx config and broke the server. ๐
So here’s the golden rule:
๐ Make sure you have your domain/subdomain ready before installing Jitsi Meet
โ ๏ธ Important Dialog Boxes to Handle Carefully
During installation, you’ll face two important prompts:
1๏ธโฃ Configuration File Prompt
You’ll see something like:
“Keep the local version currently installed?”
๐ Choose: Keep the local version currently installed
(Use arrow keys and press Enter)
This is essential to preserve default configs Jitsi needs to run properly.
2๏ธโฃ Domain/Hostname Input
This prompt asks:
“Enter the domain name for your Jitsi Meet instance”
โ
If you already have a domain/subdomain, try to enter it here if you can.
โ ๏ธ If not, just press OK — we can change or configure it later.
Now, why am I saying "try to enter it if you can"?
Because after aborting once, when I re-ran the installer later, this domain prompt never showed up again — and I couldn't find a clean way to bring it back. So if it works for you the first time, great. If not, don’t worry — domain configs can be edited manually later.
โ What Happens If It Installs Correctly?
Once everything is configured properly and domain is set, you’ll be able to access Jitsi on (After getting SSL for your domains):
(We will also learn ahead about how to get SSL for domains.)
But if you see blank pages or errors, chances are something broke during install. That’s why following each step precisely is so important.
๐ Real Error I Faced — And What It Means
๐ Error 1:
While installing, I encountered this error:
What is this about?
This error is related to UEFI boot configurations, specifically for Secure Boot setups.
But here's the twist — my system was running in legacy BIOS mode, not UEFI. So it couldn’t find the EFI directory, and the install script failed.
โ Will this affect Jitsi?
Not at all.
This error affects only your boot process, not web services.
Jitsi Meet runs on top of Nginx, Prosody, Jicofo, etc. As long as your system is up and running, this bootloader-related error has no impact on your Jitsi server.
๐ Error 2:
๐ Reinstalling Jitsi Meet: Lessons from My Second Attempt
After the first crash, I decided to start from scratch — I wiped everything clean and went for a full reinstallation.
But this time, I encountered new questions and warnings that you might see too. So here’s what to expect — and what to answer when the terminal asks you things like:
๐งจ “File exists. Overwrite?” Prompt
While adding the Jitsi GPG key again:
I saw this:
๐ What to do?
Since I was reinstalling and needed a fresh start, I safely typed y and hit Enter.
โ It only overwrites the Jitsi keyring file — nothing dangerous.
๐งพ “Do You Want to Continue?” Prompt While Installing Jitsi
When you run:
You’ll likely see something like:
๐ข Go ahead and type Y — this is standard. It’s only installing necessary Jitsi components like:
-
jitsi-meet
-
jitsi-videobridge2
-
jitsi-meet-web
-
and others
These packages don’t interfere with anything outside of Jitsi.
Note 1:
๐ How to Check (and Change) the Jitsi Hostname
Sometimes you may want to verify what domain or subdomain Jitsi is configured for. Use this:
~ sudo grep -Ri 'VirtualHost' /etc/prosody/conf.avail/
You’ll see something like:
๐ Replace localhost with your actual domain!
I changed mine to:
โ After making changes, restart all related services to apply updates:
~ sudo systemctl restart prosody
~ sudo systemctl restart jicofo
~ sudo systemctl restart jitsi-videobridge2
~ sudo systemctl restart nginx
Note 2 With ๐ Error 3:
Why Restart Nginx If You Didn't Create It?
Good question!
Even if you never manually touched Nginx, Jitsi automatically configures Nginx during installation to serve its frontend.
โ But in my case, because I aborted midway, the Nginx config never got created — and I ended up with a:
Let’s fix that manually...
๐งฑ Recreate Nginx Config (If Missing)
Step 1: Check if the config exists
~ ls -l /etc/nginx/sites-available/
Look for something like:
Then check if it’s enabled:
~ ls -l /etc/nginx/sites-enabled/
Step 2: If not, create it manually:
~ sudo nano /etc/nginx/sites-available/jitsi.biz499.com
Paste this minimal config:
server {
server_name jitsi.biz499.com www.jitsi.biz499.com;
root /usr/share/jitsi-meet;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Then:
~ sudo ln -s /etc/nginx/sites-available/jitsi.biz499.com /etc/nginx/sites-enabled/
~ sudo systemctl restart nginx
๐ Error 4:
๐ฅ Fixing the “500 Internal Server Error”
At one point, my browser showed a 500 error. This usually means a broken Nginx config or file permission issue.
My earlier Nginx config had this mistake:
๐ This was unnecessary and broke the rewrite logic.
โ Fixed version:
server {
server_name jitsi.biz499.com www.jitsi.biz499.com;
root /usr/share/jitsi-meet;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Problem solved. โ
๐ Error 5:
๐ฅ๏ธ Fixing the Blank Black Screen on Browser
If your site loads to a black blank screen:
It means:
UI files loaded โ
Backend services are NOT working โ
Step 1: Check Browser Console (F12 → Console Tab)
Look for:
-
WebSocket connection failed
-
CONFERENCE FAILED
-
BOSH connection failed
-
Failed to load resource
Step 2: Check Jitsi Services:
~ sudo systemctl status prosody
~ sudo systemctl status jicofo
~ sudo systemctl status jitsi-videobridge2
If any are inactive, restart them:
~ sudo systemctl restart prosody
~ sudo systemctl restart jicofo
~ sudo systemctl restart jitsi-videobridge2
Step 3: Check Nginx Logs
~ sudo tail -n 50 /var/log/nginx/error.log
This helps identify broken links or script loading issues.
๐งพ Bonus: My Config File Was Missing
After all troubleshooting, I realized the config file itself was missing:
~ /etc/jitsi/meet/jitsi.biz499.com-config.js
๐ ๏ธ I recreated it manually using a standard template, and that finally got things working.
Paste the following configuration:
var config = {
hosts: {
domain: 'jitsi.biz499.com',
muc: 'conference.jitsi.biz499.com', // must match muc_mapper_domain_base
},
serviceUrl: 'wss://jitsi.biz499.com/xmpp-websocket',
clientNode: 'http://jitsi.org/jitsimeet',
p2p: {
enabled: true,
preferH264: true,
stunServers: [
{ urls: 'stun:stun.l.google.com:19302' }
]
},
useStunTurn: true,
enableWelcomePage: true,
defaultLanguage: 'en',
resolution: 720,
constraints: {
video: {
height: {
ideal: 720,
max: 720,
min: 240
}
}
},
// disableSimulcast: true,
};
๐พ Save and exit (Ctrl+O, Enter, then Ctrl+X)
๐ Restart All Services
~ sudo systemctl restart nginx prosody jicofo jitsi-videobridge2
๐ Error 6:
๐งฑ Step-by-Step Debug for the Black Screen
Still getting a blank screen? That means your frontend loaded but it’s unable to communicate with backend services. Let’s debug this step-by-step:
โ Check and Fix Prosody Config
Check if this file exists:
~ sudo nano /etc/prosody/conf.avail/jitsi.biz499.com.cfg.lua
You should see something like:
๐ Create Prosody Config Manually (If Missing)
~ sudo nano /etc/prosody/conf.avail/jitsi.biz499.com.cfg.lua
Before creating this file, get SSL for your domain as in this file it will ask for SSL Key and certificate.
Set Up SSL for Your Domain
Since I hadn’t done SSL before, I ran:
~ sudo certbot --nginx -d jitsi.biz499.com www.jitsi.biz499.com
๐ This will:
-
Generate a free SSL certificate (Let’s Encrypt)
-
Automatically update your Nginx config
-
Reload Nginx with HTTPS support
โ After success, it shows:
Now paste the following in Prosody Config (sudo nano /etc/prosody/conf.avail/jitsi.biz499.com.cfg.lua):
VirtualHost "jitsi.biz499.com"
authentication = "anonymous"
ssl = {
key = "/etc/prosody/certs/jitsi.biz499.com.key";
certificate = "/etc/prosody/certs/jitsi.biz499.com.crt";
}
modules_enabled = {
"bosh";
"pubsub";
"ping";
"speakerstats";
"turncredentials";
"conference_duration";
}
Component "conference.jitsi.biz499.com" "muc"
storage = "memory"
muc_room_cache_size = 1000
Component "internal.auth.jitsi.biz499.com" "muc"
storage = "memory"
muc_room_cache_size = 1000
muc_component_config = {
muc_room_locking = false;
muc_room_default_public_jids = true;
}
VirtualHost "guest.jitsi.biz499.com"
authentication = "anonymous"
c2s_require_encryption = false
โ ๏ธ Ensure the SSL certificate/key paths are correct — you can verify with:
~ ls /etc/prosody/certs/
๐ Then enable the config:
~ sudo ln -s /etc/prosody/conf.avail/jitsi.biz499.com.cfg.lua /etc/prosody/conf.d/
๐ Restart Everything Again
~ sudo systemctl restart prosody
~ sudo systemctl restart jicofo
~ sudo systemctl restart jitsi-videobridge2
~ sudo systemctl restart nginx
Note 3:
๐ Where Is index.html Coming From in the NGINX?
You might wonder: “I didn’t place any index.html — where did it come from?”
โก๏ธ The answer: It’s automatically placed by Jitsi Meet during installation inside:
You can check with:
~ ls -l /usr/share/jitsi-meet/
โ The Final Result
After doing all this, your Jitsi instance should now load properly at your domain. Mine is:
๐ฌ If you still see a blank screen, just wait a little. Sometimes services take a while to start syncing — especially right after full configuration. It may take a few minutes or even an hour or two in rare cases.
๐ That wraps up all the real errors I faced — and the manual steps I took to solve them.