Lewati ke isi

Instalasi dan integrasi Jibri dengan JMS (Jitsi Meet Server)

Persiapan

Spesifikasi

Berikut rinciannya:

  1. Sistem operasi: Ubuntu 18.04 LTS
  2. Nama domain JMS: sintas.proxsis.co.id
  3. Server Applikasi
  4. JItsi BRoadcasting Infra (JIBRI) - s-2vcpu-2gb

Proses

Semua perintah yang dieksekusi dijalankan dengan menggunakan root

Instalasi

#!/bin/bash
set -eux

# berkas konfigurasi Jibri config.json
JMS_FQDN="central.proxsis.co.id"
ENV_NAME="jibri01"
JIBRI_NICK_NAME="jibri01"
JIBRI_AUTH_USER="jibri"
JIBRI_AUTH_PASS="jibriauthpass"
JIBRI_RECORDER_USER="recorder"
JIBRI_RECORDER_PASS="jibrirecorderpass"
JIBRI_FINALIZE_SCRIPT="/etc/jitsi/jibri/finalize_recording.sh"
JIBRI_RECORDING_DIR="/tmp/recordings"

# ALSA and Loopback Device
apt-get install -y linux-image-extra-virtual
echo "snd-aloop" >> /etc/modules
modprobe snd-aloop
lsmod | grep snd_aloop

# Ffmpeg with X11 capture support
add-apt-repository ppa:mc3man/bionic-media
apt-get update
apt-get install -y ffmpeg

# Google Chrome stable & Chromedriver
curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub \
  | apt-key add
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" \
  > /etc/apt/sources.list.d/google-chrome.list
apt-get update -y
apt-get install -y google-chrome-stable

# chrome manages policies
mkdir -p /etc/opt/chrome/policies/managed
echo '{ "CommandLineFlagSecurityWarningsEnabled": false }' \
  >>/etc/opt/chrome/policies/managed/managed_policies.json

# install Chromedriver
CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`
wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip \-P /tmp
unzip /tmp/chromedriver_linux64.zip -d /tmp
rm /tmp/chromedriver_linux64.zip
mv -f /tmp/chromedriver /usr/local/bin/chromedriver
chown -Rv root:root /usr/local/bin/chromedriver
chmod -Rv 0755 /usr/local/bin/chromedriver

# misc tools
apt-get install -y default-jre-headless ffmpeg curl alsa-utils \
  icewm xdotool xserver-xorg-input-void xserver-xorg-video-dummy

# install java-8
apt-get remove -y --purge openjdk-11-jre-headless
apt-get install -y openjdk-8-jdk openjdk-8-jdk-headless \
  openjdk-8-jre openjdk-8-jre-headless

# repo Jitsi (Debian)
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key \
  | apt-key add -
sh -c "echo 'deb https://download.jitsi.org stable/' \
  > /etc/apt/sources.list.d/jitsi-stable.list"
apt-get update
apt-get install -y jibri

# user group
usermod -aG adm,audio,video,plugdev jibri

# berkas konfigurasi Jibri
cp /etc/jitsi/jibri/config.json{,.orig}
cat << EOF > /etc/jitsi/jibri/config.json
{
  "recording_directory":"$JIBRI_RECORDING_DIR",
  "finalize_recording_script_path": "$JIBRI_FINALIZE_SCRIPT",
  "xmpp_environments": [
    {
      "name": "prod environment",
      "xmpp_server_hosts": [
          "$JMS_FQDN"
      ],
      "xmpp_domain": "$JMS_FQDN",
      "control_login": {
          "domain": "auth.$JMS_FQDN",
          "username": "$JIBRI_AUTH_USER",
          "password": "$JIBRI_AUTH_PASS"
      },
      "control_muc": {
          "domain": "internal.auth.$JMS_FQDN",
          "room_name": "JibriBrewery",
          "nickname": "$JIBRI_NICK_NAME"
      },
      "call_login": {
          "domain": "recorder.$JMS_FQDN",
          "username": "$JIBRI_RECORDER_USER",
          "password": "$JIBRI_RECORDER_PASS"
      },
      "room_jid_domain_string_to_strip_from_start": "conference.",
      "usage_timeout": "0"
    }
  ]
}
EOF

# finalisasi skrip perekaman
cat << EOF > /etc/jitsi/jibri/finalize_recording.sh
#!/bin/bash

RECORDINGS_DIR=$JIBRI_RECORDING_DIR

echo "This is a dummy finalize script" > /tmp/finalize.out
echo "The script was invoked with recordings directory $JIBRI_RECORDING_DIR." >> /tmp/finalize.out
echo "You should put any finalize logic (renaming, uploading to a service" >> /tmp/finalize.out
echo "or storage provider, etc.) in this script" >> /tmp/finalize.out

exit 0
EOF

#
systemctl restart jibri

Instalasi (jibri0n)

#!/bin/bash
set -eux

# variabel
JMS_FQDN="sintas.proxsis.co.id"
ENV_NAME="jibri01"
JIBRI_NICK_NAME="jibri02"
JIBRI_AUTH_USER="jibri"
JIBRI_AUTH_PASS="jibriauthpass"
JIBRI_RECORDER_USER="recorder"
JIBRI_RECORDER_PASS="jibrirecorderpass"
JIBRI_FINALIZE_SCRIPT="/etc/jitsi/jibri/finalize_recording.sh"
JIBRI_RECORDING_DIR="/tmp/recordings"

#
#sed --in-place "s/^jibri01.*/jibri02/g" /etc/jitsi/jibri/config.json

cat << EOF > /etc/jitsi/jibri/config.json
{
  "recording_directory":"$JIBRI_RECORDING_DIR",
  "finalize_recording_script_path": "$JIBRI_FINALIZE_SCRIPT",
  "xmpp_environments": [
    {
      "name": "prod environment",
      "xmpp_server_hosts": [
          "$JMS_FQDN"
      ],
      "xmpp_domain": "$JMS_FQDN",
      "control_login": {
          "domain": "auth.$JMS_FQDN",
          "username": "$JIBRI_AUTH_USER",
          "password": "$JIBRI_AUTH_PASS"
      },
      "control_muc": {
          "domain": "internal.auth.$JMS_FQDN",
          "room_name": "JibriBrewery",
          "nickname": "$JIBRI_NICK_NAME"
      },
      "call_login": {
          "domain": "recorder.$JMS_FQDN",
          "username": "$JIBRI_RECORDER_USER",
          "password": "$JIBRI_RECORDER_PASS"
      },
      "room_jid_domain_string_to_strip_from_start": "conference.",
      "usage_timeout": "0"
    }
  ]
}
EOF

Penyelesaian

Selesaikan konfigurasi pada JMS

#!/bin/bash
set -eux

#variables
JMS_FQDN="central.proxsis.co.id"
TURN_SECRET=""
FOCUS_SECRET=""
JIBRI_AUTH_USER="jibri"
JIBRI_AUTH_PASS="jibriauthpass"
JIBRI_RECORDER_USER="recorder"
JIBRI_RECORDER_PASS="jibrirecorderpass"
#
cp /etc/prosody/conf.avail/$JMS_FQDN.cfg.lua{,.orig}
#
cat << EOF > /etc/prosody/conf.avail/$JMS_FQDN.cfg.lua
plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }
-- instance wide
muc_mapper_domain_base = "$JMS_FQDN";
turncredentials_secret = "$TURN_SECRET";
turncredentials = {
  { type = "stun", host = "$JMS_FQDN", port = "4446" },
  { type = "turn", host = "$JMS_FQDN", port = "4446", transport = "udp" },
  { type = "turns", host = "$JMS_FQDN", port = "443", transport = "tcp" }
};
cross_domain_bosh = false;
consider_bosh_secure = true;
-- virtualhosts
VirtualHost "$JMS_FQDN"
  authentication = "ldap2"
  ssl = {
    key = "/etc/prosody/certs/$JMS_FQDN.key";
    certificate = "/etc/prosody/certs/$JMS_FQDN.crt";
  }
  speakerstats_component = "speakerstats.$JMS_FQDN"
  conference_duration_component = "conferenceduration.$JMS_FQDN"
  modules_enabled = {
    "bosh";
    "pubsub";
    "ping"; -- Enable mod_ping
    "speakerstats";
    "turncredentials";
    "conference_duration";
  }
  c2s_require_encryption = false
VirtualHost "auth.$JMS_FQDN"
  ssl = {
      key = "/etc/prosody/certs/auth.$JMS_FQDN.key";
      certificate = "/etc/prosody/certs/auth.$JMS_FQDN.crt";
  }
  authentication = "internal_plain"
VirtualHost "guest.$JMS_FQDN"
  authentication = "anonymous"
  c2s_require_encryption = false
VirtualHost "recorder.$JMS_FQDN"
  modules_enabled = {
    "ping";
  }
  authentication = "internal_plain"
-- components
Component "conference.$JMS_FQDN" "muc"
  storage = "none"
  modules_enabled = {
    "muc_meeting_id";
    "muc_domain_mapper";
  }
  admins = { "focus@auth.$JMS_FQDN" }
  muc_room_locking = false
  muc_room_default_public_jids = true
Component "internal.auth.$JMS_FQDN" "muc"
  storage = "none"
  modules_enabled = {
    "ping";
  }
  admins = { "focus@auth.$JMS_FQDN", "jvb@auth.$JMS_FQDN" }
  muc_room_locking = false
  muc_room_default_public_jids = true
  muc_room_cache_size = 1000
Component "focus.$JMS_FQDN"
  component_secret = "$FOCUS_SECRET"
Component "speakerstats.$JMS_FQDN" "speakerstats_component"
  muc_component = "conference.$JMS_FQDN"
Component "conferenceduration.$JMS_FQDN" "conference_duration_component"
  muc_component = "conference.$JMS_FQDN"
EOF

# otentikasi pengguna jibri dan recorder
prosodyctl register $JIBRI_AUTH_USER auth.$JMS_FQDN $JIBRI_AUTH_PASS
prosodyctl register $JIBRI_RECORDER_USER recorder.$JMS_FQDN $JIBRI_RECORDER_PASS

# konfig Jicofo SIP Communicator
cat << EOF > /etc/jitsi/jicofo/sip-communicator.properties
[email protected].$JMS_FQDN
org.jitsi.jicofo.auth.URL=XMPP:$JMS_FQDN
[email protected].$JMS_FQDN
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
EOF

# Jitsi Meet
# TODO: Masih edit manual, belum dengan skrip
cp /etc/jitsi/meet/$JMS_FQDN-config.js{,.orig}
nano /etc/jitsi/meet/
#
cat -n /etc/jitsi/meet/$JMS_FQDN-config.js.orig \
  | grep -E \
  "fileRecordingsEnabled|liveStreamingEnabled|hiddenDomain"
#
# sed -i 's#^//[ \t]liveStreamingEnabled#liveStreamingEnabled: true#g' /etc/jitsi/meet/$JMS_FQDN-config.js.orig

   fileRecordingsEnabled: true,
   liveStreamingEnabled: true,
   hiddenDomain 'recorder.JMS_FQDN',

Rujukan