MAATRIX / Блог / BigBlueButton в Docker Compose: готовый файл

BigBlueButton в Docker Compose: готовый файл

MAATRIX

Ищете «bigbluebutton docker-compose готовый файл» и упираетесь в противоречивые мануалы — где-то всё ставится одной командой на голый Ubuntu, а где-то показывают docker-compose.yml на десяток сервисов, который у вас не запускается? Причина не в кривых руках, а в том, что BBB — это не одно приложение, а связка из FreeSWITCH, mediasoup/Kurento, coturn и веб-морды, и часть этой связки в Docker пихать не стоит. Разберём честно, что реально контейнеризуется, дам рабочий compose-файл для той части, которая в докере действительно работает.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему BigBlueButton не влезает в один docker-compose.yml целиком

Официальная команда BigBlueButton сама ставит сервер через bash-скрипт bbb-install.sh прямо на систему, а не через Docker, и делает это осознанно. Медиа-ядро (FreeSWITCH для звука, mediasoup/Kurento для видео и шаринга экрана, coturn как TURN-релей) работает с большим количеством UDP-портов, требует host-сеть без NAT, тонкой настройки ядра (sysctl, лимиты файловых дескрипторов) и прямого доступа к сетевым интерфейсам. Всё это плохо ложится на изоляцию контейнеров: либо вы пробрасываете все порты и --network host, теряя смысл изоляции, либо получаете рваный звук и зависающий шаринг экрана из-за NAT-транса внутри Docker-сети.

Есть неофициальные образы, которые пытаются упаковать всё ядро BBB в контейнеры — они существуют, но команда BBB их не поддерживает, и на проде вы останетесь с проблемой один на один, когда после апдейта что-то отвалится. Если вам принципиально важен именно Docker для ядра — берите такие проекты на свой риск и тестируйте видеозвонок на 15+ участников с шарингом экрана до продакшена, а не после.

Честная и рабочая схема — гибрид: медиа-ядро BBB ставится штатным bbb-install.sh прямо на сервер, а фронтенд для пользователей — Greenlight — разворачивается в Docker Compose. Это официально поддерживаемый способ: сам bbb-install.sh в современных версиях генерирует compose-файл для Greenlight автоматически, просто по умолчанию прячет его в /usr/share/bbb-greenlight/. Дальше — что в нём, зачем разбираться руками и как его настроить под себя.

Ставим ядро BBB на голый сервер

Понадобится чистый Ubuntu 24.04, домен с A-записью на IP сервера (для Let's Encrypt) и минимум 4 vCPU / 8 ГБ RAM для комфортных занятий с доской и breakout-комнатами — подробнее по требованиям ниже. Порт 443 и 80 должны быть открыты, плюс диапазон UDP 16384–32768 для медиа-трафика.

sudo apt update && sudo apt -y upgrade
wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v3.0.x-release/bbb-install.sh > bbb-install.sh
chmod +x bbb-install.sh
sudo ./bbb-install.sh -w -v focal-300 -s conf.example.com -e you@example.com

Флаг -w включает вебхуки, -s задаёт домен, -e — почту для Let's Encrypt. Версия релиза (-v) на момент установки может отличаться — сверьтесь с актуальным тегом в репозитории bigbluebutton/bbb-install, не берите значение из статьи вслепую. Установка займёт 15–30 минут и поднимет FreeSWITCH, медиа-сервер, coturn, nginx с сертификатом и системный BBB API на https://conf.example.com/bigbluebutton/.

После установки проверьте статус:

sudo bbb-conf --check
sudo bbb-conf --secret

Вторая команда покажет API-секрет и endpoint — они понадобятся Greenlight, чтобы стучаться в ядро BBB.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Greenlight в Docker Compose: готовый файл

Greenlight — это веб-морда для BBB: комнаты, приглашения, запись встреч, админка. Именно её и разворачивают через Docker Compose, потому что это обычное Rails-приложение с Postgres — никаких требований к host-сети.

Если ядро ставилось через bbb-install.sh без флага -g0, файл уже сгенерирован автоматически в /usr/share/bbb-greenlight/docker-compose.yml, а секрет подставлен из bbb-conf --secret. Если хотите собрать его руками (например, разворачиваете Greenlight на отдельном сервере от медиа-ядра, что снимает нагрузку с машины, где крутится FreeSWITCH) — вот рабочий вариант:

# /opt/greenlight/docker-compose.yml
services:
  postgres:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: greenlight
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: greenlight_production
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks: [gl_net]

  greenlight-v3:
    image: bigbluebutton/greenlight:v3
    restart: unless-stopped
    depends_on: [postgres]
    environment:
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      DB_ADAPTER: postgresql
      DB_HOST: postgres
      DB_NAME: greenlight_production
      DB_USERNAME: greenlight
      DB_PASSWORD: ${DB_PASSWORD}
      BIGBLUEBUTTON_ENDPOINT: https://conf.example.com/bigbluebutton/
      BIGBLUEBUTTON_SECRET: ${BBB_SECRET}
      SAFE_HOSTS: conf.example.com
      RELATIVE_URL_ROOT: /
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - gl_uploads:/usr/src/app/public/uploads
    networks: [gl_net]

volumes:
  pg_data:
  gl_uploads:

networks:
  gl_net:

BIGBLUEBUTTON_ENDPOINT и BIGBLUEBUTTON_SECRET берутся из вывода bbb-conf --secret на сервере с ядром. SECRET_KEY_BASE генерируется командой openssl rand -hex 64. Сохраните эти значения в .env рядом с compose-файлом:

cat > /opt/greenlight/.env <<'EOF'
DB_PASSWORD=замените-на-свой-пароль
SECRET_KEY_BASE=вставьте-вывод-openssl-rand-hex-64
BBB_SECRET=вставьте-secret-из-bbb-conf
EOF

Поднимаем и создаём администратора:

cd /opt/greenlight
docker compose up -d
docker compose exec greenlight-v3 bundle exec rake admin:create

Общие подходы к самому compose-файлу и переменным окружения разобраны в статье про docker-compose для продакшена — там же про профили и .env, если планируете несколько окружений (staging/prod) для Greenlight.

SSL и reverse-proxy перед Greenlight

bbb-install.sh уже поднял nginx с Let's Encrypt для API BBB. Greenlight в контейнере слушает на 127.0.0.1:3000 — вешаем на тот же домен отдельный location или отдельный поддомен, чтобы не плодить лишние сертификаты:

# /etc/nginx/sites-available/greenlight.conf
location / {
    proxy_pass http://127.0.0.1:3000;
    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 $scheme;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Если Greenlight живёт на том же домене, что и API BBB (conf.example.com), добавьте этот location в существующий конфиг, который сгенерировал bbb-install.sh, и перезагрузите nginx:

sudo nginx -t && sudo systemctl reload nginx

Если сертификат ещё не выпущен на нужный домен или получаете ошибку валидации — по этим случаям есть отдельный разбор в статье про настройку Let's Encrypt SSL на VPS.

Сколько сервера нужно под онлайн-обучение

BBB — тяжёлое приложение именно из-за медиа-ядра: у каждого участника видеозвонка со включённой камерой идёт отдельный WebRTC-поток, а транскодирование под доску и шаринг экрана добавляет нагрузку на CPU. Точные цифры зависят от числа участников с включённым видео и от того, используете ли запись занятий — не берите чужие бенчмарки как гарантию, тестируйте на своём тарифе перед реальными занятиями. Ориентировочно для комфортной работы:

СценарийCPURAMДиск
До 15 участников, видео у части4 vCPU8 ГБ60 ГБ SSD
До 30 участников, breakout-комнаты8 vCPU16 ГБ100 ГБ SSD
С записью занятий и архивом+2 vCPU+4 ГБдобавьте под хранение записей

Breakout-комнаты (BBB создаёт под них отдельные BBB-сессии) и общая доска с одновременным рисованием нескольких участников — самые прожорливые по CPU функции, опросы и чат почти не влияют на нагрузку. Диск важен из-за записей: часовое занятие с видео и презентацией легко весит несколько сотен мегабайт, при активном использовании закладывайте отдельный volume под /var/bigbluebutton.

Firewall на сервере с ядром BBB нужен обязательно — 80/443 для веба, UDP-диапазон для медиа и SSH только с ваших IP. Если ещё не настраивали правила, пройдитесь по статье про настройку firewall UFW на VPS — там же про то, как не заблокировать себе доступ по SSH при настройке.

Бэкап, обновление и пересборка контейнера

У Greenlight в Docker всего два состояния, которые жалко потерять: база Postgres (комнаты, пользователи, настройки) и volume с загруженными аватарками/логотипами. Ядро BBB бэкапится отдельно и по-другому — как обычный системный сервис.

Бэкап базы Greenlight:

docker compose exec postgres pg_dump -U greenlight greenlight_production | gzip > /backup/greenlight-$(date +%F).sql.gz

Восстановление:

gunzip -c /backup/greenlight-2026-08-20.sql.gz | docker compose exec -T postgres psql -U greenlight greenlight_production

Для регулярного автоматического бэкапа не изобретайте велосипед — статья про BorgBackup на VPS описывает, как навесить дедуплицированные шифрованные бэкапы по расписанию на любую директорию, включая дампы Postgres.

Обновление Greenlight — просто пересборка контейнера на новый тег образа:

docker compose pull
docker compose up -d

Ядро BBB обновляется штатно через тот же bbb-install.sh с новым номером версии — перед мажорным апгрейдом сверьтесь с changelog релиза, между минорными версиями миграции обычно проходят без сюрпризов, но между мажорными (например 2.7 → 3.0) бывают breaking changes в структуре конфигов.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли засунуть в Docker вообще всё ядро BBB, включая FreeSWITCH и mediasoup?

Технически неофициальные проекты пытаются, но команда BBB это не поддерживает и не тестирует на своих релизах. Для продакшена с реальными занятиями это риск, который себя не окупает — ядро проще держать нативным через bbb-install.sh.

Greenlight обязателен, или можно обойтись API BBB напрямую?

Можно — многие LMS (Moodle, Canvas) подключаются к API BBB напрямую через плагины, без Greenlight вообще. Greenlight нужен, если хотите отдельный сайт для создания комнат без интеграции с LMS.

Чем BBB отличается от Jitsi для онлайн-обучения?

Jitsi проще ставится и легче по ресурсам, но не имеет из коробки доски для совместного рисования, системы breakout-комнат и опросов в том виде, в каком они реализованы в BBB — сравнение по шагам есть в статье про установку Jitsi Meet. Если нужны именно учебные функции — берите BBB, если нужен простой быстрый видеозвонок — Jitsi.

Greenlight падает с ошибкой подключения к BBB API — с чего начать?

Проверьте, что BIGBLUEBUTTON_ENDPOINT заканчивается на /bigbluebutton/ и что секрет совпадает с выводом bbb-conf --secret на сервере ядра — рассинхрон секретов самая частая причина.

Нужен ли отдельный сервер под Greenlight, если ядро уже занимает всю машину?

Не обязательно на старте — Greenlight лёгкий (Rails + Postgres), но если ядро под нагрузкой съедает CPU под завязку во время занятий, вынесите Greenlight на отдельный сервер: конфиг из этой статьи меняется только доменом в BIGBLUEBUTTON_ENDPOINT.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →