diff --git a/docker-compose.webhooks.yml b/docker-compose.webhooks.yml
new file mode 100644
index 0000000..b7ed70b
--- /dev/null
+++ b/docker-compose.webhooks.yml
@@ -0,0 +1,13 @@
+version: '3.6'
+services:
+ webhooks:
+ build: mod/webhooks
+ restart: unless-stopped
+ environment:
+ DOMAIN: ${DOMAIN}
+ SHARED_SECRET: ${SHARED_SECRET}
+ extra_hosts:
+ - "redis:10.7.7.5"
+ networks:
+ bbb-net:
+ ipv4_address: 10.7.7.15
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index a7a1916..130ee20 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,6 +9,7 @@ services:
environment:
DOMAIN: ${DOMAIN}
SHARED_SECRET: ${SHARED_SECRET}
+ WELCOME_MESSAGE: ${WELCOME_MESSAGE:-}
WELCOME_FOOTER: ${WELCOME_FOOTER}
STUN_SERVER: stun:${STUN_IP}:${STUN_PORT}
TURN_SERVER: ${TURN_SERVER:-}
@@ -34,6 +35,8 @@ services:
EXTERNAL_IPv4: ${EXTERNAL_IPv4}
EXTERNAL_IPv6: ${EXTERNAL_IPv6:-::1}
SIP_IP_ALLOWLIST: ${SIP_IP_ALLOWLIST:-}
+ DISABLE_SOUND_MUTED: ${DISABLE_SOUND_MUTED:-false}
+ DISABLE_SOUND_ALONE: ${DISABLE_SOUND_ALONE:-false}
volumes:
- ./conf/sip_profiles:/etc/freeswitch/sip_profiles/external
- ./conf/dialplan_public:/etc/freeswitch/dialplan/public_docker
@@ -138,6 +141,12 @@ services:
DOMAIN: ${DOMAIN}
CLIENT_TITLE: ${CLIENT_TITLE}
ETHERPAD_API_KEY: ${ETHERPAD_API_KEY}
+ LISTEN_ONLY_MODE: ${LISTEN_ONLY_MODE:-true}
+ DISABLE_ECHO_TEST: ${DISABLE_ECHO_TEST:-false}
+ AUTO_SHARE_WEBCAM: ${AUTO_SHARE_WEBCAM:-false}
+ DISABLE_VIDEO_PREVIEW: ${DISABLE_VIDEO_PREVIEW:-false}
+ CHAT_ENABLED: ${CHAT_ENABLED:-true}
+ CHAT_START_CLOSED: ${CHAT_START_CLOSED:-false}
networks:
bbb-net:
ipv4_address: 10.7.7.11
diff --git a/mod/core/web/bigbluebutton.properties b/mod/core/web/bigbluebutton.properties
index 03b2575..5791073 100644
--- a/mod/core/web/bigbluebutton.properties
+++ b/mod/core/web/bigbluebutton.properties
@@ -146,7 +146,7 @@ defaultGuestPolicy=ALWAYS_ACCEPT
#
# native2ascii -encoding UTF8 bigbluebutton.properties bigbluebutton.properties
#
-defaultWelcomeMessage=Welcome to %%CONFNAME%%!
For help on using BigBlueButton see these (short) tutorial videos.
To join the audio bridge click the phone button. Use a headset to avoid causing background noise for others.
+defaultWelcomeMessage={{ .Env.WELCOME_MESSAGE }}
defaultWelcomeMessageFooter={{ .Env.WELCOME_FOOTER }}
# Default maximum number of users a meeting can have.
diff --git a/mod/freeswitch/conf/autoload_configs/conference.conf.xml.tmpl b/mod/freeswitch/conf/autoload_configs/conference.conf.xml.tmpl
new file mode 100644
index 0000000..516b2c7
--- /dev/null
+++ b/mod/freeswitch/conf/autoload_configs/conference.conf.xml.tmpl
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{if not (isTrue .Env.DISABLE_SOUND_MUTED) }}
+
+
+ {{end}}
+ {{if not (isTrue .Env.DISABLE_SOUND_ALONE) }}
+
+ {{end}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mod/freeswitch/entrypoint.sh b/mod/freeswitch/entrypoint.sh
index 75cce30..d252b27 100755
--- a/mod/freeswitch/entrypoint.sh
+++ b/mod/freeswitch/entrypoint.sh
@@ -17,4 +17,5 @@ done
dockerize \
-template /etc/freeswitch/vars.xml.tmpl:/etc/freeswitch/vars.xml \
+ -template /etc/freeswitch/autoload_configs/conference.conf.xml.tmpl:/etc/freeswitch/autoload_configs/conference.conf.xml \
/usr/bin/freeswitch -u freeswitch -g daemon -nonat -nf
diff --git a/mod/html5/Dockerfile b/mod/html5/Dockerfile
index d2394df..31def3a 100644
--- a/mod/html5/Dockerfile
+++ b/mod/html5/Dockerfile
@@ -14,7 +14,7 @@ USER meteor
ENV METEOR_VERSION 1.8.1
RUN curl -sL https://install.meteor.com?release=$METEOR_VERSION | sed s/--progress-bar/-sL/g | /bin/sh
-ENV TAG v2.2.18
+ENV TAG v2.2.20
RUN cd ~ \
&& svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/bigbluebutton-html5 \
&& mv ~/bigbluebutton-html5 ~/source \
@@ -51,4 +51,4 @@ USER meteor
ENTRYPOINT ["/entrypoint.sh"]
# lets set the tag again, so that it is include in the image for later version retrieval
-ENV TAG v2.2.18
+ENV TAG v2.2.20
diff --git a/mod/html5/settings.yml b/mod/html5/settings.yml
index ba19f69..f85505c 100644
--- a/mod/html5/settings.yml
+++ b/mod/html5/settings.yml
@@ -4,14 +4,14 @@ public:
desktopFontSize: 14px
audioChatNotification: false
autoJoin: true
- listenOnlyMode: true
+ listenOnlyMode: {{ .Env.LISTEN_ONLY_MODE }}
forceListenOnly: false
- skipCheck: false
+ skipCheck: {{ .Env.DISABLE_ECHO_TEST }}
clientTitle: {{ .Env.CLIENT_TITLE }}
appName: BigBlueButton HTML5 Client
bbbServerVersion: 2.2
copyright: "©2020 BigBlueButton Inc."
- html5ClientBuild: 960
+ html5ClientBuild: 968
helpLink: https://bigbluebutton.org/html5/
lockOnJoin: true
cdn: ""
@@ -86,6 +86,16 @@ public:
packetLostThreshold: 10
kurento:
wsUrl: wss://{{ .Env.DOMAIN }}/bbb-webrtc-sfu
+ # Valid for video-provider. Time (ms) before its WS connection times out
+ # and tries to reconnect.
+ wsConnectionTimeout: 4000
+ cameraTimeouts:
+ # Base camera timeout: used as the camera *sharing* timeout and
+ # as the minimum camera subscribe reconnection timeout
+ baseTimeout: 15000
+ # Max timeout: used as the max camera subscribe reconnection timeout. Each
+ # subscribe reattempt increases the reconnection timer up to this
+ maxTimeout: 60000
chromeDefaultExtensionKey: akgoaoikmbmhcopjgakkcepdgdgkjfbc
chromeDefaultExtensionLink: https://chrome.google.com/webstore/detail/bigbluebutton-screenshare/akgoaoikmbmhcopjgakkcepdgdgkjfbc
chromeExtensionKey: KEY
@@ -127,8 +137,8 @@ public:
enableVideoStats: false
enableVideoMenu: true
enableListenOnly: true
- autoShareWebcam: false
- skipVideoPreview: false
+ autoShareWebcam: {{ .Env.AUTO_SHARE_WEBCAM }}
+ skipVideoPreview: {{ .Env.DISABLE_VIDEO_PREVIEW }}
pingPong:
clearUsersInSeconds: 180
pongTimeInSeconds: 15
@@ -149,8 +159,8 @@ public:
lines: 2
time: 5000
chat:
- enabled: true
- startClosed: false
+ enabled: {{ .Env.CHAT_ENABLED }}
+ startClosed: {{ .Env.CHAT_START_CLOSED }}
min_message_length: 1
max_message_length: 5000
grouping_messages_window: 10000
@@ -190,6 +200,7 @@ public:
callHangupMaximumRetries: 10
echoTestNumber: 'echo'
relayOnlyOnReconnect: false
+ listenOnlyCallTimeout: 15000
presentation:
defaultPresentationFile: default.pdf
panZoomThrottle: 32
diff --git a/mod/nginx/bbb/client.nginx b/mod/nginx/bbb/client.nginx
new file mode 100644
index 0000000..2a4e787
--- /dev/null
+++ b/mod/nginx/bbb/client.nginx
@@ -0,0 +1,4 @@
+location = /client/guest-wait.html {
+ alias /etc/nginx/bbb/guest-wait.html;
+}
+
diff --git a/mod/nginx/bbb/guest-wait.html b/mod/nginx/bbb/guest-wait.html
new file mode 100644
index 0000000..c1c4b53
--- /dev/null
+++ b/mod/nginx/bbb/guest-wait.html
@@ -0,0 +1,81 @@
+
+
+
+
+ Guest Lobby
+
+
+
+
+
+
+
+
+
+
Please wait for a moderator to approve you joining the meeting.
+
+
+
+
diff --git a/mod/nginx/bbb/webhooks.nginx b/mod/nginx/bbb/webhooks.nginx
new file mode 100644
index 0000000..533fc84
--- /dev/null
+++ b/mod/nginx/bbb/webhooks.nginx
@@ -0,0 +1,9 @@
+# Pass to the webhooks app all requests made to the webhooks API.
+location /bigbluebutton/api/hooks {
+ proxy_pass http://10.7.7.15:3005;
+ proxy_redirect default;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-NginX-Proxy true;
+}
diff --git a/mod/webhooks/Dockerfile b/mod/webhooks/Dockerfile
new file mode 100644
index 0000000..36b1019
--- /dev/null
+++ b/mod/webhooks/Dockerfile
@@ -0,0 +1,26 @@
+FROM node:12-alpine
+
+# download dockerize
+ENV DOCKERIZE_VERSION v0.6.1
+RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+ && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
+ && apk add subversion \
+ && mkdir /app \
+ && adduser -D -u 2002 -g webhooks webhooks \
+ && chown webhooks:webhooks /app
+
+USER webhooks
+
+
+ENV TAG v2.2.20
+RUN svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/bbb-webhooks /app \
+ && rm -rf /app/.svn \
+ && cd /app && npm install --production
+
+COPY entrypoint.sh /entrypoint.sh
+COPY config.yml /app/config/default.yml.tmpl
+
+ENTRYPOINT /entrypoint.sh
+
+
diff --git a/mod/webhooks/config.yml b/mod/webhooks/config.yml
new file mode 100644
index 0000000..9f6f632
--- /dev/null
+++ b/mod/webhooks/config.yml
@@ -0,0 +1,69 @@
+# Shared secret of your BigBlueButton server.
+bbb:
+ serverDomain: {{ .Env.DOMAIN }}
+ sharedSecret: {{ .Env.SHARED_SECRET }}
+ # Whether to use Auth2.0 or not, Auth2.0 sends the sharedSecret whithin an Authorization header as a bearer
+ auth2_0: true
+ apiPath: /bigbluebutton/api
+
+# The port in which the API server will run.
+server:
+ port: 3005
+
+# Web hooks configs
+hooks:
+ channels:
+ - from-akka-apps-redis-channel
+ - from-bbb-web-redis-channel
+ - from-akka-apps-chat-redis-channel
+ - bigbluebutton:from-bbb-apps:meeting
+ - bigbluebutton:from-bbb-apps:users
+ - bigbluebutton:from-bbb-apps:chat
+ - bigbluebutton:from-rap
+ # IP where permanent hook will post data (more than 1 URL means more than 1 permanent hook)
+ permanentURLs: []
+ # How many messages will be enqueued to be processed at the same time
+ queueSize: 10000
+ # Allow permanent hooks to receive raw message, which is the message straight from BBB
+ getRaw: false
+ # If set to higher than 1, will send events on the format:
+ # "event=[{event1},{event2}],timestamp=000" or "[{event1},{event2}]" (based on using auth2_0 or not)
+ # when there are more than 1 event on the queue at the moment of processing the queue.
+ multiEvent: 1
+ # Retry intervals for failed attempts for perform callback calls.
+ # In ms. Totals to around 5min.
+ retryIntervals:
+ - 100
+ - 500
+ - 1000
+ - 2000
+ - 4000
+ - 8000
+ - 10000
+ - 30000
+ - 60000
+ - 60000
+ - 60000
+ - 60000
+ # Reset permanent interval when exceeding maximum attemps
+ permanentIntervalReset: 8
+ # Hook's request module timeout for socket conn establishment and/or responses (ms)
+ requestTimeout: 5000
+
+# Mappings of internal to external meeting IDs
+mappings:
+ cleanupInterval: 10000 # 10 secs, in ms
+ timeout: 86400000 # 24 hours, in ms
+
+# Redis
+redis:
+ host: redis
+ port: 6379
+ keys:
+ hookPrefix: bigbluebutton:webhooks:hook
+ hooks: bigbluebutton:webhooks:hooks
+ mappings: bigbluebutton:webhooks:mappings
+ mappingPrefix: bigbluebutton:webhooks:mapping
+ eventsPrefix: bigbluebutton:webhooks:events
+ userMaps: bigbluebutton:webhooks:userMaps
+ userMapPrefix: bigbluebutton:webhooks:userMap
\ No newline at end of file
diff --git a/mod/webhooks/entrypoint.sh b/mod/webhooks/entrypoint.sh
new file mode 100755
index 0000000..79131c2
--- /dev/null
+++ b/mod/webhooks/entrypoint.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+export NODE_ENV=production
+cd /app
+dockerize \
+ -wait tcp://redis:6379 \
+ -template /app/config/default.yml.tmpl:/app/config/default.yml \
+ node app.js
+
diff --git a/sample.env b/sample.env
index 6a7c89e..e14e57d 100644
--- a/sample.env
+++ b/sample.env
@@ -15,6 +15,9 @@ ENABLE_COTURN=true
# https://docs.bigbluebutton.org/greenlight/gl-overview.html
ENABLE_GREENLIGHT=true
+# Enable Webhooks
+# used by some integrations
+#ENABLE_WEBHOOKS=true
# ====================================
# SECRETS
@@ -63,6 +66,8 @@ SIP_IP_ALLOWLIST=
CLIENT_TITLE=BigBlueButton
+# use following lines to replace the default welcome message and footer
+WELCOME_MESSAGE=Welcome to %%CONFNAME%%!
For help on using BigBlueButton see these (short) tutorial videos.
To join the audio bridge click the phone button. Use a headset to avoid causing background noise for others.
WELCOME_FOOTER=This server is running BigBlueButton.
# use following line for an additional SIP dial-in message
@@ -72,6 +77,29 @@ WELCOME_FOOTER=This server is running