Разворачиваем школьный учебный портал на Moodle и BigBlueButton

В конце марта 2020 маленькая камчатская школа столкнулась с той же проблемой, что и все школы нашей страны: как учить детей если они не могут ходить в школу?

Просто скидывать материал для самостоятельного изучения нельзя, должна быть обратная связь, надо убедиться, что ученик правильно понял материал.

Изучение федеральных порталов дало понимание, что имеющиеся уроки имеют слишком примитивное изложение тем, а те, что позволяют загружать свой материал скорее всего не переживут возросшую нагрузку. Поэтому были сформулированы требования к учебному порталу:

  1. Решение на своих серверах (self-hosted). Отказ от публичных сервисов, которые скорее всего не справятся с нагрузкой (что позже и подтвердилось).
  2. Ручная регистрация. Ученик должен получить логин/пароль от классного руководителя, а не ходить по ресурсам и самостоятельно регистрироваться.
  3. Работа в браузере на всех устройствах без необходимости установки стороннего ПО. Так как и родители и дети сидят дома, а компьютеров на всех не хватит, то учебный портал должен запускаться на любых устройствах (компьютеры, планшеты, смартфоны), которые в данный момент доступны ученику. Установка дополнительного ПО может стать проблемой, поэтому работать все должно в браузере без дополнительных плагинов (Flash и т.д.).
  4. Структурирование материалов урока, наличие обратной связи по каждому выполненному заданию. Выполненная учеником работа должна лежать там же, где и задание. Учитель не должен заниматься сортировкой домашних работ. У учителя должна быть возможность отмечать ошибки ученика прямо на его работе и там же оставлять комментарии.
  5. Контроль активности учащихся. Учителю надо знать, когда конкретный ученик заходил и что делал.
  6. Сквозная авторизация в видеоуроках. Ученикам нельзя давать возможность самостоятельно представляться в видеоуроках, а у учителя должны быть все инструменты модерации видеоурока (включение/выключение микрофонов и камеры каждого участника, запрет личных чатов, включение/выключение общего чата).

После беглого поиска и тестирования выбрали связку Moodle+BigBlueButton как удовлетворяющую всем этим требованиям одновременно.

Установка и настройка заняла 1 выходной день, обучение учителей и решение организационных вопросов — неделю каникул.

Для начала мы купили домен (я везде буду использовать вымышленный myportal.ru), делегировали его на DNS-серверы и начали установку.

Установка Moodle
Для установки Moodle взята «голая» виртуальная машина Ubuntu 18.04 с 8 vCPU, 24 ГБ ОЗУ и 2 ТБ места. Изначально установлен только SSH-сервер.

Подробно установка описана тут.
Чтобы не писать sudo перед каждой командой логинимся под root:

$ sudo su -

Обновляем систему:

apt update
apt dist-upgrade

Настраиваем timezone:

dpkg-reconfigure tzdata

Удаляем лишние компоненты:

apt-cache search cloud-init
bash -c "echo 'datasource_list: [ None ]' sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg"
apt purge -y cloud-init
rm -Rf /etc/cloud /var/lib/cloud

Ставим apache, mysql и php:

apt install apache2 mysql-client mysql-server php libapache2-mod-php mc

Проходим мастер для защиты mysql:

mysql_secure_installation

Ставим остальные пакеты, которые нужны Moodle:

apt install graphviz aspell ghostscript clamav php7.2-pspell php7.2-curl php7.2-gd php7.2-intl php7.2-mysql php7.2-xml php7.2-xmlrpc php7.2-ldap php7.2-zip php7.2-soap php7.2-mbstring

Редактируем часовой пояс в /etc/php/7.2/cli/php.ini и /etc/php/7.2/apache/php.ini (естественно, указываем свой):

[Date]
date.timezone = "Asia/Kamchatka"

Качаем Moodle и распаковываем его в каталог /var/www/html/moodle:

wget https://download.moodle.org/download.php/stable38/moodle-latest-38.tgz

Изначально права на каталог /var/www/html/moodle 0777, но после установки плагинов обязательно поменяем их на 0755:

chmod 0777 -R /var/www/html/moodle

Создаем каталог /var/www/moodledata, в нем наш Moodle будет хранить все файлы. На каталог /var/www/moodledata выставляем права 0777:

mkdir /var/www/moodledata
chmod 0777 -R /var/www/moodledata

Удаляем сайт по-умолчанию из /etc/apache2/sites-available/ и создаем там свою конфигурацию с именем портала (например, urok.myportal.ru.conf)и следующим содержимым:

<VirtualHost *:80>
ServerName urok.myportal.ru
ServerAdmin help@myportal.ru
DocumentRoot /var/www/html/moodle/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

Делаем рестарт apache2 и получаем бесплатный сертификат:

service apache2 restart
add-apt-repository ppa:certbot/certbot
apt update
apt install certbot python3-certbot-apache
certbot --apache -d urok.myportal.ru
service apache2 restart

В результате к нашему сайту можно подключаться по https, а конфигурация apache2 будет такой в двух файлах (с редиректом на https):

<VirtualHost *:80>
ServerName urok.myportal.ru
ServerAdmin help@myportal.ru
DocumentRoot /var/www/html/moodle/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =urok.myportal.ru
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName urok.myportal.ru
ServerAdmin help@myportal.ru
DocumentRoot /var/www/html/moodle/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/urok.myportal.ru/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/urok.myportal.ru/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Настраиваем ufw:

ufw enable
ufw allow ssh
ufw allow 'Apache Full'
ufw delete allow 'Apache'
ufw status
Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

Создаем базу данных, 'pass' меняем на свой сложный пароль:

mysql -u root -p
CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO 'moodleuser'@'localhost' IDENTIFIED BY 'pass';

Теперь можно открыть наш сайт в браузере и пройти мастер установки Moodle. Потребуется указать имя базы данных (moodle), логин (moodleuser) и пароль, который мы придумали на предыдущем шаге.

После установки прописываем запуск cron.php по расписанию:

crontab -u www-data -e
* * * * * /usr/bin/php  /var/www/html/moodle/admin/cli/cron.php >/dev/null

Тут замечена некоторая неторопливость Moodle, поэтому сразу был установлен Memcached:
apt install memcached libmemcached-tools php-memcached

Cтавим следующие плагины (Администрирование — Плагины — Установка плагинов):
— Opcache management для производительности https://moodle.org/plugins/tool_opcache
— Atto: Styles для визуального редактора https://moodle.org/plugins/atto_styles
— BigBlueButtonBN для видеоуроков https://moodle.org/plugins/mod_bigbluebuttonbn
— Moove в качестве темы оформления https://moodle.org/plugins/theme_moove
После установки плагинов меняем права на каталог moodle:

chmod 0755 -R /var/www/html/moodle

Это требуется для безопасности: веб-сервер выполняется от имени www-data, поэтому он не сможет писать в каталог /var/www/html/moodle. Как я уже писал, хранит свои файлы Moodle в отдельном каталоге /var/www/moodledata.

В дальнейшем на время обновления плагинов и тем можно временно менять права на каталог:

cd /var/www/html/moodle/
chmod -R 0757 mod/
chmod -R 0757 theme/

Выполнять обновление плагинов и тем через админку moodle и возвращать права:

chmod -R 0755 mod/
chmod -R 0755 theme/

На этом установка Moodle завершена, приступаем к установке BigBlueButton.

Тема Moove выбрана как самая простая с точки зрения пользователя. На главной странице пользователя встречает большое окно с просьбой ввести логин и пароль, а после логина — список уроков. Заблудиться невозможно.







Конечно, хотелось бы вместо предметов иметь список уроков на сегодня (более привычный формат для школы), но так как на второй день после установки с порталом начали работать учителя, то решили больше ничего не трогать и не менять в навигации.

Установка BigBlueButton
Входящий в состав BBB Freeswitch не дружит с виртуализацией и разработчик настойчиво рекомендует ставить BBB на физический сервер. На антресольке был найден сервер Dell R610 с 2х Xeon X5650, на который и был установлен BBB.

ОС по рекомендациям разработчика была выбрана Ubuntu 16.04.
Обновляем систему и выставляем часовой пояс:

apt update
apt dist-upgrade
dpkg-reconfigure tzdata

Включаем ufw и открываем порты, которые будет использовать BBB:

ufw enable
ufw allow ssh
ufw allow in 80,443,1935,7443/tcp
ufw allow in 16384:32768/udp

Создаем каталог /var/bigbluebutton/, в нем будут храниться записи вебинаров.
Я для этого каталога использовал отдельный LUN объемом 4 ТБ.

Проверяем локаль:

cat /etc/default/locale

Если она отличается от en_US.UTF-8, то делаем следующее:

apt-get install language-pack-en
update-locale LANG=en_US.UTF-8
exit

Логинимся заново и убеждаемся, что локаль en_US.UTF-8:

# cat /etc/default/locale
LANG=en_US.UTF-8

Теперь проверяем язык в show-environment. Если он отличается от en_US.UTF-8, то исправляем:

systemctl show-environment
systemctl set-environment LANG=en_US.UTF-8
systemctl show-environment
LANG=en_US.UTF-8

Дальше воспользуемся готовым скриптом установки BBB https://github.com/bigbluebutton/bbb-install

wget -qO- https://ubuntu.bigbluebutton.org/bbb-install.sh | bash -s -- -v xenial-22 -s bbb.myportal.ru -e help@myportal.ru

Вместо bbb.myportal.ru и help@myportal.ru подставляем свои значения. Сервер будет установлен, получен бесплатный сертификат Let's Encrypt, настроен https.

После установки удаляем лишнее:

apt-get purge bbb-demo

Moodle будет создавать комнаты BigBlueButton используя API. Получаем ключ API:

# bbb-conf --secret
    URL: https://bbb.myportal.ru/bigbluebutton/
    Secret: cBjkdnjasuibnjnfdksagn6967sfrs

Этот URL и ключ мы укажем в настройка модуля Moodle BigBlueButtonBN.

Установка почтового сервера.
Moodle отправляет очень много уведомлений. Даже если в настройках все выключить, пользователь может для конкретного предмета или урока включить отправку уведомлений на почту и ему будет отправляться письмо по каждому событию.



Сначала мы использовали pdd.yandex.ru, но уже на второй день столкнулись с ограничением в 3000 писем с одного ящика. Поэтому pdd.yandex.ru был заменен собственным сервером Zimbra.
Берем Ubuntu 18.04 (4vCPU и 16 ГБ ОЗУ на наши 1000 пользователей) и качаем для нее Zimbra Open Source Edition: https://www.zimbra.com/downloads/zimbra-collaboration-open-source/

Первым делом надо прописать в hosts реальный ip и имя сервера:

mcedit /etc/hosts
127.0.0.1 localhost
77.88.99.11 mail.myportal.ru mail

Удаляем лишние компоненты:

apt-cache search cloud-init
bash -c "echo 'datasource_list: [ None ]' sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg"
apt purge -y cloud-init
rm -Rf /etc/cloud /var/lib/cloud
systemctl disable systemd-resolved
systemctl stop systemd-resolved
echo "nameserver 77.88.8.8" > /etc/resolv.conf

Распаковываем дистрибутив Zimbra и запускаем инсталлятор

wget https://files.zimbra.com/downloads/8.8.15_GA/zcs-8.8.15_GA_3869.UBUNTU18_64.20190918004220.tgz
tar -xzf zcs-8.8*
cd /home/zcs-8.8.15_GA_3869.UBUNTU18_64.20190918004220/
./install.sh

Cоглашаемся с лицензионным соглашением и выбираем компоненты для установки.

Я ставил все, кроме zimbra-drive, zimbra-chat и zimbra-imapd
Во время установки скрипт спросит название домена. Необходимо указать домен в формате myportal.ru

DNS ERROR resolving MX for mail.myportal.ru
Change domain name? Yes
myportal.ru

В конце указываем пароль администратора через оции 7 — 4 — ввод пароля — r — a.
Включаем ufw и открываем порты, которые будет использовать Zimbra:

ufw enable
ufw allow ssh
ufw allow in 25,80,110,143,443,465,587,993,995,5222,5223,9071,7071/tcp

Теперь можно зайти в админку Zimbra по адресу mail.myportal.ru:7071
Для получения сертификата Let's Encrypt будет использоваться этот скрипт: https://github.com/VojtechMyslivec/letsencrypt-zimbra

apt install software-properties-common
add-apt-repository ppa:certbot/certbot
apt update
apt install certbot
git clone https://github.com/VojtechMyslivec/letsencrypt-zimbra.git /opt/letsencrypt-zimbra
cp /opt/letsencrypt-zimbra/letsencrypt-zimbra.cfg{.example,}

В конфиге необходимо указать свою почту и имя сервера:

mcedit /opt/letsencrypt-zimbra/letsencrypt-zimbra.cfg
email="help@myportal.ru"
common_names=( "mail.myportal.ru" )

Разрешаем пользователю zimbra запускать certbot:

cp configs/sudoers.conf /etc/sudoers.d/zimbra_certbot

Получаем сертификат:

sudo -Hiu zimbra /opt/letsencrypt-zimbra/obtain-and-deploy-letsencrypt-cert.sh -v

Добавляем в планировщик автоматическое обновление сертификата:

cp configs/cron.conf /etc/cron.d/letsencrypt-zimbra


Так как учеников много, то ящики мы создаем с помощью скрипта. Из таблицы Excel с помощью склеивания значений столбцов выгружается строки создания пользователей и копируются в скрипт.

touch account.sh
chmod +x account.sh

Скрипт имеет вид:

export LC_ALL='ru_RU.UTF-8'
zmprov createAccount a9arkhipov@myportal.ru 'dhfekjcjd' displayName 'Андрей Архипов' givenName 'Андрей' sn 'Архипов' zimbraPasswordMustChange FALSE

Скрипт запускается от имени пользователя zimbra.

su zimbra
./account.sh

Настройка BigBlueButton
Для того, чтобы BBB говорил по-русски установим русскую озвучку:

wget https://files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-8000-1.0.51.tar.gz
wget https://files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-16000-1.0.51.tar.gz
wget https://files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-32000-1.0.51.tar.gz
wget https://files.freeswitch.org/releases/sounds/freeswitch-sounds-ru-RU-elena-48000-1.0.51.tar.gz

И распаковываем все в /opt/freeswitch/share/freeswitch/sounds.

Необходимо поправить права на каталог, чтобы к файлам имел доступ freeswitch:

chown -R freeswitch:daemon /opt/freeswitch/share/freeswitch/sounds/ru/

Редактируем vars.xml:

mcedit /opt/freeswitch/etc/freeswitch/vars.xml

<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/ru/RU/elena"/>
Презентация, которая по-умолчнию отображается в комнатах лежит по адресу: /var/www/bigbluebutton-default/default.pdf

Настройки сервера:

mcedit /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties

Некоторые параметры с объяснениями:

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

defaultWelcomeMessage=Welcome to <b>%%CONFNAME%%</b>!
defaultWelcomeMessageFooter=support@myportal.ru

muteOnStart=true # Присоединяться к конференции с выключенным микрофоном.
allowModsToUnmuteUsers=true # Разрешить учителю включать микрофон учеников 
attendeesJoinViaHTML5Client=true # использовать HTML5 клиент вместо Flash
moderatorsJoinViaHTML5Client=true # использовать HTML5 клиент вместо Flash
breakoutRoomsEnabled=false # Выключить групповые комнаты
breakoutRoomsRecord=false
breakoutRoomsPrivateChatEnabled=false
allowDuplicateExtUserid=true # Разрешить одному пользователи входить с нескольких устройств одновременно

Следующие настройки влияют на пользователей со статусом «заблокировано» в конференции



# Default Lock Settings
lockSettingsDisableCam=true
lockSettingsDisableMic=false
lockSettingsDisablePrivateChat=true
lockSettingsDisablePublicChat=false
lockSettingsDisableNote=true
lockSettingsHideUserList=false
lockSettingsLockedLayout=false
lockSettingsLockOnJoin=true
lockSettingsLockOnJoinConfigurable=true

Настройки клиента:

mcedit /usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml

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

cameraProfiles:
    - id: low
      name: Low quality 100 kbps
      default: false
      bitrate: 100
    - id: medium
      name: Medium quality 200 kbps
      default: false
      bitrate: 200
    - id: high
      name: High quality 500 kbps
      default: true
      bitrate: 500
    - id: hd

Добавил поддержку Яндекс.Браузера, иначе пользователей с таким браузером не пустит в конференцию с ошибкой «Неподдерживаемый браузер»:

minBrowserVersions:
  - browser: YandexBrowser
    version: 15

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

bbb-conf --stop
bbb-conf --start


Настройка Moodle
Первым делом настраиваем главную страницу: Администрирование — Главная страница — настройки главной страницы. На главной мы отсавили только Объявления, а после входа отображаются Курсы, на которые пользователь записан и Объявления.

Дальше идем в Администрирование — Сервер. Настраиваем Имя техподдержки, Электронная почта техподдержки.

В Opcache management убеждаемся, что кеширование работает.

В Сервер / Электронная почта указываем настройки отправки писем.

Сервер: mail.myportal.ru, Безопасность TLS, Тип аутентификации LOGIN, Логин noreply@myportal.ru, Пароль тот, что указывали при создании ящика. Разрешенные почтовые домены — myportal.ru, Информация о сайте, с которого отправлено сообщение — Всегда.

В Оценки — Общие настройки «Оценка в баллах по умолчанию» указываем привычные школе «5».
В настройке темы Moove (Внешний вид — Moove) я добавил завершающий код SCSS чтобы работал плагин ATTO:

Завершающий код
.attostylesbox {
    padding: 10px;
    box-sizing: border-box;
    border-radius: 5px;
    margin-bottom: 10px;
    width: 100%
}
.attostylesbox.attostylesbox-solid {
    color: white;
}
.attostylesbox.attostylesbox-outline {
    background-color: white;
    border-width: 2px;
    border-style: solid;
}
.attostylesbox.attostylesbox-callout {
    background-color: white;
    border: 1px solid #eee;
    border-left-width: 5px;
}
.attostylesbox.attostylesbox-solid-blue {
    background-color: #7d9fd3;
}
.attostylesbox.attostylesbox-solid-green {
    background-color: #98ca3e;
}
.attostylesbox.attostylesbox-solid-yellow {
    background-color: #ffcf35;
}
.attostylesbox.attostylesbox-solid-red {
    background-color: #ef4540;
}
.attostylesbox.attostylesbox-solid-black {
    background-color: #3a3a3a;
}
.attostylesbox.attostylesbox-outline-blue {
    border-color: #7d9fd3;
    color: #7d9fd3;
}
.attostylesbox.attostylesbox-outline-green {
    border-color: #98ca3e;
    color: #98ca3e;
}
.attostylesbox.attostylesbox-outline-yellow {
    border-color: #ffcf35;
    color: #ffcf35;
}
.attostylesbox.attostylesbox-outline-red {
    border-color: #ef4540;
    color: #ef4540;
}
.attostylesbox.attostylesbox-outline-black {
    border-color: #3a3a3a;
    color: #3a3a3a;
}
.attostylesbox.attostylesbox-callout-blue {
    border-left-color: #7d9fd3;
}
.attostylesbox.attostylesbox-callout-green {
    border-left-color: #98ca3e;
}
.attostylesbox.attostylesbox-callout-yellow {
    border-left-color: #ffcf35;
}
.attostylesbox.attostylesbox-callout-red {
    border-left-color: #ef4540;
}
.attostylesbox.attostylesbox-callout-black {
    border-left-color: #3a3a3a;
}
.attostylestextmarker {
    border-radius: 5px;
    padding-left: 5px;
    padding-right: 5px;
}
.attostylestextmarker.attostylestextmarker-green {
    background: #99ffcc;
}
.attostylestextmarker.attostylestextmarker-pink {
    background: #ffccff;
}
.attostylestextmarker.attostylestextmarker-yellow {
    background: #ffffcc;
}


В настройках главной страницы можно выключить все лишние блоки и рекламу спонсоров, а в настройках нижнего колонтитула указать контакты техподдержки.

В настройках плагинов (Администрирование — Плагины — Обзор плагинов) выбираем Видеоконференция BigBlueButton и указываем URL сервера BigBlueButton и секретный ключ, который мы получали командой bbb-conf --secret.

В настройках аутентификации (Администрирование — Плагины — Аутентификация — Ручная регистрация) запрещаем пользователям менять имя, фамилию, адрес электронной почты и отключаем самостоятельную регистрацию ( в разделе Аутентификация).

Создание пользователей Moodle.

Снова берем табличку с фамилией, именем, классом, генерируем всем пароли (например, с помощью ViPNet Password Generator) и формируем логины и адреса электронной почты. Чтобы не было мучительно больно при использовании паролей в csv и скриптах, удаляем из паролей те, что содержат ' и;



Сохраняем в csv в таком формате:

username:firstname:lastname:email:cohort1:city:country:lang:password
g1petrov:Владимир:Петров:g1petrov@myportal.ru:1 Г (2020):Елизово:RU:ru:drkcwf,f,

Кодировка файла должна быть UTF-8, преобразовывать удобно в notepad++.

Открываем Администрирование — Пользователи — Загрузить пользователей. Разделитель ":" Строк предпросмотра «1000». Смотрим на наличие ошибок и если все хорошо — загружаем.

Теперь у нас есть все ученики. Осталось создать учителей и можно создавать уроки.

Открываем Администрирование — Курсы — Управление курсами и категориями. Создаем категорию. Например, «Школа №1».

Назначаем роли категории:



В Управляющих добавляем завучей и директора, в создателей курса всех учителей.
Создаем курс (например, 11 А Информатика ). Находясь в курсе учитель или завуч нажимают «Участники» — «Записать пользователей на курс».



Можно выбрать группу (например, «11 А (2020)»), чтобы записать всех пользователей из класса.
Чтобы добавить элементы в урок включаем режим редактирования и добавляем элемент.



Например, конференцию BigBlueButton. Для запуска конференции нажимаем «Подключиться к сеансу». Видеоурок начался.



За месяц накопился опыт работы в режиме видеоуроков.

  1. Лучше всего для онлайн-обучения использовать недорогие настольные USB-микрофоны типа Fifine K669 или DEXP U700. Чем меньше кнопок на микрофоне, тем лучше.
  2. Учителя старших классов к середине месяца практически перестали пользоваться веб-камерами, так как главное — презентация и голос. Видео отвлекает учеников и не позволяет учителю просыпаться в 8:10 и сразу начинать урок.
  3. За 30 минут онлайн-урока учителя рассказывают намного больше, чем большинство учеников успевают выучить самостоятельно за то же время.

От других школ были запросы «хочется такого же, как Zoom, чтобы по ссылке», поэтому был поднят отдельный сервер с BigBlueButton и Greenlight в качестве панели управления.

Ставится он так же, как и BBB, только с ключом -g в конце:

wget -qO- https://ubuntu.bigbluebutton.org/bbb-install.sh | bash -s -- -v xenial-22 -s vks.myportal.ru -e help@myportal.ru -g
cd greenlight/
docker exec greenlight-v2 bundle exec rake admin:create

Есть защита от срыва уроков (явление, названное zoom bombing): при создании конференции можно включить режим «Требуется одобрение модератора перед подключением». При каждом входе ученика потребуется подтверждение учителя, учитель будет пускать только своих учеников по знакомой фамилии.



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

Надеюсь, наш опыт кому-то пригодится и мы сделали мир чуточку лучше.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 28

    0
    Я правильно понял, что BBB уже без флеша работает?
      0
      У него есть html5 клиент, не знаю как сейчас, год назад все было сыровато для использования из коробки, не было возможности переключиться между разными разрешениями, в частности.
      Надо держать в уме, что это не готовое решение, а конструктор для интеграции в Ваше веб-приложение.
        +1

        Мы использовали только HTML5 клиент, он был включен принудительно в настройках (attendeesJoinViaHTML5Client=true,
        moderatorsJoinViaHTML5Client=true).

        0
        не пробовали ставить плагин для moodle для управления bbb?
        и по серверу для bbb подскажите — сколько одновременно онлайн конференций было на каком железе?
          +1

          Да, именно BigBlueButtonBN использовался для интеграции BBB в Moodle.
          В конце марта во время тестирования просили учителей включить всем веб-камеры. На трафике 250 мбит/с нагрузка на 2xXeon X5650 была не более 20%. К сожалению, в BBB нет инструментов сервера, которые позволили бы видеть количество подключившихся. В апреле в среднем на сервере работало 200-250 учеников одновременно, нагрузка на процессор не превышала 15%.
          С аудио и видео BBB работает в режиме прокси, каждый поток аудио и видео просто рассылается всем клиентам. Это накладывает ограничение на количество одновременно включенных камер. Никакого Simulcast в нем нет, если каждый из 20 участников транслирует 500 кбит/с поток с камеры и в настройках комнаты всем разрешено видеть всех (например, родительское собрание), то в каждого клиента летит 19 видеопотоков по 500 кбит/с, которые клиентское устройство должно декодировать и показать пользователю.
          В плане трансляции видео от каждого ученика интересней Zoom и Jitsi, которые поддерживают Simulcast. Каждый клиент транслирует на сервер видео минимум в 2 потока: например, основной в 500 кбит/с и дополнительный в 128 кбит/с, а на стороне клиента уже выбирается с какого именно потока воспроизводить видео в зависимости от места в раскладке на экране. Это значительно снижает требования к мощности клиентских устройств.
          В BBB мы в основном пользовались режимом в котором все видят модератора (учителя), модератор видит всех, а друг друга ученики не видят, чтобы не нагружать устройства учеников.

            0
            В BBB мы в основном пользовались режимом в котором все видят модератора (учителя), модератор видит всех, а друг друга ученики не видят, чтобы не нагружать устройства учеников.

            А где в BBB этот режим включается? Не могу найти.
              +2
              Надо включить в конфиге сервера «пользователь заходит заблокированным» (это описано в статье), а на пользователей со статусом «заблокирован» распространяются настройки раздела «Управление пользователями» — «Заблокировать участников». Ставим «Видеть вэб-камеры других участников» в «Заблокировано» и камеры пользователей видит только модератор. Каждого пользователя отдельно можно разблокировать и назначать ведущим. В обоих случаях его камеру увидят другие участники.
              0
              В BigBlueButton поток «по умолчанию» по моим тестам 200Кбит, так что формально Jitsi в сумме потребляет больше полосы (не пробовал его, но вы пишете выше, что 500+128)
              Качество картинки (и ширину потока) можно выбирать при подключении камеры.

              Как правило, для мероприятий вроде онлайн-обучения вряд ли нужна картинка HD-качества со стороны школьника/студента, обычно это «говорящая голова». Нужна грамотно сделанная презентация и хороший звук. Который больше зависит не от кодека и полосы, а от микрофона докладчика и постороннего шума вокруг него.
                +1
                Jitsi стримит 720p в 3 потока: 720p, 360p и 180p. Остальные клиенты выбирают из этих трех исходя из своих возможностей. Качество звука в Jitsi мне не понравилось вообще. Лучший звук из всех протестированных решений был в MCU Vinteo (вроде кодек opus). Там отчетливо была слышна разница между USB-микрофонами разной ценовой категории.
                Про звук и презентацию в онлайн-обучении согласен. Учителя сами к этому пришли, картинка нужна только младшим классам и специфическим предметам типа иностранных языков. Видео учеников отчасти позволяет контролировать заинтересованность, но намного эффективнее давать простой тест в Moodle сразу по окончании урока, чем весь урок вглядываться в лица учеников.
                0
                Спасибо за ценную информацию конкретной практической реализации!
                Если не секрет, какой ширины канал использовался и хватало ли его?
                  0
                  Ответ нашел ниже, надо было обновить страницу перед комментированием.
                0
                в BBB нельзя четко ответит на вопрос «сколько онлайн конференций может быть».
                Сильно зависит от того, что это за конференции
                1) используется перезентация или трансляция рабочего стола (презентация это картинка статичная, трансляция стола — это видеопоток каждому участнику)
                2) сколько человек одновременно в аудиоконференции с активным микрофоном — только ведущий или «все со всеми»
                3) сколько камер подключено — ни одной, только у ведущего, несколько камер, у всех
                4) кто видит активные камеры — только модератор видит все камеры, все видят все камеры
                5) какое качество выставлено у камер — низкое, среднее, высокое
                6) идет ли запись мероприятия

                и все эти параметры мультплицируют нагрузку с какими-то коэфициентами. Чем больше функционала используете тем сильнее нагрузка возрастает, в геометрической прогрессии.
                0

                Спасибо за статью!
                "Для установки Moodle взята «голая» виртуальная машина Ubuntu 18.04 с 8 vCPU, 24 ГБ ОЗУ"
                По опыту, для moodle, которым пользуется сотня-другая учеников, достаточно 4 гб ОЗУ и 2 ядра.
                Я так понимаю, большой процент ресурсов простаивает теперь на этом сервере?

                  +1
                  В моем случае CPU это старенький Xeon X5650 (2,6 ГГц), поэтому при 4 vCPU постоянная загруженность была более 80%. Два ядра привели бы к явным тормозам. Администрирование — Отчеты — Тест производительности у меня показывает 80 баллов даже когда на портале более 200 пользователей (чем меньше баллов, тем лучше). Что касается ОЗУ, то 4 ГБ явно мало, сейчас используется около 12ГБ, СУБД разрешено активно использовать память.
                    0

                    Понял, благодарю за ответ!

                  +2
                  Выполнение `chmod -R 0755` на директории приводит к тому, что все файлы в дереве начиная от этой директории получают флаг «исполняемый». Это плохо тем, что при наличии дыр в движке (а гарантировать что в мудле их нет — нельзя) позволяющих дропнуть свой код, он будет исполняемым, и позволит пройти дальше.

                  Лучше менять права примерно так:
                  find /var/www/html -type d -exec chmod 755 {} \;
                  find /var/www/html -type f -exec chmod 644 {} \;


                  А если надо временно дать доступ на запись в директорию движку, лучше делать это без ключа -R.
                    +1
                    Да, правильней менять права с запретом на исполнение.
                    Что касается записи в директорию, то при обновлении тем/плагинов он заменяет файлы и ему нужны права на запись существующих файлов.
                    0
                    Начали активно использовать ВВВ в период изоляции в ВУЗе. Ранее использовалось только для студентов дистанционной формы обучения и нагрузка была незначительной.

                    Столкнулись с проблемой, что примерно при 600+ пользователей онлайн на сервере звук начинает отставать. Причем 600+ может быть как и 10 мероприятий по 60 человек, и 60 мероприятий по 10 человек. Очевидной причины не найдено. Загрузка по CPU незначительная, сервер — 2xAMD EPYC 7402, в сумме 96 потоков, 256Гб ОЗУ
                    Временное решение было такое: на железном сервере сделано 3 виртуалки по 32 ядра на ноду, на каждой — инстанс BBB. Мероприятия условно равномерно распределяются по трем серверам. На момент создания мероприятия неизвестно, сколько в нем будет участников, поэтому балансируется «условно». Но, как правило, более 200 участников в одном мероприятии не бывает, более частый кейс — 10-30 человек.
                    Такой подход, на удивление, помог победить проблему со звуком на том же железе, и сейчас сервер без проблем «держит» до 1200-1300 онлайн пользователей в пике.

                    Greenlight практически не используем, «комнаты» создаются по API из нашего приложения управления расписанием. Там же выставляются параметры, а конкретно — режимы вроде «слушатель не может включать камеру» для лекций, «модератор видит всех, все видят только модератора» для практических занятий, разрешена ли запись мероприятия и т.п.

                    Там же сделана привязка имени пользователя к его логину, чтобы пользователи не назывались «Маша» и «Саша», а было ФИО и номер группы.

                    Написан небольшой шаблончик мониторинга bbb для zabbix, а так же «на коленке» система просмотра активных мероприятий и их истории (скачивает каждые 10 минут и по запросу xml-статистику по api с каждой ноды и потом отображает в человекочитаемом виде)

                    Примеры картинок мониторинга и zabbix
                    Monitoring

                    Zabbix


                    Из проблем с BBB — иногда все же «сходит с ума» Kurento media server, потребляя 10-20 ядер виртуалки на 100%. Временное решение — перезапуск сервисов BBB ежедневно в 4 утра вроде помог, после этого проблем больше не наблюдалось (прошло 2 недели)
                    Разбираться с проблемой более детально нет возможности, так как нужно срочно восстанавливать работоспособность сервиса, а не трейсы процессов делать. А в логах ничего необычного.
                      0
                      Firewall есть? У нас тоже Kurento сходил с ума пока все лишние порты не закрыли. Оставили 80, 443 и udp порты как в инструкции.
                        +1
                        Мне кажется, проблема тут не в процессорах, а в прерываниях и очередях на сетевой карте. Есть готовое решение для балансировки BBB — Scalelite
                        Greenlight мы сами не используем, это только для других школ. Сами создаем конференции BBB только в Moodle как раз из-за сквозной авторизации (учитель видит учеников по имени и фамилии).
                        Не поделитесь, как в zabbix получаете информацию о количестве активных пользователей?
                        0
                        а если ли публичная ссылка на шаблон zabbix?
                          0
                          Подскажите, какой у Вас канал, и какая на него нагрузка, когда идет активный учебный процесс?
                            0
                            Сильно зависит от того, пользуются ли веб-камерами учителя и ученики или нет. Например, используется около 80 Мбит/с когда ~200 учеников только слышат преподавателя, задают вопросы голосом и видят презентацию и около 300 Мбит/с на вечерних родительских собраниях (где-то 50 человек в разных комнатах), когда все видят всех и у части включена камера. Увеличение трафика вызывает и демонстрация экрана вместо презентации. У нашего сервера 2 гигабитных канала от местных провайдеров, чего более чем достаточно, т.к. пользователи тоже местные, а наземный (подводный) линк в глобал с Камчатки только один.
                            0
                            Спасибо за статью. Крайне актуально.
                            Жаль только, что у Jitsi (пока) нет такой админки, как у BBB.
                            Jitsi удобнее хотя бы тем, что исп-ся всего 3-4 порта в отличие от BBB с Kurento и 100500 udp-портами.
                            Может в будущем авторы BBB и перейдут на jitsi (мечты).
                              0
                              defaultWelcomeMessage=Welcome to %%CONFNAME%%!
                              Кириллица работать не будет?
                                0
                                Будет. Кодировка UTF-8, формат ASCII. Находим в интернете любой онлайн-конвертер native2ascii и получаем текст вида
                                \u041f\u0440\u0438\u0432\u0435\u0442, EvgenySerd!
                                0
                                Отличная статья. Спасибо.
                                У меня вопрос по настройкам видео, нужно чтобы ученик видел себя и учителей, но не видел остальных учеников. А учителя как модераторы видели всех. В одной конференции учителей может быть несколько.
                                PS. Если поставить lockSettingsDisableCam=true и lockSettingsLockOnJoin=true то у ученика просто блокируется камера, что не совсем то что нужно.
                                PS2 Кстати сталкивался с тем что не везде доступен ubuntu.bigbluebutton.org существует зеркало packages-eu.bigbluebutton.org
                                  0
                                  Транслировать веб-камеру: Разрешено
                                  Видеть веб-камеры других участников: Запрещено
                                  В такой конфигурации ученик будет видеть всех модераторов (учителей), но не будет видеть других учеников. Своя картинка у ученика отображаться будет при включенной камере.

                                Only users with full accounts can post comments. Log in, please.