Recording failed to start

Hi Team,

I have followed @Freddie 's Tutorial: TUTORIAL - How to Install the NEW JIBRI
I have also looked briefly into: TUTORIAL: Jibri Overview, Troubleshooting Tips & Tricks - Solve your Jibri Problems, Quickly! - #316 by newDevPer

But I am still getting the below error :
Recording failed to start
Recording failed. Please try again.

Can someone please help me in resolving it?
Console output:

jibri.conf

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 = "prod environment"
xmpp-server-hosts = ["meet.jitsi.com"]
xmpp-domain = "meet.jitsi.com"


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

            control-login {
                domain = "auth.meet.jitsi.com"
                username = "jibri"
                password = "YOURSECRET3"
            }

            call-login {
                domain = "recorder.meet.jitsi.com"
                username = "recorder"
                password = "YOURSECRET3"
            }

            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 = "/srv/recordings2"
 }
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
".*"
   ]
 }
ffmpeg {
resolution = "1920x1080"
// The audio source that will be used to capture audio on Linux
audio-source = "alsa"
// The audio device that will be used to capture audio on Linux
audio-device = "plug:bsnoop"
 }
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

   }
}

jicofo.conf:

# Jicofo HOCON configuration. See reference.conf in /usr/share/jicofo/jicofo.jar for
#available options, syntax, and default values.
jicofo {
  xmpp: {
    client: {
      client-proxy: "focus.meet.jitsi.com"
      xmpp-domain: "meet.jitsi.com"
      domain: "auth.meet.jitsi.com"
      username: "focus"
      password: "iF8nXLyINQ28eBBz"
    }
    trusted-domains: [ "recorder.meet.jitsi.com" ]
  }
  bridge: {
    brewery-jid: "JvbBrewery@internal.auth.meet.jitsi.com"
  }
}
jicofo.sctp.enabled=false
jibri: {
    brewery-jid = "JibriBrewery@internal.auth.meet.jitsi.com"
    pending-timeout = 90
}

/etc/prosody/conf.avail/meet.jitsi.com.cfg.lua:

plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "meet.jitsi.com";

external_service_secret = "x9Tjt4ZfHY9fDW04";
external_services = {
     { type = "stun", host = "meet.jitsi.com", port = 3478 },
     { type = "turn", host = "meet.jitsi.com", port = 3478, transport = "udp", secret = true, ttl = 86400, algorithm = "turn" },
     { type = "turns", host = "meet.jitsi.com", port = 5349, transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" }
};

cross_domain_bosh = false;
consider_bosh_secure = true;
-- https_ports = { }; -- Remove this line to prevent listening on port 5284

-- by default prosody 0.12 sends cors headers, if you want to disable it uncomment the following (the config is available on 0.12.1)
--http_cors_override = {
--    bosh = {
--        enabled = false;
--    };
--    websocket = {
--        enabled = false;
--    };
--}

-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
    protocol = "tlsv1_2+";
    ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}

unlimited_jids = {
    "focus@auth.meet.jitsi.com",
    "jvb@auth.meet.jitsi.com"
}

VirtualHost "meet.jitsi.com"
    authentication = "jitsi-anonymous" -- do not delete me
    -- Properties below are modified by jitsi-meet-tokens package config
    -- and authentication above is switched to "token"
    --app_id="example_app_id"
    --app_secret="example_app_secret"
    -- Assign this host a certificate for TLS, otherwise it would use the one
    -- set in the global section (if any).
    -- Note that old-style SSL on port 5223 only supports one certificate, and will always
    -- use the global one.
    ssl = {
        key = "/etc/prosody/certs/meet.jitsi.com.key";
        certificate = "/etc/prosody/certs/meet.jitsi.com.crt";
    }
    av_moderation_component = "avmoderation.meet.jitsi.com"
    speakerstats_component = "speakerstats.meet.jitsi.com"
    conference_duration_component = "conferenceduration.meet.jitsi.com"
    end_conference_component = "endconference.meet.jitsi.com"
    -- we need bosh
    modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "speakerstats";
        "external_services";
        "conference_duration";
        "end_conference";
        "muc_lobby_rooms";
        "muc_breakout_rooms";
        "av_moderation";
        "room_metadata";
    }
    c2s_require_encryption = false
    lobby_muc = "lobby.meet.jitsi.com"
    breakout_rooms_muc = "breakout.meet.jitsi.com"
    room_metadata_component = "metadata.meet.jitsi.com"
    main_muc = "conference.meet.jitsi.com"
    -- muc_lobby_whitelist = { "recorder.meet.jitsi.com" } -- Here we can whitelist jibri to enter lobby enabled rooms

Component "conference.meet.jitsi.com" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "polls";
        --"token_verification";
        "muc_rate_limit";
    }
    admins = { "focus@auth.meet.jitsi.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true

Component "breakout.meet.jitsi.com" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "muc_rate_limit";
        "polls";
    }
    admins = { "focus@auth.meet.jitsi.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true

-- internal muc component
Component "internal.auth.meet.jitsi.com" "muc"
    storage = "memory"
    modules_enabled = {
        "ping";
    }
    admins = { "focus@auth.meet.jitsi.com", "jvb@auth.meet.jitsi.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true
    -- muc_room_cache_size = 1000

VirtualHost "auth.meet.jitsi.com"
    ssl = {
        key = "/etc/prosody/certs/auth.meet.jitsi.com.key";
        certificate = "/etc/prosody/certs/auth.meet.jitsi.com.crt";
    }
    modules_enabled = {
        "limits_exception";
    }
    authentication = "internal_hashed"

-- Proxy to jicofo's user JID, so that it doesn't have to register as a component.
Component "focus.meet.jitsi.com" "client_proxy"
    target_address = "focus@auth.meet.jitsi.com"

Component "speakerstats.meet.jitsi.com" "speakerstats_component"
    muc_component = "conference.meet.jitsi.com"

Component "conferenceduration.meet.jitsi.com" "conference_duration_component"
    muc_component = "conference.meet.jitsi.com"

Component "endconference.meet.jitsi.com" "end_conference"
    muc_component = "conference.meet.jitsi.com"

Component "avmoderation.meet.jitsi.com" "av_moderation_component"
    muc_component = "conference.meet.jitsi.com"

Component "lobby.meet.jitsi.com" "muc"
    storage = "memory"
    restrict_room_creation = true
    muc_room_locking = false
    muc_room_default_public_jids = true
    modules_enabled = {
        "muc_rate_limit";
        "polls";
    }

Component "metadata.meet.jitsi.com" "room_metadata_component"
    muc_component = "conference.meet.jitsi.com"
    breakout_rooms_component = "breakout.meet.jitsi.com"

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

VirtualHost "recorder.meet.jitsi.com"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"

Your domain is meet.jitsi.com?

meet.****.com it is, I had edited it for safety

I see… so you just put that there for privacy.

Share your Jibri log.

log.0.txt

2023-03-01 23:29:55.623 INFO: [1] MainKt.handleCommandLineArgs#186: Jibri run with args [--config, /etc/jitsi/jibri/config.json]
2023-03-01 23:29:56.036 INFO: [1] MainKt.setupLegacyConfig#211: Checking legacy config file /etc/jitsi/jibri/config.json
2023-03-01 23:29:56.060 INFO: [1] MainKt.setupLegacyConfig#214: Legacy config file /etc/jitsi/jibri/config.json doesn't exist
2023-03-01 23:29:56.964 INFO: [1] MainKt.main#55: Jibri starting up with id 
2023-03-01 23:29:58.402 INFO: [1] JwtInfo$Companion.fromConfig#176: got jwtConfig: {}

2023-03-01 23:29:58.403 INFO: [1] JwtInfo$Companion.fromConfig#186: Unable to create JwtInfo: com.typesafe.config.ConfigException$Missing: /etc/jitsi/jibri/jibri.conf: 88: No configuration setting found for key 'signing-key-path'
2023-03-01 23:29:58.407 FINE: [1] RefreshingProperty.getValue#47: Refreshing property jwt (not yet initialized or expired)...
2023-03-01 23:29:58.834 INFO: [1] MainKt.main#125: Using port 3333 for internal HTTP API
2023-03-01 23:29:58.865 FINE: [18] WebhookClient$updateStatus$1.invokeSuspend#109: Updating 0 subscribers of status
2023-03-01 23:30:00.169 INFO: [1] XmppApi.updatePresence#209: Jibri reports its status is now JibriStatus(busyStatus=IDLE, health=OverallHealth(healthStatus=HEALTHY, details={})), publishing presence to connections
2023-03-01 23:30:00.335 INFO: [1] XmppApi.start#156: Connecting to xmpp environment on meet.lybl.com with config XmppEnvironmentConfig(name=prod environment, xmppServerHosts=[meet.lybl.com], xmppDomain=meet.lybl.com, baseUrl=null, controlLogin=XmppCredentials(domain=auth.meet.lybl.com, port=null, username=jibri, password=*****), controlMuc=XmppMuc(domain=internal.auth.meet.lybl.com, roomName=JibriBrewery, nickname=jibri-nickname), sipControlMuc=null, callLogin=XmppCredentials(domain=recorder.meet.lybl.com, port=null, username=recorder, password=*****), stripFromRoomDomain=conference., usageTimeoutMins=0, trustAllXmppCerts=true, securityMode=null)
2023-03-01 23:30:00.345 INFO: [1] XmppApi.start#174: The trustAllXmppCerts config is enabled for this domain, all XMPP server provided certificates will be accepted
2023-03-01 23:30:00.433 INFO: [1] MainKt.main#152: Using port 2222 for HTTP API
2023-03-01 23:30:00.520 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient.initializeConnectAndJoin#279: Initializing a new MucClient for [ org.jitsi.xmpp.mucclient.MucClientConfiguration id=meet.lybl.com domain=auth.meet.lybl.com hostname=meet.lybl.com port=null username=jibri mucs=[jibribrewery@internal.auth.meet.lybl.com] mucNickname=jibri-nickname disableCertificateVerification=true]
2023-03-01 23:30:00.565 WARNING: [31] MucClient.createXMPPTCPConnectionConfiguration#115: Disabling certificate verification!
2023-03-01 23:30:00.650 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient.initializeConnectAndJoin#341: Dispatching a thread to connect and login.
2023-03-01 23:30:01.042 FINE: [31] JibriStatsDClient.incrementCounter#38: Incrementing statsd counter: xmpp-connected:xmpp_server_host:meet.lybl.com
2023-03-01 23:30:01.043 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient$2.connected#312: Connected.
2023-03-01 23:30:01.043 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient.lambda$getConnectAndLoginCallable$9#637: Logging in.
2023-03-01 23:30:01.353 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient$2.authenticated#318: Authenticated, b=false
2023-03-01 23:30:01.583 INFO: [31] [hostname=meet.lybl.com id=meet.lybl.com] MucClient$MucWrapper.join#761: Joined MUC: jibribrewery@internal.auth.meet.lybl.com
2023-03-01 23:30:58.742 FINE: [18] WebhookClient$updateStatus$1.invokeSuspend#109: Updating 0 subscribers of status
2023-03-01 23:31:58.742 FINE: [18] WebhookClient$updateStatus$1.invokeSuspend#109: Updating 0 subscribers of status
2023-03-01 23:32:58.742 FINE: [18] WebhookClient$updateStatus$1.invokeSuspend#109: Updating 0 subscribers of status

Is that the full log?
Are you able to successfully host a 3-party meeting (without recording)?

Is that the full log? → yes
Are you able to successfully host a 3-party meeting (without recording)? → yes

@Freddie can you help me with the above

The Jibri log you shared doesn’t show any errors (and it looks incomplete). Restart all services, then do test recording and share Jibri, Prosody and Jicofo logs.

Also, does Jibri have permissions for the recording directory (/srv/recordings)?

Yes, Jibri is the owner of /srv/recordings.

Please find the below files, for those were the only jibri logs coming up

prosody.log (85.5 KB)
jicofo.log (530.6 KB)

log.0.txt (5.0 KB)
log.1.txt (7.3 KB)
log.2.txt (8.6 KB)
log.3.txt (3.9 KB)
log.4.txt (6.1 KB)
xorg.log (44.0 KB)

Jibri can’t connect to the meeting (looks like a case of wrong credentials). I’d suggest deleting the Jibri accounts and re-registering them.

Also, what java version are you using?