BigBlueButton

Обновлено 8 апреля 2021

BigBlueButton

BigBlueButton — открытое программное обеспечение для проведения веб-конференции. Система разработана в первую очередь для дистанционного обучения. Название BigBlueButton происходит от первоначальной концепции, что, начало веб-конференции должно быть максимально простым, как нажатие метафорической большой синей кнопки.

Подготовка LXC контейнера

BigBlueButton разрабатывается и тестируется под Ubuntu Xenial. Установить Ubuntu вы можете в LXC-контейнере, для этого выполните установку необходимых пакетов:

emerge -a app-emulation/lxc dev-libs/libcgroup

Запустите сервис cgconfig для создание cgroup systemd:

/etc/init.d/cgconfig start

Настройка запуска Docker внутри LXC контейнера

При использовании Docker внутри LXC контейнера в хостовой системе загрузите необходимые модули ядра и добавьте их в автозагрузку:

modprobe -a br_netfilter ip_tables nf_conntrack_netlink nf_nat overlay xt_conntrack

echo -e "br_netfilter\nip_tables\nnf_conntrack_netlink\nnf_nat\noverlay\nxt_conntrack" > /etc/modules-load.d/docker.conf

Создайте контейнер для BigBlueButton:

lxc-create -t download -n bigbluebutton -- -d ubuntu -r xenial -a amd64

Запустите созданный контейнер:

lxc-start bigbluebutton

Настройте сеть согласно инструкции, но не присваивайте IP адрес и шлюз через конфигурационный файл контейнера.

Добавьте разрешение, чтобы запустить тест hello-world для Docker:

/var/calculate/lxc/calculate/config
lxc.cgroup.devices.allow = c 10:200 rwm

Настройте параметры сети внутри контейнера, указав необходимый IP адрес, маску сети, шлюз по умолчанию и DNS сервер:

/etc/network/interfaces
...
auto eth0
iface eth0 inet static
  address 192.168.11.2
  netmask 255.255.255.0
  gateway 192.168.11.1
  dns-nameservers 8.8.8.8
...

Перезапустите контейнер:

lxc-stop -r bigbluebutton

Подключитесь к контейнеру:

lxc-attach bigbluebutton

Обновите репозиторий бинарных пакетов:

apt-get update

Установите SSH клиент и сервер:

apt-get install ssh openssh-server -y

Измените пароль пользователя root:

passwd

Разрешите подключаться через SSH пользователю root:

/etc/ssh/sshd_config
...
PermitRootLogin yes
...

Перезапустите сервис SSH:

systemctl restart ssh

Перенастройте локаль:

sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen

sed -i -e 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen

dpkg-reconfigure --frontend=noninteractive locales

update-locale LANG=en_US.UTF-8

Убедитесь, что локаль указана в переменных окружения:

systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Добавьте определение сервера как meet.example.org:

/etc/hosts
127.0.0.1   meet.example.org bigbluebutton localhost

Так как установка производится в контейнере, то для некоторых компонентов BigBlueButton необходим источник энтропии. Установите генератор энтропии:

apt-get install haveged -y

Добавьте демон энтропии в автозагрузку и запустите его:

systemctl enable haveged

systemctl start haveged

Установите утилиты для управления репозиториями:

apt-get install software-properties-common -y

Установка и настройка BigBlueButton

Добавьте дополнительные репозитории:

add-apt-repository ppa:bigbluebutton/support -y

add-apt-repository ppa:rmescandon/yq -y

Добавьте репозиторий MongoDB и установите базу данных:

wget -qO - https://www.mongodb.org/static/pgp/server-3.4.asc | apt-key add -

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list

apt-get update

apt-get install -y mongodb-org curl

Добавьте репозиторий NodeJS с версей 8.x и установите его:

curl -sL https://deb.nodesource.com/setup_8.x | bash -

apt-get install -y nodejs

Добавьте ключ BigBlueButton и репозиторий:

wget https://ubuntu.bigbluebutton.org/repo/bigbluebutton.asc -O- | apt-key add -

echo "deb https://ubuntu.bigbluebutton.org/xenial-220/ bigbluebutton-xenial main" | tee /etc/apt/sources.list.d/bigbluebutton.list

apt-get update

Начните установку пакетов для BigBlueButton:

apt-get install bigbluebutton -y

Во время установки пакетов, будет необходимо принять лицензию EULA.

Из-за ограничений LXC контейнера установка не сможет быть завершена, из-за невозможности запуска служб Redis и FreeSWITCH.

Исправье модуль запуса Redis, отключив использование отсутствующих механизмов ограничения:

/etc/systemd/system/redis.service
[Unit]
Description=Advanced key-value store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
PIDFile=/var/run/redis/redis-server.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis

ExecStartPre=-/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d
ExecStartPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-up.d
ExecStop=-/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d
ExecStop=/bin/kill -s TERM $MAINPID
ExecStopPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-down.d

UMask=007
#PrivateTmp=yes
#PrivateDevices=yes
#ProtectHome=yes
#ReadOnlyDirectories=/
#ReadWriteDirectories=-/var/lib/redis
#ReadWriteDirectories=-/var/log/redis
#ReadWriteDirectories=-/var/run/redis
#CapabilityBoundingSet=~CAP_SYS_PTRACE

# redis-server writes its own config file when in cluster mode so we allow
# writing there (NB. ProtectSystem=true over ProtectSystem=full)
#ProtectSystem=true
#ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target
Alias=redis.service

Запустите сервис Redis:

systemctl daemon-reload

systemctl start redis

Исправьте модуль запуска FreeSWITCH, отключив использование отсутствующих механизмов ограничения:

/etc/systemd/system/multi-user.target.wants/freeswitch.service
[Unit]
Description=freeswitch
After=syslog.target network.target local-fs.target

[Service]
; service
Type=forking
PIDFile=/opt/freeswitch/var/run/freeswitch/freeswitch.pid
Environment="DAEMON_OPTS=-nonat"
EnvironmentFile=-/etc/default/freeswitch
ExecStart=/opt/freeswitch/bin/freeswitch -u freeswitch -g daemon -ncwait $DAEMON_OPTS
TimeoutSec=45s
Restart=always
; exec
WorkingDirectory=/opt/freeswitch
User=freeswitch
Group=daemon

#LimitCORE=infinity
#LimitNOFILE=100000
#LimitNPROC=60000
#LimitSTACK=250000
#LimitRTPRIO=infinity
#LimitRTTIME=7000000
#IOSchedulingClass=realtime
#IOSchedulingPriority=2
#CPUSchedulingPolicy=rr
#CPUSchedulingPriority=89

#UMask=0007

[Install]
WantedBy=multi-user.target

Запустите сервис FreeSWITCH:

systemctl daemon-reload

systemctl start freeswitch

Продолжите прерванную установку:

apt-get install -f

Установите пакет BigBlueButton HTML5:

apt-get install bbb-html5

Для того, чтобы избавиться от "щелчков", отрегулируйте уровень звука, необходимый для передачи голоса другим пользователям:

/opt/freeswitch/etc/freeswitch/autoload_configs/conference.conf.xml
<profile name="cdquality">
  <param name="domain" value="$${domain}"/>
  <param name="rate" value="48000"/>
  <param name="interval" value="20"/>
  <param name="energy-level" value="10"/>
...

Перезапустите BigBlueButton:

bbb-conf --restart

Проверьте на наличие ошибок конфигурации:

bbb-conf --check
BigBlueButton Server 2.2.3 (1833)
                    Kernel version: 4.19.96-calculate
                      Distribution: Ubuntu 16.04.6 LTS (64-bit)
                            Memory: 131797 MB
                         CPU cores: 16

/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties (bbb-web)
       bigbluebutton.web.serverURL: http://meet.example.org
                defaultGuestPolicy: ALWAYS_ACCEPT
                 svgImagesRequired: true

/etc/nginx/sites-available/bigbluebutton (nginx)
                       server name: http://meet.example.org
                              port: 80, [::]:80
                    bbb-client dir: /var/www/bigbluebutton

/var/www/bigbluebutton/client/conf/config.xml (bbb-client)
                Port test (tunnel): rtmp://meet.example.org
                              red5: meet.example.org
              useWebrtcIfAvailable: true

/opt/freeswitch/etc/freeswitch/vars.xml (FreeSWITCH)
                       local_ip_v4: 192.168.11.2
                   external_rtp_ip: stun:stun.freeswitch.org
                   external_sip_ip: stun:stun.freeswitch.org

/opt/freeswitch/etc/freeswitch/sip_profiles/external.xml (FreeSWITCH)
                        ext-rtp-ip: $${local_ip_v4}
                        ext-sip-ip: $${local_ip_v4}
                        ws-binding: :5066
                       wss-binding: :7443

/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml (record and playback)
                     playback_host: meet.example.org
                 playback_protocol: http
                            ffmpeg: 4.2.2-1bbb1~ubuntu16.04

/etc/bigbluebutton/nginx/sip.nginx (sip.nginx)
                        proxy_pass: 192.168.11.2

/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml (Kurento SFU)
                        kurento.ip: 192.168.11.2
                       kurento.url: ws://127.0.0.1:8888/kurento
                    localIpAddress: 192.168.11.2
               recordScreenSharing: true
                     recordWebcams: true
                  codec_video_main: VP8
               codec_video_content: VP8

/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml (HTML5 client)
                             build: 870
                        kurentoUrl: wss://meet.example.org/bbb-webrtc-sfu
                  enableListenOnly: true

# Potential problems described below

Укажите имя хоста для приложения BigBlueButton meet.example.org:

bbb-conf --setip meet.example.org

Настройка HTTPS

Получение сертификата Let's Encrypt

Получите сертификат домена meet.example.org согласно руководству.

Настройка HTTPS для Nginx

Создайте каталог для сертификатов:

mkdir /etc/nginx/ssl

Скопируйте полученные через Let’s Encrypt сертификаты:

cp fullchain.pem /etc/nginx/ssl/meet.example.org/fullchain.pem

cp privkey.pem /etc/nginx/ssl/meet.example.org/privkey.pem

Сгенерируйте DH ключ:

openssl dhparam -out /etc/nginx/ssl/dhp-4096.pem 4096

Добавьте HTTPS Nginx:

/etc/nginx/sites-available/bigbluebutton
server {
    server_name meet.example.org;
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/nginx/ssl/meet.example.org/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/meet.example.org/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS:!AES256";
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/ssl/dhp-4096.pem;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
    ...

Настройка FreeSWITCH для SSL

Настройте FreeSWITCH на использование SSL, указав внешний адрес:

/etc/bigbluebutton/nginx/sip.nginx
location /ws {
    proxy_pass https://1.2.3.4:7443;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_read_timeout 6h;
    proxy_send_timeout 6h;
    client_body_timeout 6h;
    send_timeout 6h;
}

Важно

В этой конфигурации указывается внешний IP адрес, а не имя хоста.

Настройка BigBlueButton на использование сессии через HTTPS

Настройте BigBlueButton для использования HTTPS сессии и HTML5:

/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
...
#----------------------------------------------------
# This URL is where the BBB client is accessible. When a user sucessfully
# enters a name and password, she is redirected here to load the client.
# Do not commit changes to this field.
bigbluebutton.web.serverURL=https://meet.example.org
...
# Force all attendees to join the meeting using the HTML5 client
attendeesJoinViaHTML5Client=true

# Force all moderators to join the meeting using the HTML5 client
moderatorsJoinViaHTML5Client=true

Настройте общий доступ к экрану также через HTTPS:

/usr/share/red5/webapps/screenshare/WEB-INF/screenshare.properties
...
streamBaseUrl=rtmp://meet.example.org/screenshare
jnlpUrl=https://meet.example.org/screenshare
jnlpFile=https://meet.example.org/screenshare/screenshare.jnlp

Укажите клиенту загрузку компонентов через HTTPS:

sed -e 's|http://|https://|g' -i /var/www/bigbluebutton/client/conf/config.xml

Настройте WebRTC через SSL сокет:

/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml
...
  kurento:
    wsUrl: wss://meet.example.org/bbb-webrtc-sfu
...
  note:
    enabled: true
    url: https://meet.example.org/pad
...

Так же настройте работу записей через HTTPS:

/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
...
playback_protocol: https

Перезапустите BigBlueButton:

bbb-conf --restart

Перезапустите Nginx:

systemctl restart nginx

Настройка TURN сервера

Настройте TURN сервер turn.example.org согласно руководству.

Укажите BigBlueButton использовать настроенный TURN сервер turn.example.org в качестве STUN и TURN серверов. Для подключения к TURN серверу используется ключ 4b85833c7fdf06130bd7398ac9af558b, указанный в параметре static-auth-secret, настройки TURN сервера.

/usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="stun0" class="org.bigbluebutton.web.services.turn.StunServer">
        <constructor-arg index="0" value="stun:turn.example.org"/>
    </bean>

    <bean id="turn0" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="4b85833c7fdf06130bd7398ac9af558b"/>
        <constructor-arg index="1" value="turns:turn.example.org:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>

    <bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="4b85833c7fdf06130bd7398ac9af558b"/>
        <constructor-arg index="1" value="turn:turn.example.org:443?transport=tcp"/>
        <constructor-arg index="2" value="86400"/>
    </bean>

    <bean id="stunTurnService"
            class="org.bigbluebutton.web.services.turn.StunTurnService">
        <property name="stunServers">
            <set>
                <ref bean="stun0"/>
            </set>
        </property>
        <property name="turnServers">
            <set>
                <ref bean="turn0"/>
                <ref bean="turn1"/>
            </set>
        </property>
    </bean>
</beans>

Перезапустите BigBlueButton:

bbb-conf --restart

Настройка Greenlight

Greenlight - приложение на Ruby on Rails, предоставляющее простой интерфейс для пользователей, чтобы создавать комнаты, начинать конференции, управлять записями конференций.

Установите утилиты для подключения репозитория:

apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

Добавьте ключи и подключите репозиторий Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

apt-key fingerprint 0EBFCD88

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

apt-get update

Установите Docker версии 17.09.1:

apt-get install docker-ce=17.09.1~ce-0~ubuntu docker-compose containerd.io -y

Проверьте работу Docker запуском контейнера hello-world:

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Запретите обновление docker-ce в дальнейшем:

echo docker-ce hold | dpkg --set-selections

Создайте директорию для конфигурации GreenLight:

mkdir ~/greenlight && cd ~/greenlight

Сгенерируйте файл конфигурации GreenLight:

docker run --rm bigbluebutton/greenlight:v2 cat ./sample.env > .env

Сгенерируйт секретный ключ для GreenLight:

docker run --rm bigbluebutton/greenlight:v2 bundle exec rake secret

458e2c786750cb534f2350d12bcf173052cf5fa275c66d545fb64affe805f49cb09169a8a8799cbcaff7762c1c1664e48e5cf4d8754a5f0865e0c9fedc53e1cc

Установите полученное значение в параметр SECRET_KEY_BASE файла .env:

~/greenlight/.env
# Create a Secret Key for Rails
#
# You can generate a secure one through the Greenlight docker image
# with the command.
#
#   docker run --rm bigbluebutton/greenlight:v2 bundle exec rake secret
#
SECRET_KEY_BASE=458e2c786750cb534f2350d12bcf173052cf5fa275c66d545fb64affe805f49cb09169a8a8799cbcaff7762c1c1664e48e5cf4d8754a5f0865e0c9fedc53e1cc
...

Получите URL BigBlueButton и его ключ:

bbb-conf --secret
    URL: https://meet.example.org/bigbluebutton/
    Secret: zZ7XSEB7EjubByrCxAthTNYomDVbMwjUbfT4xqoa3p

    Link to the API-Mate:
    https://mconf.github.io/api-mate/#server=https://meet.example.org/bigbluebutton/&sharedSecret=zZ7XSEB7EjubByrCxAthTNYomDVbMwjUbfT4xqoa3p

Установите полученное значение в параметры BIGBLUEBUTTON_ENDPOINT и BIGBLUEBUTTON_SECRET файла .env:

~/greenlight/.env
...
# The endpoint and secret for your BigBlueButton server.
# Set these if you are running GreenLight on a single BigBlueButton server.
# You can retrive these by running the following command on your BigBlueButton server:
#
#   bbb-conf --secret
#
BIGBLUEBUTTON_ENDPOINT=https://meet.example.org/bigbluebutton/
BIGBLUEBUTTON_SECRET=zZ7XSEB7EjubByrCxAthTNYomDVbMwjUbfT4xqoa3p

Проверьте настройки GreenLight:

docker run --rm --env-file .env bigbluebutton/greenlight:v2 bundle exec rake conf:check
Checking environment: Passed
Checking Connection: Passed
Checking Secret: Passed

Добавьте настрой для Nginx:

docker run --rm bigbluebutton/greenlight:v2 cat ./greenlight.nginx | tee /etc/bigbluebutton/nginx/greenlight.nginx

Добавьте перенаправление BigBlueButton на страницу GreenLight:

/etc/nginx/sites-available/bigbluebutton
...
    # Redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
            root   /var/www/nginx-default;
    }
    location = / {
        return 307 /b;
    }
}

Сгенерируйте сценарий для docker-compose:

docker run --rm bigbluebutton/greenlight:v2 cat ./docker-compose.yml > docker-compose.yml

Сгенерируйте пароль для PostgreSQL:

export pass=$(openssl rand -hex 8); sed -i 's/POSTGRES_PASSWORD=password/POSTGRES_PASSWORD='$pass'/g' docker-compose.yml;sed -i 's/DB_PASSWORD=password/DB_PASSWORD='$pass'/g' .env

Измените версию docker-compose файла:

sed -i "s/version: '3'/version: '2'/" docker-compose.yml

Запустите контейнер:

docker-compose up -d

Перезапустите Nginx:

systemctl restart nginx

Создайте учётную запись администратора:

docker exec greenlight-v2 bundle exec rake user:create["Admin Name","support@example.org","password","admin"]

Все готово! После открытия meet.example.org сайт будет выглядеть следующим образом:

BigBlueButton после установки

Для авторизации администратором введите электронный адрес support@example.org и пароль admin.

Настройка почтовых уведомлений

Для включения подверждения учётной записи по электронной почте укажите настройки почтового сервера для отправки почты:

~/greenlight/.env
...
# Set this to true if you want GreenLight to send verification emails upon
# the creation of a new account
#
ALLOW_MAIL_NOTIFICATIONS=true

SMTP_SERVER=mail.example.org
SMTP_PORT=465
SMTP_DOMAIN=example.org
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_ATUH=
SMTP_STARTTLS_AUTO=true

# Specify the email address that all mail is sent from
SMTP_SENDER=support@example.org
...

Перезапустите Greenlight:

docker-compose down && docker-compose up -d

Смена пароля пользователю

Смену пароля пользователю можно осуществить через консоль RubyOnRail:

docker exec -it greenlight-v2 bundle exec rails c

Loading production environment (Rails 5.2.3)
irb(main):001:0> User.find_by(email: "user@example.org").update_attribute(:password, "new_secret")
=> true

При включенном подверждении учётной записи по электронной почте, сброс пароля пользователя можно выполнить на странице редактирования пользовательского аккаунта:

Reset user password

Обновление BigBlueButton

Подключитесь к контейнеру:

lxc-attach bigbluebutton

Обновите репозиторий бинарных пакетов:

apt-get update

Выполните обновление всех пакетов системы:

apt-get dist-upgrade

Выполните обновление образа Greenlight:

cd ~/greenlight

docker pull bigbluebutton/greenlight:v2

Убедитесь, что настройки не сбросились после обновления:

/opt/freeswitch/etc/freeswitch/autoload_configs/conference.conf.xml
<profile name="cdquality">
  <param name="domain" value="$${domain}"/>
  <param name="rate" value="48000"/>
  <param name="interval" value="20"/>
  <param name="energy-level" value="10"/>
...

Перезапустите контейнер:

lxc-stop -r bigbluebutton

Восстановление образов Docker при использовании Btrfs

Если контейнер развернут на файловой системе Btrfs, то Docker для образов будет использовать подтома, которые не будут попадать в снапшоты этого контейнера. Для того, чтобы запустить Greenlight, необходимо заново скачать образы.

Скачайте заново все используемые Docker образы для Greenlight:

cd ~/greenlight

docker pull bigbluebutton/greenlight:v2

docker pull postgres:9.5

Перезапустите Greenlight:

docker-compose down && docker-compose up -d