Bbb

Материал из wiki.nntc.nnov.ru
Версия от 20:37, 31 августа 2025; Vovan (обсуждение | вклад) (Действие второе)
Перейти к навигации Перейти к поиску

Проблематика

Работа 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;
    }