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.onlinee 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:
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:
#----------------------------------------------------
# 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.
- Abra o arquivo de configuração do NGINX do BBB:
sudo nano /etc/nginx/sites-available/bigbluebutton
- 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;
}
- 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;
}
- 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:
archive(arquivar)process(processar)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.rbpara conversão automática ao final de cada gravação - Criação da pasta
/var/www/bigbluebutton-default/recordingpara armazenar os MP4 - Atualização do arquivo
/var/bigbluebutton/playback/presentation/2.3/index.htmlpara 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)
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
Nenhum comentário