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