Рассмотрим установку сервиса создания и управления виртуальными классами на базе ПО BigBlueButton
BigBlueButton — это возможность создавать виртуальные комнаты/классы, это возможность проводить совещания, обучение и другие виртуальные встречи.
Отличная замена Zoom, Skype и другим подобным программам
В данной статье основная цель - развернуть BigBlueButton внутри сети организации и организовать корпоративный сервис, используя свои SSL сертификаты.
Во всех статьях, которые есть на конец 2023 года, никто подробное не рассматривал данный вопрос и проблемы, и чаще всего использовались бесплатные сертификаты от Let's Encrypt.
Итак начнем.
Определимся, что имя сервера у нас будет bbb.domain.com.
Первый шаг - получаем сертификаты
Каким способом Вам дали сертификаты, сами ли создали, дал ли системный администратор, но у вас должно быть как минимум два файла *.crt и *.key, или один *.pfx
Во втором случае Вам необходимо из него получить crt и key
Делается это так:
openssl pkcs12 -in file.pfx -clcerts -nokeys -out bbb.crt
openssl pkcs12 -in file.pfx -nocerts -out key-encrypted.key
openssl rsa -in key-encrypted.key -out bbb.key
Разместим эти два файла в /etc/ssl/private
Шаг второй - основная установка
Открываем ссылку и проверяем/исполняем требования https://docs.bigbluebutton.org/administration/install
По поводу требования 16 GB of memory with swap enabled 8 CPU cores, with high single-thread performance
Сразу хочу сказать, система не запуститься если не будут соблюдаться требования в 16 Гб оперативной памяти и 4 процессоров CPU.
При установке будет писать "Your server needs to have (at least) 4 CPUs (8 recommended for production)." Поэтому на 4 процессорах работать будет.
Учтите, что разработчики очень хорошо "связывают" свое ПО с релизом операционной системы, поэтому если Вы решите что сможете поставить BigBlueButton 2.7 на Ubuntu отличную от версии 20.04 (focal), будьте готовы исправлять зависимости библиотек, которые будут возникать.
Далее, по вышеуказанной ссылке в разделе Pre-installation checks проверяем все другие параметры и выполняем их.
Запускаем в терминале ОС команду
wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v2.7.x-release/bbb-install.sh | bash -s -- -w -v focal-270 -s bbb.domain.com -d -g
где
-s bbb.domain.com - имя хоста. Запись типа A - должна присутствовать в вашем DNS сервере.
-d - означает что мы будем использовать свои SSL сертификаты
-g - установим Greenlight. Web интерфейс для работы с BigBlueButton
После непродолжительной установки мы получим развернутный пакет, который можем проверить командой bbb-conf --checks
BigBlueButton Server 2.7.2 (492)
Kernel version: 5.4.0-166-generic
Distribution: Ubuntu 20.04.6 LTS (64-bit)
Memory: 16380 MB
CPU cores: 4
/etc/bigbluebutton/bbb-web.properties (override for bbb-web)
/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties (bbb-web)
bigbluebutton.web.serverURL: https://bbb.example.com
defaultGuestPolicy: ALWAYS_ACCEPT
defaultMeetingLayout: CUSTOM_LAYOUT
/etc/nginx/sites-available/bigbluebutton (nginx)
server_name: bbb.example.com
port: 80, [::]:80127.0.0.1:82 http2 proxy_protocol, [::1]:82 http2127.0.0.1:81 proxy_protocol, [::1]:81
/opt/freeswitch/etc/freeswitch/vars.xml (FreeSWITCH)
local_ip_v4: 172.11.88.148
external_rtp_ip: 172.11.88.148
external_sip_ip: 172.11.88.148
/opt/freeswitch/etc/freeswitch/sip_profiles/external.xml (FreeSWITCH)
ext-rtp-ip: $${local_ip_v4}
ext-sip-ip: $${local_ip_v4}
ws-binding: 172.11.88.148:5066
wss-binding: 172.11.88.148:7443
UDP port ranges
FreeSWITCH: 16384-24576
kurento: 24577-32768
bbb-webrtc-sfu: 24577-32768
bbb-webrtc-recorder: 24577-32768
/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml (record and playback)
playback_host: bbb.example.com
playback_protocol: https
ffmpeg: 4.2.7-0ubuntu0.1
/usr/share/bigbluebutton/nginx/sip.nginx (sip.nginx)
proxy_pass: 172.11.88.148
protocol: http
/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml (bbb-webrtc-sfu)
/etc/bigbluebutton/bbb-webrtc-sfu/production.yml (bbb-webrtc-sfu - override)
mediasoup.webrtc.*.announcedIp: 172.11.88.148
mediasoup.plainRtp.*.announcedIp: 172.11.88.148
kurento.ip: 172.11.88.148
kurento.url: ws://127.0.0.1:8888/kurento
freeswitch.sip_ip: 172.11.88.148
recordingAdapter: Kurento
recordScreenSharing: true
recordWebcams: true
codec_video_main: VP8
codec_video_content: VP8
/etc/bbb-webrtc-recorder/bbb-webrtc-recorder.yml (bbb-webrtc-recorder)
/etc/bigbluebutton/bbb-webrtc-recorder.yml (bbb-webrtc-recorder - override)
debug: false
recorder.directory: /var/lib/bbb-webrtc-recorder
/usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml (HTML5 client)
/etc/bigbluebutton/bbb-html5.yml (HTML5 client config override)
build: 201
kurentoUrl: wss://bbb.example.com/bbb-webrtc-sfu
defaultFullAudioBridge: fullaudio
defaultListenOnlyBridge: fullaudio
sipjsHackViaWs: true
# Potential problems described below
Если потенциальных проблем нет, то наша первая и основная часть завершена. Вы можете открыть сайт https://bbb.domain.com и получить приглашение системы на вход.
Кстати, если бы при запуске скрипта использовалась команда
wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v2.7.x-release/bbb-install.sh | bash -s -- -w -v focal-270 -s bbb.domain.com -e Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. -g
с использованием Let's Encrypt сертификатов, то наша бы статья на этом бы и завершилась, так как у вас был бы уже установленный полнофункциональный BigBlueButton
Но сертификаты у нас свои. Заметим что команда bbb-conf --check не дает ошибок, пробуем открыть сайт https://bbb.domain.com
Если сайт открывается экспортируем цепочку корневых сертификатов на сервер. У каждого сертификата есть один или несколько удостоверяющих центров, вот их сертификаты нам и нужны.
Выгружаем/экспортируем их все из браузера на сервер c раcширением *.crt
Корневые сертификаты размещаем в двух папках /etc/ssl/certs и /usr/local/share/ca-certificates
Запускаем update-ca-certificates и добавляем корневые сертификаты в список доверенных
Посмотрим что находится в файле /etc/haproxy/certbundle.pem там должны находится как наши сертификаты.
Перезапускаем BigBlueButton bbb-conf --restart
Создадим пользователя - администратора
docker exec greenlight-v3 bundle exec rake admin:create
User account was created successfully!
Name: Administrator
Email: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
Password: Administrator1!
Role: Administrator
Теперь мы можем зарегистрироваться и создать виртуальные комнаты. И вроде бы все хорошо, но...
Шаг третий. Как войти в созданную комнату
После создания комнаты - внутрь попасть почему то не получается.
Внизу появляется запись "The action can't be completed error"
А в консоли сайта появляется ошибка вида
main-7418853bb06c5bbc3addb59ce7bec97fe4ac85263776128f089ffa055ec709b6.js:10 POST https://bbb.domain.com/api/v1/meetings/1i7-7tn-ooa-ndj/start.json 400
main-7418853bb06c5bbc3addb59ce7bec97fe4ac85263776128f089ffa055ec709b6.js:12 Error: Request failed with status code 400
Проблема в том, что наши корневые сертификаты не знает Greenlight и SSL рукопожатие не проходит.
Причем ошибок BlueBigButton не сообщает по команде bbb-conf --debug , и только в логах haproxy /var/log/haproxy.log Вы увидите множество ошибок при попытке войти в комнату
Nov 13 17:44:57 bbb haproxy[935]: 172.1.7.11:51226 [13/Nov/2023:17:44:57.790] nginx_or_turn/1: SSL handshake failure
Добавление наших корпоративных корневых сертификатов происходит так:
- Когда мы устанавливали BigBlueButton то в папке пользователя создалась папка greenlight-v3
- Открываем её и создаем папку mycerts
- Копируем наши сертификаты что экспортировали с браузера ( с расширением crt) в эту папку.
- редактируем файл docker-compose.yml и добавляем строки помеченные красным
version: '3'
services:
postgres:
image: postgres:14.6-alpine3.17
container_name: postgres
restart: unless-stopped
volumes:
- ./data/postgres/14/database_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=bf7c5fc72f9786be04d669f79b8d6d7b5f9fd6888b8c27ac
redis:
image: redis:6.2-alpine3.17
container_name: redis
restart: unless-stopped
volumes:
- ./data/redis/database_data:/data
greenlight-v3:
entrypoint: [bin/start]
image: bigbluebutton/greenlight:v3
container_name: greenlight-v3
restart: unless-stopped
env_file: .env
ports:
- 127.0.0.1:5050:3000
logging:
driver: journald
volumes:
- ./data/greenlight-v3/storage:/usr/src/app/storage
- ./mycerts:/usr/local/share/ca-certificates
depends_on:
- postgres
- redis
Обратите внимание что Вам надо внести изменения в контейнере greenlight-v3 а не redis
- сохраняем и снова запускаем установку
wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v2.7.x-release/bbb-install.sh | bash -s -- -w -v focal-270 -s bbb.domain.com -d -g
Да-да! Заново.. На сегодняшний день это единственный простой способ добавить корневые сертификаты в Greenlight
При повторной установке файл docker-compose.yml не изменяется и все наши изменения применяются в вновь созданном образе.
- активируем наши сертификаты
docker exec greenlight-v3 update-ca-certificates
- перезапускаем сервис bbb-conf --restart
- наслаждаемся полученным эффектом.
Мы смогли войти в виртуальную комнату и можем общаться, приглашать друзей, транслировать экран и так далее.
Шаг четвертый. Показ презентаций.
После первоначальной радости, мы увидим что есть одна проблема.
Не показываются презентации. Ни default.pdf ни любая другая. И как же проводить тогда обучение?
Можно конечно транслировать экран, но наверное стоит починить нашу проблему.
Заметим, что когда грузим нашу презентации в комнату, в логах /var/log/haproxy.log мы опять видим SSL handshake failure
Значит у нас что то еще не видит наши корневые сертификаты.
Для этого нам надо погрузится в чтение логов syslog
Nov 13 11:17:35 bbb systemd_start.sh[24362]: 2023-11-13T08:17:35.364Z backend-2 [#033[31merror#033[39m] : No file found. Error: self signed certificate in certificate chain
Nov 13 11:17:35 bbb systemd_start.sh[24362]: 2023-11-13T08:17:35.371Z backend-2 [#033[31merror#033[39m] : No file found. Error: self signed certificate in certificate chain
Nov 13 11:17:35 bbb systemd_start.sh[24362]: 2023-11-13T08:17:35.382Z backend-2 [#033[31merror#033[39m] : Error parsing image size. Error: self signed certificate in certificate chain.
SSL корневые сертификаты не видит NODE.JS поэтому мы можем поступаем так :
1. Редактируем /usr/share/meteor/bundle/main.js добавив в начале process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
2. bbb-conf --restart
Таким образом мы игнорируем ошибки SSL. К сожалению не смог достичь чтобы meteor прочитывал мои корневые сертификаты, поэтому вот такой путь.
Теперь наша система использует наши SSL сертификаты, позволяет создавать и входить в комнаты, грузить презентации и многое другое. Но это еще не всё....
Шаг четвертый. Запись вебинаров.
Все отлично с нашей системой, но при записи вебинаров они не появляются в списках, хотя создаются.
при выполнении команды bbb-record --republish в логах /var/log/bigbluebutton/post_process.log видим
[2023-11-14T16:56:30.044255 #13674] INFO -- : SSL_connect SYSCALL returned=5 errno=0 state=error: certificate verify failed
Решение - необходимо исправить файл /usr/local/bigbluebutton/core/scripts/post_publish/post_publish_recording_ready_callback.rb
Добавляем строку выделенную красным
uri = URI.parse(callback_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == 'https')
http.verify_mode = OpenSSL::SSL::VERIFY_NONEBigBlueButton.logger.info("Sending request to #{uri.scheme}://#{uri.host}#{uri.request_uri}")
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({ signed_parameters: payload_encoded })response = http.request(request)
Здесь тоже пришлось отключить проверку SSL.
А вот теперь всё! У нас рабочая полноценная система BigBlueButton с своими собственными сертификатами.
Дополнительная информация
чтение логов из докер образов
docker logs -f greenlight-v3 (follows the logs)