Skip to content
Bots!
Bots!
  • About
    • Myself
    • আমার দোয়া
  • Bookmarks
    • Bookmarks
    • My OCI Bookmarks
    • Useful Proxmox Commands & Links
    • Learning Nano
    • Useful Sites
    • Useful Virtualbox Command
    • Useful MySQL Command
    • Useful Linux Command
    • BTT-CAS
  • Resources
    • Webinar on Cloud Adoption for Project Managers
  • Photos
  • Videos
  • Downloads
Bots!

Installing Jitsi and Jibri on Same Machine

Rumi, July 4, 2020July 14, 2020

This post is heavily inspired from this community post by https://community.jitsi.org/u/Woodworker_Life. However, the original installation document is based on typical split Jitsi on one VM and Jibri on seperate VM. 

A little reworked version is deployed and tested for several client based with no performance issue- this post covers a single VM with Jitsi Videobridge and Jibri Reocording system.

Prerequisites:

  • Works only on Ubuntu 16 Distribution
  • Only following DNS entries are needed to be available:
    • meet.ensii.net -> 123.45.67.89
    • recording.ensii.net-> 123.45.67.89
    • recorder.ensii.net-> 123.45.67.89
  • update /etc/hosts file as following:
    • 127.0.0.1    meet.ensii.net
      123.45.67.89    recording.ensii.net
      123.45.67.89    recorder.ensii.net

Part-1: Setup Jitsi Meet on the server

You will need to login to the server you created in step 1. For this, on my Windows laptop, I use PuTTy. Login with initial password and change it to your own.

Update server:

apt update && apt upgrade -y

Update hostname:

hostnamectl set-hostname meet.ensii.net

Install NGINX

If Jitsi Meet gets installed on a fresh server, it will install it’s own webserver (Jetty) in the process. From what I find in the forums, I prefer to go with NGINX, so let’s install that first. In the terminal:

apt install nginx -y

Hint: We do NOT have to configure anything for NGINX: the jitsi-installer will take care of that!

apt install -y apt-transport-https

Install Jitsi Meet

First we need to add the repositories where our server should retrieve the Jitsi Meet packages, in the terminal:

echo 'deb https://download.jitsi.org stable/' >> /etc/apt/sources.list.d/jitsi-stable.list
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
apt update && apt install jitsi-meet -y

During installation we can expect 2 questions:

Domain – Here I enter the full domain: 

meet.ensii.net

Certificate – Leave this option at the default to install Let’s Encrypt certificates afterwards. Generate Let’s Encrypt certificates for our domain 

-UPDATE-
Currently, the build is broken and at the end of the process it shows error message:
Unable to find deploy-hook command /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh in the PATH.
(PATH is /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

As a workaround we can do following:

mkdir -p /etc/letsencrypt/renewal-hooks/deploy/
touch /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/0000-coturn-certbot-deploy.sh

Execute the Let’s Encrypt script:

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

The script will ask for your email address where Let’s Encrypt will send information in case of expiration -date or such.

At this point you should have a working Jitsi Meet server!

Open a browser and enter the domain of your Jitsi Meet, I open https://meet.ensii.net and get greeted by the welcome screen. Here I create a new meeting ‘test’ and open a conference (make sure to ALLOW the browser to use microphone and camera). I always open an incognito window and open the same meeting I initiated already: https://meet.ensii.net/ 7test so there should now be 2 participants in the call. Opening a 3rd browser to that same meeting ensures that we know if Jitsi switches from peer2peer mode to videobridge mode. When 3 participants are showing in the call, we know all is well so far.

Tweaking and tuning

Tuning A) Prosody portmanager error

service prosody status

(type ‘q’ to quit the output console)

Output:
● prosody.service - Prosody XMPP Server
Loaded: loaded (/lib/systemd/system/prosody.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-15 19:39:18 CEST; 32min ago
Docs: https://prosody.im/doc 5
Main PID: 16994 (lua5.2)
Tasks: 1 (limit: 2296)
Memory: 18.5M
CGroup: /system.slice/prosody.service
└─16994 lua5.2 /usr/bin/prosody

Apr 15 19:39:18 meet.ensii.net 34 systemd[1]: Started Prosody XMPP Server.
Apr 15 19:39:19 meet.ensii.net 34 prosody[16994]: portmanager: Error binding encrypted port for https: No certificate
Apr 15 19:39:19 meet.ensii.net 34 prosody[16994]: portmanager: Error binding encrypted port for https: No certificate

The portmanager error basically is harmles and can be ignored. But we can also fix this.

nano /etc/prosody/conf.avail/meet.ensii.net.cfg.lua

Before the first Virtualhost entry, insert following:

-- we are going to be proxying the BOSH connection anyway, so there is no need to be listening for BOSH over HTTPS
https_ports = { }

Save the changes and restart prosody, all should be happy now: 

service prosody restart
service prosody status

Tuning B) Improving over-all performance by sacrificing audio-indicator animation

nano /etc/jitsi/meet/meet.ensii.net-config.js

Find the audio-section and set:

disableAudioLevels: true,

With this setting, you loose the visually appealing sound level indicators/animations in the call, but this also removes a lot of overhead and screen-rewriting. On this rather poor-dimensioned server, this brings a noticable performance gain.

Found here: [Customizing jitsi — viewer only — bandwidth — usecase 56]

Tuning C) Video resolution and bitrate

Jitsi Meet sends 720p resolutions with 30 fps (at least afaik).
Google’s recommendations are:
Resolution: 1280×720 @ 30 fps
Video Bitrate Range: 1,500-4,000 Kbps

I have tested several scenarios with setting the ‘startBitrate’ to a low level and found good results with following:

nano /etc/jitsi/meet/meet.ensii.net-config.js

Find the video-section and insert:

startBitrate: 500,
resolution: 720,
constraints: {
video: {
aspectRatio: 16 / 9,
height: {
ideal: 720,
max: 720,
min: 240
}
}
},

Part-2: Installation of Jibri: JAVA 8 (Jibri requires JAVA 8)

Check your java version-

java -version

The output should return with OpenJDK 8 installed. Now set the Java Home-

The returned console output shows us the path to JAVA 8 and we will copy this to set the Java Home Environment Variable variable:

nano ~/.bashrc 

Paste the following line (make sure to use the path that was returned in previous step):

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java

Save this and then source the file:

source ~/.bash_profile

And check the Java Home:

echo $JAVA_HOME

This should return:

/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java

Miscellaneous packages

We will install all miscellaneous packages EXCEPT default-jre-headless:

apt update && install unzip ffmpeg curl alsa-utils icewm xdotool xserver-xorg-input-void xserver-xorg-video-dummy -y

ALSA and Loopback Device. Set up the module to be loaded on boot:

echo "snd-aloop" >> /etc/modules

Load the module into the running kernel:

modprobe snd-aloop

Check to see that the module is already loaded:

lsmod | grep snd_aloop

This should return (something like):

snd_aloop 24576 0
snd_pcm 106496 1 snd_aloop
snd 86016 3 snd_aloop,snd_timer,snd_pcm

Google Chrome stable & Chromedriver. Install the latest Google Chrome stable build:

curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
apt update && apt install google-chrome-stable -y

Add chrome managed policies file and set CommandLineFlagSecurityWarningsEnabled to false. It will hide warnings in Chrome. You can set it like so:

mkdir -p /etc/opt/chrome/policies/managed
echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' >>/etc/opt/chrome/policies/managed/managed_policies.json

Chromedriver is also required and can be installed like so:

CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`
wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/
unzip ~/chromedriver_linux64.zip -d ~/
rm ~/chromedriver_linux64.zip
mv -f ~/chromedriver /usr/local/bin/chromedriver
chown root:root /usr/local/bin/chromedriver
chmod 0755 /usr/local/bin/chromedriver

Jitsi/Jibri Debian Repository

The Jibri packages can be found in the stable repository:

wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
sh -c "echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list"
apt update && apt install jibri -y

We want to make sure that user ‘jibri’ is part of the necessary groups:

usermod -aG adm,audio,video,plugdev jibri

With these steps, we have now the basic setup of Jibri done, but the service is not active (yet).

Part-3: Configuring Jitsi and Jibri

Prosody configuration

Create the internal Multi User Component (MUC) and the the recorder virtual host entry, login to server “jitsi” and:

nano /etc/prosody/conf.avail/meet.ensii.net.cfg.lua

At the end of this file, add a dedicated section:

-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.meet.ensii.net" "muc"
modules_enabled = {
"ping";
}
storage = "memory"
muc_room_cache_size = 1000

VirtualHost "recorder.meet.ensii.net"
modules_enabled = {
"ping";
}
authentication = "internal_plain"

Reload prosody:

/etc/init.d/prosody reload

Create two users for Jibri (user: jibri and user: recorder):

prosodyctl register jibri auth.meet.ensii.net JibrisPass
prosodyctl register recorder recorder.meet.ensii.net RecordersPass

(Important: take note of these passwords, we will need them later also on server “jibri”!)

Jicofo configuration

Set the Multi User Component (MUC) to look out for Jibri:

nano /etc/jitsi/jicofo/sip-communicator.properties

In this file, add two lines:

org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.meet.ensii.net
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90

Reload jicofo:

/etc/init.d/jicofo reload

Jitsi Meet configuration

Make sure we have the button for recording and/or streaming in our config:

nano /etc/jitsi/meet/meet.ensii.net-config.js

Look for following lines, uncomment the line and set value to ‘true’ or add if the line does not exist:

fileRecordingsEnabled: true, // If you want to enable file recording
liveStreamingEnabled: true, // If you want to enable live streaming
hiddenDomain: 'recorder.meet.ensii.net',

Make sure we have the menu-option for recording and streaming available:

nano /usr/share/jitsi-meet/interface_config.js

Look for the section TOOLBAR_BUTTONS and make sure that the array contains ‘recordings’ and ‘livestreaming’. We need to configure the xmpp environments and the directory where we want to store our recordings:

nano /etc/jitsi/jibri/config.json

Change settings according to:

{
"recording_directory":"/srv/recordings",
"finalize_recording_script_path": "/path/to/finalize_recording.sh",
"xmpp_environments": [
{
"name": "prod environment",
"xmpp_server_hosts": [
"meet.ensii.net"
],
"xmpp_domain": "meet.ensii.net",
"control_login": {
// The domain to use for logging in
"domain": "auth.meet.ensii.net",
// The credentials for logging in
"username": "jibri",
"password": "JibrisPass"
},
"control_muc": {
"domain": "internal.auth.meet.ensii.net",
"room_name": "JibriBrewery",
"nickname": "jibri-nickname"
},
"call_login": {
"domain": "recorder.meet.ensii.net",
"username": "recorder",
"password": "RecordersPass"
},
"room_jid_domain_string_to_strip_from_start": "conference.",
"usage_timeout": "0"
}
]
}

Now we create the directory for the recordings and make sure user ‘jibri’ can write here:

mkdir /srv/recordings
chown jibri:jitsi /srv/recordings

Restart jibri service:

service jibri restart

This is all we need to do on server “jibri”.

Everything above this section needs to be changed on server “jibri”: “recording.ensii.net 20”

Testing recording

Once all these changes were in place, I even rebooted both servers. On the server “jibri”, the jibri service does not automatically start, so keep in mind to do so manually if needed.

Now I open my https://meet.ensii.net/ 12 and start a meeting ‘test’. Once I Am presented with my videostream, I open the menu and choose ‘Start recording’. After some time to load, the recording was started. So after some seconds, I open the menu again and choose ‘Stop recording’.

On the server, I found the mp4 file of the recording in a sub-folder with a random generated folder-name:

Mission accomplished!

Last but not the least, if you reboot the server, you have to start jibri service-

systemctl restart jibri

Src: 
https://community.jitsi.org/t/how-to-to-setup-integrated-jitsi-and-jibri-for-dummies-my-comprehensive-tutorial-for-the-beginner/35718/3

Administrations Configurations (Linux) JibriJitsiUbuntu 16

Post navigation

Previous post
Next post

Comments (22)

  1. Praveen says:
    July 24, 2020 at 3:46 pm

    Thank you for this doc.

    I am getting an error while deploying jibri.

    modprobe snd-aloop
    modprobe: FATAL: Module snd-aloop not found in directory /lib/modules/4.4.0-169-generic

    I am using a digitalocean droplet with ubuntu 16. I also tried the steps explained below
    https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#jitsi-broadcasting-infrastructure-jibri-configuration

    Reply
    1. Rumi says:
      July 29, 2020 at 11:10 am

      The published configuration works on my many installations. Do not mix with other configuration reference- which might not work. Can you share the kernel version that your droplet has?

      Reply
  2. Subodh says:
    August 1, 2020 at 10:14 pm

    Hi,
    We have followed your steps, but our Nginx is not able to start and showing following error:
    Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.

    Can you help?

    Reply
    1. Rumi says:
      August 2, 2020 at 7:17 pm

      Try to check if the nginx is properly installed and if port 80+443 are taken by some other application (such as Apache). Port conflict is an error probably. As the error itself is self-explaantory- try to run this command- “journalctl -xe” and see the prints. You can also apply “netstat -plntu” to see what other application or service might have occupied your port 80+443. Thnaks.

      Reply
  3. Pratik(gigabyteservice) says:
    August 20, 2020 at 1:35 am

    hello thanks for explanation can you please write a blog about how to connect multiple jibri if they are hosted on different instance & how to add Dropbox with

    Reply
    1. Rumi says:
      August 23, 2020 at 11:53 am

      Connecting to multiple Jibri might not be achievable- however, there might be solution for Jibri load balancing which I haven’t tried. Regarding dropbox or other cloud drive integration you might look into this article- https://tweenpath.net/install-rclone-synching-server-contents-cloud-storage-google-drive-onedrive-dropbox-own-nextcloud/

      Reply
  4. Ram says:
    September 17, 2020 at 11:21 pm

    Hello,

    Thanks for the same. Everything is installed properly and even the recording starts and stops and creates the mp4 file. However when i open the file its just blank with the logo of jitsi . I suspect something is not right with the ffmpeg but i am stuck now .

    Reply
    1. Rumi says:
      September 23, 2020 at 8:50 pm

      Plz check if any of chrome driver is being missed during package installation.

      Reply
  5. amin zemaray says:
    September 23, 2020 at 2:30 pm

    Hallo,

    I hereby share with you the following, I was able to do with great success
    Jetsi Meet in ubuntu 18.04 and Debian 10 is set up and works perfectly

    I also wanted to set up Jibri Recording and Streaming in ubuntu 18.04 and Debian
    99% all commands and configuration went perfectly. Only got the last configuration
    I peroblem “nano /etc/jitsi/jibri/jibri.conf” and I get a blank page
    no recording_directory xmpp_server_host control_muc call_login and stuff fort.
    if i look at ubuntu file dirctory etc -jitsi-jbri in this diectory is no
    jibri.json file in return i get a file empty jibri.conf. and if i go to host via google
    and I type recordig I get error message recordig in not available. or recording failed.
    jibri configuration in forum is not clear and maybe not complete.
    Help me
    Thanks

    Reply
    1. Rumi says:
      September 23, 2020 at 8:50 pm

      Only got the last configuration
      I peroblem “nano /etc/jitsi/jibri/jibri.conf” and I get a blank page

      Where are u getting this error- on ubuntu 18 or Debian 10?

      Reply
  6. Kir says:
    October 6, 2020 at 8:01 pm

    I have similar issue on Debian 10.

    there is NO file /etc/jitsi/jibri/config.json
    so jibri doesn’t start.

    could you provide the full config.json, rather then options that must be changed?

    Reply
  7. Kir says:
    October 8, 2020 at 10:57 am

    Rumi, you did a great work.
    Do you have plans to update your guide, since it’s not working with the current version if Jibri (at least /etc/jitsi/jibri/config.json is not using now and was replaced with the /etc/jitsi/jibri/jibri.config that uses another syntax.

    another question is regarding your guide
    You define several hosts at /etc/hosts
    127.0.0.1 meet.ensii.net
    123.45.67.89 recording.ensii.net
    123.45.67.89 recorder.ensii.net

    but non of them (recording.ensii.net or recorder.ensii.net) are using at your configs!!!
    Where is the mistake?
    Their are not necessary or there is a mistake somewhere?

    Reply
    1. Rumi says:
      October 22, 2020 at 9:55 am

      Hi Kir,

      It works. Have had an installation only a day back. You need to use same precise version on ubuntu OS as mentioned in the blog.

      Reply
  8. oscar rojas says:
    December 29, 2020 at 2:20 am

    Hi. I would like to do the same configuration that you have so that it works for you, but it happens that it prevents me from doing it in Ubuntu 16.04. I should only use ubuntu version 20.04.
    Is there any way that you can do the same for this version of ubuntu?

    Reply
    1. Rumi says:
      January 16, 2021 at 11:41 am

      You can only use this config on Ubuntu 16

      Reply
  9. subhash says:
    February 5, 2021 at 7:22 pm

    I have followed your instructions except that i have installed it separate azure VM ,i am getting the below error after installing.

    Log from jicafo :

    Jicofo 2021-02-04 13:20:32.092 SEVERE: [38] org.jitsi.jicofo.recording.jibri.JibriSession.log() Unable to find an available Jibri, can’t start
    Jicofo 2021-02-04 13:20:32.093 INFO: [38] org.jitsi.jicofo.recording.jibri.JibriRecorder.log() Failed to start a Jibri session, no Jibris available.

    Log from jibri is as below:
    [ 13.236] (II) config/udev: Adding input device Power Button (/dev/input/event0)
    [ 13.236] (II) AutoAddDevices is off – not adding device.
    [ 13.236] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event4)
    [ 13.236] (II) AutoAddDevices is off – not adding device.
    [ 13.236] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event1)
    [ 13.236] (II) AutoAddDevices is off – not adding device.
    [ 13.236] (II) config/udev: Adding input device TPPS/2 IBM TrackPoint (/dev/input/event3)
    [ 13.236] (II) AutoAddDevices is off – not adding device.
    [ 13.237] (II) config/udev: Adding input device TPPS/2 IBM TrackPoint (/dev/input/mouse1)
    [ 13.237] (II) AutoAddDevices is off – not adding device.

    When i check the status of jibri i see jibri is active and running with below error:

    recorder.meet.learningtree.ai launch.sh[3604]: SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.

    Reply
    1. Rumi says:
      February 12, 2021 at 9:23 pm

      What did you mean by separate VM? The document is based on a single VM.

      Reply
  10. Rajesh says:
    April 23, 2021 at 6:08 pm

    i can not start call recording and live streaming Please Help me

    Reply
  11. khalid says:
    July 14, 2021 at 1:17 pm

    why we need to configure VM public ip in /hosts file.

    Reply
    1. Rumi says:
      July 17, 2021 at 10:40 pm

      The internal configuration structure is designed on domain structure, hence the domain is mapped with the correspnding server (its self server in this case) using hosts file.

      Reply
  12. shamaevanatalyaNatalie says:
    March 28, 2022 at 8:01 pm

    Hi!
    Thanks for great instruction.
    On this step I’m getting this

    prosodyctl register jibri auth.meet.ensii.net JibrisPass

    Prosody was unable to find lua-unbound
    This package can be obtained in the following ways:

    Debian/Ubuntu | sudo apt install lua-unbound
    luarocks | luarocks install luaunbound
    Source | https://www.zash.se/luaunbound.html

    Old DNS resolver library will be used
    More help can be found on our website, at https://prosody.im/doc/depends

    **************************
    Can you please help to solve it?

    Reply
    1. Rumi says:
      April 1, 2022 at 7:55 pm

      “auth.meet.ensii.net”- You need to use your domain instead. ensii.net is an example domain I used over here.

      Reply

Leave a Reply to Rumi Cancel reply

Your email address will not be published. Required fields are marked *

Myself…

Hi, I am Hasan T. Emdad Rumi, an IT Project Manager & Consultant, Virtualization & Cloud Savvyfrom Dhaka, Bangladesh. I have prior experience in managing numerous local and international projects in the area of Telco VAS & NMC, National Data Center & PKI Naitonal Root and CA Infrastructure. Also engaged with several Offshore Software Development Team.

Worked with Orascom Telecom-Banglalink, Network Elites as VAS partner, BTRC, BTT (Turkey) , Mango Teleservices Limited and Access to Informaiton (A2I-UNDP)

Currently working at Oracle Corporation as Principal Technology Solution and Cloud Architect.

You can reach me [h.t.emdad at gmail.com] and I will be delighted to exchange my views.

Tags

Apache Bind Cacti CentOS CentOS 6 CentOS 7 Debain Debian Debian 10 Debian 11 Debian 12 DKIM Docker endian icinga iptables Jitsi LAMP Letsencrypt Linux Munin MySQL Nagios Nextcloud NFS nginx pfsense php Postfix powerdns Proxmox RDP squid SSH SSL Ubuntu Ubuntu 16 Ubuntu 18 Ubuntu 20 Varnish virtualbox vpn Webmin XCP-NG zimbra

Topics

Recent Posts

  • Install Jitsi on Ubuntu 22.04 / 22.10 April 30, 2025
  • Key Lessons in life April 26, 2025
  • Create Proxmox Backup Server (PBS) on Debian 12 April 19, 2025
  • Add Physical Drive in Proxmox VM Guest April 19, 2025
  • Mount a drive permanently with fstab in Linux April 16, 2025
  • Proxmox 1:1 NAT routing March 30, 2025
  • Installation steps of WSL – Windows Subsystem for Linux March 8, 2025
  • Enabling Nested Virtualization In Proxmox March 8, 2025
  • How to Modify/Change console/SSH login banner for Proxmox Virtual Environment (Proxmox VE / PVE) March 3, 2025
  • Install Proxmox Backup Server on Debian 12 February 12, 2025

Archives

Top Posts & Pages

  • Install Jitsi on Ubuntu 22.04 / 22.10
©2025 Bots! | WordPress Theme by SuperbThemes