Closed yodatak closed 3 years ago
The Dockerfile
file in the jibri subfolder should do the trick. Use docker build ...
to create an image from that Dockerfile. You'll find this image also on the docker hub jitsi/jibri
Sorry for this docker-noob question: Would it also work to eg. just pull the docker image from the docker hub and run it? Or which steps do I still need to do to make this work once I installed docker on my server?
Would it also work to eg. just pull the docker image from the docker hub and run it?
Yes, I think so. You should be able to run e.g. the jibri docker images also standalone. The configuration is done via ENVIRONMENT-Variables. You'll find the available variables in the jibri.yml and described in the README.md
If you need more custom configuration build yor own jibri docker image with the files from the jibri subfolder
It's possible to jibri container as standalone. You just need to have proper .env file mentioned in the README.md with minor customization in the jibri.yml.
This is the jibri.yml which I'm using to run jibri in separate VMs, all communicating with one main prosody server,
version: '3'
services:
jibri:
image: jitsi/jibri
volumes:
- ${CONFIG}/jibri:/config
- /dev/shm:/dev/shm
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
Remember, proper configuration is required to be done in the .env file for the jibri to communicate with the XMPP server.
Thanks for the pointers. I'm still having trouble running it cause docker doesn't seem to use my .env file somehow.
I adjusted the Jitsi Meet server like described on https://github.com/jitsi/jibri. Then I created a docker droplet on DigitalOcean and logged in as root. I used nano .env
to save this:
# JIBRI CONFIG
# Internal XMPP domain for authenticated services
XMPP_AUTH_DOMAIN=auth.mydomain.com
# XMPP domain for the internal MUC used for jibri, jigasi and jvb pools
XMPP_INTERNAL_MUC_DOMAIN=internal-muc.mydomain.com
# XMPP domain for the jibri recorder
XMPP_RECORDER_DOMAIN=recorder.mydomain.com
# Internal XMPP server
XMPP_SERVER=xmpp.mydomain.com
# Internal XMPP domain
XMPP_DOMAIN=mydomain.com
# XMPP user for Jibri client connections
JIBRI_XMPP_USER=jibri
# XMPP password for Jibri client connections
JIBRI_XMPP_PASSWORD=long-and-difficult-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=another-long-and-difficult-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=muc
# Directory for logs inside Jibri container
JIBRI_LOGS_DIR=/config/logs
DISPLAY=:0=
Then I did two different things. First, I tried to just run docker pull jitsi/jibri
and docker run jitsi/jibri
which resulted in an error saying that FATAL ERROR: Jibri recorder password and auth password must be set
even though they were set in the .env
file, right?
And secondly, I tried this: I used nano
to save a jibri.yml
with the contents from @hmharshit and ran docker-compose -f jibri.yml up
which resulted in WARNING: The CONFIG variable is not set. Defaulting to a blank string.
, ERROR: Please load snd-aloop module on the docker host.
, stat: cannot stat '/dev/snd/pcmC0D0p': No such file or directory
and chmod: cannot access '/config/finalize.sh': No such file or directory
. And this just threw up a lot of other errors and I wouldn't know where to begin.
Could anyone provide more detailed instructions on how to get the jibri docker container running or could someone give me a few tips? Help is very appreciated. Thanks in advance.
@lggwettmann What OS are you using? Debian Based or Arch Based?
I'm using Ubuntu 18.04.4 LTS @hmharshit
@lggwettmann Have you followed these steps before installing jibri ? These are pre-requisites before installing jibri, all steps are mentioned in the README.md.
Oh - that helped. Thanks @hmharshit ! I assumed these steps were 'included' in the Docker container. Oops. I followed them and it worked fine. When running the container I do get a whole stack of errors now, though:
root@Jitsi-Recording:~# docker-compose -f jibri.yml up
WARNING: The CONFIG variable is not set. Defaulting to a blank string.
Starting root_jibri_1 ... done
Attaching to root_jibri_1
jibri_1 | [s6-init] making user provided files available at /var/run/s6/etc...exited 0.
jibri_1 | [s6-init] ensuring user provided files have correct perms...exited 0.
jibri_1 | [fix-attrs.d] applying ownership & permissions fixes...
jibri_1 | [fix-attrs.d] done.
jibri_1 | [cont-init.d] executing container initialization scripts...
jibri_1 | [cont-init.d] 01-set-timezone: executing...
jibri_1 | [cont-init.d] 01-set-timezone: exited 0.
jibri_1 | [cont-init.d] 10-config: executing...
jibri_1 | chmod: cannot access '/config/finalize.sh': No such file or directory
jibri_1 | [cont-init.d] 10-config: exited 0.
jibri_1 | [cont-init.d] done.
jibri_1 | [services.d] starting services
jibri_1 | icewm-session: using /root/.icewm for private configuration files
jibri_1 | [services.d] done.
jibri_1 | _XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created.
jibri_1 |
jibri_1 | X.Org X Server 1.19.2
jibri_1 | Release Date: 2017-03-02
jibri_1 | X Protocol Version 11, Revision 0
jibri_1 | Build Operating System: Linux 4.9.0-8-amd64 x86_64 Debian
jibri_1 | Current Operating System: Linux 3ad198e134da 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64
jibri_1 | Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.15.0-96-generic root=UUID=cd899ca9-1943-46c8-9c55-42fc136ef940 ro cgroup_enable=memory swapaccount=1 console=tty1 console=ttyS0
jibri_1 | Build Date: 03 November 2018 03:09:11AM
jibri_1 | xorg-server 2:1.19.2-1+deb9u5 (https://www.debian.org/support)
jibri_1 | Current version of pixman: 0.34.0
jibri_1 | Before reporting problems, check http://wiki.x.org
jibri_1 | to make sure that you have the latest version.
jibri_1 | Markers: (--) probed, (**) from config file, (==) default setting,
jibri_1 | (++) from command line, (!!) notice, (II) informational,
jibri_1 | (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
jibri_1 | (++) Log file: "/tmp/xorg.log", Time: Sun Apr 12 18:11:18 2020
jibri_1 | (++) Using config file: "/etc/jitsi/jibri/xorg-video-dummy.conf"
jibri_1 | (==) Using system config directory "/usr/share/X11/xorg.conf.d"
jibri_1 | 2020-04-12 18:11:19.182 INFO: [1] org.jitsi.jibri.Main.main() Jibri run with args [--config, /etc/jitsi/jibri/config.json]
jibri_1 | 2020-04-12 18:11:19.186 INFO: [1] org.jitsi.jibri.Main.main() Using config file /etc/jitsi/jibri/config.json
jibri_1 | 2020-04-12 18:11:19.191 INFO: [1] org.jitsi.jibri.Main.main() Using port 3333 for internal HTTP API
jibri_1 | 2020-04-12 18:11:19.195 INFO: [1] org.jitsi.jibri.Main.main() Using port 2222 for the HTTP API
jibri_1 | icewmbg: IceWM: using /root/.icewm for private configuration files
jibri_1 | using /root/.icewm for private configuration files
jibri_1 | 2020-04-12 18:11:21.097 INFO: [1] org.jitsi.jibri.Main.loadConfig() Parsed config:
jibri_1 | JibriConfig(recordingDirectory=/config/recordings, singleUseMode=false, enabledStatsD=true, finalizeRecordingScriptPath=/config/finalize.sh, xmppEnvironments=[XmppEnvironmentConfig(name=prod environment, xmppServerHosts=[xmpp.mydomain.com], xmppDomain=mydomain.com, controlLogin=XmppCredentials(domain=auth.mydomain.com, username=jibri, password=kind-tungsten-hasp-auk-hemline), controlMuc=XmppMuc(domain=internal-muc.mydomain.com, roomName=jibribrewery, nickname=jibri-instanse-075160351), sipControlMuc=null, callLogin=XmppCredentials(domain=recorder.mydomain.com, username=recorder, password=horror-heard-bettor-write-onwards), stripFromRoomDomain=muc., usageTimeoutMins=0, trustAllXmppCerts=true)])
jibri_1 | SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
jibri_1 | SLF4J: Defaulting to no-operation (NOP) logger implementation
jibri_1 | SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
jibri_1 | icewmtray: using /root/.icewm for private configuration files
jibri_1 | 2020-04-12 18:11:22.511 WARNING: [1] org.glassfish.jersey.internal.inject.Providers.checkProviderRuntime() A provider org.jitsi.jibri.api.http.internal.InternalHttpApi registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.jitsi.jibri.api.http.internal.InternalHttpApi will be ignored.
jibri_1 | 2020-04-12 18:11:23.256 INFO: [1] org.jitsi.jibri.api.xmpp.XmppApi.updatePresence() Jibri reports its status is now JibriStatus(busyStatus=IDLE, health=OverallHealth(healthStatus=HEALTHY, details={})), publishing presence to connections
jibri_1 | 2020-04-12 18:11:23.258 INFO: [1] org.jitsi.xmpp.mucclient.MucClientManager.log() Setting a presence extension: org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt@771158fb
jibri_1 | 2020-04-12 18:11:23.275 INFO: [1] org.jitsi.jibri.api.xmpp.XmppApi.start() Connecting to xmpp environment on xmpp.mydomain.com with config XmppEnvironmentConfig(name=prod environment, xmppServerHosts=[xmpp.mydomain.com], xmppDomain=mydomain.com, controlLogin=XmppCredentials(domain=auth.mydomain.com, username=jibri, password=kind-tungsten-hasp-auk-hemline), controlMuc=XmppMuc(domain=internal-muc.mydomain.com, roomName=jibribrewery, nickname=jibri-instanse-075160351), sipControlMuc=null, callLogin=XmppCredentials(domain=recorder.mydomain.com, username=recorder, password=horror-heard-bettor-write-onwards), stripFromRoomDomain=muc., usageTimeoutMins=0, trustAllXmppCerts=true)
jibri_1 | 2020-04-12 18:11:23.277 INFO: [1] org.jitsi.jibri.api.xmpp.XmppApi.start() The trustAllXmppCerts config is enabled for this domain, all XMPP server provided certificates will be accepted
jibri_1 | 2020-04-12 18:11:23.328 FINE: [19] org.jitsi.xmpp.mucclient.MucClient.log() Initializing a new MucClient for [ org.jitsi.xmpp.mucclient.MucClientConfiguration id=xmpp.mydomain.com domain=auth.mydomain.com hostname=xmpp.mydomain.com username=jibri mucs=[jibribrewery@internal-muc.mydomain.com] mucNickname=jibri-instanse-075160351 disableCertificateVerification=true]
jibri_1 | 2020-04-12 18:11:23.356 WARNING: [19] org.jitsi.xmpp.mucclient.MucClient.log() Disabling certificate verification!
jibri_1 | 2020-04-12 18:11:23.424 WARNING: [1] org.glassfish.jersey.internal.inject.Providers.checkProviderRuntime() A provider org.jitsi.jibri.api.http.HttpApi registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.jitsi.jibri.api.http.HttpApi will be ignored.
jibri_1 | 2020-04-12 18:11:23.452 FINE: [19] org.jitsi.xmpp.mucclient.MucClient.log() [MucClient id=xmpp.mydomain.com hostname=xmpp.mydomain.com] about to connect and login.
jibri_1 | 2020-04-12 18:11:23.490 SEVERE: [19] org.jitsi.xmpp.mucclient.MucClientManager.log() Failed to initialize and start a MucClient:
jibri_1 | org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'xmpp.mydomain.com:5222' failed because: java.net.UnknownHostException: xmpp.mydomain.com: Name or service not known
jibri_1 | at org.jivesoftware.smack.SmackException$ConnectionException.from(SmackException.java:278)
jibri_1 | at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:619)
jibri_1 | at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:902)
jibri_1 | at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:383)
jibri_1 | at org.jitsi.xmpp.mucclient.MucClient.initializeConnectAndJoin(MucClient.java:277)
jibri_1 | at org.jitsi.xmpp.mucclient.MucClientManager.lambda$addMucClient$0(MucClientManager.java:152)
jibri_1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
jibri_1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
jibri_1 | at java.lang.Thread.run(Thread.java:748)
jibri_1 | 2020-04-12 18:11:53.373 WARNING: [28] org.jivesoftware.smackx.ping.PingManager.pingServerIfNecessary() XMPPConnection was not authenticated
It looks like this part is the issue:
jibri_1 | 2020-04-12 18:11:23.490 SEVERE: [19] org.jitsi.xmpp.mucclient.MucClientManager.log() Failed to initialize and start a MucClient:
jibri_1 | org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'xmpp.mydomain.com:5222' failed because: java.net.UnknownHostException: xmpp.mydomain.com: Name or service not known
Do I need to open some ports on the jitsi-meet instance or something?
Cool! That worked.
Yes @lggwettmann, You need to open some ports on your XMPP server. As far as I remember, the port should be 5222/tcp
, but I don't remember the exact one. You can check the jibri logs and see which port it's trying to access. Start with 5222
though,
Yes, it's 5222, but I can't find how to open them 🙈
Login into the digital ocean console. Open the port in the firewall tab of the VM in the console.
Oh, getcha. Did it - I think, but didn't help. Could this point to another error?
java.net.UnknownHostException: xmpp.mydomain.com: Name or service not known
You need to point to your XMPP domain. This obviously won't work as it's a dummy domain.
Oh yeah yeah, 🤣 of course, mydomain.com is just a placeholder. I replaced my actual domain with mydomain.com here for privacy reasons. 👌
If someone want to make a quick tutorial for use this with a standard installation of jistis + a dockerised jibri it could be awsome !
Okay, I got it to work. Some configuration needs to be different with a standard jitsi install like mine vs the docker jitsi.
I had to set these variables like this in the .env file:
XMPP_INTERNAL_MUC_DOMAIN=internal.auth.mydomain.com --> instead of internal-muc.auth.mydomain.com
XMPP_SERVER=mydomain.com --> instead of xmpp.mydomain.com
Port 5222 didn't need to be opened explicitly in the end. Thanks for your help @hmharshit!
Short summary of how to set up a dockerized Jibri in combination with a Jitsi Meet standard installation:
nano jibri.yml
to save the following code.
version: '3'
services: jibri: image: jitsi/jibri volumes:
5. Use ```nano .env``` to save the following code. Remember to substitute the domain name and use the same usernames and passwords as you used in step 1.
XMPP_AUTH_DOMAIN=auth.mydomain.com
XMPP_INTERNAL_MUC_DOMAIN=internal.auth.mydomain.com
XMPP_RECORDER_DOMAIN=recorder.mydomain.com
XMPP_SERVER=mydomain.com
XMPP_DOMAIN=mydomain.com
JIBRI_XMPP_USER=jibri
JIBRI_XMPP_PASSWORD=long-and-difficult-password
JIBRI_BREWERY_MUC=jibribrewery
JIBRI_RECORDER_USER=recorder
JIBRI_RECORDER_PASSWORD=another-long-and-difficult-password
JIBRI_RECORDING_DIR=/config/recordings
JIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.sh
JIBRI_STRIP_DOMAIN_JID=conference
JIBRI_LOGS_DIR=/config/logs
DISPLAY=:0=
6. Run ```docker-compose -f jibri.yml up```. If you'd like the container to restart on reboots or crashes: find the container ID with ```docker ps -a``` and use it with ```docker update --restart unless-stopped CONTAINER ID```.
7. Make sure that the recording and live stream-buttons in the Jitsi Meet instance at ```/usr/share/jitsi-meet/interface-config.js``` are activated in the toolbar settings.
8. Record your first session via the Jitsi interface :)
Hope that helps @yodatak. Might perhaps even be useful to implement this or something similar in the Readme?
**UPDATED:** I changed the JIBRI_STRIP_DOMAIN_JID-value to make sure Jibri goes to the correct room URL after I had a few issues with that. Added the use of YML and restarting of the container on reboot.
And there is still an issue, unfortunately.
Jibri does record but it only shows the Jitsi logo and one video feed with just a gravatar even if 5 people are in the conference call. I have tried to research it but couldn't find the solution and I think there is an issue with the ports as you suggested @hmharshit .
It seems that there is something wrong with the open ports. Is it possible that the Jibri Docker container closes off some ports and that's why Jibri doesn't receive any media from the Jitsi Meet instance?
I have scanned the ports on the Jitsi Instance (DigitalOcean without firewall):
And on the Jibri Docker I get this - doesn't matter if I open the ports TCP 22, TCP/UDP 443, TCP/UDP 10000 via a Digital Ocean firewall or not:
I've seen instructions saying that UDP 1000 needs to be open on the Jitsi-Meet instance to be able to see more than 2 participants - my installation (without Jibri) works fine with the above set-up, but I'm also not running behind a NAT afaik.
Obviously there is a port-issue on the Jibri Docker container. But I don't know how to tackle this. Also opening it up via a firewall doesn't help/work.
I kept it in this thread cause I assume it has something to do with the fact that I use the standard Jibri installation method + the Jibri Docker in combination. Has anyone an idea how to solve this? Any help is appreciated. How did you solve this @hmharshit ?
Do you happen to have any clue or idea where to start @hmharshit ? The jibri logs didn't seem to give any error either. And my firewalls are deactivated. I appreciate your help.
Hi, I am actually testing this at the moment, and I have the same issue, Jibri only records one feed. Additionally, all recordings stop after exactly 1 minutes. Do you experience the same issue?
Same thing here. 58 seconds and the metadata.json created reports that there were no participants in the meeting..
What does your ${CONFIG} variable reference to in your jibri.yml @hmharshit ? I'm playing around with network_mode: "host" and opening ports via the YML now.
When starting the container I get this warning:
jibri_1 | 2020-04-24 16:34:29.582 WARNING: [1] org.glassfish.jersey.internal.inject.Providers.checkProviderRuntime() A provider org.jitsi.jibri.api.http.internal.InternalHttpApi registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.jitsi.jibri.api.http.internal.InternalHttpApi will be ignored.
And then I get a CallEmpty-Event cause Jibri seems to think it's in the room by itself (??) and that's why the recording stops after about a minute.
jibri_1 | 2020-04-24 16:38:55.853 INFO: [43] org.jitsi.jibri.JibriManager.startFileRecording() Starting a file recording with params: FileRecordingRequestParams(callParams=CallParams(callUrlInfo=CallUrlInfo(baseUrl=https://live.artship.co/conference, callName=testmode, urlParams=[])), sessionId=uhoethoghajhhxwe, callLoginParams=XmppCredentials(domain=recorder.live.artship.co, username=recorder, password=horror-heard-bettor-write-onwards)) finalize script path: /config/finalize.sh and recordings directory: /config/recordings
jibri_1 | Starting ChromeDriver 81.0.4044.69 (6813546031a4bc83f717a2ef7cd4ac6ec1199132-refs/branch-heads/4044@{#776}) on port 13621
jibri_1 | Only local connections are allowed.
jibri_1 | Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
jibri_1 | 2020-04-24 16:38:58.014 INFO: [43] org.openqa.selenium.remote.ProtocolHandshake.createSession() Detected dialect: OSS
jibri_1 | 2020-04-24 16:38:58.056 INFO: [43] org.jitsi.jibri.selenium.JibriSelenium.<init>() Starting empty call check with a timeout of PT30S
jibri_1 | 2020-04-24 16:38:58.095 FINE: [43] org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer.<init>() Detected os as OS: LINUX
jibri_1 | 2020-04-24 16:38:58.111 INFO: [43] org.jitsi.jibri.service.impl.FileRecordingJibriService.<init>() Writing recording to /config/recordings/uhoethoghajhhxwe
jibri_1 | 2020-04-24 16:38:58.126 FINE: [43] org.jitsi.jibri.statsd.JibriStatsDClient.incrementCounter() Incrementing statsd counter: start:recording
jibri_1 | 2020-04-24 16:38:58.132 INFO: [43] org.jitsi.jibri.status.JibriStatusManager.log() Busy status has changed: IDLE -> BUSY
jibri_1 | 2020-04-24 16:38:58.133 INFO: [43] org.jitsi.jibri.api.xmpp.XmppApi.updatePresence() Jibri reports its status is now JibriStatus(busyStatus=BUSY, health=OverallHealth(healthStatus=HEALTHY, details={})), publishing presence to connections
jibri_1 | 2020-04-24 16:38:58.134 INFO: [43] org.jitsi.xmpp.mucclient.MucClientManager.log() Setting a presence extension: org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt@7a3a7749
jibri_1 | 2020-04-24 16:38:58.135 FINE: [43] org.jitsi.xmpp.mucclient.MucClientManager.log() Replacing presence extension: org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt@771158fb
jibri_1 | 2020-04-24 16:38:58.140 FINE: [30] org.jitsi.xmpp.extensions.DefaultPacketExtensionProvider.parse() Could not add a provider for element busy-status from namespace http://jitsi.org/protocol/jibri
jibri_1 | 2020-04-24 16:38:58.142 FINE: [30] org.jitsi.xmpp.extensions.DefaultPacketExtensionProvider.parse() Could not add a provider for element health-status from namespace http://jitsi.org/protocol/health
jibri_1 | 2020-04-24 16:39:00.260 FINE: [53] org.jitsi.jibri.selenium.pageobjects.CallPage.visit() Visiting url https://live.artship.co/conference/testmode#config.iAmRecorder=true&config.externalConnectUrl=null&config.startWithAudioMuted=true&config.startWithVideoMuted=true&interfaceConfig.APP_NAME="Jibri"&config.analytics.disabled=true&config.p2p.enabled=false
jibri_1 | 2020-04-24 16:39:03.806 INFO: [53] org.jitsi.jibri.selenium.pageobjects.CallPage.visit() Waited 2399 milliseconds for call page to load
jibri_1 | 2020-04-24 16:39:03.829 INFO: [53] org.jitsi.jibri.selenium.JibriSelenium.onSeleniumStateChange() Transitioning from state Starting up to Running
jibri_1 | 2020-04-24 16:39:03.831 INFO: [53] org.jitsi.jibri.service.impl.FileRecordingJibriService.invoke() Selenium joined the call, starting the capturer
jibri_1 | 2020-04-24 16:39:03.908 INFO: [53] org.jitsi.jibri.util.JibriSubprocess.ffmpeg.launch() Starting ffmpeg with command ffmpeg -y -v info -f x11grab -draw_mouse 0 -r 30 -s 1280x720 -thread_queue_size 4096 -i :0.0+0,0 -f alsa -thread_queue_size 4096 -i plug:cloop -acodec aac -strict -2 -ar 44100 -c:v libx264 -preset veryfast -profile:v main -level 3.1 -pix_fmt yuv420p -r 30 -crf 25 -g 60 -tune zerolatency -f mp4 /config/recordings/uhoethoghajhhxwe/testmode_2020-04-24-16-38-58.mp4 ([ffmpeg, -y, -v, info, -f, x11grab, -draw_mouse, 0, -r, 30, -s, 1280x720, -thread_queue_size, 4096, -i, :0.0+0,0, -f, alsa, -thread_queue_size, 4096, -i, plug:cloop, -acodec, aac, -strict, -2, -ar, 44100, -c:v, libx264, -preset, veryfast, -profile:v, main, -level, 3.1, -pix_fmt, yuv420p, -r, 30, -crf, 25, -g, 60, -tune, zerolatency, -f, mp4, /config/recordings/uhoethoghajhhxwe/testmode_2020-04-24-16-38-58.mp4])
jibri_1 | 2020-04-24 16:39:05.404 INFO: [57] org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer.onFfmpegStateMachineStateChange() Ffmpeg capturer transitioning from state Starting up to Running
jibri_1 | 2020-04-24 16:39:05.406 INFO: [57] org.jitsi.jibri.service.impl.FileRecordingJibriService.onServiceStateChange() File recording service transitioning from state Starting up to Running
jibri_1 | 2020-04-24 16:39:05.407 INFO: [57] org.jitsi.jibri.api.xmpp.XmppApi.invoke() Current service started up successfully, sending on iq <iq to='jibribrewery@internal.auth.live.artship.co/focus' id='lfutv-38' type='set'><jibri xmlns='http://jitsi.org/protocol/jibri' status='on'/></iq>
jibri_1 | 2020-04-24 16:39:18.914 INFO: [54] org.jitsi.jibri.selenium.JibriSelenium.run() Jibri client receive bitrates: {}, all clients muted? true
jibri_1 | 2020-04-24 16:39:33.856 INFO: [54] org.jitsi.jibri.selenium.JibriSelenium.run() Jibri client receive bitrates: {}, all clients muted? true
jibri_1 | 2020-04-24 16:39:48.867 INFO: [54] org.jitsi.jibri.selenium.JibriSelenium.run() Jibri client receive bitrates: {}, all clients muted? true
jibri_1 | 2020-04-24 16:40:03.825 INFO: [54] org.jitsi.jibri.selenium.JibriSelenium.run() Call has been empty since 2020-04-24T14:39:18.861Z (PT44.949S ago). Returning CallEmpty event
Hi @lggwettmann.
Do you happen to have any clue or idea where to start? The jibri logs didn't seem to give any error either. And my firewalls are deactivated.
No, I don't have any idea why recording is not working for you.
What does your ${CONFIG} variable reference to in your jibri.yml?
It refers to the path of the directory where my config files are stored for the web, prosody, etc. It's the default one that comes in env.example in the repository.
For your issue, I'll suggest if you create a new issue regarding the problem you are facing as your original issue is already fixed.
Thanks for your help and feedback, you are correct. Will do so 👍🏻
I found the issue after setting up a completely new non-docker Jibri server. The JIBRI_STRIP_DOMAIN_JID
needed to be conference
for normal Jitsi Meet instances.. :/
I updated my little tutorial above.
Nice, I'll test this out when I have a chance, thanks for the update.
@hmharshit Hi, Need a help from you. To set up those variables in .env file do I need to this for each container or in the server level? Please help, I need to setup multiple jibri using docker.
My 3 node configuration here BARE METAL implementation,
I have tried on K8s but got stuck in scaling jibri due to manual step and --device /dev/snd binding error, so have tried docker swarm option too, but again same problem of --device /dev/snd binding error.
So finally I deployed using docker-compose, which works for me quite well.
My docker-compose.yml for master:172.16.10.7
version: '3'
services:
# Frontend
web:
image: jitsi/web:latest
restart: ${RESTART_POLICY}
ports:
- '${HTTP_PORT}:80'
- '${HTTPS_PORT}:443'
volumes:
- ${CONFIG}/web:/config:Z
- ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z
environment:
- ENABLE_LETSENCRYPT
- ENABLE_HTTP_REDIRECT
- ENABLE_HSTS
- ENABLE_XMPP_WEBSOCKET
- DISABLE_HTTPS
- LETSENCRYPT_DOMAIN
- LETSENCRYPT_EMAIL
- LETSENCRYPT_USE_STAGING
- PUBLIC_URL
- TZ
- AMPLITUDE_ID
- ANALYTICS_SCRIPT_URLS
- ANALYTICS_WHITELISTED_EVENTS
- BRIDGE_CHANNEL
- CALLSTATS_CUSTOM_SCRIPT_URL
- CALLSTATS_ID
- CALLSTATS_SECRET
- CHROME_EXTENSION_BANNER_JSON
- CONFCODE_URL
- CONFIG_EXTERNAL_CONNECT
- DEPLOYMENTINFO_ENVIRONMENT
- DEPLOYMENTINFO_ENVIRONMENT_TYPE
- DEPLOYMENTINFO_USERREGION
- DIALIN_NUMBERS_URL
- DIALOUT_AUTH_URL
- DIALOUT_CODES_URL
- DROPBOX_APPKEY
- DROPBOX_REDIRECT_URI
- DYNAMIC_BRANDING_URL
- ENABLE_AUDIO_PROCESSING
- ENABLE_AUTH
- ENABLE_CALENDAR
- ENABLE_FILE_RECORDING_SERVICE
- ENABLE_FILE_RECORDING_SERVICE_SHARING
- ENABLE_GUESTS
- ENABLE_IPV6
- ENABLE_LIPSYNC
- ENABLE_NO_AUDIO_DETECTION
- ENABLE_P2P
- ENABLE_PREJOIN_PAGE
- ENABLE_WELCOME_PAGE
- ENABLE_CLOSE_PAGE
- ENABLE_RECORDING
- ENABLE_REMB
- ENABLE_REQUIRE_DISPLAY_NAME
- ENABLE_SIMULCAST
- ENABLE_STATS_ID
- ENABLE_STEREO
- ENABLE_SUBDOMAINS
- ENABLE_TALK_WHILE_MUTED
- ENABLE_TCC
- ENABLE_TRANSCRIPTIONS
- ETHERPAD_PUBLIC_URL
- ETHERPAD_URL_BASE
- GOOGLE_ANALYTICS_ID
- GOOGLE_API_APP_CLIENT_ID
- INVITE_SERVICE_URL
- JICOFO_AUTH_USER
- MATOMO_ENDPOINT
- MATOMO_SITE_ID
- MICROSOFT_API_APP_CLIENT_ID
- NGINX_RESOLVER
- NGINX_WORKER_PROCESSES
- NGINX_WORKER_CONNECTIONS
- PEOPLE_SEARCH_URL
- RESOLUTION
- RESOLUTION_MIN
- RESOLUTION_WIDTH
- RESOLUTION_WIDTH_MIN
- START_AUDIO_ONLY
- START_AUDIO_MUTED
- DISABLE_AUDIO_LEVELS
- ENABLE_NOISY_MIC_DETECTION
- START_BITRATE
- DESKTOP_SHARING_FRAMERATE_MIN
- DESKTOP_SHARING_FRAMERATE_MAX
- START_VIDEO_MUTED
- TESTING_CAP_SCREENSHARE_BITRATE
- TESTING_OCTO_PROBABILITY
- XMPP_AUTH_DOMAIN
- XMPP_BOSH_URL_BASE
- XMPP_DOMAIN
- XMPP_GUEST_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_RECORDER_DOMAIN
- TOKEN_AUTH_URL
networks:
meet.jitsi:
aliases:
- ${XMPP_DOMAIN}
# XMPP server
prosody:
image: jitsi/prosody:latest
restart: ${RESTART_POLICY}
ports:
- '5222:5222'
- '5347:5347'
- '5280:5280'
volumes:
- ${CONFIG}/prosody/config:/config:Z
- ${CONFIG}/prosody/prosody-plugins-custom:/prosody-plugins-custom:Z
environment:
- AUTH_TYPE
- ENABLE_AUTH
- ENABLE_GUESTS
- ENABLE_LOBBY
- ENABLE_XMPP_WEBSOCKET
- GLOBAL_MODULES
- GLOBAL_CONFIG
- LDAP_URL
- LDAP_BASE
- LDAP_BINDDN
- LDAP_BINDPW
- LDAP_FILTER
- LDAP_AUTH_METHOD
- LDAP_VERSION
- LDAP_USE_TLS
- LDAP_TLS_CIPHERS
- LDAP_TLS_CHECK_PEER
- LDAP_TLS_CACERT_FILE
- LDAP_TLS_CACERT_DIR
- LDAP_START_TLS
- XMPP_DOMAIN
- XMPP_AUTH_DOMAIN
- XMPP_GUEST_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_MODULES
- XMPP_MUC_MODULES
- XMPP_INTERNAL_MUC_MODULES
- XMPP_RECORDER_DOMAIN
- XMPP_CROSS_DOMAIN
- JICOFO_COMPONENT_SECRET
- JICOFO_AUTH_USER
- JICOFO_AUTH_PASSWORD
- JVB_AUTH_USER
- JVB_AUTH_PASSWORD
- JIGASI_XMPP_USER
- JIGASI_XMPP_PASSWORD
- JIBRI_XMPP_USER
- JIBRI_XMPP_PASSWORD
- JIBRI_RECORDER_USER
- JIBRI_RECORDER_PASSWORD
- JWT_APP_ID
- JWT_APP_SECRET
- JWT_ACCEPTED_ISSUERS
- JWT_ACCEPTED_AUDIENCES
- JWT_ASAP_KEYSERVER
- JWT_ALLOW_EMPTY
- JWT_AUTH_TYPE
- JWT_TOKEN_AUTH_MODULE
- LOG_LEVEL
- PUBLIC_URL
- TZ
networks:
meet.jitsi:
aliases:
- ${XMPP_SERVER}
# Focus component
jicofo:
image: jitsi/jicofo:latest
restart: ${RESTART_POLICY}
volumes:
- ${CONFIG}/jicofo:/config:Z
environment:
- AUTH_TYPE
- BRIDGE_AVG_PARTICIPANT_STRESS
- BRIDGE_STRESS_THRESHOLD
- ENABLE_AUTH
- ENABLE_AUTO_OWNER
- ENABLE_CODEC_VP8
- ENABLE_CODEC_VP9
- ENABLE_CODEC_H264
- ENABLE_RECORDING
- ENABLE_SCTP
- JICOFO_COMPONENT_SECRET
- JICOFO_AUTH_USER
- JICOFO_AUTH_PASSWORD
- JICOFO_ENABLE_BRIDGE_HEALTH_CHECKS
- JICOFO_CONF_INITIAL_PARTICIPANT_WAIT_TIMEOUT
- JICOFO_CONF_SINGLE_PARTICIPANT_TIMEOUT
- JICOFO_ENABLE_HEALTH_CHECKS
- JICOFO_SHORT_ID
- JICOFO_RESERVATION_ENABLED
- JICOFO_RESERVATION_REST_BASE_URL
- JIBRI_BREWERY_MUC
- JIBRI_REQUEST_RETRIES
- JIBRI_PENDING_TIMEOUT
- JIGASI_BREWERY_MUC
- JIGASI_SIP_URI
- JVB_BREWERY_MUC
- MAX_BRIDGE_PARTICIPANTS
- OCTO_BRIDGE_SELECTION_STRATEGY
- TZ
- XMPP_DOMAIN
- XMPP_AUTH_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_MUC_DOMAIN
- XMPP_SERVER
depends_on:
- prosody
networks:
meet.jitsi:
# Video bridge
jvb:
image: jitsi/jvb:latest
restart: ${RESTART_POLICY}
ports:
- '${JVB_PORT}:${JVB_PORT}/udp'
- '${JVB_TCP_PORT}:${JVB_TCP_PORT}'
volumes:
- ${CONFIG}/jvb:/config:Z
environment:
- DOCKER_HOST_ADDRESS
- XMPP_AUTH_DOMAIN
- XMPP_INTERNAL_MUC_DOMAIN
- XMPP_SERVER
- JVB_AUTH_USER
- JVB_AUTH_PASSWORD
- JVB_BREWERY_MUC
- JVB_PORT
- JVB_TCP_HARVESTER_DISABLED
- JVB_TCP_PORT
- JVB_TCP_MAPPED_PORT
- JVB_STUN_SERVERS
- JVB_ENABLE_APIS
- JVB_WS_DOMAIN
- JVB_WS_SERVER_ID
- PUBLIC_URL
- TZ
depends_on:
- prosody
networks:
meet.jitsi:
aliases:
- jvb.meet.jitsi
# Custom network so all services can communicate using a FQDN
networks:
meet.jitsi:
.env
for web, jicof, jvb, prosody for master: 172.16.10.7 as follows# shellcheck disable=SC2034
# Security
#
# Set these to strong passwords to avoid intruders from impersonating a service account
# The service(s) won't start unless these are specified
# Running ./gen-passwords.sh will update .env with strong passwords
# You may skip the Jigasi and Jibri passwords if you are not using those
# DO NOT reuse passwords
#
# XMPP component password for Jicofo
JICOFO_COMPONENT_SECRET=password1
# XMPP password for Jicofo client connections
JICOFO_AUTH_PASSWORD=password2
# XMPP password for JVB client connections
JVB_AUTH_PASSWORD=password3
# XMPP password for Jigasi MUC client connections
JIGASI_XMPP_PASSWORD=password4
# XMPP recorder password for Jibri client connections
JIBRI_RECORDER_PASSWORD=password5
# XMPP password for Jibri client connections
JIBRI_XMPP_PASSWORD=password6
#
# Basic configuration options
#
# Directory where all configuration will be stored
CONFIG=~/.jitsi-meet-cfg
# Exposed HTTP port
HTTP_PORT=80
# Exposed HTTPS port
HTTPS_PORT=443
# System time zone
TZ=UTC
# Public URL for the web service (required)
PUBLIC_URL=https://172.16.10.7:443
# IP address of the Docker host
# See the "Running behind NAT or on a LAN environment" section in the Handbook:
# https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#running-behind-nat-or-on-a-lan-environment
DOCKER_HOST_ADDRESS=172.16.10.7
# Control whether the lobby feature should be enabled or not
ENABLE_LOBBY=1
# Show a prejoin page before entering a conference
#ENABLE_PREJOIN_PAGE=0
# Enable the welcome page
#ENABLE_WELCOME_PAGE=1
# Enable the close page
#ENABLE_CLOSE_PAGE=0
# Disable measuring of audio levels
#DISABLE_AUDIO_LEVELS=0
# Enable noisy mic detection
#ENABLE_NOISY_MIC_DETECTION=1
#
# Let's Encrypt configuration
#
# Enable Let's Encrypt certificate generation
#ENABLE_LETSENCRYPT=1
# Domain for which to generate the certificate
#LETSENCRYPT_DOMAIN=meet.example.com
# E-Mail for receiving important account notifications (mandatory)
#LETSENCRYPT_EMAIL=alice@atlanta.net
# Use the staging server (for avoiding rate limits while testing)
#LETSENCRYPT_USE_STAGING=1
#
# Etherpad integration (for document sharing)
#
# Set etherpad-lite URL in docker local network (uncomment to enable)
#ETHERPAD_URL_BASE=http://etherpad.meet.jitsi:9001
# Set etherpad-lite public URL (uncomment to enable)
#ETHERPAD_PUBLIC_URL=https://etherpad.my.domain
# Name your etherpad instance!
ETHERPAD_TITLE='Video Chat'
# The default text of a pad
ETHERPAD_DEFAULT_PAD_TEXT='Welcome to Web Chat!\n\n'
# Name of the skin for etherpad
ETHERPAD_SKIN_NAME=colibris
# Skin variants for etherpad
ETHERPAD_SKIN_VARIANTS='super-light-toolbar super-light-editor light-background full-width-editor'
#
# Basic Jigasi configuration options (needed for SIP gateway support)
#
# SIP URI for incoming / outgoing calls
#JIGASI_SIP_URI=test@sip2sip.info
# Password for the specified SIP account as a clear text
#JIGASI_SIP_PASSWORD=passw0rd
# SIP server (use the SIP account domain if in doubt)
#JIGASI_SIP_SERVER=sip2sip.info
# SIP server port
#JIGASI_SIP_PORT=5060
# SIP server transport
#JIGASI_SIP_TRANSPORT=UDP
#
# Authentication configuration (see handbook for details)
#
# Enable authentication
ENABLE_AUTH=1
# Enable guest access
ENABLE_GUESTS=1
# Select authentication type: internal, jwt or ldap
AUTH_TYPE=internal
# JWT authentication
#
# Application identifier
#JWT_APP_ID=my_jitsi_app_id
# Application secret known only to your token
#JWT_APP_SECRET=my_jitsi_app_secret
# (Optional) Set asap_accepted_issuers as a comma separated list
#JWT_ACCEPTED_ISSUERS=my_web_client,my_app_client
# (Optional) Set asap_accepted_audiences as a comma separated list
#JWT_ACCEPTED_AUDIENCES=my_server1,my_server2
# LDAP authentication (for more information see the Cyrus SASL saslauthd.conf man page)
#
# LDAP url for connection
#LDAP_URL=ldaps://ldap.domain.com/
# LDAP base DN. Can be empty
#LDAP_BASE=DC=example,DC=domain,DC=com
# LDAP user DN. Do not specify this parameter for the anonymous bind
#LDAP_BINDDN=CN=binduser,OU=users,DC=example,DC=domain,DC=com
# LDAP user password. Do not specify this parameter for the anonymous bind
#LDAP_BINDPW=LdapUserPassw0rd
# LDAP filter. Tokens example:
# %1-9 - if the input key is user@mail.domain.com, then %1 is com, %2 is domain and %3 is mail
# %s - %s is replaced by the complete service string
# %r - %r is replaced by the complete realm string
#LDAP_FILTER=(sAMAccountName=%u)
# LDAP authentication method
#LDAP_AUTH_METHOD=bind
# LDAP version
#LDAP_VERSION=3
# LDAP TLS using
#LDAP_USE_TLS=1
# List of SSL/TLS ciphers to allow
#LDAP_TLS_CIPHERS=SECURE256:SECURE128:!AES-128-CBC:!ARCFOUR-128:!CAMELLIA-128-CBC:!3DES-CBC:!CAMELLIA-128-CBC
# Require and verify server certificate
#LDAP_TLS_CHECK_PEER=1
# Path to CA cert file. Used when server certificate verify is enabled
#LDAP_TLS_CACERT_FILE=/etc/ssl/certs/ca-certificates.crt
# Path to CA certs directory. Used when server certificate verify is enabled
#LDAP_TLS_CACERT_DIR=/etc/ssl/certs
# Wether to use starttls, implies LDAPv3 and requires ldap:// instead of ldaps://
# LDAP_START_TLS=1
#
# Advanced configuration options (you generally don't need to change these)
#
# Internal XMPP domain
XMPP_DOMAIN=172.16.10.7
# Internal XMPP server
XMPP_SERVER=xmpp.172.16.10.7
# Internal XMPP server URL
XMPP_BOSH_URL_BASE=http://xmpp.172.16.10.7:5280
# Internal XMPP domain for authenticated services
XMPP_AUTH_DOMAIN=auth.172.16.10.7
# XMPP domain for the MUC
XMPP_MUC_DOMAIN=muc.172.16.10.7
# XMPP domain for the internal MUC used for jibri, jigasi and jvb pools
XMPP_INTERNAL_MUC_DOMAIN=internal-muc.172.16.10.7
# XMPP domain for unauthenticated users
XMPP_GUEST_DOMAIN=guest.172.16.10.7
# Comma separated list of domains for cross domain policy or "true" to allow all
# The PUBLIC_URL is always allowed
#XMPP_CROSS_DOMAIN=true
# Custom Prosody modules for XMPP_DOMAIN (comma separated)
XMPP_MODULES=info,alert
# Custom Prosody modules for MUC component (comma separated)
XMPP_MUC_MODULES=info,alert
# Custom Prosody modules for internal MUC component (comma separated)
XMPP_INTERNAL_MUC_MODULES=info,alert
# MUC for the JVB pool
JVB_BREWERY_MUC=jvbbrewery
# XMPP user for JVB client connections
JVB_AUTH_USER=jvb
# STUN servers used to discover the server's public IP
JVB_STUN_SERVERS=meet-jit-si-turnrelay.jitsi.net:443
# Media port for the Jitsi Videobridge
JVB_PORT=10000
# TCP Fallback for Jitsi Videobridge for when UDP isn't available
JVB_TCP_HARVESTER_DISABLED=true
JVB_TCP_PORT=4443
JVB_TCP_MAPPED_PORT=4443
# A comma separated list of APIs to enable when the JVB is started [default: none]
# See https://github.com/jitsi/jitsi-videobridge/blob/master/doc/rest.md for more information
#JVB_ENABLE_APIS=rest,colibri
# XMPP user for Jicofo client connections.
# NOTE: this option doesn't currently work due to a bug
JICOFO_AUTH_USER=focus
# Base URL of Jicofo's reservation REST API
#JICOFO_RESERVATION_REST_BASE_URL=http://reservation.example.com
# Enable Jicofo's health check REST API (http://<jicofo_base_url>:8888/about/health)
#JICOFO_ENABLE_HEALTH_CHECKS=true
# XMPP user for Jigasi MUC client connections
JIGASI_XMPP_USER=jigasi
# MUC name for the Jigasi pool
JIGASI_BREWERY_MUC=jigasibrewery
# Minimum port for media used by Jigasi
JIGASI_PORT_MIN=20000
# Maximum port for media used by Jigasi
JIGASI_PORT_MAX=20050
# Enable SDES srtp
#JIGASI_ENABLE_SDES_SRTP=1
# Keepalive method
#JIGASI_SIP_KEEP_ALIVE_METHOD=OPTIONS
# Health-check extension
#JIGASI_HEALTH_CHECK_SIP_URI=keepalive
# Health-check interval
#JIGASI_HEALTH_CHECK_INTERVAL=300000
#
# Enable Jigasi transcription
#ENABLE_TRANSCRIPTIONS=1
# Jigasi will record audio when transcriber is on [default: false]
#JIGASI_TRANSCRIBER_RECORD_AUDIO=true
# Jigasi will send transcribed text to the chat when transcriber is on [default: false]
#JIGASI_TRANSCRIBER_SEND_TXT=true
# Jigasi will post an url to the chat with transcription file [default: false]
#JIGASI_TRANSCRIBER_ADVERTISE_URL=true
# Credentials for connect to Cloud Google API from Jigasi
# Please read https://cloud.google.com/text-to-speech/docs/quickstart-protocol
# section "Before you begin" paragraph 1 to 5
# Copy the values from the json to the related env vars
#GC_PROJECT_ID=
#GC_PRIVATE_KEY_ID=
#GC_PRIVATE_KEY=
#GC_CLIENT_EMAIL=
#GC_CLIENT_ID=
#GC_CLIENT_CERT_URL=
# Enable recording
ENABLE_RECORDING=1
# XMPP domain for the jibri recorder
XMPP_RECORDER_DOMAIN=recorder.172.16.10.7
# XMPP recorder user for Jibri client connections
JIBRI_RECORDER_USER=recorder
# 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
# XMPP user for Jibri client connections
JIBRI_XMPP_USER=jibri
# MUC name for the Jibri pool
JIBRI_BREWERY_MUC=jibribrewery
# MUC connection timeout
JIBRI_PENDING_TIMEOUT=90
# 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=muc
# Directory for logs inside Jibri container
JIBRI_LOGS_DIR=/config/logs
# Disable HTTPS: handle TLS connections outside of this setup
#DISABLE_HTTPS=1
# Redirect HTTP traffic to HTTPS
# Necessary for Let's Encrypt, relies on standard HTTPS port (443)
#ENABLE_HTTP_REDIRECT=1
# Send a `strict-transport-security` header to force browsers to use
# a secure and trusted connection. Recommended for production use.
# Defaults to 1 (send the header).
# ENABLE_HSTS=1
# Enable IPv6
# Provides means to disable IPv6 in environments that don't support it (get with the times, people!)
#ENABLE_IPV6=1
# Container restart policy
# Defaults to unless-stopped
RESTART_POLICY=unless-stopped
# Authenticate using external service or just focus external auth window if there is one already.
# TOKEN_AUTH_URL=https://auth.meet.example.com/{room}
* Master:172.16.10.7 source .env docker-compose up -d
jibri.yml
version: '3'
services:
jibri:
image: jitsi/jibri:latest
restart: ${RESTART_POLICY}
volumes:
- ${CONFIG}/jibri:/config:Z
- /dev/shm:/dev/shm
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
# networks:
# meet.jitsi:
.env
for node1: 172.16.10.6 and node2: 172.16.10.8 is# shellcheck disable=SC2034
# Security
#
# Set these to strong passwords to avoid intruders from impersonating a service account
# The service(s) won't start unless these are specified
# Running ./gen-passwords.sh will update .env with strong passwords
# You may skip the Jigasi and Jibri passwords if you are not using those
# DO NOT reuse passwords
#
# XMPP component password for Jicofo
JICOFO_COMPONENT_SECRET=password1
# XMPP password for Jicofo client connections
JICOFO_AUTH_PASSWORD=password2
# XMPP password for JVB client connections
JVB_AUTH_PASSWORD=password3
# XMPP password for Jigasi MUC client connections
JIGASI_XMPP_PASSWORD=password4
# XMPP recorder password for Jibri client connections
JIBRI_RECORDER_PASSWORD=password5
# XMPP password for Jibri client connections
JIBRI_XMPP_PASSWORD=password6
#
# Basic configuration options
#
# Directory where all configuration will be stored
CONFIG=~/.jitsi-meet-cfg
# Exposed HTTP port
HTTP_PORT=80
# Exposed HTTPS port
HTTPS_PORT=443
# System time zone
TZ=UTC
# Public URL for the web service (required)
PUBLIC_URL=https://172.16.10.7:443
# IP address of the Docker host
# See the "Running behind NAT or on a LAN environment" section in the Handbook:
# https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#running-behind-nat-or-on-a-lan-environment
DOCKER_HOST_ADDRESS=172.16.10.7
# Control whether the lobby feature should be enabled or not
ENABLE_LOBBY=1
# Show a prejoin page before entering a conference
#ENABLE_PREJOIN_PAGE=0
# Enable the welcome page
#ENABLE_WELCOME_PAGE=1
# Enable the close page
#ENABLE_CLOSE_PAGE=0
# Disable measuring of audio levels
#DISABLE_AUDIO_LEVELS=0
# Enable noisy mic detection
#ENABLE_NOISY_MIC_DETECTION=1
#
# Let's Encrypt configuration
#
# Enable Let's Encrypt certificate generation
#ENABLE_LETSENCRYPT=1
# Domain for which to generate the certificate
#LETSENCRYPT_DOMAIN=meet.example.com
# E-Mail for receiving important account notifications (mandatory)
#LETSENCRYPT_EMAIL=alice@atlanta.net
# Use the staging server (for avoiding rate limits while testing)
#LETSENCRYPT_USE_STAGING=1
#
# Etherpad integration (for document sharing)
#
# Set etherpad-lite URL in docker local network (uncomment to enable)
#ETHERPAD_URL_BASE=http://etherpad.meet.jitsi:9001
# Set etherpad-lite public URL (uncomment to enable)
#ETHERPAD_PUBLIC_URL=https://etherpad.my.domain
# Name your etherpad instance!
ETHERPAD_TITLE='Video Chat'
# The default text of a pad
ETHERPAD_DEFAULT_PAD_TEXT='Welcome to Web Chat!\n\n'
# Name of the skin for etherpad
ETHERPAD_SKIN_NAME=colibris
# Skin variants for etherpad
ETHERPAD_SKIN_VARIANTS='super-light-toolbar super-light-editor light-background full-width-editor'
#
# Basic Jigasi configuration options (needed for SIP gateway support)
#
# SIP URI for incoming / outgoing calls
#JIGASI_SIP_URI=test@sip2sip.info
# Password for the specified SIP account as a clear text
#JIGASI_SIP_PASSWORD=passw0rd
# SIP server (use the SIP account domain if in doubt)
#JIGASI_SIP_SERVER=sip2sip.info
# SIP server port
#JIGASI_SIP_PORT=5060
# SIP server transport
#JIGASI_SIP_TRANSPORT=UDP
#
# Authentication configuration (see handbook for details)
#
# Enable authentication
ENABLE_AUTH=1
# Enable guest access
ENABLE_GUESTS=1
# Select authentication type: internal, jwt or ldap
AUTH_TYPE=internal
# JWT authentication
#
# Application identifier
#JWT_APP_ID=my_jitsi_app_id
# Application secret known only to your token
#JWT_APP_SECRET=my_jitsi_app_secret
# (Optional) Set asap_accepted_issuers as a comma separated list
#JWT_ACCEPTED_ISSUERS=my_web_client,my_app_client
# (Optional) Set asap_accepted_audiences as a comma separated list
#JWT_ACCEPTED_AUDIENCES=my_server1,my_server2
# LDAP authentication (for more information see the Cyrus SASL saslauthd.conf man page)
#
# LDAP url for connection
#LDAP_URL=ldaps://ldap.domain.com/
# LDAP base DN. Can be empty
#LDAP_BASE=DC=example,DC=domain,DC=com
# LDAP user DN. Do not specify this parameter for the anonymous bind
#LDAP_BINDDN=CN=binduser,OU=users,DC=example,DC=domain,DC=com
# LDAP user password. Do not specify this parameter for the anonymous bind
#LDAP_BINDPW=LdapUserPassw0rd
# LDAP filter. Tokens example:
# %1-9 - if the input key is user@mail.domain.com, then %1 is com, %2 is domain and %3 is mail
# %s - %s is replaced by the complete service string
# %r - %r is replaced by the complete realm string
#LDAP_FILTER=(sAMAccountName=%u)
# LDAP authentication method
#LDAP_AUTH_METHOD=bind
# LDAP version
#LDAP_VERSION=3
# LDAP TLS using
#LDAP_USE_TLS=1
# List of SSL/TLS ciphers to allow
#LDAP_TLS_CIPHERS=SECURE256:SECURE128:!AES-128-CBC:!ARCFOUR-128:!CAMELLIA-128-CBC:!3DES-CBC:!CAMELLIA-128-CBC
# Require and verify server certificate
#LDAP_TLS_CHECK_PEER=1
# Path to CA cert file. Used when server certificate verify is enabled
#LDAP_TLS_CACERT_FILE=/etc/ssl/certs/ca-certificates.crt
# Path to CA certs directory. Used when server certificate verify is enabled
#LDAP_TLS_CACERT_DIR=/etc/ssl/certs
# Wether to use starttls, implies LDAPv3 and requires ldap:// instead of ldaps://
# LDAP_START_TLS=1
#
# Advanced configuration options (you generally don't need to change these)
#
# Internal XMPP domain
XMPP_DOMAIN=172.16.10.7
# Internal XMPP server
XMPP_SERVER=172.16.10.7
# Internal XMPP server URL
XMPP_BOSH_URL_BASE=http://xmpp.172.16.10.7:5280
# Internal XMPP domain for authenticated services
XMPP_AUTH_DOMAIN=auth.172.16.10.7
# XMPP domain for the MUC
XMPP_MUC_DOMAIN=muc.172.16.10.7
# XMPP domain for the internal MUC used for jibri, jigasi and jvb pools
XMPP_INTERNAL_MUC_DOMAIN=internal-muc.172.16.10.7
# XMPP domain for unauthenticated users
XMPP_GUEST_DOMAIN=guest.172.16.10.7
# Comma separated list of domains for cross domain policy or "true" to allow all
# The PUBLIC_URL is always allowed
#XMPP_CROSS_DOMAIN=true
# Custom Prosody modules for XMPP_DOMAIN (comma separated)
XMPP_MODULES=info,alert
# Custom Prosody modules for MUC component (comma separated)
XMPP_MUC_MODULES=info,alert
# Custom Prosody modules for internal MUC component (comma separated)
XMPP_INTERNAL_MUC_MODULES=info,alert
# MUC for the JVB pool
JVB_BREWERY_MUC=jvbbrewery
# XMPP user for JVB client connections
JVB_AUTH_USER=jvb
# STUN servers used to discover the server's public IP
JVB_STUN_SERVERS=meet-jit-si-turnrelay.jitsi.net:443
# Media port for the Jitsi Videobridge
JVB_PORT=10000
# TCP Fallback for Jitsi Videobridge for when UDP isn't available
JVB_TCP_HARVESTER_DISABLED=true
JVB_TCP_PORT=4443
JVB_TCP_MAPPED_PORT=4443
# A comma separated list of APIs to enable when the JVB is started [default: none]
# See https://github.com/jitsi/jitsi-videobridge/blob/master/doc/rest.md for more information
#JVB_ENABLE_APIS=rest,colibri
# XMPP user for Jicofo client connections.
# NOTE: this option doesn't currently work due to a bug
JICOFO_AUTH_USER=focus
# Base URL of Jicofo's reservation REST API
#JICOFO_RESERVATION_REST_BASE_URL=http://reservation.example.com
# Enable Jicofo's health check REST API (http://<jicofo_base_url>:8888/about/health)
#JICOFO_ENABLE_HEALTH_CHECKS=true
# XMPP user for Jigasi MUC client connections
JIGASI_XMPP_USER=jigasi
# MUC name for the Jigasi pool
JIGASI_BREWERY_MUC=jigasibrewery
# Minimum port for media used by Jigasi
JIGASI_PORT_MIN=20000
# Maximum port for media used by Jigasi
JIGASI_PORT_MAX=20050
# Enable SDES srtp
#JIGASI_ENABLE_SDES_SRTP=1
# Keepalive method
#JIGASI_SIP_KEEP_ALIVE_METHOD=OPTIONS
# Health-check extension
#JIGASI_HEALTH_CHECK_SIP_URI=keepalive
# Health-check interval
#JIGASI_HEALTH_CHECK_INTERVAL=300000
#
# Enable Jigasi transcription
#ENABLE_TRANSCRIPTIONS=1
# Jigasi will record audio when transcriber is on [default: false]
#JIGASI_TRANSCRIBER_RECORD_AUDIO=true
# Jigasi will send transcribed text to the chat when transcriber is on [default: false]
#JIGASI_TRANSCRIBER_SEND_TXT=true
# Jigasi will post an url to the chat with transcription file [default: false]
#JIGASI_TRANSCRIBER_ADVERTISE_URL=true
# Credentials for connect to Cloud Google API from Jigasi
# Please read https://cloud.google.com/text-to-speech/docs/quickstart-protocol
# section "Before you begin" paragraph 1 to 5
# Copy the values from the json to the related env vars
#GC_PROJECT_ID=
#GC_PRIVATE_KEY_ID=
#GC_PRIVATE_KEY=
#GC_CLIENT_EMAIL=
#GC_CLIENT_ID=
#GC_CLIENT_CERT_URL=
# Enable recording
ENABLE_RECORDING=1
# XMPP domain for the jibri recorder
XMPP_RECORDER_DOMAIN=recorder.172.16.10.7
# XMPP recorder user for Jibri client connections
JIBRI_RECORDER_USER=recorder
# 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
# XMPP user for Jibri client connections
JIBRI_XMPP_USER=jibri
# MUC name for the Jibri pool
JIBRI_BREWERY_MUC=jibribrewery
# MUC connection timeout
JIBRI_PENDING_TIMEOUT=90
# 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=muc
# Directory for logs inside Jibri container
JIBRI_LOGS_DIR=/config/logs
# Disable HTTPS: handle TLS connections outside of this setup
#DISABLE_HTTPS=1
# Redirect HTTP traffic to HTTPS
# Necessary for Let's Encrypt, relies on standard HTTPS port (443)
#ENABLE_HTTP_REDIRECT=1
# Send a `strict-transport-security` header to force browsers to use
# a secure and trusted connection. Recommended for production use.
# Defaults to 1 (send the header).
# ENABLE_HSTS=1
# Enable IPv6
# Provides means to disable IPv6 in environments that don't support it (get with the times, people!)
#ENABLE_IPV6=1
# Container restart policy
# Defaults to unless-stopped
RESTART_POLICY=unless-stopped
# Authenticate using external service or just focus external auth window if there is one already.
# TOKEN_AUTH_URL=https://auth.meet.example.com/{room}
# install the module
apt update && apt install linux-image-extra-virtual
# configure 5 capture/playback interfaces. Increase it to your requirement like in my case I have
# `echo "options snd-aloop enable=1,1,1,1,1,1,1,1,1,1 index=0,1,2,3,4,5,6,7,8,9" > /etc/modprobe.d/alsa-loopback.conf`
# Recommended
echo "options snd-aloop enable=1,1,1,1,1 index=0,1,2,3,4" > /etc/modprobe.d/alsa-loopback.conf
# setup autoload the module
echo "snd-aloop" >> /etc/modules
# check that the module is loaded
lsmod | grep snd_aloop
docker-compose -f jibri.yml up --scale jibri=5
# change `docker-jitsi-meet-bak_jibri_1` with your jibri 1 docker container
docker exec -t docker-jitsi-meet-bak_jibri_1 sed -i 's/Loopback/0/g' /home/jibri/.asoundrc
docker exec -t docker-jitsi-meet-bak_jibri_2 sed -i 's/Loopback/1/g' /home/jibri/.asoundrc
docker exec -t docker-jitsi-meet-bak_jibri_3 sed -i 's/Loopback/2/g' /home/jibri/.asoundrc
docker exec -t docker-jitsi-meet-bak_jibri_4 sed -i 's/Loopback/3/g' /home/jibri/.asoundrc
docker exec -t docker-jitsi-meet-bak_jibri_5 sed -i 's/Loopback/4/g' /home/jibri/.asoundrc
docker restart docker-jitsi-meet-bak_jibri_1 docker-jitsi-meet-bak_jibri_2 docker-jitsi-meet-bak_jibri_3 docker-jitsi-meet-bak_jibri_4 docker-jitsi-meet-bak_jibri_5
You will have then 10 recorders here
cannot open meeting
in jibri logs while recording add following in /usr/share/jitsi/jibri/jibri.congf
jibri{
chrome {
// The flags which will be passed to chromium when launching
flags = [
"--use-fake-ui-for-media-stream",
"--start-maximized",
"--kiosk",
"--enabled",
"--disable-infobars",
"--ignore-certificate-errors",
"--autoplay-policy=no-user-gesture-required"
]
}
}
TODO: Scale jvb, refactor ADVICE: Do not run jibri on master or where your jvb is hosted.
Closing this there is nothing actionable.
It cloud be interesting to just have the jibri composant to a docker image and document how to use it because install a chromium stack in a production server is not the best in docker its just fine !