Instance locale de BigBlueButton

Si vous n’avez pas accès à une instance BBB pour exécuter B3Desk et la tester, vous pouvez lancer un conteneur BBB.

Voici les étapes à suivre pour avoir un conteneur BBB local correctement configuré.

Étapes d’installation

Il existe un script officiel pour construire l’image Docker de BBB. Il est disponible bigbluebutton/create_bbb.sh après avoir lancé la commande git submodule update --init.

Créer le conteneur BBB

./bigbluebutton/create_bbb.sh --image=imdt/bigbluebutton:3.0.x-develop --update bbb30

L’image est assez volumineuse (~8Go), il faudra donc être patient.

  • Le script devrait afficher l’url et le secret du service BBB.

    URL: https://bbb30.test/bigbluebutton/
    Secret: unknownBbbSecretKey

    Link to the API-Mate:
    https://bbb30.test/api-mate/#server=https://bbb30.test/bigbluebutton/&sharedSecret=bbbSecretKey

Cette commande vous montre également comment accéder au BBB API-Mate.

  • Copiez l’url BBB (BIGBLUEBUTTON_ENDPOINT) et ajoutez api à la fin, ainsi que la clé secrète (BIGBLUEBUTTON_SECRET) dans votre fichier web.env

Le conteneur BBB tourne sur son propre réseau Docker, isolé de celui de B3Desk : il faut donc les relier. Plutôt que le réseau b3desk_default géré par Compose (recréé à chaque docker compose down/up, ce qui débranche BBB), on utilise un réseau externe dédié bbb-shared qui survit aux redémarrages.

Créer le réseau partagé

Cette opération n’est à faire qu’une seule fois. Le réseau doit exister avant le lancement des conteneurs B3Desk :

docker network create bbb-shared

Les services web et worker y sont déjà rattachés dans docker-compose.override.yml, ils le rejoignent donc automatiquement à chaque docker compose up.

Ajouter le conteneur BBB au réseau local

Connectez le conteneur BBB au réseau partagé en lui donnant comme alias le nom d’hôte présent dans BIGBLUEBUTTON_ENDPOINT (par défaut bbb30.test), afin que B3Desk puisse le résoudre :

docker network connect --alias bbb30.test bbb-shared bbb30

Le conteneur conserve cette connexion tant qu’il n’est pas recréé : un simple docker start bbb30 la préserve, mais une réinstallation via create_bbb.sh impose de relancer cette commande.

Vous pouvez vérifier que les services communiquent avec un curl depuis bbb30 vers un service B3Desk, par exemple.

Autoriser les requêtes http avec BBB

BBB doit explicitement autoriser les requêtes http vers b3desk, sans quoi les fichiers de présentation n’apparaîtront pas dans le salon :

docker exec bbb30 sed -i '$ a insertDocumentSupportedProtocols=https,http' /etc/bigbluebutton/bbb-web.properties
docker exec bbb30 bbb-conf --restart

Lancer un conteneur existant

Si vous avez déjà installé BBB et que le conteneur existe toujours, il n’est pas nécessaire de le réinstaller (le script create_bbb.sh supprime toute instance existante et recrée une version mise à jour).

Démarrez le conteneur BBB :

docker start bbb30

S’il a été recréé depuis sa dernière connexion, rattachez-le au réseau partagé (étape inutile sinon, la connexion ayant été conservée) :

docker network connect --alias bbb30.test bbb-shared bbb30

Vous pouvez vérifier qu’il fonctionne effectivement avec :

docker ps -a

Configurer l’enregistrement MP4

Pour configurer BBB afin qu’il traite les enregistrements en vidéo MP4, comme en production, vous devez effectuer une intervention manuelle. Il s’agit d’un problème qui n’est pas encore résolu.

  • Ouvrir une session dans le conteneur :

ssh bbb30
  • Installer le paquet bbb-playback-video :

sudo apt-get install bbb-playback-video
  • Éditer le fichier /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml :

sudo vim /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
  • Ajouter le traitement et la publication vidéo dans le fichier :

steps:
  archive: "sanity"
  sanity: "captions"
  captions:
    - "process:presentation"
    - "process:video"
    - "process:ai-summary"
  "process:presentation": "publish:presentation"
  "process:video": "publish:video"
  "process:ai-summary": "publish:ai-summary"
  • Redémarrer la file d’attente de traitement des enregistrements

sudo systemctl restart bbb-rap-resque-worker.service

Configurer la transcription IA

La transcription nécessite d’avoir livekit comme moteur audio (afin d’avoir des pistes séparées) et un ensemble de scripts pour extraire l’audio, envoyer les pistes à un modèle de transcription, récupérer les transcript puis les envoyer à un second modèle pour produire une synthèse.

L’installation est automatisée, disponible avec le script suivant, aussi disponible à cette adresse. Le script installe la version 0.1.15 du paquet bbb-record-ai-summary.

Le script demandera des informations sur le service à utiliser (Albert ou OpenAI) ainsi que la clé d’API.

Après un enregistrement, le transcript ainsi que le résumé sont alors disponibles via l’endpoint getRecordings de l’API BBB.

Le prompt de résumé par défaut utilisé est :

Create a concise summary that includes:

1. Main topics discussed
2. Key decisions made
3. Action items (if any)
4. Important points raised

Detect the language of the transcript and write the entire summary in that same language.
Never translate or switch languages.

Keep the summary clear, professional, and under 500 words.
Script d’installation
#!/bin/bash -ex

AI_PROVIDER="${1:-${AI_PROVIDER:-}}"
AI_API_KEY="${2:-${AI_API_KEY:-}}"

usage() {
  echo "Usage: $0 <ai-provider> <api-key>"
  echo ""
  echo "Supported ai-provider values: claude, openai, albert"
  echo "You can also set AI_PROVIDER and AI_API_KEY in the environment."
}

if [[ -z "$AI_PROVIDER" || -z "$AI_API_KEY" ]]; then
  usage
  exit 1
fi

case "$AI_PROVIDER" in
  claude)
    LLM_API_KEY_PATH=".llm.anthropic_api_key"
    TRANSCRIPTION_PROVIDER=""
    ;;
  openai)
    LLM_API_KEY_PATH=".llm.openai_api_key"
    TRANSCRIPTION_PROVIDER="openai"
    ;;
  albert)
    LLM_API_KEY_PATH=".llm.albert_api_key"
    TRANSCRIPTION_PROVIDER="albert"
    ;;
  *)
    echo "Unsupported ai-provider: $AI_PROVIDER"
    usage
    exit 1
    ;;
esac

sudo apt update

# LIVEKIT
sudo apt-get install bbb-livekit -y || true
sudo yq e -i '.livekit.enabled = true' /etc/bigbluebutton/bbb-webrtc-sfu/production.yml
sudo systemctl restart bbb-webrtc-sfu
sudo systemctl restart livekit-server
echo "audioBridge=livekit" | sudo tee -a /etc/bigbluebutton/bbb-web.properties
sudo systemctl restart bbb-web nginx

# DEB
wget -O /tmp/bbb-record-ai-summary_0.1.15_all.deb \
  https://github.com/bigbluebutton/bbb-record-ai-summary/releases/download/v0.1.15/bbb-record-ai-summary_0.1.15_all.deb

sudo apt install /tmp/bbb-record-ai-summary_0.1.15_all.deb -y

sudo chown -R bigbluebutton:bigbluebutton /var/bigbluebutton/recording/process/ai-summary

sudo touch /etc/bigbluebutton/ai-summary.yml
sudo yq eval ".llm.provider = \"$AI_PROVIDER\"" -i /etc/bigbluebutton/ai-summary.yml
sudo yq eval "$LLM_API_KEY_PATH = \"$AI_API_KEY\"" -i /etc/bigbluebutton/ai-summary.yml
sudo yq eval '.llm.language = "fr"' -i /etc/bigbluebutton/ai-summary.yml
sudo yq eval '.locale = "fr"' -i /etc/bigbluebutton/ai-summary.yml

sudo touch /etc/bigbluebutton/post-archive-transcription.yml
sudo yq eval '.language = "fr"' -i /etc/bigbluebutton/post-archive-transcription.yml
if [[ -n "$TRANSCRIPTION_PROVIDER" ]]; then
  sudo yq eval ".${TRANSCRIPTION_PROVIDER}.api_key = \"$AI_API_KEY\"" -i /etc/bigbluebutton/post-archive-transcription.yml
  sudo yq eval ".transcriber_path = \"/usr/local/bigbluebutton/core/lib/transcription/${TRANSCRIPTION_PROVIDER}_whisper.rb\"" -i /etc/bigbluebutton/post-archive-transcription.yml
else
  echo "Skipping transcription API key setup for provider '$AI_PROVIDER' because no matching transcription backend is available."
fi


captions_type="$(yq eval '.steps.captions | tag' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"

# normalize steps.captions to an array.
if [[ "$captions_type" == "!!str" ]]; then
  captions_value="$(yq eval '.steps.captions' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml)"
  if [[ -n "$captions_value" && "$captions_value" != "null" ]]; then
    sudo CAPTIONS_VALUE="$captions_value" \
      yq eval -i '.steps.captions = [strenv(CAPTIONS_VALUE)]' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
  fi
fi

# check for the new config entry and add it only if missing.
captions_type="$(yq eval '.steps.captions | tag' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"
if [[ "$captions_type" == "!!seq" ]]; then
  has_ai_summary="$(yq eval '.steps.captions[] | select(. == "process:ai-summary")' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml 2>/dev/null || true)"
  if [[ -z "$has_ai_summary" ]]; then
    sudo yq eval -i '.steps.captions = .steps.captions + ["process:ai-summary"]' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
  fi
  sudo yq eval -i '.steps.captions[] style="double"' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
fi



sudo yq eval '.steps."process:ai-summary" = "publish:ai-summary"' -i /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml
sudo yq eval -i '.steps."process:ai-summary" style="double"' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml

sudo yq eval -i '
    .steps."process:ai-summary" = "publish:ai-summary" |
    (.steps."process:ai-summary" | key) style="double" |
    .steps."process:ai-summary" style="double"
  ' /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml


sudo systemctl restart bbb-rap-resque-worker livekit-server bbb-webrtc-recorder


bbb-conf --salt