Bbb
Содержание
Проблематика
Работа BBB за NAT
Когда веб-клиент пытается установить соединение с аудио посредством WebRTC, то в протоколе внутри WebSocket сервер отдаёт внутренний IP сервера вместо внешнего. На этом этапе аудио соединение рушится и это проблема.
Проксирование через Nginx
Если порт 443 и 80 заняты другим сервером (очень часто так бывает), то для работы BBB на определённом домене необходимо настраивать реверс-прокси на внешнем веб сервере (как правило это Nginx). В случае с BBB здесь достаточно хитрая настройка reverse-proxy.
Также необходимо учитывать, что инсталлер BBB не может установить решение без использования certbot и настройки валидного сертификата (с некоторых пор без валидного сертификата в браузерах не работает WebRTC. Вот совсем не работает... Совсем-совсем...).
Поэтому алгоритм установки BBB для работы за reverse-proxy тоже специфический. Можно даже это назвать некоторым лайвхаком...
Другие важные моменты
Момент 1
На самом BBB сервере домен, на котором далее будет доступен этот BBB сервер из интернета, должен ресолвиться во внутренний ip адрес этого BBB-сервера (не в ip адрес Nginx Reverse-Proxy ни в коем случае, если что!)
Момент 2
При интеграции с Moodle сам хост, на котором работает Moodle должен адекватно добираться до BBB сервера по адресу https://<доменное имя>, потому что сам Moodle, помимо того, что отдаёт ссылки на BBB сервер по его внешнему домену, ещё и сам дёргает за API этого BBB-сервера, чтобы, например, создать на нём конференцию, запросить список записей или что-то ещё в этом роде.
Момент 3
Может так получиться, что "умный" инсталлер BBB поднимет на локальной петле дополнительный ip адрес (это может возникнуть, когда DNS-сервер ресолвит <доменное имя> не в ip адрес BBB сервера, а в ip адрес фронтального реверс-прокси (например, Nginx)).
В этом случае нужно заглушить сервис:
systemctl disable --now dummy-nic.service
либо удалить совсем
rm /lib/systemd/system/dummy-nic.service systemctl daemon-reload
Затем перезагрузиться.
Также нужно обратить внимание, что параметры
ip sip_ip
в файле
/etc/bigbluebutton/bbb-webrtc-sfu/production.yml
указывают на внутренний ip адрес BBB сервера, а не на тот ip адрес, который был поднят сервисом dummy-nic.service, о котором рассказано выше.
После этого нужно перезагрузиться.
В другом разделе также написано о необходимости редактирования параметров
announcedIp
, но это в соответствующем разделе...
Решение
Установка BBB, если требуется внешний reverse-proxy снаружи
1. С наружнего роутера забрасываем 80 порт на внутренний ip BBB сервера (вероятно, он используется уже на действующем решении, где работает certbot и обновляет посредством этого 80 порта другие сертификаты LE, однако придётся его временно перерулить на внуренний ip BBB сервера, ведь certbot-у на этом сервере тоже нужно убедиться, что это тот сервер, который имеет право получить валидный сертификат);
2. UDP порты 16384-32768 снаружи заруливаем на внутренний ip адрес BBB и оставляем так навсегда;
3. Запускаем скрипт установки
./bbb-install.sh -v jammy-300 -s my-bbb-server.ru -e vasya@mail.ru
, где
my-bbb-server.ru
это домен вашего будущего сервера BBB, а
vasya@mail.ru
это емэйл, на который будет если что писать certbot (в нашем случае не будет, т.к. мы отключим его. Потому что у нас на реверс-прокси есть свой сертбот, который будет обновлять фронтальный сертификат. А внутри BBB сервера через 30 дней сертификат перестанет быть валидным - ну и ладно. Наружнему реверс-прокси будет сказано игнорировать это. И да, это будет безопасно для конечного пользователя);
4. Ждём завершения установки;
5. Возвращаем 80 порт на место.
Практически всё готово. Но не всё...
Настройка внешней системы на BBB сервер на примере MOODLE
На BBB-сервере выполняем команду
bbb-conf --secret
и получаем в ответ что-то типа
URL: https://sferum.nntc.nnov.ru/bigbluebutton/ Secret: vUftg5lCmWvRC7ZUftg5lCmWvRCgByIRPZD31ffPYuQcdcQv0Z2Vu
Далее идём в настройки плагина (можно найти на официальном сайте BBB) и вставляем туда эти данные.
Всё.
Исправление ошибки с передачей локального ip адреса BBB сервера на веб-клиент
Действие первое
Как выше было описано, проблема работы звука на BBB сервере, находящемся за NAT, заключается в том, что веб-клиент получает от сервера локальный адрес, который, конечно же, неведом клиенту, который подключается к конференции из интернета.
Чтобы это исправить, нужно перенастроить сервис, посредством которого этот адрес оказывается в протоколе, посредством которого клиент и сервер через вебсокет устанавливают соединение.
Для этого на сервере BBB открываем файл
/etc/bigbluebutton/bbb-webrtc-sfu/production.yml
и заменяем в нём везде значение параметра
announcedIp
на домен, на котором будет работать ваш сервер.
В случае с этой статьёй это домен
my-bbb-server.ru
Должно получиться что-то типа этого:
cat /etc/bigbluebutton/bbb-webrtc-sfu/production.yml freeswitch: esl_password: <тут автосгенерированный пароль> ip: <тут внутренний ip BBB сервера> sip_ip: <тут тоже внутренний ip BBB сервера> mediasoup: webrtc: listenIps: - ip: 0.0.0.0 announcedIp: my-bbb-server.ru plainRtp: listenIp: ip: 0.0.0.0 announcedIp: my-bbb-server.ru
после этого перезапускаем сервис
systemctl restart bbb-webrtc-sfu
или просто перезагружаем сервер
reboot
Действие второе
В файле
/etc/turnserver.conf
после строчек
listening-ip=10.207.239.232 relay-ip=10.207.239.232
добавляем параметр, указывающий на внешний ip адрес, доступный из интернета (тот ip адрес, на который ресолвится внешний домен BBB сервера). Например если ваш домен by-bbb-server.ru ресолвится в ip 91.121.251.254, то строчка должна быть такой:
external-ip=91.121.251.254
Далее забираем из этого же файла значение параметра
static-auth-secret
Просто положите это пока в текстовый файл.
Сохраняем файл
/etc/turnserver.conf
после изменений и рестартуем сервис
systemctl restart coturn
Действие третье
В файле
/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
ищем параметр
bigbluebutton.web.serverURL
и меняем его значение на
https://<доменное имя>
Например, для доменного имени
my-bbb-server.ru
полная строка с параметром и его значением будет такая
bigbluebutton.web.serverURL=https://my-bbb-server.ru
Ниже этой строчки необходимо добавить ещё несколько таких новых параметров:
# TURN/STUN для WebRTC bbb.web.turnserverURL=turn:my-bbb-server.ru:3478?transport=udp bbb.web.turnUsername=bbb bbb.web.turnPassword=<пароль, который в предыдущем конфиге заранее положили в текстовый файл> bigbluebutton.web.appURL=https://my-bbb-server.ru
Особенности настройки реверс-прокси Nginx
Методом проб и ошибок были найдены следующие локейшны, которых минимально необходимо и достаточно для успешной работы BBB через реверс-прокси:
location / { proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_connect_timeout 3600s; proxy_pass https://<внутренний ip адрес bbb сервера, доступный nginx-у>; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_ssl_server_name on; proxy_ssl_verify off; } location /ws/ { proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_connect_timeout 3600s; proxy_pass https://<внутренний ip адрес bbb сервера, доступный nginx-у>; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_ssl_server_name on; proxy_ssl_verify off; } location /webrtc-sfu { proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_connect_timeout 3600s; proxy_pass https://<внутренний ip адрес bbb сервера, доступный nginx-у>; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_ssl_server_name on; proxy_ssl_verify off; } location /html5client/socket.io/ { proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_connect_timeout 3600s; proxy_pass https://<внутренний ip адрес bbb сервера, доступный nginx-у>; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_ssl_server_name on; proxy_ssl_verify off; }