{"id":13556190,"url":"https://github.com/jitsi/jibri","last_synced_at":"2025-04-03T09:30:55.619Z","repository":{"id":38418058,"uuid":"51473177","full_name":"jitsi/jibri","owner":"jitsi","description":"Jitsi BRoadcasting Infrastructure","archived":false,"fork":false,"pushed_at":"2025-02-06T21:00:18.000Z","size":1385,"stargazers_count":613,"open_issues_count":85,"forks_count":314,"subscribers_count":53,"default_branch":"master","last_synced_at":"2025-02-06T22:18:52.549Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jitsi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-02-10T21:22:20.000Z","updated_at":"2025-02-06T21:00:23.000Z","dependencies_parsed_at":"2024-02-20T20:29:44.270Z","dependency_job_id":"e291323c-7cd3-43cf-8932-1620f0e7fd26","html_url":"https://github.com/jitsi/jibri","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jitsi%2Fjibri","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jitsi%2Fjibri/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jitsi%2Fjibri/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jitsi%2Fjibri/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jitsi","download_url":"https://codeload.github.com/jitsi/jibri/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246976135,"owners_count":20863023,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest"],"created_at":"2024-08-01T12:03:41.380Z","updated_at":"2025-04-03T09:30:53.536Z","avatar_url":"https://github.com/jitsi.png","language":"Kotlin","funding_links":[],"categories":["Communication and Collaboration Tools","Kotlin","hacktoberfest"],"sub_categories":["Secure Communication"],"readme":"# Jibri\n\nJItsi BRoadcasting Infrastructure\n\n# What is Jibri\n\nJibri provides services for recording or streaming a Jitsi Meet conference.\n\nIt works by launching a Chrome instance rendered in a virtual framebuffer and\ncapturing and encoding the output with ffmpeg. It is intended to be run on a\nseparate machine (or a VM), with no other applications using the display or\naudio devices. Only one recording at a time is supported on a single jibri.\n\n**NOTE:** Jibri currently only works with a full-fledged Jitsi Meet\ninstallation. Using a different frontend won't work.\n\n# Installing Jibri\n\n### Installation notes\n\n- Jibri was built on Ubuntu 18.04 (Bionic), and has been tested with the\n  pre-built kernel and extra kernel modules (`linux-image-extra-virtual`\n  package). Any other distribution or kernel configuration MAY work but has not\n  been tested.\n\n## Pre-requisites\n\n### ALSA and Loopback Device\n\n- First make sure the ALSA loopback module is available. The extra modules\n  (including ALSA loopback) can be installed on Ubuntu 16.04 using package name\n  `linux-image-extra-virtual`\n- Perform the following tasks as the root user\n  - Set up the module to be loaded on boot: `echo \"snd_aloop\" \u003e\u003e /etc/modules`\n  - Load the module into the running kernel: `modprobe snd_aloop`\n  - Check to see that the module is already loaded: `lsmod | grep snd_aloop`\n- If the output shows the snd-aloop module loaded, then the ALSA loopback\n  configuration step is complete.\n\n### Ffmpeg with X11 capture support\n\n- Jibri requires a relatively modern ffmpeg install with x11 capture compiled\n  in. This comes by default in Ubuntu 16.04, by installing the ffmpeg package.\n- If building Jibri for Ubuntu 14.04 (trusty), the mc3man repo provides\n  packages. They can be used by the following in Ubuntu 14.04:\n\n```bash\nsudo add-apt-repository ppa:mc3man/trusty-media\nsudo apt-get update\nsudo apt-get install ffmpeg\n```\n\n### Google Chrome stable \u0026 Chromedriver\n\nThe latest Google Chrome stable build should be used. It may be able to be\ninstalled direclty via apt, but the manual instructions for installing it are as\nfollows:\n\n```bash\nsudo su -l\napt-get -y install wget curl gnupg jq unzip\n\ncurl -fsSL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/google-chrome-keyring.gpg\necho \"deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main\" | tee /etc/apt/sources.list.d/google-chrome.list\n\napt-get -y update\napt-get -y install google-chrome-stable\napt-mark hold google-chrome-stable\n```\n\nAdd chrome managed policies file and set\n`CommandLineFlagSecurityWarningsEnabled` to `false`. It will hide warnings in\nChrome. You can set it like so:\n\n```bash\nmkdir -p /etc/opt/chrome/policies/managed\necho '{ \"CommandLineFlagSecurityWarningsEnabled\": false }' \u003e\u003e/etc/opt/chrome/policies/managed/managed_policies.json\n```\n\nChromedriver is also required and can be installed like so:\n\n```bash\nCHROME_VER=$(dpkg -s google-chrome-stable | egrep \"^Version\" | cut -d \" \" -f2 | cut -d. -f1-3)\nCHROMELAB_LINK=\"https://googlechromelabs.github.io/chrome-for-testing\"\nCHROMEDRIVER_LINK=$(curl -s $CHROMELAB_LINK/known-good-versions-with-downloads.json | jq -r \".versions[].downloads.chromedriver | select(. != null) | .[].url\" | grep linux64 | grep \"$CHROME_VER\" | tail -1)\nwget -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_LINK\n\nrm -rf /tmp/chromedriver-linux64\nunzip -o /tmp/chromedriver-linux64.zip -d /tmp\nmv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/\nchown root:root /usr/local/bin/chromedriver\nchmod 755 /usr/local/bin/chromedriver\n```\n\n### Jitsi Debian Repository\n\nThe Jibri packages can be found in the stable repository on downloads.jitsi.org.\nFirst install the Jitsi repository key onto your system:\n\n```bash\ncurl https://download.jitsi.org/jitsi-key.gpg.key | sudo sh -c 'gpg --dearmor \u003e /usr/share/keyrings/jitsi-keyring.gpg'\n```\n\nCreate a sources.list.d file with the repository:\n\n```bash\necho 'deb [signed-by=/usr/share/keyrings/jitsi-keyring.gpg] https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list \u003e /dev/null\n```\n\nUpdate your package list:\n\n```bash\nsudo apt-get update\n```\n\nInstall the latest jibri\n\n```bash\nsudo apt-get install jibri\n```\n\n### User and Group\n\n- Jibri is currently meant to be run as a regular system user. This example\n  creatively uses username 'jibri' and group name 'jibri', but any user will do.\n  This has not been tested with the root user.\n- Ensure that the jibri user is in the correct groups to make full access of the\n  audio and video devices. The example jibri account in Ubuntu 16.04 are:\n  \"adm\",\"audio\",\"video\",\"plugdev\".\n\n```bash\nsudo usermod -aG adm,audio,video,plugdev jibri\n```\n\n### Config files\n\n- Edit the `jibri.conf` file (installed to `/etc/jitsi/jibri/jibri.conf` by\n  default) appropriately. You can look at\n  [reference.conf](src/main/resources/reference.conf) for the default values and\n  an example of how to set up jibri.conf. Only override the values you want to\n  change from their defaults in `jibri.conf`.\n\n```\njibri {\n    .....\n    api {\n        xmpp {\n            environments = [\n                {\n                    name = \"yourdomain.com\"\n                    xmpp-server-hosts = [\"1.2.3.4\"],\n                    xmpp-domain = \"yourdomain.com\"\n                    control-login {\n                        domain = \"auth.yourdomain.com\"\n                        username = \"jibri\"\n                        password = \"jibriauthpass\"\n                        port = 5222\n                    }\n                    control-muc {\n                        domain = \"internal.auth.yourdomain.com\"\n                        room-name = \"JibriBrewery\"\n                        nickname = \"myjibri-1-2-3-4\"\n                    }\n                    call-login {\n                        domain = \"recorder.yourdomain.com\"\n                        username = \"recorder\"\n                        password = \"jibrirecorderpass\"\n                    }\n                    strip-from-room-domain = \"conference.\"\n                    trust-all-xmpp-certs = true\n                    usage-timeout = 0\n                }\n            ]\n        }\n    }\n    .....\n}\n```\n\n### Logging\n\nBy default, Jibri logs to `/var/log/jitsi/jibri`. If you don't install via the\ndebian package, you'll need to make sure this directory exists (or change the\nlocation to which Jibri logs by editing the [log config](lib/logging.properties)\n\n# Configuring a Jitsi Meet environment for Jibri\n\nJibri requires some settings to be enabled within a Jitsi Meet configuration.\nThese changes include virtualhosts and accounts in Prosody, settings for the\njitsi meet web (within config.js) as well as `jicofo.conf`.\n\n## Prosody\n\nCreate the internal MUC component entry. This is required so that the jibri\nclients can be discovered by Jicofo in a MUC that's not externally accessible by\njitsi meet users. Add the following in `/etc/prosody/prosody.cfg.lua`:\n\n```lua\n-- internal muc component, meant to enable pools of jibri and jigasi clients\nComponent \"internal.auth.yourdomain.com\" \"muc\"\n    modules_enabled = {\n      \"ping\";\n    }\n    -- storage should be \"none\" for prosody 0.10 and \"memory\" for prosody 0.11\n    storage = \"memory\"\n    muc_room_cache_size = 1000\n```\n\nCreate the recorder virtual host entry, to hold the user account for the jibri\nchrome session. This is used to restrict only authenticated jibri chrome\nsessions to be hidden participants in the conference being recordered. Add the\nfollowing in `/etc/prosody/prosody.cfg.lua`:\n\n```lua\nVirtualHost \"recorder.yourdomain.com\"\n  modules_enabled = {\n    \"ping\";\n  }\n  authentication = \"internal_hashed\"\n```\n\nSetup the two accounts jibri will use:\n\n```bash\nprosodyctl register jibri auth.yourdomain.com jibriauthpass\nprosodyctl register recorder recorder.yourdomain.com jibrirecorderpass\n```\n\nThe first account is the one Jibri will use to log into the control MUC (where\nJibri will send its status and await commands). The second account is the one\nJibri will use as a client in selenium when it joins the call so that it can be\ntreated in a special way by the Jitsi Meet web UI.\n\n## Jicofo\n\nEdit `/etc/jitsi/jicofo/jicofo.conf`, set the appropriate MUC to look for the\nJibri Controllers. This should be the same MUC as is referenced in jibri's\n`jibri.conf` file. Restart Jicofo after setting this property. It's also\nsuggested to set the pending-timeout to 90 seconds, to allow the Jibri some time\nto start up before being marked as failed.\n\n```\njicofo {\n  ...\n  jibri {\n    brewery-jid = \"JibriBrewery@internal.auth.yourdomain.com\"\n    pending-timeout = 90 seconds\n  }\n  ...\n}\n```\n\n## Jitsi Meet\n\nEdit the `/etc/jitsi/meet/yourdomain-config.js` file, add/set the following\nproperties:\n\n```javascript\n// recording\nconfig.recordingService = {\n  enabled: true,\n  sharingEnabled: true,\n  hideStorageWarning: false,\n};\n\n// liveStreaming\nconfig.liveStreaming = {\n  enabled: true,\n};\n\nconfig.hiddenDomain = \"recorder.yourdomain.com\";\n```\n\nOnce recording is enabled in `yourdomain-config.js`, the recording button will\nbecome available in the user interface. However, until a valid jibri is seen by\nJicofo, the mesage \"Recording currently unavailable\" will be displayed when it\nis pressed. Once a jibri connects successfully, the user will instead be\nprompted to enter a stream key.\n\n**Note**: Make sure to update Jibri's `jibri.conf` appropriately to match any\nconfig done above.\n\n## Start Jibri\n\nOnce you have configured `jibri.conf`, start the jibri service:\n\n```bash\nsudo systemctl restart jibri\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjitsi%2Fjibri","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjitsi%2Fjibri","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjitsi%2Fjibri/lists"}