BigBlueButton v3 Installationsanleitung

Diese BigBlueButton v3 Installationsanleitung beschreibt alle notwendigen Installationsschritte auf Basis des Ubuntu 22.04.x LTS Betriebssystems inkl. weiterer Optimierungen Ihres BigBlueButton-Servers.

Die neue BigBlueButton Version 3 hat lange auf sich warten lassen, kommt dafür aber mit vielen neuen Features.

Inhaltsverzeichnis:

  1. Systemanforderungen und -voraussetzungen
  2. Installation BigBlueButton
  3. ClamAV
  4. CrowdSec
  5. Nextcloud Integration
  6. Borg-Backup
  7. Update

1. Systemanforderungen und -voraussetzungen

Die minimalen Servervoraussetzungen für einen BigBlueButton Server sind:

  • Ubuntu 22.04 64-bit OS running Linux kernel 5.x
  • Latest version of docker installed
  • 16 GB of memory with swap enabled
  • 8 CPU cores, with high single-thread performance
  • 500 GB of free disk space (or more) for recordings, or 50GB if session recording is disabled on the server.
  • TCP ports 80 and 443 are accessible
  • UDP ports 16384 – 32768 are accessible
  • 250 Mbits/sec bandwidth (symmetrical) or more
  • TCP port 80 and 443 are not in use by another web server or reverse proxy
  • A hostname (such as bbb.example.com) for setup of a SSL certificate
  • IPV4 and IPV6 address

Serverempfehlungen:
netcup: https://www.netcup.de/vserver/#root-server-details
hetzner: https://www.hetzner.com/de/dedicated-rootserver/matrix-ax

Installationsquellen (Stand 01. März 2025):
Ubuntu Jammy: https://releases.ubuntu.com/jammy
BigBlueButton: https://docs.bigbluebutton.org/administration/install

Systemvoraussetzungen:

Für diese Installationsanleitung setzen wir folgende Systembedingungen voraus:

* ein eigener Server für BigBlueButton v. 3 auf Basis von Ubuntu 22.04.x LTS
* ein coturn-Server, betrieben auf einem separaten Server
* DNS-Einträge (A/AAA-Records) für BigBlueButton
* IPv4 und IPv6


2. Installation BigBlueButton v. 3

Melden Sie sich als Benutzer mit sudo-Berechtigungen am Server an:

sudo -s

Installieren Sie die Net-Tools für administrative Zwecke:

apt install -y net-tools

Überprüfen wir die Spracheinstellungen am Server, erwartet wird die Collation „en_US.UTF-8“:

cat /etc/default/locale

Das Ergebnis sollte daher wie folgt aussehen:

LANG="en_US.UTF-8"

Andernfalls korrigieren Sie diese Einstellungen mittels des nachfolgenden Befehls

apt install language-pack-en && update-locale LANG=en_US.UTF-8

und überprüfen dann, ob noch weitere Einträge in der Datei „/etc/default/locale“ vorhanden sind. Wenn ja, dann entfernen Sie diese bitte, melden sich vom System ab, dann wieder am System an und überprüfen die Ausgabe mittels des nachfolgenden Befehls erneut.

systemctl show-environment

Nun setzen wir den Hostnamen in der hosts-Datei und ersetzen die roten Werte:

nano /etc/hosts
[...]
127.0.0.1	localhost
127.0.1.1	bbb.ihredomain.de bbb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
aaa.bbb.ccc.ddd  bbb.ihredomain.de bbb
[...]

Nach der hosts-Datei setzen wir noch den FQDN in der hostname-Datei:

nano /etc/hostname

Tragen Sie den Domänennamen (FQDN) ein:

bbb.ihredomain.de

Starten Sie nun den Server neu

reboot now

und fahren mit der Installation fort. Für die Installation nutzen wir ein Installationsskript, welches wir herunterladen und direkt ausführen. Wechseln Sie nach dem Neustart erneut in die Shell des Benutzers mit sudo-Berechtigungen:

sudo -s

Bereiten Sie das Installationsskript vor. Ersetzen Sie bbb.ihredomain.de mit ihrer gewünschten Domain und die Emailadresse mail@ihredomain.de mit einer für die Let’sEncrypt Zertifikatserstellung benötigten, gültigen Emailadresse.

wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v3.0.x-release/bbb-install.sh | bash -s -- -w -v jammy-300 -s bbb.ihredomain.de -e mail@ihredomain.de

Wenn Sie auch Greenlight mitinstallieren lassen möchten, so ergänzen Sie den Parameter „-g“:

wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v3.0.x-release/bbb-install.sh | bash -s -- -w -v jammy-300 -s bbb.ihredomain.de -e mail@ihredomain.de -g

Die Installation startet nun und installiert Ihnen das aktuelle BigBlueButton v. 3 wenigen Minuten (< 30 Minuten), abhängig von der Bandbreite am Server. Nach Abschluss der Installation überprüfen Sie das BBB-System mittels

bbb-conf --check

Starten wir BBB neu und kontrollieren die Funktionsfähigkeit:

bbb-conf --restart

Um Problemen mit Verbindungen über verschiedene Netzwerke (bspw. verursacht durch NAT o. Ä.) zu verhindern, sollten Sie Ihren eigenen stun/coturn-Server nutzen. Die Funktionsfähigkeit des coturn-Servers lässt sich auf der Kommandozeile oder auf dieser Webseite online überprüfen.

Sofern Ihr coturn-Server erfolgreich überprüft wurde (srflx-Einträge mit OK quittiert), bearbeiten Sie die Datei apply-config.sh

mv /etc/bigbluebutton/bbb-conf/apply-config.sh /etc/bigbluebutton/bbb-conf/apply-config.sh.bak
touch /etc/bigbluebutton/bbb-conf/apply-config.sh
nano /etc/bigbluebutton/bbb-conf/apply-config.sh

GIT/Codeberg: https://codeberg.org/criegerde/bigbluebutton/raw/branch/master/v3/apply-config.sh

Kopieren Sie den Inhalt hinein und passen die roten Werte an.

#!/bin/bash
# Pull in the helper functions for configuring BigBlueButton
source /etc/bigbluebutton/bbb-conf/apply-lib.sh

# Variablen
COTURN_URL="ihre.coturndomain.de"
COTURN_PORT="443"
COTURN_PASSWORD="Ihr-Coturn-Passwort"

enableUFWRules

clear

echo " » Copy default.pdf and favicon.icon"
cp /home/<IhrBenutzer>/bbb/default.pdf /var/www/bigbluebutton-default/assets/default.pdf
cp /home/<IhrBenutzer>/bbb/favicon.ico /var/www/bigbluebutton-default/assets/favicon.ico

echo " » Modify logging behaviour"
sed -i 's/appLogLevel=.*/appLogLevel=Error/g' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
sed -i 's/endWhenNoModerator=.*/endWhenNoModerator=true/g' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
sed -i 's/endWhenNoModeratorDelayInMinutes=.*/endWhenNoModeratorDelayInMinutes=2/g' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
sed -i 's/disabledFeatures=.*/disabledFeatures=learningDashboard, learningDashboardDownloadSessionData/g' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
sed -i 's/level:.*/level: error/g' /usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml
sed -i 's/loglevel =.*/loglevel = "OFF"/g' /etc/bbb-fsesl-akka/application.conf
sed -i 's/stdout-loglevel =.*/stdout-loglevel = "OFF"/g' /etc/bbb-fsesl-akka/application.conf

echo " » Enabling ClamAV"
grep -qxF "scanUploadedPresentationFiles=true" /etc/bigbluebutton/bbb-web.properties || echo "scanUploadedPresentationFiles=true" >> /etc/bigbluebutton/bbb-web.properties

echo " » Disabling Analyzing"
sed -i 's/#disabledFeatures=.*/disabledFeatures=learningDashboard/g' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
grep -qxF "endWhenNoModerator=true" /etc/bigbluebutton/bbb-web.properties || echo "endWhenNoModerator=true" >> /etc/bigbluebutton/bbb-web.properties
grep -qxF "endWhenNoModeratorDelayInMinutes=5" /etc/bigbluebutton/bbb-web.properties || echo "endWhenNoModeratorDelayInMinutes=5" >> /etc/bigbluebutton/bbb-web.properties
grep -qxF "muteOnStart=true" /etc/bigbluebutton/bbb-web.properties || echo "muteOnStart=true" >> /etc/bigbluebutton/bbb-web.properties

echo " » Room information"
sed -i 's/defaultWelcomeMessage=.*/defaultWelcomeMessage=\<b\>\%\%CONFNAME\%\%\<\/b\>/' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties
sed -i 's/defaultWelcomeMessageFooter=.*/defaultWelcomeMessageFooter=Datenschutzerkl\&auml\;rung: \<a href\=\"https\:\/\/www\.c-rieger\.de\/datenschutz-carsten-rieger-it-services\/\" target\=\"\_blank\"\>hier\<\/a\>\./' /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties

echo " » Guestroom"
sed -i 's/"app.guest.windowTitle":.*/"app.guest.windowTitle": "c-rieger.de » Guest Lobby",/g' /usr/share/bigbluebutton/html5-client/locales/en.json
sed -i 's/"app.guest.windowTitle":.*/"app.guest.windowTitle": "c-rieger.de » Wartebereich",/g' /usr/share/bigbluebutton/html5-client/locales/de.json

echo " » Design Mods"
sed -i 's/startClosed:.*/startClosed: true/' /usr/share/bigbluebutton/html5-client/private/config/settings.yml
sed -i 's/forceRelayOnFirefox:.*/forceRelayOnFirefox: true/' /usr/share/bigbluebutton/html5-client/private/config/settings.yml
sed -i 's/hidePresentationOnJoin:.*/hidePresentationOnJoin: false/' /usr/share/bigbluebutton/html5-client/private/config/settings.yml

echo " » TURNSERVER-Setting will be applied"
cat <<HERE > /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="stun0" class="org.bigbluebutton.web.services.turn.StunServer">
	<constructor-arg index="0" value="stun:$COTURN_URL"/>
    </bean>
    <bean id="turn0" class="org.bigbluebutton.web.services.turn.TurnServer">
        <constructor-arg index="0" value="$COTURN_PASSWORD"/>
        <constructor-arg index="1" value="turns:$COTURN_URL:$COTURN_PORT"?transport=tcp"/
        <constructor-arg index="2" value="86400"/>
    </bean>
    <bean id="stunTurnService"
            class="org.bigbluebutton.web.services.turn.StunTurnService">
        <property name="stunServers">
            <set>
                <ref bean="stun0"/>
            </set>
        </property>
        <property name="turnServers">
            <set>
                <ref bean="turn0"/>
            </set>
        </property>
    </bean>
</beans>
HERE
echo ""
echo "(c) Carsten Rieger IT-Services"
exit 0

Starten Sie BigBlueButton neu:

bbb-conf --restart

Die aktuell verwendeten BBB- Versionen ermitteln Sie durch

bbb-conf --version

Zum Abschluss erweitern wir crontab, um sowohl die Logfiles turnusmäßig zu bereinigen, als auch die SSL-Zertifikate regelmäßig automatisch zu erneuern:

crontab -e

Fügen Sie am Ende diese Zeilen hinzu:

...
@daily /usr/bin/journalctl --vacuum-size=1G > /dev/null 2>&1
@daily find  /var/log/nginx/*.log -mtime +14 -delete
@daily find  /var/log/bbb-webrtc-sfu/*.log -mtime +14 -delete
@daily find  /var/log/bigbluebutton/*.log -mtime +14 -delete
@daily find  /var/log/*.log -mtime +14 -delete
...

Sollte es zu Problemen bei der Verwendung im Firefox Browser kommen, so wäre folgende Einstellung ein Versuch wert: about:config » media.peerconnection.ice.relay_only » true

Quelle: https://docs.bigbluebutton.org/administration/turn-server#test-your-turn-server

Weitere BBB-Befehle (bbb-conf) und Anpassungen finden Sie hier (BigBlueButton). Zudem haben Sie auch die Möglichkeit, eigene Videohintergründe bereitzustellen. Beschrieben wird das Vorgehen im BBB-Wiki.


3. ClamAV installieren

ClamAV können Sie bequem per Docker nutzen. Die Einrichtung erfolgt über dieses Kommando:

docker run -d --name "clamav" --mount type=bind,source=/var/bigbluebutton,target=/var/bigbluebutton -p 3310:3310 -p 7357:7357 --restart always clamav/clamav:latest

Im anschluß daran überprüfen Sie, ob der ClamAV-Docker gestartet wurde und läuft:

Um die Funktion von ClamAV zu überprüfen können Sie Test-Virusdateien in eine BigBlueButton-Präsentation hochladen.

Sofern eine Bedrohung entdeckt wurde wird eine Warnung erscheinen:

Im Log (bbb-web) werden Meldungen wie diese protokolliert:

Mar 03 01:07:18 test30 java[2810929]: 2025-03-02T01:07:18.285Z DEBUG o.b.w.c.PresentationController - processing file upload eicar.com.txt (presId: f7ff3fd7c0ab460f7139541c02df46f24ac90b67-1728436037947)
Mar 03 01:07:18 test30 java[2810929]: 2025-03-02T01:07:18:550Z DEBUG o.b.w.c.PresentationController - file upload success eicar.com.txt
Mar 03 01:07:18 test30 java[2810929]: 2025-03-02T01:07:19:020Z ERROR o.b.p.DocumentConversionServiceImp - Presentation upload failed for meetingId=4814d8e60f2e15576bebfe7cef34367ef5b54539-1728435987030 presId=f7ff3fd7c0ab460f7139541c02df46f24ac90b67-1728436037947
Mar 03 01:07:18 test30 java[2810929]: 2025-03-02T01:07:20:000Z ERROR o.b.p.DocumentConversionServiceImp - Presentation upload failed because a virus was detected in the uploaded file

Testviren-Dateien können Sie hier herunterladen eicar.org.


4. CrowdSec

Zuerst richten wir die Quellen ein:

curl -s https://install.crowdsec.net | sudo sh

Im Anschluss aktualisieren wir die Repos udn installieren CrowdSec

apt update
apt install crowdsec
systemctl enable --now crowdsec.service
apt install crowdsec-firewall-bouncer-nftables

Überprüfen Sie, dass beide Prozesse laufen:

systemctl status crowdsec crowdsec-firewall-bouncer.service

Erweitern Sie den Grundschutz:

cscli collections install crowdsecurity/nginx
cscli parsers install crowdsecurity/nginx-logs
cscli scenarios install crowdsecurity/nginx-req-limit-exceeded
cscli collections install crowdsecurity/sshd
cscli scenarios install crowdsecurity/ssh-bf
cscli scenarios install crowdsecurity/ssh-slow-bf
cscli parsers install crowdsecurity/sshd-success-logs
cscli parsers install crowdsecurity/sshd-logs

uns laden anschließen CrowdSec neu:

systemctl reload crowdsec

Mittels der Befehle

cscli metrics

und

cscli parser list && cscli collections list

können Sie Ihre CrowdSec-Installation überprüfen.


5. Nextcloud Integration

Die ausgezeichnete Integration in Ihre Nextcloud beschreibt der folgende Artikel und BigBlueButton selbst auf dieser Seite.

Die notwendige URL sowie den dazugehörige API-Token erhalten Sie per Konsole:

bbb-conf --secret

Sie richten die Url sowie den Token in der Nextcloud-App ein

und können umgehend mit der Nutzung von BigBlueButton aus Ihrer Nextcloud heraus beginnen.

Die zugrundeliegende App können Sie ganz einfach per Konsole in der Nextcloud aktivieren:

nocc app:enable bbb

6. BorgBackup

Erzeugen Sie sich Ihre Backup-Datenstruktur

mkdir -p /backup/daten /backup/temp /restore

Beginnen Sie dann mit der Installation

apt update && apt upgrade -y && apt install -y borgbackup python3-llfuse

Im Anschluß erstellen wir das lokale Borg Backuprepository

borg init -e repokey-blake2 /backup/daten/

Unterhalb von /backup/daten finden Sie dann eine Dateistrutkur, die von Borg intern verwendet wird und Ihre Backups verschlüsselt und dedupliziert vorhält. Nachfolgend stelle ich Ihnen ein Beispielskript für die Sicherung der BBB-Instanz zur Verfügung, welches aber an Ihre Serverumgebung angepasst werden muss.

Passen Sie dafür die rot markierten Werte an:

nano /root/backup.sh
#!/bin/bash
##################################
### Beispieldaten:
### logDirectory="/backup_logs/"
### backupDiscMount="/backup/"
### localBackupDir="/backup/temp"
##################################
export BORG_PASSPHRASE='<DAS-BORG-PASSWORT>'
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
startTime=$(date +%s)
currentDate=$(date --date @"$startTime" +"%Y%m%d_%H%M%S")
currentDateReadable=$(date --date @"$startTime" +"%d.%m.%Y - %H:%M:%S")
logDirectory="/<BORG-LOGVERZEICHNIS>/"
logFile="${logDirectory}/${currentDate}.log"
backupDiscMount="/<BACKUP-VERZEICHNIS>/"
localBackupDir="/<BACKUP-VERZEICHNIS>/temp"
borgRepository="${backupDiscMount}/daten"
borgBackupDirs="/etc/ /usr/share/ /root/ $localBackupDir/"
webserverServiceName='nginx'
############################################################################
if [ ! -d "${logDirectory}" ]
then
mkdir -p "${logDirectory}"
fi
errorecho() { cat <<< "$@" 1>&2; }
exec > >(tee -i "${logFile}")
exec 2>&1
if [ "$(id -u)" != "0" ]
then
errorecho "ERROR: This script has to be run as root!"
exit 1
fi
if [ ! -d "${localBackupDir}" ]
then
errorecho "ERROR: The local backup directory ${localBackupDir} does not exist!"
exit 1
fi
echo -e "\n###### Start des Backups: ${currentDateReadable} ######\n"
echo -e "Daten werden zusammengestellt"
dpkg --get-selections > "${localBackupDir}/software.list"
echo -e "\nBackup mit borgbackup"
borg create --stats \
$borgRepository::"${currentDate}" \
$localBackupDir \
$borgBackupDirs
echo
rm "${localBackupDir}"/software.list
rm -r "${localBackupDir}/${fileNameBackupDb}"
borg prune --progress --stats $borgRepository --keep-within=7d --keep-weekly=4 --keep-monthly=6
endTime=$(date +%s)
endDateReadable=$(date --date @"$endTime" +"%d.%m.%Y - %H:%M:%S")
duration=$((endTime-startTime))
durationSec=$((duration % 60))
durationMin=$(((duration / 60) % 60))
durationHour=$((duration / 3600))
durationReadable=$(printf "%02d Stunden %02d Minuten %02d Sekunden" $durationHour $durationMin $durationSec)
echo -e "\n###### Ende des Backups: ${endDateReadable} (${durationReadable}) ######\n"
echo -e "Plattenbelegung:\n"
df -h ${backupDiscMount}

Markieren Sie das Skript als ausführbar

chmod +x /root/backup.sh

Erstellen Sie einen cronjob, der das Backup automatisch täglich für Sie ausführt:

crontab -e
7 2 * * * /root/backup.sh > /dev/null 2>&1

Sie können sich die erstellten Backups auflisten lassen:

borg list /backup/daten

Möchten Sie nun ein Backupset durchsuchen, respektive Ihre Daten wieder herstellen, so mounten Sie das Backupset und stellen dann daraus Ihre Daten einzeln oder komplett wieder her:

borg mount /backup/daten::<date> /restore/

Beispiel:

borg mount /backup/daten::20250302_084033 /restore/

Zum Beenden verlassen Sie das eingebundene Backupset mittels

borg umount /restore/

wieder. Eine externe Sicherung, bspw. zu einer Hetzner Storagbox, besschreiben wir hier.


7. Update

Um BigBlueButton aktualisieren zu können stellen wir Ihnen diess Skript bereit:

mkdir /home/<Ihr Benutzername am BBB-Server>/bbb/
nano /root/update.sh

Fügen Sie den nachfolgenden Code ein und passen dabei die nachfolgenden zwei rot markierten Stellen an:

[…]
DNS=“ihre.domain.de
BENUTZER=“Ihr Benutzername am BBB-Server
[…]

#!/bin/bash
####################
# Update BBB v. 3  #
##########################################################
# BITTE ANPASSEN:
DNS="ihre.domain.de"
BENUTZER="Ihr Benutzername am BBB-Server"
##########################################################
if [ -f /tmp/bbb ]; then
        clear
        clear
        echo " ++++++++++++++++++++++++++++++++++++++++++++++++++++"
        echo ""
        echo " » Das Updateskript ist bereits aktiv - *ABBRUCH*"
        echo " » Oder wurde ein vorheriger Prozess abgebrochen?"
	echo ""
	echo " » "$(ls /tmp/bbb)
	echo ""
        echo " » Entfernen Sie ggf. die Datei mit diesem Befehl:"
        echo " » sudo rm -f /tmp/bbb_updateskript"  
        echo ""
        echo " ++++++++++++++++++++++++++++++++++++++++++++++++++++"
        echo ""
        exit 1
fi
touch /tmp/bbb_updateskript
cd /
apt-mark unhold bbb-*
apt update
apt upgrade -V
clear
echo " » Aktualisiere ClamAV"
docker stop clamav
docker rm clamav
docker image rm $(docker image ls | grep clamav/clamav | awk '{ print $3 }')
docker run -d --name "clamav" --mount type=bind,source=/var/bigbluebutton,target=/var/bigbluebutton -p 3310:3310 -p 7357:7357 --restart always clamav/clamav:latest
apt-mark hold bbb-*
apt autoremove -y
apt autoclean
clear
echo -n " » BBB Neustart gewünscht [y|n]?"
read answer
echo " » Kopiere die 'apply-config.sh' ..."
cp /home/$BENUTZER/bbb/apply-config.sh /etc/bigbluebutton/bbb-conf/
if [ "$answer" != "${answer#[YyjJ]}" ] ;then
	sleep 2
	echo ""
	bbb-conf --setip $DNS
fi
        echo ""
        echo " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
	echo ""
if [ -e /var/run/reboot-required ]; then
        echo -e " »\e[1;31m ACHTUNG: ES IST EIN SERVERNEUSTART ERFORDERLICH.\033[0m"
        echo ""
        echo " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
else
        echo -e " »\033[32m  KEIN Serverneustart notwendig.\033[0m"
        echo ""
        echo " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
fi
echo ""
rm -f /tmp/bbb
exit 0
# (c) Carsten Rieger, https://www.c-rieger.de

Markieren Sie das Skript als ausführbar

chmod +x /root/update.sh

und aktualisieren darüber Ihre BBB-Instanz inkl. des ClamAV-Dockers

/root/update.sh

GIT/Codeberg: https://codeberg.org/criegerde/bigbluebutton/raw/branch/master/v3/update.sh


Die Installation wurde erfolgreich abgeschlossen und so wünsche ich Ihnen viel Spaß mit Ihrer eigenen BigBlueButton-Instanz. Über Ihre Unterstützung (diese wird ordnungsgemäß versteuert!) würden sich meine Frau, meine Zwillinge und ich sehr freuen!