This is a tutorial and a record of how I set up a Jitsi Meet server and 6 dockerized Jibri instances on an AWS Ubuntu server. (c5.4xlarge)
This means that the Jitsi Meet, Prosody, Jicofo and 6 jibri recorders are working on the same server. It took me a whole week to get this up and running so this document is also for my own reference! I referred many documents and forums, and this is where I decided to compile everything.
For security reasons, I will use the domain as my.domain.com and the IP address as my-elastic-ip
Preface
If the below steps seem daunting, I provide Jitsi setup consulting, so message me if you require any help setting up!
So here goes:
Jitsi Server Setup
-
Get a domain. I have to stress how important this is. If you donât have one, there are multiple places you can get one for free. Make it easy to write since youâll be writing this everywhere. A Jitsi setup hardly ever works without a proper domain.
-
Get an AWS instance: Ubuntu, preferably c5.4xlarge. Setting up an EC2 instance is well documented.
-
Use Route 53 to point your domain to your elastic IP address. All subdomains (*.my.domain.com) should also point to this elastic IP
-
Once your server is set up, you need to open a few ports. Actually, more than a few. Please let me know if some ports are redundant! (Please ignore port 5033)
-
Edit hostnamectl
sudo hostnamectl set-hostname my.domain.com
-
Edit /etc/hosts
sudo nano /etc/hosts
Add the following lines
Line 1:127.0.0.1 localhost my.domain.com
Line 2:my-elastic-ip my.domain.com
-
This should already be installed, but execute this command
sudo apt install -y apt-transport-https
-
Add Jitsi to repo
echo 'deb https://download.jitsi.org stable/' | sudo tee \ /etc/apt/sources.list.d/jitsi-stable.list
-
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo \ apt-key add -
-
sudo apt update
-
Now Install Jitsi Meet
sudo apt install -y jitsi-meet
When asked for the domain, make sure you type this correctly. This domain is added to a plethora of files and if you get this step wrong, the easiest way would be to purge and start again.
Create a self-signed certificate. Use Letâs Encrpyt later. If you know what youâre doing, use your own SSL cert. -
Generate a lets encrypt cert.
sudo /usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
You will be asked for an email address, and if your domain works correctly, et voila! you have HTTPS! -
Test if Jitsi Meet works correctly.
Go to https://my.domain.com
and if you see Jitsi, youâre almost done with this stage of the setup.
Prosody, Jicofo and Auth setup
Basically, to see the screen where âI am the hostâ, and login, you need to do the following.
-
Most of these commands need root, so
sudo su
-
cd /etc/prosody/conf.avail/
-
nano my.domain.com.cfg.lua
-
In the VirtualHost section for your domain, change the authentication method from
anonymous
tointernal_plain
VirtualHost "my.domain.com"
...
authentication = "internal_plain"
...
- Above the existing VirtualHost section for your site, insert a new VirtualHost section. The name of this VirtualHost is guest. my.domain . For example, insert the following lines to create a new guest VirtualHost for the site my.domain.com.
VirtualHost "guest.my.domain.com"
authentication = "anonymous"
c2s_require_encryption = false
modules_enabled = {
"bosh";
"pubsub";
"ping";
"speakerstats";
"turncredentials";
"conference_duration";
}`
Save the file.
-
Jicofo (Jitsi Conference Focus) is a component of Jitsi Meet that manages user sessions.
While youâre still root,
nano /etc/jitsi/jicofo/sip-communicator.properties
-
Add a new line here
org.jitsi.jicofo.auth.URL=XMPP:my.domain.com
Save and exit.
-
Edit Prosody for Jibri
nano /etc/prosody/conf.d/my.domain.com.cfg.lua
Update the internal muc component as:
file content
-- internal muc component Component "internal.auth.MY.DOMAIN.COM" "muc" storage = "memory" modules_enabled = { "ping"; } admins = { "focus@auth.MY.DOMAIN.COM", "jvb@auth.MY.DOMAIN.COM", "jibri@auth.MY.DOMAIN.COM" } muc_room_locking = false muc_room_default_public_jids = true muc_room_cache_size = 1000 c2s_require_encryption = false
- In the same file, add a recorder VirtualHost
file content
VirtualHost "recorder.MY.DOMAIN.COM" modules_enabled = { "ping"; } authentication = "internal_plain" c2s_require_encryption = false allow_empty_token = true
-
Create Jitsi admin users. These are basically moderators to the conference. If youâre signed in, you will see options like recording and kicking people out.
sudo prosodyctl register christopherblackwell my.domain.com niceAndLongPassword123
Repeat this command for any additional users you want to create. -
Add Jibri to SIP
nano /etc/jitsi/jicofo/sip-communicator.properties
Add the following content to this file
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.my.domain.com
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
- Add Jibri User
prosodyctl register jibri auth.my.domain.com niceAndLongPassword123
prosodyctl register recorder recorder.my.domain.com niceAndLongPassword123
-
Restart all services.
sudo systemctl restart {prosody,jicofo,jitsi-videobridge2,nginx}
-
Login to the Jitsi console and you will see everything up and running! If you can log in using the password and username you set above, you have setup prosody correctly.
Customise the UI
For your instance, you may want to change some logos and text. You can find it all here. I won't go too deep, but here goes-
Changing the watermark: Simply go to
/usr/share/jitsi-meet/images/
and replacewatermark.png
with your own file calledwatermark.png
. Using SFTP or FTP is outside the scope this document. -
Changing the background of the index page: In
/usr/share/jitsi-meet/css/
, replaceall.css
with your own version. Please keep in mind that the CSS is minified, so you may find it difficult to do any changes. From Woodworker_Life:
Original:
background-image: linear-gradient(-90deg, #1251AE 0, #0074FF 50%, #1251AE 100%);
my.domain:background-image: linear-gradient(-90deg, #047500 0, #069E00 50%, #047500 100%);
-
Changing the text:
You will find this at/usr/share/jitsi-meet/libs/app.bundle.min.js
Simply find and replace the text you want to change -
Changing the app name and a few other things Have a look at
/usr/share/jitsi-meet/interface_config.js
Optimise the video quality
Again, thanks Woodworker_Life!
nano /etc/jitsi/meet/my.domain.com-config.js
Find the audio section and set
disableAudioLevels: true,
Find the video-section and insert:
startBitrate: 500,
resolution: 720,
constraints: {
video: {
aspectRatio: 16 / 9,
height: {
ideal: 720,
max: 720,
min: 240
}
}
},
Tweak these values according to your user base.
=================================================================
Setting up 6 dockerized Jibri instances
Phew. Okay if you've reached here, then let's finish this!Each recorder requires a Jibri instance. Expect up to 1 GB of RAM required per Jibri instance.
You have been warned. If your server crashes, it means you need more horsepower.
Couple of things to keep in mind:
- AWS does not come with a Loopback interface. This means that you have to install these in the kernel yourself. Each Jibri recorder requires 2 of its own Loopback interfaces, so please read, and re-read everything I have done here. The limit for number of loopback interfaces is 32, so this means you can have 16 recorders at the most, at one server.
- If you got something wrong, from this point on, you can simply start over from here.
- You will be tweaking with the kernel, so I am not responsible for any loss of data.
- You SHOULD have completed steps 8 - 12 of the Jitsi setup. If youâve jumped to here, go ahead and visit that.
Setting up the Loopback interfaces
Iâm assuming youâre still root. If youâre not
sudo su
-
apt -y install linux-image-extra-virtual
-
nano /etc/default/grub
-
Configure the 12 loopback interfaces for 6 recorders.
echo "options snd-aloop enable=1,1,1,1,1,1,1,1,1,1,1,1 index=0,1,2,3,4,5,6,7,8,9,10,11" > /etc/modprobe.d/alsa-loopback.conf
-
Load it on boot:
echo "snd-aloop">>/etc/modules
-
Load it into the existing Kernel
modprobe snd-aloop
-
See if itâs working
lsmod | grep snd_aloop
Output should be:
snd_aloop 24576 0
snd_pcm 98304 1 snd_aloop
snd 81920 3 snd_timer,snd_aloop,snd_pcm
- Important Edit the following file:
nano /etc/default/grub
-
Modify the value of
GRUB_DEFAULT
fromâ0â to â1>2â
This is the most important step. Youâre basically telling the AWS server to use a generic kernel instead of the one itâs currently using. -
Reboot your instance
reboot
- SSH back in to the server and execute
ls -alh /proc/asound
Your output should be similar to:
Output
dr-xr-xr-x 16 root root 0 Nov 24 13:54 .
dr-xr-xr-x 192 root root 0 Nov 24 13:54 âŚ
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card0
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card1
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card10
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card11
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card2
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card3
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card4
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card5
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card6
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card7
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card8
dr-xr-xr-x 6 root root 0 Nov 24 13:55 card9
-râr--r-- 1 root root 0 Nov 24 13:55 cards
-râr--r-- 1 root root 0 Nov 24 13:55 devices
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback â card0
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_1 â card1
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_2 â card2
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_3 â card3
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_4 â card4
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_5 â card5
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_6 â card6
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_7 â card7
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_8 â card8
lrwxrwxrwx 1 root root 5 Nov 24 13:55 Loopback_9 â card9
lrwxrwxrwx 1 root root 6 Nov 24 13:55 Loopback_A â card10
lrwxrwxrwx 1 root root 6 Nov 24 13:55 Loopback_B â card11
-râr--r-- 1 root root 0 Nov 24 13:55 modules
If this output looks good, proceed to docker.
Installing Docker
A few APT commands
-
sudo apt-get install curl apt-transport-https ca-certificates software-properties-common
-
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
sudo apt update
-
apt-cache policy docker-ce
Check the output:
Output
docker-ce:
Installed: (none)
Candidate: 5:19.03.13~3-0~ubuntu-bionic
Version table:
5:19.03.13~3-0~ubuntu-bionic 500
500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
sudo apt install docker-ce
sudo systemctl status docker
sudo apt install docker-compose
Setting up Docker Jibri
Now that you have docker installed, we need to pull jibri, make 6 instances and connect them to the loopback interfaces.First, go root:
-
sudo su
-
docker pull jitsi/jibri
-
Copy the whole following command in one go
cd &&
mkdir jibri-docker &&
cd jibri-docker &&
touch .env &&
touch jibri.yml &&
mkdir config &&
cd config &&
touch .asoundrc1 &&
touch .asoundrc2 &&
touch .asoundrc3 &&
touch .asoundrc4 &&
touch .asoundrc5 &&
touch .asoundrc6 &&
cd âŚ
-
Important: you need to specify the env file that docker will use for Jibri
nano /root/jibri-docker/.env
-
Add the following content to this file:
.env file content
# JIBRI CONFIG # Internal XMPP domain for authenticated services XMPP_AUTH_DOMAIN=auth.MY.DOMAIN.COM # XMPP domain for the internal MUC used for jibri, jigasi and jvb pools XMPP_INTERNAL_MUC_DOMAIN=internal.auth.MY.DOMAIN.COM # XMPP domain for the jibri recorder XMPP_RECORDER_DOMAIN=recorder.MY.DOMAIN.COM # Internal XMPP server XMPP_SERVER=MY.DOMAIN.COM # Internal XMPP domain XMPP_DOMAIN=MY.DOMAIN.COM # XMPP user for Jibri client connections JIBRI_XMPP_USER=jibri # XMPP password for Jibri client connections JIBRI_XMPP_PASSWORD=YOUR_JIBRI_USER_PASSWORD # MUC name for the Jibri pool JIBRI_BREWERY_MUC=jibribrewery # XMPP recorder user for Jibri client connections JIBRI_RECORDER_USER=recorder # XMPP recorder password for Jibri client connections JIBRI_RECORDER_PASSWORD=YOUR_RECORDER_USER_PASSWORD # Directory for recordings inside Jibri container JIBRI_RECORDING_DIR=/config/recordings # The finalizing script. Will run after recording is complete JIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.sh # When jibri gets a request to start a service for a room, the room # jid will look like: roomName@optional.prefixes.subdomain.xmpp_domain # We'll build the url for the call by transforming that into: # https://xmpp_domain/subdomain/roomName # So if there are any prefixes in the jid (like jitsi meet, which # has its participants join a muc at conference.xmpp_domain) then # list that prefix here so it can be stripped out to generate # the call url correctly JIBRI_STRIP_DOMAIN_JID=conference # Directory for logs inside Jibri container JIBRI_LOGS_DIR=/config/logs DISPLAY=:0=
-
Create a docker-compose file for Jibri
nano /root/jibri-docker/jibri.yml
jibri.yml file content
version: '3' services: jibri1: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri1:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc1:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ depends_on: - jicofo jibri2: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri2:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc2:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ jibri3: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri3:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc3:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ jibri4: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri4:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc4:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ jibri5: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri5:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc5:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ depends_on: - jicofo jibri6: image: jitsi/jibri restart: ${RESTART_POLICY} volumes: - ${CONFIG}/jibri6:/config:Z - /dev/shm:/dev/shm - /root/jibri-docker/config/.asoundrc6:/home/jibri/.asoundrc - /root/jibri-docker/recordings:/config/recordings cap_add: - SYS_ADMIN - NET_BIND_SERVICE devices: - /dev/snd:/dev/snd environment: - XMPP_AUTH_DOMAIN - XMPP_INTERNAL_MUC_DOMAIN - XMPP_RECORDER_DOMAIN - XMPP_SERVER - XMPP_DOMAIN - JIBRI_XMPP_USER - JIBRI_XMPP_PASSWORD - JIBRI_BREWERY_MUC - JIBRI_RECORDER_USER - JIBRI_RECORDER_PASSWORD - JIBRI_RECORDING_DIR - JIBRI_FINALIZE_RECORDING_SCRIPT_PATH - JIBRI_STRIP_DOMAIN_JID - JIBRI_LOGS_DIR - DISPLAY=:0 - TZ
-
Important Step
Add the contents of the following files
nano /root/jibri-docker/config/.asoundrc1
nano /root/jibri-docker/config/.asoundrc2
nano /root/jibri-docker/config/.asoundrc3
nano /root/jibri-docker/config/.asoundrc4
nano /root/jibri-docker/config/.asoundrc5
nano /root/jibri-docker/config/.asoundrc6
.asoundrc1 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_1,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_1,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
.asoundrc2 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback_2,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_3,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_3,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback_2,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
.asoundrc3 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback_4,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_5,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_5,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback_4,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
.asoundrc4 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback_6,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_7,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_7,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback_6,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
.asoundrc5 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback_8,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_9,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_9,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback_8,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
.asoundrc6 file content
pcm.amix { type dmix ipc_key 219345 slave.pcm "hw:Loopback_A,0,0" } pcm.asnoop { type dsnoop ipc_key 219346 slave.pcm "hw:Loopback_B,1,0" } pcm.aduplex { type asym playback.pcm "amix" capture.pcm "asnoop" } pcm.bmix { type dmix ipc_key 219347 slave.pcm "hw:Loopback_B,0,0" } pcm.bsnoop { type dsnoop ipc_key 219348 slave.pcm "hw:Loopback_A,1,0" } pcm.bduplex { type asym playback.pcm "bmix" capture.pcm "bsnoop" } pcm.pjsua { type plug slave.pcm "bduplex" } pcm.!default { type plug slave.pcm "aduplex" }
-
Finally, up the docker containers:
cd /root/jibri-docker
docker-compose -f jibri.yml up -d
-
Check if running
docker ps
-
Check logs of the first container
docker logs jibri-docker_jibri1_1
(This may differ based on your container) -
If you want to restart docker on reboot, execute
docker update ârestart unless-stopped CONTAINER ID
-
Youâre ready to roll!!