Bbb
Содержание
Проблематика
Работа BBB за NAT
Когда веб-клиент пытается установить соединение с аудио посредством WebRTC, то в протоколе внутри WebSocket сервер отдаёт внутренний IP сервера вместо внешнего. На этом этапе аудио соединение рушится и это проблема.
Проксирование через Nginx
Если порт 443 и 80 заняты другим сервером (очень часто так бывает), то для работы BBB на определённом домене необходимо настраивать реверс-прокси на внешнем веб сервере (как правило это Nginx). В случае с BBB здесь достаточно хитрая настройка reverse-proxy.
Также необходимо учитывать, что инсталлер BBB не может установить решение без использования certbot и настройки валидного сертификата (с некоторых пор без валидного сертификата в браузерах не работает WebRTC. Вот совсем не работает... Совсем-совсем...).
Поэтому алгоритм установки BBB для работы за reverse-proxy тоже специфический. Можно даже это назвать некоторым лайвхаком...
Решение
Установка 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
Особенности настройки реверс-прокси 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; }