Cómo instalar Janus Gateway en Ubuntu Server 18.04

En estos días, me contrataron como freelancer para configurar un servidor WebRTC auto alojado y entre Jitsi, Janus y Kurento, decidí seguir adelante con el proyecto Janus Gateway . Janus es un servidor WebRTC de código abierto, de propósito general, diseñado y desarrollado por Meetecho. Esta versión del servidor está diseñada para sistemas Linux, aunque también se puede compilar e instalar en máquinas MacOS.

En este artículo, explicaremos cómo instalar correctamente Janus Gateway con todas las extensiones posibles en su servidor Ubuntu 18.04 (solo la instalación, la configuración se tratará en un artículo futuro).

Antes de empezar

Antes de seguir el tutorial, asegúrese de actualizar el repositorio de apt usando el siguiente comando:

sudo apt-get update

Como hay muchas personas que se olvidan de hacer esto cada vez que instalan un nuevo software y reportan errores básicos como, git no está instalado.

1. Instalar dependencias

Para compilar Janus desde la fuente e instalarlo en su distribución de Ubuntu 18.04, necesitará las siguientes dependencias instaladas en su sistema (puede instalarlas una por una usando sudo apt-get install <package name>):

  • git
  • libmicrohttpd-dev
  • libjansson-dev
  • libssl-dev
  • libsrtp-dev
  • libsofia-sip-ua-dev
  • libglib2.0-dev
  • libopus-dev
  • libogg-dev
  • libcurl4-openssl-dev
  • liblua5.3-dev
  • libconfig-dev
  • pkg-config
  • gengetopt
  • libtool
  • automake
  • herramientas-gtk-doc
  • hacer

Por supuesto, es un poco largo de leer, por lo que también puede crear el archivo install_dependencies.sh y pegar el siguiente contenido en él:

#!/bin/bash

# List of packages to install before building Janus
packagelist=(
    git
    libmicrohttpd-dev
    libjansson-dev
    libssl-dev
    libsrtp-dev
    libsofia-sip-ua-dev
    libglib2.0-dev
    libopus-dev
    libogg-dev
    libcurl4-openssl-dev
    liblua5.3-dev
    libconfig-dev
    pkg-config
    gengetopt
    libtool
    automake
    gtk-doc-tools
    cmake
)
sudo apt-get install ${packagelist[@]}

Ejecute el siguiente comando en su terminal para ejecutar el instalador:

bash install_dependencies.sh

Después de instalar las dependencias, deberá compilar algunas otras dependencias manualmente sobre la marcha, ya que Janus es bastante problemático con las versiones de las herramientas que requiere, por lo que si usa la última versión de Janus, esta es la forma de proceder.

2. Descarga y compila libnice

La siguiente dependencia que necesita instalar es libnice, a pesar de lo que pueda imaginar por el nombre de la biblioteca, libnice implementa el estándar Interactive Connectivity Establishment (ICE) (RFC 5245 y RFC 8445). Proporciona una biblioteca basada en GLib, libnice, así como elementos GStreamer para usarla.

Libnice

Libnice generalmente está disponible en la mayoría de las distribuciones como un paquete, sin embargo, se sabe que la versión disponible de fábrica en Ubuntu causa problemas, por lo que se recomienda la instalación desde la rama maestra. Cree el install_libnice.sharchivo y pegue el siguiente contenido en él:

#!/bin/bash

# install_libnice.sh
git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
./autogen.sh
./configure --prefix=/usr
make && sudo make install

Esto clonará el código fuente de libnice e iniciará la configuración e instalación automáticamente. Ejecute el siguiente comando en su terminal para ejecutar el instalador:

bash install_libnice.sh

También puede seguir los pasos manualmente si lo desea.

3. Instale libsrtp

Janus también necesita que la biblioteca libsrtp esté instalada en su sistema. Libsrtp es una biblioteca para SRTP (Protocolo de transporte seguro en tiempo real) disponible en el repositorio oficial de Cisco en Github aquí . Este paquete proporciona una implementación del Protocolo de transporte seguro en tiempo real (SRTP), la Transformación de seguridad universal (UST) y un núcleo criptográfico de soporte.

Cree el archivo install_libsrtp.sh y pegue el siguiente contenido en él:

#!/bin/bash

# install_libsrtp.sh
wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
tar xfv v2.2.0.tar.gz
cd libsrtp-2.2.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

Ejecute el siguiente comando en su terminal para ejecutar el instalador:

bash install_libsrtp.sh

Esto descargará la versión de libsrtp v2.2, luego descomprimirá el archivo y lo configurará para usar openssl y luego lo instalará. También puede seguir los pasos manualmente si lo desea.

4. Instale usrsctp

SCTP es un protocolo de transporte confiable y orientado a mensajes con soporte directo para multihoming que se ejecuta sobre IP o UDP, y es compatible con las versiones v4 y v6. Janus requiere que esta biblioteca funcione correctamente, así que, como hicimos antes, compilaremos la biblioteca desde la fuente.

Cree el archivo install_usrsctp.sh y pegue el siguiente contenido en él:

#!/bin/bash

# install_usrsctp.sh
git clone https://github.com/sctplab/usrsctp
cd usrsctp
./bootstrap
./configure --prefix=/usr && make && sudo make install

Ejecute el siguiente comando en su terminal para ejecutar el instalador:

bash install_usrsctp.sh

Esto descargará el código fuente de la última versión de USRSCTP y se compilará e instalará en el sistema. También puede seguir los pasos manualmente si lo desea.

5. Instale libwebsockets

Como recomendación personal, aunque no es necesario instalar esta biblioteca, usar websockets con Janus es bastante cómodo para la interfaz.

Libwebsockets

Para instalar esta biblioteca, de modo que pueda proporcionar soporte para websockets, cree el install_libwebsockets.sharchivo y pegue el siguiente contenido en él:

#!/bin/bash

# install_libwebsockets.sh
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
# If you want to use the latest master version of libwebsockets, comment the next line
git checkout v2.4-stable
mkdir build
cd build
# See https://github.com/meetecho/janus-gateway/issues/732 re: LWS_MAX_SMP
cmake -DLWS_MAX_SMP=1 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make && sudo make install

Ejecute el siguiente comando en su terminal para ejecutar el instalador:

bash install_libwebsockets.sh

Esto descargará la última versión de libwebsockets y lo instalará compilándolo. También puede seguir los pasos manualmente si lo desea.

6. Instale MQTT (opcional)

MQTT es un protocolo de conectividad de máquina a máquina (M2M) / "Internet de las cosas". Fue diseñado como un transporte de mensajería de publicación / suscripción extremadamente ligero. Es útil para conexiones con ubicaciones remotas donde se requiere una pequeña huella de código y / o el ancho de banda de la red es un bien escaso.

MQTT

En caso de que desee proporcionar soporte para MQTT en Janus, asegúrese de instalarlo también. Cree el siguiente install_mqtt.sharchivo y pegue el siguiente código dentro:

#!/bin/bash

# install_mqtt.sh
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
sudo prefix=/usr make install

Luego ejecute el archivo usando el siguiente comando en su terminal:

bash install_mqtt.sh

Esto clonará el código fuente de MQTT, lo compilará e instalará en su sistema. Puede seguir los pasos manualmente si lo desea.

7. Instale NanoMSG (opcional)

nanomsg es una biblioteca de sockets que proporciona varios patrones de comunicación comunes. Su objetivo es hacer que la capa de red sea rápida, escalable y fácil de usar. Implementado en C, funciona en una amplia gama de sistemas operativos sin más dependencias.

NanoMSG

Este paquete se puede instalar fácilmente en su sistema desde el repositorio apt-get, actualícelo primero:

sudo apt-get update

Y luego instala la biblioteca:

sudo apt-get install libnanomsg-dev

Después de la instalación, la biblioteca debería estar disponible en su sistema.

8. Instale RabbitMQ C AMQP (opcional)

Esta biblioteca es una biblioteca cliente AMQP en lenguaje C para usar con v2.0 + del corredor RabbitMQ. Para instalar esta biblioteca, cree el archivo install_rabbitmqc.sh y pegue el siguiente contenido en él:

#!/bin/bash

# install_rabbitmqc.sh
git clone https://github.com/alanxz/rabbitmq-c
cd rabbitmq-c
git submodule init
git submodule update
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make && sudo make install

Luego ejecuta el archivo con:

bash install_rabbitmqc.sh

Después de la instalación, la biblioteca debería estar disponible en su sistema.

9. Compilación de Janus Gateway

Después de instalar todas las bibliotecas que Janus necesita para funcionar correctamente, finalmente podrá compilar el propio Janus. 

Lo primero que debe hacer es clonar el código fuente de janus en algún directorio con git usando el siguiente comando:

git clone https://github.com/meetecho/janus-gateway.git

Luego, cambie al directorio clonado:

cd janus-gateway

Una vez que esté en este directorio, genere el archivo de configuración con el siguiente comando:

sh autogen.sh

Esto le mostrará la siguiente información en su terminal:

Compiler:                  gcc
libsrtp version:           2.x
SSL/crypto library:        OpenSSL
DTLS set-timeout:          not available
Mutex implementation:      GMutex (native futex on Linux)
DataChannels support:      yes
Recordings post-processor: no
TURN REST API client:      yes
Doxygen documentation:     no
Transports:
    REST (HTTP/HTTPS):     yes
    WebSockets:            yes
    RabbitMQ:              yes
    MQTT:                  yes
    Unix Sockets:          yes
    Nanomsg:               yes
Plugins:
    Echo Test:             yes
    Streaming:             yes
    Video Call:            yes
    SIP Gateway:           yes
    NoSIP (RTP Bridge):    yes
    Audio Bridge:          yes
    Video Room:            yes
    Voice Mail:            yes
    Record&Play:           yes
    Text Room:             yes
    Lua Interpreter:       no
    Duktape Interpreter:   no
Event handlers:
    Sample event handler:  yes
    WebSocket ev. handler: yes
    RabbitMQ event handler:yes
    MQTT event handler:    yes
    Nanomsg event handler: yes
External loggers:
    JSON file logger:      no
JavaScript modules:        no

If this configuration is ok for you, do a 'make' to start building Janus. A 'make install' will install Janus and its plugins to the specified prefix. Finally, a 'make configs' will install some sample configuration files too (something you'll only want to do the first time, though).

En la lista encontrará todas las características del servidor janus que están habilitadas, controladores de eventos y protocolos de transporte. Si desea deshabilitar algunas funciones, consulte la documentación de Janus aquí .

Luego, ejecute el archivo de configuración con la configuración que necesita. El siguiente comando inicializará una instancia de Janus predeterminada con casi todo lo que necesita para comenzar (si alguna vez necesita habilitar / deshabilitar alguna extensión, simplemente puede repetir este proceso y eso es todo):

./configure --prefix=/opt/janus

Esto configurará Janus para que se construya en el directorio /opt/janus de su sistema. Después de configurar la compilación, ejecute el comando make:

make

Y luego ejecute el comando make install:

make install

Esto instalará Janus en la ruta definida en el paso de configuración. No olvide también la primera vez que construyó Janus, copiar los archivos de configuración predeterminados en la ruta de instalación con el siguiente comando :

make configs

Esto reemplazará el contenido de todos los archivos .jcfg, por eso solo debe ejecutarse la primera vez que se compile.

10. Prueba de Janus

Finalmente, solo necesitarás verificar si el binario está funcionando. Puede verificarlo fácilmente con el siguiente comando (considerando que mantuvo la ruta de instalación predeterminada de Janus):

/opt/janus/bin/janus --help

El comando generará el siguiente texto en la terminal:

Janus commit: 7fb695a861b474cc1ecfb30764d7f0f3bb97a48b
Compiled on:  Wed Apr 29 14:33:37 CDT 2020

janus 0.9.4

Usage: janus [OPTIONS]...

  -h, --help                    Print help and exit
  -V, --version                 Print version and exit
  -b, --daemon                  Launch Janus in background as a daemon
                                  (default=off)
  -p, --pid-file=path           Open the specified PID file when starting Janus
                                  (default=none)
  -N, --disable-stdout          Disable stdout based logging  (default=off)
  -L, --log-file=path           Log to the specified file (default=stdout only)
  -H, --cwd-path=path           Working directory for Janus daemon process
                                  (default=/)
  -i, --interface=ipaddress     Interface to use (will be the public IP)
  -P, --plugins-folder=path     Plugins folder (default=./plugins)
  -C, --config=filename         Configuration file to use
  -F, --configs-folder=path     Configuration files folder (default=./conf)
  -c, --cert-pem=filename       DTLS certificate
  -k, --cert-key=filename       DTLS certificate key
  -K, --cert-pwd=text           DTLS certificate key passphrase (if needed)
  -S, --stun-server=ip:port     STUN server(:port) to use, if needed (e.g.,
                                  Janus behind NAT, default=none)
  -1, --nat-1-1=ip              Public IP to put in all host candidates,
                                  assuming a 1:1 NAT is in place (e.g., Amazon
                                  EC2 instances, default=none)
  -E, --ice-enforce-list=list   Comma-separated list of the only interfaces to
                                  use for ICE gathering; partial strings are
                                  supported (e.g., eth0 or eno1,wlan0,
                                  default=none)
  -X, --ice-ignore-list=list    Comma-separated list of interfaces or IP
                                  addresses to ignore for ICE gathering;
                                  partial strings are supported (e.g.,
                                  vmnet8,192.168.0.1,10.0.0.1 or
                                  vmnet,192.168., default=vmnet)
  -6, --ipv6-candidates         Whether to enable IPv6 candidates or not
                                  (experimental)  (default=off)
  -l, --libnice-debug           Whether to enable libnice debugging or not
                                  (default=off)
  -f, --full-trickle            Do full-trickle instead of half-trickle
                                  (default=off)
  -I, --ice-lite                Whether to enable the ICE Lite mode or not
                                  (default=off)
  -T, --ice-tcp                 Whether to enable ICE-TCP or not (warning: only
                                  works with ICE Lite)  (default=off)
  -Q, --min-nack-queue=number   Minimum size of the NACK queue (in ms) per user
                                  for retransmissions, no matter the RTT
  -t, --no-media-timer=number   Time (in s) that should pass with no media
                                  (audio or video) being received before Janus
                                  notifies you about this
  -W, --slowlink-threshold=number
                                Number of lost packets (per s) that should
                                  trigger a 'slowlink' Janus API event to users
  -r, --rtp-port-range=min-max  Port range to use for RTP/RTCP
  -B, --twcc-period=number      How often (in ms) to send TWCC feedback back to
                                  senders, if negotiated (default=200ms)
  -n, --server-name=name        Public name of this Janus instance
                                  (default=MyJanusInstance)
  -s, --session-timeout=number  Session timeout value, in seconds (default=60)
  -m, --reclaim-session-timeout=number
                                Reclaim session timeout value, in seconds
                                  (default=0)
  -d, --debug-level=1-7         Debug/logging level (0=disable debugging,
                                  7=maximum debug level; default=4)
  -D, --debug-timestamps        Enable debug/logging timestamps  (default=off)
  -o, --disable-colors          Disable color in the logging  (default=off)
  -M, --debug-locks             Enable debugging of locks/mutexes (very
                                  verbose!)  (default=off)
  -a, --apisecret=randomstring  API secret all requests need to pass in order
                                  to be accepted by Janus (useful when wrapping
                                  Janus API requests in a server, none by
                                  default)
  -A, --token-auth              Enable token-based authentication for all
                                  requests  (default=off)
      --token-auth-secret=randomstring
                                Secret to verify HMAC-signed tokens with, to be
                                  used with -A
  -e, --event-handlers          Enable event handlers  (default=off)
  -w, --no-webrtc-encryption    Disable WebRTC encryption, so no DTLS or SRTP
                                  (only for debugging!)  (default=off)

En artículos futuros, te explicaremos cómo configurar esta biblioteca para trabajar con certificados SSL y construir tu propio videochat.

Que te diviertas❤️!

References and external resources

Esto podria interesarte

Conviertete en un programador más sociable