Ir para o conteúdo principal

Configuração - BBB

BigBlueButton — Guia de Instalação e Pré-requisitos

Este documento descreve os pré-requisitos, a verificação de domínio e o comando recomendado para instalar o BigBlueButton (BBB) em Ubuntu 22.04.

✅ Pré-requisitos do Servidor

Requisito Descrição
SO Ubuntu 22.04 (64-bit), kernel 5.x
Docker Última versão instalada
Memória RAM 16 GB (swap ativado)
CPU 8 núcleos, com bom desempenho em single-thread
Armazenamento 500 GB (com gravação) ou 50 GB (sem gravação de sessões)
Portas TCP 80 e 443 abertas
Portas UDP 16384 a 32768 abertas
Largura de banda 250 Mbps simétrico ou mais
Portas 80/443 Não podem estar sendo usadas por outro serviço (Apache, Nginx, etc.)
Domínio (FQDN) Ex.: meet.edustore.online, apontando para o IP público do servidor
Acesso SSH Acesso root ou sudo para executar o script

🌐 Verificação do Domínio

Antes da instalação, o domínio precisa estar corretamente apontado para o IP público da máquina. Para testar, execute:

dig meet.edustore.online @8.8.8.8 +short

O comando acima deve retornar o IP público do seu servidor.

🚀 Comando de Instalação do BigBlueButton

wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v3.0.x-release/bbb-install.sh \
  | bash -s -- -w -v jammy-300 -s meet.edustore.online -e [email protected] -g

Substitua meet.edustore.online e [email protected] pelos valores do seu ambiente.

🔍 Explicação do Comando

Parte do Comando Explicação
wget -qO- https://raw.githubusercontent.com/.../bbb-install.sh Faz o download do script oficial de instalação do BBB e envia a saída diretamente para execução
bash -s -- Indica que estamos passando parâmetros para o script via STDIN
-w Instala o BigBlueButton com suporte a WebRTC, gravação de sessões e streaming
-v jammy-300 Define a versão da instalação como 3.0.x para Ubuntu 22.04 (codinome Jammy)
-s meet.edustore.online Informa o FQDN (nome de domínio) usado para gerar o certificado SSL
-e [email protected] E-mail usado para geração do certificado Let's Encrypt
-g Instala o Greenlight, a interface web de gerenciamento de salas do BBB

✅ Pós-instalação (checagens rápidas)

  • Acesse https://meet.edustore.online e verifique o certificado SSL.
  • Verifique serviços com sudo bbb-conf --check.
  • Se usar gravações, confirme espaço em disco e políticas de retenção.

ℹ️ Observações

  • Garanta que nenhum serviço (ex.: Apache, Nginx pré-instalados) esteja ocupando as portas 80/443 antes da instalação.
  • Mantenha o sistema atualizado e considere snapshots/backups antes de instalar em produção.

🎨 Personalizando o BigBlueButton

1) Restringir uso por iframe e bloquear acesso direto

Adicione o snippet abaixo antes do fechamento da tag </body> em:

/var/www/bigbluebutton-default/assets/index.html

<script>
  const allowedDomains = [
    "sala.focototalconcursos.com.br",
    "painel.focototalconcursos.com.br",
    "sala.andresan.com.br",
    "painel.andresan.com.br",
    "painel.concurseiroon.com",
    "sala.concurseiroon.com",
    "painel.eumebanco.com.br",
    "sala.eumebanco.com.br",
    "painel.metodoprepara.com.br",
    "sala.metodoprepara.com.br",
    "sala.concurseiroprime.com.br",
    "painel.concurseiroprime.com.br",
    "painel.cursosuperacao.com.br",
    "sala.cursosuperacao.com.br",
    "painel.carranzacursos.com.br",
    "sala.carranzacursos.com.br",
    "painel.cedacs.com.br",
    "sala.cedacs.com.br",
    "sala.fenixvestibulares.com.br",
    "painel.fenixvestibulares.com.br",
    "painel.professorzambeli.com",
    "sala.professorzambeli.com",
    "demo.edustore.online",
    "homolog.edustore.online",
    "homolog-painel.edustore.online"
  ];

  // Detecta acesso direto (fora de iframe)
  if (window.top === window.self) {
    document.body.innerHTML = "<h1 style='color:red;text-align:center;margin-top:50px'>Acesso permitido apenas via plataformas autorizadas.</h1>";
    throw new Error("Acesso direto bloqueado");
  } else {
    // Em iframe: valida se a página de origem é permitida
    try {
      const ref = document.referrer || "";
      if (!allowedDomains.some(domain => ref.includes(domain))) {
        document.body.innerHTML = "<h1 style='color:red;text-align:center;margin-top:50px'>Iframe não autorizado.</h1>";
        throw new Error("Iframe não autorizado");
      }
    } catch (e) {
      document.body.innerHTML = "<h1 style='color:red;text-align:center;margin-top:50px'>Iframe não autorizado.</h1>";
    }
  }
</script>

Opcional: neste mesmo arquivo você pode ajustar títulos e textos para a identidade “EduStore Meetings”. Exemplo simples:

<script>
  document.title = "EduStore Meetings";
</script>

2) Ajustar bbb-web.properties

Edite o arquivo:

/etc/bigbluebutton/bbb-web.properties

bigbluebutton.web.serverURL=https://meet.edustore.online
securitySalt=MuOSyERqSHaAm36efJlieUP1fjlqUd1GlHOVI7oow
defaultGuestPolicy=ALWAYS_ACCEPT

Observação: o valor de securitySalt é sensível. Evite versioná-lo em repositórios públicos.

3) Ajustar bigbluebutton.properties

Edite o arquivo:

/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties

#----------------------------------------------------
# Maximum number of pages allowed for an uploaded presentation (default 200).
maxNumPages=1000

#----------------------------------------------------
# Maximum file size for an uploaded presentation (default 30MB).
maxFileSizeUpload=1100000000

# Default Guest Policy
# Valid values are ALWAYS_ACCEPT, ALWAYS_DENY, ASK_MODERATOR
#
defaultGuestPolicy=ALWAYS_ACCEPT

# Enables or disables authenticated guest
authenticatedGuest=false

# Allows moderators to promote guests to moderators when authenticatedGuest is enabled
defaultAllowPromoteGuestToModerator=false

#----------------------------------------------------
# Default welcome message to display when the participant joins the web
# conference. This is only used for the old scheduling which will be
# removed in the future. Use the API to create a conference.
#
# If the message contains characters not in ISO-8859-1 character sets
# they must be properly escaped to unicode characters. An easy way to
# do this is running the native2ascii command setting UTF8 encoding and
# passing this file's path as input and output parameters, e.g.:
#
# native2ascii -encoding UTF8 bigbluebutton.properties bigbluebutton.properties
#
defaultWelcomeMessage=Welcome to <b>%%CONFNAME%%</b>!<br><br>For help on using EduStore Meetings.
defaultWelcomeMessageFooter=This server is running <a href="https://edustore.online/" target="_blank"><u>EduStore Meetings</u></a>.

🖼️ Alterar o Favicon (ícone do navegador)

O favicon é o pequeno ícone exibido na aba do navegador ao lado do título da página.

✅ Método 1: Substituir diretamente

Você pode sobrescrever o arquivo:

/var/www/bigbluebutton-default/assets/favicon.ico

⚠️ Atenção: essa alteração será sobrescrita quando o pacote bbb-config for atualizado.

✅ Método 2: Usar favicon persistente (recomendado)

Crie um diretório customizado:

mkdir -p /var/www/bigbluebutton-default/site

Copie seu favicon.ico personalizado:

cp favicon.ico /var/www/bigbluebutton-default/site/

Crie um arquivo NGINX customizado:

sudo nano /etc/bigbluebutton/nginx/favicon.nginx

Adicione o seguinte conteúdo:

location = /favicon.ico {
    alias /var/www/bigbluebutton-default/site/favicon.ico;
}

Reinicie o NGINX:

sudo nginx -t
sudo nginx -s reload

✅ Essa abordagem não será sobrescrita em atualizações e afeta tanto o BigBlueButton quanto o Greenlight.


🔀 Redirecionar a rota raiz (/) para EduStore Meetings

Objetivo: impedir o acesso direto à landing do BigBlueButton/Greenlight e redirecionar somente a raiz do domínio para https://edustore.online/?product=meetings.

  1. Abra o arquivo de configuração do NGINX do BBB:
sudo nano /etc/nginx/sites-available/bigbluebutton
  1. No bloco server { ... } do seu domínio (server_name meet.edustore.online;), adicione a diretiva para redirecionar apenas a raiz:
# ✅ Redireciona apenas a raiz (/) para a URL externa
location = / {
  return 301 https://edustore.online/?product=meetings;
}
  1. Exemplo de bloco server (trecho final esperado):
server {
  # SSL é finalizado no HAProxy; HTTP/2/1.1 são roteados conforme ALPN
  listen 127.0.0.1:82 http2 proxy_protocol;
  listen [::1]:82 http2;
  listen 127.0.0.1:81 proxy_protocol;
  listen [::1]:81;
  server_name meet.edustore.online;

  # Use redirecionamentos relativos
  absolute_redirect off;

  # HSTS (opcional)
  # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

  access_log /var/log/nginx/bigbluebutton.access.log;

  # Em cenários de reverse-proxy, use $real_scheme no include do BBB
  set $real_scheme "https";

  # ✅ Redireciona a raiz para o site da EduStore
  location = / {
    return 301 https://edustore.online/?product=meetings;
  }

  # Landing do BBB
  location / {
    root /var/www/bigbluebutton-default/assets;
    try_files $uri @bbb-fe;
  }

  # Regras específicas de gravação e playback
  include /etc/bigbluebutton/nginx/*.nginx;
}
  1. Teste e recarregue o NGINX:
sudo nginx -t && sudo nginx -s reload

📝 Alterar o Título do Cliente HTML5 (texto da aba)

Por padrão, a aba do navegador exibe o nome BigBlueButton. Para personalizar:

✅ Etapas

Edite o arquivo de sobrescrita (override):

sudo nano /etc/bigbluebutton/bbb-html5.yml

Adicione ou edite o seguinte trecho:

public:
  app:
    clientTitle: "EduStore Meetings"

Salve e feche.

Reinicie os serviços do HTML5 client:

sudo systemctl restart bbb-html5

✅ Alternativa com comando yq:

Se preferir usar linha de comando para editar diretamente:

yq e -i '.public.app.clientTitle = "EduStore Meetings"' /etc/bigbluebutton/bbb-html5.yml

O comando acima requer que o pacote yq esteja instalado.

🎥 Gravações

Remover dados brutos (raw) de gravações publicadas

Quando uma reunião termina, o BBB arquiva os dados da reunião ("raw data"). Manter esses dados permite reconstruir a gravação em caso de falhas de processamento, habilitar um novo formato ou recuperar exclusões acidentais. Em contrapartida, os dados brutos ocupam espaço em disco ao longo do tempo.

Por padrão, o BBB remove automaticamente os dados brutos 60 dias após a publicação da gravação. Para ajustar esse prazo, edite o arquivo /etc/cron.daily/bigbluebutton e procure pela linha próxima ao topo:

published_days=60

Altere para o número de dias desejado. Para desativar completamente a limpeza dos dados brutos, comente a linha (próximo ao final do arquivo):

remove_raw_of_published_recordings

Excluir gravações com mais de N dias

Para excluir gravações com mais de 60 dias, crie o arquivo /etc/cron.daily/bbb-recording-cleanup com o conteúdo abaixo:

#!/bin/bash

MAXAGE=60

LOGFILE=/var/log/bigbluebutton/bbb-recording-cleanup.log

shopt -s nullglob

NOW=$(date +%s)

echo "$(date --rfc-3339=seconds) Deleting recordings older than ${MAXAGE} days" >>"${LOGFILE}"

for donefile in /var/bigbluebutton/recording/status/published/*-presentation.done ; do
        MTIME=$(stat -c %Y "${donefile}")
        # Check the age of the recording
        if [ $(( ( $NOW - $MTIME ) / 86400 )) -gt $MAXAGE ]; then
                MEETING_ID=$(basename "${donefile}")
                MEETING_ID=${MEETING_ID%-presentation.done}
                echo "${MEETING_ID}" >> "${LOGFILE}"

                bbb-record --delete "${MEETING_ID}" >>"${LOGFILE}"
        fi
done

for eventsfile in /var/bigbluebutton/recording/raw/*/events.xml ; do
        MTIME=$(stat -c %Y "${eventsfile}")
        # Check the age of the recording
        if [ $(( ( $NOW - $MTIME ) / 86400 )) -gt $MAXAGE ]; then
                MEETING_ID="${eventsfile%/events.xml}"
                MEETING_ID="${MEETING_ID##*/}"
                echo "${MEETING_ID}" >> "${LOGFILE}"

                bbb-record --delete "${MEETING_ID}" >>"${LOGFILE}"
        fi
done

Altere o valor de MAXAGE para definir quantos dias manter as gravações no seu servidor BBB. Depois de criar o arquivo, torne-o executável:

chmod +x /etc/cron.daily/bbb-recording-cleanup

🎬 BBB-MP4 (Converter gravações em MP4)

⚙️ Como funciona

Após o término de uma sessão, o sistema de gravação do BigBlueButton executa três etapas:

  1. archive (arquivar)
  2. process (processar)
  3. publish (publicar)

Quando a gravação é publicada, o script /usr/local/bigbluebutton/core/scripts/post_publish/bbb_mp4.rb é executado automaticamente. Ele chama o bbb-mp4.sh passando o meeting_id, iniciando a conversão para MP4.

🚀 Instalação

Assumindo que o projeto será instalado em /var/www/:

cd /var/www
git clone https://github.com/manishkatyan/bbb-mp4.git
cd bbb-mp4

✏️ Editar .env

Exemplo de variáveis:

BBB_DOMAIN_NAME=seu.bbb.com.br
COPY_TO_LOCATION=/var/www/bigbluebutton-default/recording

📦 Executar instalador

./bbb-mp4-install.sh

Esse instalador cria um container Docker com:

  • Google Chrome
  • XVFB (Virtual Frame Buffer)
  • FFmpeg
  • Node.js

E também realiza:

  • Criação do script bbb_mp4.rb para conversão automática ao final de cada gravação
  • Criação da pasta /var/www/bigbluebutton-default/recording para armazenar os MP4
  • Atualização do arquivo /var/bigbluebutton/playback/presentation/2.3/index.html para incluir o botão de download

👤 Permissões

Execute os comandos abaixo para configurar as permissões corretamente:

# Adiciona o usuário bigbluebutton ao grupo docker
sudo usermod -aG docker bigbluebutton

# Dá permissão de escrita no diretório do projeto
sudo chown -R bigbluebutton:bigbluebutton /var/www/bbb-mp4

Garanta também que o usuário bigbluebutton tenha acesso sudo (conforme documentação do projeto).

🌐 Configurar acesso NGINX (BBB 2.6+/3.0)

No BigBlueButton 2.6 e superiores (incluindo 3.0), crie uma configuração para servir os vídeos MP4 via NGINX:

cd /usr/share/bigbluebutton/nginx
sudo touch bbb-mp4.nginx

# Adicione a seguinte linha:
sudo bash -c "echo 'location /recording { root /var/www/bigbluebutton-default; }' > bbb-mp4.nginx"

# Verifique a configuração e recarregue o NGINX
sudo nginx -t
sudo nginx -s reload