Instalasi dan integrasi Jibri dengan JMS (Jitsi Meet Server)¶
Persiapan¶
Spesifikasi¶
Berikut rinciannya:
- Sistem operasi: Ubuntu 18.04 LTS
- Nama domain JMS: sintas.proxsis.co.id
- Server Applikasi
- 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',