Jibri Setup in JWT secured Jitsi Meet

Hi team,

We are trying to integrate Jibri into our standalone Jitsi Meet server. Also, we are using a separate AWS EC2 instance for Jibri setup. The installation & configurations are done using this link without any hassle. TUTORIAL - How to Install the NEW JIBRI.

But now, when we try to launch the room & click on start recording button, there are no console errors in the browser. But the recording fails after some attempts.

I have launched the jibri URL manually https://my-jitsi-domain.com/room1#config.iAmRecorder=true&config.externalConnectUrl=null&config.startWithAudioMuted=true&config.startWithVideoMuted=true&interfaceConfig.APP_NAME=“Jibri”&config.analytics.disabled=true&config.p2p.enabled=false&config.prejoinPageEnabled=false&config.requireDisplayName=false and it loads without any issues.

Here are the logs,

Jibri Log

2021-04-17 18:05:26.811 FINE: [16] org.jitsi.jibri.webhooks.v1.WebhookClient.log() Updating 0 subscribers of status
2021-04-17 18:05:34.892 INFO: [845] org.jitsi.jibri.api.xmpp.XmppApi.log() Received JibriIq <iq to='jibri@auth.my-jitsi-domain.com/NQAZ3L_K' from='jibribrewery@internal.auth.my-jitsi-domain.com/focus' id='amlicmlAYXV0aC5jbGFzc3Jvb20tc3RhZ2luZy1kZXYucHJlcGF6ZS5jb20vTlFBWjNMX0sAYmhnU3EtMTMzMjUAI/lrSw5UoByNKYt9JdTWoA==' type='set'><jibri xmlns='http://jitsi.org/protocol/jibri' action='start' recording_mode='file' room='room1@conference.my-jitsi-domain.com' session_id='osdcoywarxbxasbv' app_data='{"file_recording_metadata":{"share":true}}'/></iq> from environment [MucClient id=my-jitsi-domain.com hostname=my-jitsi-domain.com]
2021-04-17 18:05:34.893 INFO: [845] org.jitsi.jibri.api.xmpp.XmppApi.log() Received start request, starting service
2021-04-17 18:05:34.913 INFO: [845] org.jitsi.jibri.api.xmpp.XmppApi.log() Parsed call url info: CallUrlInfo(baseUrl=https://my-jitsi-domain.com, callName=room1, urlParams=[])
2021-04-17 18:05:34.913 INFO: [845] org.jitsi.jibri.JibriManager.log() Starting a file recording with params: FileRecordingRequestParams(callParams=CallParams(callUrlInfo=CallUrlInfo(baseUrl=https://my-jitsi-domain.com, callName=room1, urlParams=[])), sessionId=osdcoywarxbxasbv, callLoginParams=XmppCredentials(domain=recorder.my-jitsi-domain.com, username=recorder, password=myjibrirecpassword))
2021-04-17 18:05:34.914 FINE: [845] org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer.log() Detected os as OS: LINUX
2021-04-17 18:05:35.509 INFO: [845] org.openqa.selenium.remote.ProtocolHandshake.createSession() Detected dialect: OSS
2021-04-17 18:05:35.517 INFO: [845] org.jitsi.jibri.service.impl.FileRecordingJibriService.log() Writing recording to /srv/recordings/osdcoywarxbxasbv, finalize script path /path/to/finalize_recording.sh
2021-04-17 18:05:35.518 FINE: [845] org.jitsi.jibri.statsd.JibriStatsDClient.log() Incrementing statsd counter: start:recording
2021-04-17 18:05:35.518 INFO: [845] org.jitsi.jibri.status.JibriStatusManager.log() Busy status has changed: IDLE -> BUSY
2021-04-17 18:05:35.518 FINE: [845] org.jitsi.jibri.webhooks.v1.WebhookClient.log() Updating 0 subscribers of status
2021-04-17 18:05:35.518 INFO: [845] org.jitsi.jibri.api.xmpp.XmppApi.log() Jibri reports its status is now JibriStatus(busyStatus=BUSY, health=OverallHealth(healthStatus=HEALTHY, details={})), publishing presence to connections
2021-04-17 18:05:35.533 INFO: [845] org.jitsi.jibri.api.xmpp.XmppApi.log() Sending 'pending' response to start IQ
2021-04-17 18:05:35.534 INFO: [857] org.jitsi.jibri.selenium.pageobjects.HomePage.log() Visiting url https://my-jitsi-domain.com
2021-04-17 18:05:37.523 INFO: [857] org.jitsi.jibri.selenium.pageobjects.HomePage.log() Waited 1.99s for driver to load page
2021-04-17 18:05:37.645 INFO: [857] org.jitsi.jibri.selenium.pageobjects.CallPage.log() Visiting url https://my-jitsi-domain.com/room1#config.iAmRecorder=true&config.externalConnectUrl=null&config.startWithAudioMuted=true&config.startWithVideoMuted=true&interfaceConfig.APP_NAME="Jibri"&config.analytics.disabled=true&config.p2p.enabled=false&config.prejoinPageEnabled=false&config.requireDisplayName=false
2021-04-17 18:05:38.771 INFO: [857] org.jitsi.jibri.selenium.pageobjects.CallPage.log() Waited 1.12s for driver to load page
2021-04-17 18:05:38.783 FINE: [857] org.jitsi.jibri.selenium.pageobjects.CallPage.log() Not joined yet: Cannot read property 'isJoined' of undefined
2021-04-17 18:05:39.295 FINE: [857] org.jitsi.jibri.selenium.pageobjects.CallPage.log() Not joined yet: Cannot read property 'isJoined' of undefined
2021-04-17 18:05:39.801 FINE: [857] org.jitsi.jibri.selenium.pageobjects.CallPage.log() Not joined yet: Cannot read property 'isJoined' of undefined

Jicofo Log

Jicofo 2021-04-17 18:05:29.948 INFO: [31] org.jitsi.jicofo.ChatRoomRoleAndPresence.log() Chat room event ChatRoomMemberPresenceChangeEvent[type=MemberLeft sourceRoom=org.jitsi.impl.protocol.xmpp.ChatRoomImpl@50722859 member=ChatMember[prepaze_lms_space_staging_3196@conference.my-jitsi-domain.com/c4002aac, jid: c4002aac-d8ba-4b1f-9ad7-9c8450f99529@my-jitsi-domain.com/tpeBTnyZ]@1276043326]
Jicofo 2021-04-17 18:05:29.949 INFO: [31] org.jitsi.jicofo.ChatRoomRoleAndPresence.log() Owner has left the room !
Jicofo 2021-04-17 18:05:29.949 INFO: [31] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Member prepaze_lms_space_staging_3196@conference.my-jitsi-domain.com/c4002aac is leaving
Jicofo 2021-04-17 18:05:29.949 WARNING: [31] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Participant not found for prepaze_lms_space_staging_3196@conference.my-jitsi-domain.com/c4002aac terminated already or never started ?
Jicofo 2021-04-17 18:05:29.953 INFO: [31] org.jitsi.jicofo.FocusManager.log() Disposed conference for room: prepaze_lms_space_staging_3196@conference.my-jitsi-domain.com conference count: 2
Jicofo 2021-04-17 18:05:30.240 INFO: [31] org.jitsi.jicofo.ChatRoomRoleAndPresence.log() Owner has left the room !
Jicofo 2021-04-17 18:05:34.892 INFO: [369] org.jitsi.jicofo.recording.jibri.JibriSession.log() Starting session with Jibri jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname
Jicofo 2021-04-17 18:05:34.892 INFO: [369] org.jitsi.jicofo.recording.jibri.JibriSession.log() Starting Jibri jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname for stream ID: null in room: room1@conference.my-jitsi-domain.com
Jicofo 2021-04-17 18:05:35.523 INFO: [31] org.jitsi.jicofo.recording.jibri.JibriDetector.log() Received Jibri jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname status <jibri-status xmlns='http://jitsi.org/protocol/jibri'><busy-status xmlns='http://jitsi.org/protocol/jibri' status='busy'/><health-status xmlns='http://jitsi.org/protocol/health' status='healthy'/></jibri-status>
Jicofo 2021-04-17 18:05:35.536 INFO: [369] org.jitsi.jicofo.recording.jibri.JibriSession.log() Updating status from JIBRI: <iq to='focus@auth.my-jitsi-domain.com/focus1976652685859310' from='jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname' id='bhgSq-13325' type='result'><jibri xmlns='http://jitsi.org/protocol/jibri' status='pending'/></iq> for room1@conference.my-jitsi-domain.com
Jicofo 2021-04-17 18:05:35.536 INFO: [369] org.jitsi.jicofo.recording.jibri.JibriSession.log() Got Jibri status update: Jibri jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname has status pending and failure reason null, current Jibri jid is jibribrewery@internal.auth.my-jitsi-domain.com/jibri-nickname
Jicofo 2021-04-17 18:05:35.536 INFO: [369] org.jitsi.jicofo.recording.jibri.JibriRecorder.log() Started Jibri session

Jibri config

   jibri {
  // A unique identifier for this Jibri
  // TODO: eventually this will be required with no default
  id = ""
  // Whether or not Jibri should return to idle state after handling
  // (successfully or unsuccessfully) a request.  A value of 'true'
  // here means that a Jibri will NOT return back to the IDLE state
  // and will need to be restarted in order to be used again.
  single-use-mode = false
  api {
    http {
      external-api-port = 2222
      internal-api-port = 3333
    }
    xmpp {
      // See example_xmpp_envs.conf for an example of what is expected here
      environments = [
          {
                name = "staging environment"
                xmpp-server-hosts = ["my-jitsi-domain.com"]
                xmpp-domain = "my-jitsi-domain.com"

                control-muc {
                    domain = "internal.auth.my-jitsi-domain.com"
                    room-name = "JibriBrewery"
                    nickname = "jibri-nickname"
                }

                control-login {
                    domain = "auth.my-jitsi-domain.com"
                    username = "jibri"
                    password = "myauthpassword"
                }

                call-login {
                    domain = "recorder.my-jitsi-domain.com"
                    username = "recorder"
                    password = "myrecordingpassword"
                }

                strip-from-room-domain = "conference."
                usage-timeout = 0
                trust-all-xmpp-certs = true
            }]
    }
  }
  recording {
    recordings-directory = "/srv/recordings"
    # TODO: make this an optional param and remove the default
    finalize-script = "/path/to/finalize_recording.sh"
  }
  streaming {
    // A list of regex patterns for allowed RTMP URLs.  The RTMP URL used
    // when starting a stream must match at least one of the patterns in
    // this list.
    rtmp-allow-list = [
      // By default, all services are allowed
      ".*"
    ]
  }
  chrome {
    // The flags which will be passed to chromium when launching
    flags = [
      "--use-fake-ui-for-media-stream",
      "--start-maximized",
      "--kiosk",
      "--enabled",
      "--disable-infobars",
      "--autoplay-policy=no-user-gesture-required"
    ]
  }
  stats {
    enable-stats-d = true
  }
  webhook {
    // A list of subscribers interested in receiving webhook events
    subscribers = []
  }
  jwt-info {
    // The path to a .pem file which will be used to sign JWT tokens used in webhook
    // requests.  If not set, no JWT will be added to webhook requests.
    # signing-key-path = "/path/to/key.pem"

    // The kid to use as part of the JWT
    # kid = "key-id"

    // The issuer of the JWT
    # issuer = "issuer"

    // The audience of the JWT
    # audience = "audience"

    // The TTL of each generated JWT.  Can't be less than 10 minutes.
    # ttl = 1 hour
  }
  call-status-checks {
    // If all clients have their audio and video muted and if Jibri does not
    // detect any data stream (audio or video) comming in, it will stop
    // recording after NO_MEDIA_TIMEOUT expires.
    no-media-timeout = 30 seconds

    // If all clients have their audio and video muted, Jibri consideres this
    // as an empty call and stops the recording after ALL_MUTED_TIMEOUT expires.
    all-muted-timeout = 10 minutes

    // When detecting if a call is empty, Jibri takes into consideration for how
    // long the call has been empty already. If it has been empty for more than
    // DEFAULT_CALL_EMPTY_TIMEOUT, it will consider it empty and stop the recording.
    default-call-empty-timeout = 30 seconds
  }
}

Any help in resolving this issue will be much appreciated. Thanks in advance :slight_smile: