フォーラム記事に掲載したオープンソースのビデオ会議システム(オンライン授業システム)である BigBlueButton(BBB) のインストールメモのまとめ。前回の v2.4 から今回は v2.6 へアップグレードしています。今回も BigBlueButton を構成する各アプリを Docker コンテナで稼働させます。v2.4 からの主な変更点は、WebRTC に mediasoup が採用されていることと IPv6 への対応です。Nginx, Coturn, FreeSwitchではTLS認証が必須のため、予めCertbotによりLet's Encryptの認証ファイルを取得しておきます。Docker環境下でシステム運用しますが、OSにはUbuntu20.06以上が推奨されています。またホストマシンの最低スペックも8CPUコア、16GBメモリ、500GBディスクスペース以上となっています(参加人数によってはこれより低スペックでも十分動作可能)。
フォーラム記事:BigBlueButton v2.6 on Docker(v2.4からのアップデート、IPv6対応)
ホストマシン:4コアCPU、12GBメモリ、500GB SSD、Ubuntu22.04
1. Docker版BBBのダウンロードとDocker Composeファイルの作成
最新安定版のmainブランチ(サブモジュールオプション付)をフォルダbbb2602-dockerへダウンロード後、このフォルダ内へ移動
$ git clone [email protected]:bigbluebutton/docker.git -b main --recurse-submodules bbb2602-docker
$ cd bbb2602-docker
下記スクリプトにより、Docker Composeファイルdocker-compose.ymlと環境変数設定ファイル.envを作成
$ ./scripts/setup
注)事後.envファイルを編集した場合、新たにdocke-compose.ymlを以下のコマンドで再構築して下さい。
$ ./scripts/generate-compose
2. Let’s EncryptによるTLS認証のための証明書取得
フォルダbbb2602-docker内での作業です。Nginx, FreeSwitch,Coturnの各コンテナでTLS認証による証明書が必要となるため、予めLet’s Encryptによる証明書をCertbotコンテナ(スタンドアローンモード)により取得しておきます。
$ docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot certonly --standalone -d www.example.com
注)ホストマシンの/etc/letsencryptフォルダに認証ファイルは保存されます。ホストマシンのクローンジョブに上記のCertbot/Dockerによる更新コマンドを追加する必要があります。
FreeSwitchのウェブソケットでTLS認証する場合、プライベートキーファイルを含めた認証ファイルが必要です。
このファイルと指定されたファイル名でシンボリックリンクを作成しておきます。
$ sudo cat cert.pem privkey.pem fullchain.pem > wss.pem
$ sudo ln -s wss.pem agent.pem
$ sudo ln -s wss.pem tls.pem
$ sudo ln -s wss.pem dtls-srtp.pem
3. Nginxリバースプロキシ設定ファイルの作成
システムの入口としてリバースプロキシサーバを設置します。設置すると言っても既存の nginx
にリバースプロキシの設定ファイルを追加して読み込ませるだけです。また、HTTPS接続とするため、既に取得したSSL/TLS証明書をこのファイル内でも使用します。
リバースプロキシの設定ファイルは以下に記載されています。
docker/existing-web-server.md at develop · bigbluebutton/docker · GitHub
以下のDockerHubのページを参照して、上記の設定ファイルをテンプレートファイル nginx_config_temp/reverse-proxy.conf.template として保存します。このテンプレートファイルがコンテナ起動時の設定ファイルとして /etc/nginx/conf.d ディレクトリにコピーされます。
https://hub.docker.com/_/nginx
nginx_config_temp/reverse-proxy.conf.template
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
map $remote_addr $endpoint_addr {
"~:" [::1];
default 127.0.0.1;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name ${NGINX_HOST};
ssl_certificate /etc/letsencrypt/live/${NGINX_HOST}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${NGINX_HOST}/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
# on the host machine, "$ sudo openssl dhparam -out ./letsencrypt/dhp-4096.pem 4096"
ssl_dhparam /etc/letsencrypt/dhp-4096.pem;
access_log /var/log/nginx/bigbluebutton.access.log;
error_log /var/log/nginx/bigbluebutton.error.log;
location / {
proxy_http_version 1.1;
proxy_pass http://$endpoint_addr:48087;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache_bypass $http_upgrade;
}
}
dhp-4096.pemファイルは下記のopensslコマンドで作成して下さい。
$ sudo openssl dhparam -out ./letsencrypt/dhp-4096.pem 4096
4. Docker Composeファイルdocker-compose.ymlと環境変数設定ファイル.envの編集
IPv6への対応(WebRTC-SFU)やリバースプロキシファイルの読込みをdocker-compose.ymlファイルに反映させます。
注)Nginx, WebRTC-SFU, Greenlight, Postgres, Networkの各セクションの変更点
- Nginx:テンプレートファイル追加
- WebRTC-SFU:WEBRTC,RTPのLISTEN_IPのIPv6への対応
- Greenlight, Postgres:Greenlight v3へアップグレード
- Network:IPv6アドレス範囲追加
docker-compose.yml(変更・追加箇所のみ記載)
services:
nginx:
volumes:
# added for reverse-proxy config template file; see https://hub.docker.com/_/nginx
# *.conf.template changed into /etc/nginx/conf.d/*.conf after variables transferred.
- ./nginx_config_temp:/etc/nginx/templates
environment:
# added below for variables in *.conf.template
- NGINX_HOST=www.example.com
# TODO: remove as soon as not required anymore by webrtc-sfu
kurento:
image: kurento/kurento-media-server:7.0.1
restart: unless-stopped
environment:
KMS_EXTERNAL_IPV4: 10.7.7.1
#KMS_EXTERNAL_IPV6: ${EXTERNAL_IPv6}
KMS_MIN_PORT: 10000
KMS_MAX_PORT: 10030
network_mode: host
volumes:
- vol-kurento:/var/kurento
webrtc-sfu:
build:
context: mod/webrtc-sfu
args:
BBB_BUILD_TAG: v2022-12-29-grails-524
image: alangecker/bbb-docker-webrtc-sfu:v2.9.12
restart: unless-stopped
depends_on:
- redis
- freeswitch
environment:
CLIENT_HOST: 10.7.7.1
REDIS_HOST: 10.7.7.5
# changed from default in default.example.yml
MCS_HOST: 10.7.7.1
MCS_ADDRESS: 10.7.7.1
FREESWITCH_IP: 10.7.7.1
FREESWITCH_SIP_IP: ${EXTERNAL_IPv6}
ESL_IP: 10.7.7.1
ESL_PASSWORD: ${FSESL_PASSWORD:-ClueCon}
# KURENTO: '[{"ip": "::", "url": "ws://[::1]:8888/kurento"}]'
KURENTO: '[{"ip": "0.0.0.0", "url": "ws://10.7.7.1:8888/kurento"}]'
MS_RTC_MIN: 16384
MS_RTC_MAX: 32768
# TODO: add mediasoup IPv6
# TODO: can listen to 0.0.0.0 for nat support? https://github.com/versatica/mediasoup/issues/487
# MS_WEBRTC_LISTEN_IPS: '[{"ip":"0.0.0.0", "announcedIp":"${EXTERNAL_IPv4}"}, {"ip":"${EXTERNAL_IPv6}"}]'
MS_WEBRTC_LISTEN_IPS: '[{"ip":"0.0.0.0", "announcedIp":"${EXTERNAL_IPv4}"}, {"ip":"${EXTERNAL_IPv6}"}]'
MS_RTP_LISTEN_IP: '{"ip":"0.0.0.0", "announcedIp":"${EXTERNAL_IPv4}"}'
volumes:
- vol-mediasoup:/var/mediasoup
tmpfs:
- /var/log/bbb-webrtc-sfu
network_mode: host
# greenlight
greenlight:
image: bigbluebutton/greenlight:v3
restart: unless-stopped
env_file: .env
depends_on:
- postgres
- redis
environment:
DATABASE_URL: postgres://postgres:${POSTGRESQL_SECRET:-password}@postgres:5432/greenlight-v3
REDIS_URL: redis://redis:6379
BIGBLUEBUTTON_ENDPOINT: https://${DOMAIN}/bigbluebutton/api
BIGBLUEBUTTON_SECRET: ${SHARED_SECRET}
SECRET_KEY_BASE: ${RAILS_SECRET}
volumes:
- ./greenlight-data:/usr/src/app/storage
networks:
bbb-net:
ipv4_address: 10.7.7.21
ipv6_address: fdxx:xxxx:8a45:2::21
postgres:
image: postgres:14.6-alpine3.17
restart: unless-stopped
environment:
POSTGRES_DB: greenlight-v3
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRESQL_SECRET:-password}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
bbb-net:
ipv4_address: 10.7.7.22
ipv6_address: fdxx:xxxx:8a45:2::22
networks:
bbb-net:
enable_ipv6: true
ipam:
driver: default
config:
- subnet: "10.7.7.0/24"
- subnet: "fdxx:xxxx:8a45:2::/64"
.envファイル内では、CoturnのTLS認証ファイルのディレクトリの指定、レコーディングを有効、Greenlightで使用するSMTPサーバ(Gmail)の設定を行います。
.env(変更箇所のみ記載)
# coturn (a TURN Server)
# requires either the abhove HTTPS Proxy to be enabled
# or TLS certificates to be mounted to container
ENABLE_COTURN=true
COTURN_TLS_CERT_PATH=/etc/letsencrypt/live/www.example.com/fullchain.pem
COTURN_TLS_KEY_PATH=/etc/letsencrypt/live/www.example.com/privkey.pem
# Recording
# IMPORTANT: this is currently a big privacy issues, because it will
# record everything which happens in the conference, even when the button
# suggets, that it does not.
# https://github.com/bigbluebutton/bigbluebutton/issues/9202
# make sure that you get peoples consent, before they join a room
ENABLE_RECORDING=true
REMOVE_OLD_RECORDING=true
RECORDING_MAX_AGE_DAYS=7
# ====================================
# GREENLIGHT CONFIGURATION
# ====================================
### SMTP CONFIGURATION
# Emails are required for the basic features of Greenlight to function.
# Please refer to your SMTP provider to get the values for the variables below
[email protected]
SMTP_SENDER_NAME=FICUSONLINE
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_DOMAIN=gmail.com
SMTP_USERNAME=user_id
SMTP_PASSWORD=password
SMTP_AUTH=plain
SMTP_STARTTLS_AUTO=true
SMTP_SSL_VERIFY=false
5. 各コンテナ設定ファイルとホストマシン/etc/hostsファイルの編集
Nginx設定ファイルのFreeSwitchへのIPv6アドレスマッピングの変更
docker-compose.ymlで設定するIPv6ネットワークゲートウェイアドレスに変更します。
bbb2602-docker/mod/nginx/bigbluebutton(変更箇所のみ記載)
map $remote_addr $freeswitch_addr {
"~:" [fdxx:xxxx:8a45:2::1];
default 10.7.7.1;
}
その他FreeSwitch設定ファイル
mod/freeswitch/conf/vars.xml.tmpl
<X-PRE-PROCESS cmd="set" data="local_ip_v6=fdxx:xxxx:8a45:2::1"/>
<X-PRE-PROCESS cmd="set" data="external_ssl_enable=true"/>
mod/freeswitch/conf/sip_profiles/external.xml
<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="tls-cert-dir" value="/etc/letsencrypt/tls"/>
mod/freeswitch/conf/sip_profiles/external-ipv6.xml
<param name="tls-cert-dir" value="/etc/letsencrypt/tls"/>
mod/freeswitch/conf/autoload_configs/acl.conf.xml
<node type="allow" cidr="fdxx:xxxx:8a45:2::/64"/>
/etc/hosts(ホストマシンの設定ファイル)
.....
.....
10.7.7.1 www.example.com
.....
fdxx:xxxx:8a45:2::1 www.example.com
6. 起動、動作確認
起動
$ docker compose up -d
[+] Running 22/22
✔ Network bbb2602-docker_bbb-net Created 0.2s
✔ Container bbb2602-docker-coturn-1 Started 1.2s
✔ Container bbb2602-docker-redis-1 Started 3.8s
✔ Container bbb2602-docker-jodconverter-1 Started 2.2s
✔ Container bbb2602-docker-kurento-1 Started 1.5s
✔ Container bbb-mongodb Started 2.4s
✔ Container bbb-freeswitch Started 1.5s
✔ Container bbb2602-docker-postgres-1 Started 2.3s
✔ Container bbb2602-docker-periodic-1 Started 7.8s
✔ Container bbb2602-docker-greenlight-1 Started 8.7s
✔ Container bbb2602-docker-etherpad-1 Started 9.1s
✔ Container bbb2602-docker-webrtc-sfu-1 Started 6.7s
✔ Container bbb2602-docker-apps-akka-1 Started 8.3s
✔ Container bbb2602-docker-fsesl-akka-1 Started 9.1s
✔ Container bbb2602-docker-bbb-pads-1 Started 13.3s
✔ Container bbb2602-docker-html5-frontend-2-1 Started 14.8s
✔ Container bbb2602-docker-html5-backend-1-1 Started 17.9s
✔ Container bbb2602-docker-html5-backend-2-1 Started 16.5s
✔ Container bbb2602-docker-html5-frontend-1-1 Started 16.6s
✔ Container bbb2602-docker-nginx-1 Started 19.6s
✔ Container bbb2602-docker-recordings-1 Started 19.0s
✔ Container bbb2602-docker-bbb-web-1 Started 19.8s
各コンテナステータス確認
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
bbb-freeswitch alangecker/bbb-docker-freeswitch:v2.6.0 "/bin/sh -c /entrypo…" freeswitch 14 minutes ago Up 14 minutes
bbb-mongodb mongo:4.4 "docker-entrypoint.s…" mongodb 14 minutes ago Up 14 minutes (healthy) 27017/tcp
bbb2602-docker-apps-akka-1 alangecker/bbb-docker-apps-akka:v2.6.0 "/bin/sh -c /entrypo…" apps-akka 14 minutes ago Up 13 minutes
bbb2602-docker-bbb-pads-1 alangecker/bbb-docker-pads:v1.4.1 "/bin/sh -c /entrypo…" bbb-pads 14 minutes ago Up 13 minutes
bbb2602-docker-bbb-web-1 alangecker/bbb-docker-web:v2.6.0 "/entrypoint.sh" bbb-web 14 minutes ago Up 13 minutes (healthy)
bbb2602-docker-coturn-1 coturn/coturn:4.6-alpine "docker-entrypoint.s…" coturn 14 minutes ago Up 14 minutes
bbb2602-docker-etherpad-1 alangecker/bbb-docker-etherpad:1.8.18-3 "/entrypoint.sh" etherpad 14 minutes ago Up 13 minutes (healthy) 9001/tcp
bbb2602-docker-fsesl-akka-1 alangecker/bbb-docker-fsesl-akka:v2.6.0 "/bin/sh -c /entrypo…" fsesl-akka 14 minutes ago Up 13 minutes
bbb2602-docker-greenlight-1 bigbluebutton/greenlight:v3 "./bin/start" greenlight 14 minutes ago Up 13 minutes 3000/tcp
bbb2602-docker-html5-backend-1-1 alangecker/bbb-docker-html5:v2.6.0 "/entrypoint.sh" html5-backend-1 14 minutes ago Up 13 minutes
bbb2602-docker-html5-backend-2-1 alangecker/bbb-docker-html5:v2.6.0 "/entrypoint.sh" html5-backend-2 14 minutes ago Up 13 minutes
bbb2602-docker-html5-frontend-1-1 alangecker/bbb-docker-html5:v2.6.0 "/entrypoint.sh" html5-frontend-1 14 minutes ago Up 13 minutes
bbb2602-docker-html5-frontend-2-1 alangecker/bbb-docker-html5:v2.6.0 "/entrypoint.sh" html5-frontend-2 14 minutes ago Up 13 minutes
bbb2602-docker-jodconverter-1 alangecker/bbb-docker-jodconverter:latest "/docker-entrypoint.…" jodconverter 14 minutes ago Up 14 minutes
bbb2602-docker-kurento-1 kurento/kurento-media-server:6.18 "/entrypoint.sh" kurento 14 minutes ago Up 3 minutes (healthy)
bbb2602-docker-nginx-1 alangecker/bbb-docker-nginx:1.23-v5.0.0-rc.2-v2.6.0 "/docker-entrypoint.…" nginx 14 minutes ago Up 13 minutes
bbb2602-docker-periodic-1 alangecker/bbb-docker-periodic:v2.5.0-rc.1 "/entrypoint.sh" periodic 14 minutes ago Up 13 minutes
bbb2602-docker-postgres-1 postgres:14.6-alpine3.17 "docker-entrypoint.s…" postgres 14 minutes ago Up 14 minutes (healthy) 5432/tcp
bbb2602-docker-recordings-1 alangecker/bbb-docker-recordings:v2.6.0 "/bin/sh -c /entrypo…" recordings 14 minutes ago Up 13 minutes
bbb2602-docker-redis-1 redis:7.0-alpine "docker-entrypoint.s…" redis 14 minutes ago Up 13 minutes (healthy) 6379/tcp
bbb2602-docker-webrtc-sfu-1 alangecker/bbb-docker-webrtc-sfu:v2.9.10 "docker-entrypoint.s…" webrtc-sfu 14 minutes ago Up 13 minutes
ログ確認
$ docker compose logs (+servive_name)
AZURE, AWS, GCPなどのクラウドサーバにインストールすることで、個人でのオンライン学習塾や教育機関でのオンラインクラスの開催も十分可能です。