From fe17745096519f02efc9afc8862f1c0042eb67ad Mon Sep 17 00:00:00 2001 From: Sofyan Sugianto Date: Sat, 15 Aug 2020 08:26:33 +0700 Subject: [PATCH] re-commit recordings from upstream for testing only --- docker-compose.recordings.yml | 13 +++ docker-compose.yml | 18 ++-- mod/core/Dockerfile | 16 +--- .../presentation.yml | 20 ----- .../record-monitor.sh | 60 ------------- mod/core/entrypoint.sh | 7 ++ mod/core/supervisord.conf | 57 +------------ mod/core/web/bigbluebutton.properties | 4 + mod/freeswitch/Dockerfile | 10 +++ mod/freeswitch/entrypoint.sh | 3 + mod/nginx/Dockerfile | 14 ++++ mod/nginx/bbb/presentation.nginx | 12 +-- mod/recordings/Dockerfile | 84 +++++++++++++++++++ mod/{core => recordings}/bigbluebutton.yml | 4 +- mod/recordings/entrypoint.sh | 18 ++++ mod/recordings/log-collector.py | 45 ++++++++++ sample.env | 8 ++ scripts/bbb-record | 20 +++++ scripts/compose | 4 + 19 files changed, 250 insertions(+), 167 deletions(-) create mode 100644 docker-compose.recordings.yml delete mode 100644 mod/core/bbb-playback-presentation/presentation.yml delete mode 100755 mod/core/bbb-playback-presentation/record-monitor.sh create mode 100644 mod/nginx/Dockerfile create mode 100644 mod/recordings/Dockerfile rename mod/{core => recordings}/bigbluebutton.yml (95%) create mode 100644 mod/recordings/entrypoint.sh create mode 100644 mod/recordings/log-collector.py create mode 100755 scripts/bbb-record diff --git a/docker-compose.recordings.yml b/docker-compose.recordings.yml new file mode 100644 index 0000000..1d2b155 --- /dev/null +++ b/docker-compose.recordings.yml @@ -0,0 +1,13 @@ +version: '3.6' +services: + recordings-process: + build: mod/recordings-process + environment: + DOMAIN: ${DOMAIN} + volumes: + - /var/bigbluebutton:/var/bigbluebutton + - vol-freeswitch:/var/freeswitch/meetings + - vol-kurento:/var/kurento + networks: + bbb-net: + ipv4_address: 10.7.7.16 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c124ac7..0358fa1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,7 @@ services: environment: DEV_MODE: ${DEV_MODE:-} DOMAIN: ${DOMAIN} + ENABLE_RECORDING: ${ENABLE_RECORDING:-false} SHARED_SECRET: ${SHARED_SECRET} WELCOME_MESSAGE: ${WELCOME_MESSAGE:-} WELCOME_FOOTER: ${WELCOME_FOOTER} @@ -16,7 +17,9 @@ services: TURN_SERVER: ${TURN_SERVER:-} TURN_SECRET: ${TURN_SECRET:-} volumes: - - bigbluebutton:/var/bigbluebutton + - /var/bigbluebutton:/var/bigbluebutton + - vol-freeswitch:/var/freeswitch/meetings + - vol-kurento:/var/kurento networks: bbb-net: ipv4_address: 10.7.7.2 @@ -41,10 +44,11 @@ services: volumes: - ./conf/sip_profiles:/etc/freeswitch/sip_profiles/external - ./conf/dialplan_public:/etc/freeswitch/dialplan/public_docker + - vol-freeswitch:/var/freeswitch/meetings network_mode: host nginx: - image: nginx:1.19-alpine + build: mod/nginx restart: unless-stopped depends_on: - etherpad @@ -53,9 +57,7 @@ services: ports: - "8080:80" volumes: - - bigbluebutton:/var/bigbluebutton - - ./mod/nginx/bbb:/etc/nginx/bbb - - ./mod/nginx/bigbluebutton:/etc/nginx/conf.d/default.conf + - /var/bigbluebutton:/var/bigbluebutton - ${DEFAULT_PRESENTATION:-/dev/null}:/etc/nginx/html/default.pdf network_mode: host extra_hosts: @@ -103,6 +105,8 @@ services: KMS_TURN_URL: KMS_NETWORK_INTERFACES: ${NETWORK_INTERFACE:-} network_mode: host + volumes: + - vol-kurento:/var/kurento webrtc-sfu: build: @@ -160,13 +164,15 @@ services: - mongodb volumes: - /var/run/docker.sock:/var/run/docker.sock - - bigbluebutton:/var/bigbluebutton + - /var/bigbluebutton:/var/bigbluebutton networks: bbb-net: ipv4_address: 10.7.7.12 volumes: bigbluebutton: + vol-freeswitch: + vol-kurento: networks: bbb-net: diff --git a/mod/core/Dockerfile b/mod/core/Dockerfile index 4c7291a..c53d192 100644 --- a/mod/core/Dockerfile +++ b/mod/core/Dockerfile @@ -4,7 +4,6 @@ MAINTAINER ffdixon@bigbluebutton.org # TODO: # - separate bbb-apps into an own container # - separate bbb-web -# - remove systemd ENV DEBIAN_FRONTEND noninteractive ENV container docker @@ -43,8 +42,7 @@ ENV VERSION v2.2.22 RUN apt-get update && apt-get install -y bbb-web \ bbb-fsesl-akka bbb-apps-akka bbb-transcode-akka bbb-apps \ - bbb-apps-video bbb-apps-screenshare bbb-apps-video-broadcast \ - bbb-record-core bbb-playback-presentation + bbb-apps-video bbb-apps-screenshare bbb-apps-video-broadcast # -- avoid blocking java # https://github.com/bigbluebutton/bigbluebutton/issues/8959 @@ -61,8 +59,6 @@ COPY red5-webapps/screenshare/application.conf /usr/share/red5/webapps/screensha COPY red5-webapps/video/bigbluebutton-video.properties /usr/share/red5/webapps/video/WEB-INF/bigbluebutton-video.properties COPY red5-webapps/video-broadcast/video-broadcast.properties /usr/share/red5/webapps/video-broadcast/WEB-INF/video-broadcast.properties -COPY bigbluebutton.yml /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml.tmpl - COPY web/bigbluebutton.properties /usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties.tmpl COPY web/turn-stun-servers.xml /usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml.tmpl @@ -70,14 +66,10 @@ COPY bbb-apps-akka/application.conf /usr/share/bbb-apps-akka/conf/application.co COPY bbb-fsesl-akka/application.conf /etc/bbb-fsesl-akka/application.conf COPY bbb-transcode-akka/application.conf /etc/bbb-transcode-akka/application.conf COPY web-run.sh /usr/share/bbb-web/run-prod.sh -COPY bbb-playback-presentation/presentation.yml /usr/local/bigbluebutton/core/scripts/ -COPY bbb-playback-presentation/record-monitor.sh /usr/local/bin -RUN chmod +x /usr/local/bin/record-monitor.sh && \ -mkdir -p /usr/src/bbb-playback-presentation && \ -cp -r /var/bigbluebutton/playback/* /usr/src/bbb-src-playback -RUN wget -O /usr/local/bin/bbb-record https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/develop/bigbluebutton-config/bin/bbb-record \ -&& chmod +x /usr/local/bin/bbb-record +# add default presentation thumbnail +RUN mkdir -p /usr/share/bigbluebutton/blank \ + && wget -O /usr/share/bigbluebutton/blank/blank-thumb.png https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/v2.2.20/bigbluebutton-config/slides/blank-thumb.png COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY entrypoint.sh /entrypoint.sh diff --git a/mod/core/bbb-playback-presentation/presentation.yml b/mod/core/bbb-playback-presentation/presentation.yml deleted file mode 100644 index 19973ce..0000000 --- a/mod/core/bbb-playback-presentation/presentation.yml +++ /dev/null @@ -1,20 +0,0 @@ -video_output_width: 640 -video_output_height: 480 -# Alternate output size to use when deskshare videos are present -# Set higher so that deskshare output is higher quality, but uses more space. -deskshare_output_width: 1280 -deskshare_output_height: 720 -# offset applied to audio in the output video file -# audio_offset = 1200 means that the audio will be delayed by 1200ms -audio_offset: 0 -include_deskshare: true - -# For PRODUCTION -publish_dir: /var/bigbluebutton/published/presentation -video_formats: -- webm -# - mp4 - -# For DEVELOPMENT -#publish_dir: /home/ubuntu/temp/published/presentation - diff --git a/mod/core/bbb-playback-presentation/record-monitor.sh b/mod/core/bbb-playback-presentation/record-monitor.sh deleted file mode 100755 index 61ede81..0000000 --- a/mod/core/bbb-playback-presentation/record-monitor.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# /var/bigbluebutton/recording/status/processed/*.done -> publish-worker.rb -# /var/bigbluebutton/recording/status/sanity/*.done -> process-worker -# /var/bigbluebutton/recording/status/ended/*.done -> events-worker -# /var/bigbluebutton/recording/status/recorded/*.done -> archive-worker -# /var/bigbluebutton/recording/status/archived/*.done -> sanity-worker - -FILES_TO_CHECK=$1 - -PATH_TO_CHECK="/var/bigbluebutton/recording/status" -CMD_DIR_PATH="/usr/local/bigbluebutton/core/scripts" - -function do_monitoring() { - while ! compgen -G "$PATH_TO_CHECK" > /dev/null; do - echo "$PATH_TO_CHECK returning 0 files, sleeping for 30s..." - sleep 30 - done - if [[ -d "$CMD_DIR_PATH" ]]; then - pushd $CMD_DIR_PATH > /dev/null - ruby $CMD_PATH - popd > /dev/null - fi - sleep 5 - echo "Re-monitoring files.." - do_monitoring -} - -function initialize_variables() { - echo "$FILES_TO_CHECK" - if [[ ! -z $FILES_TO_CHECK ]]; then - if [[ $FILES_TO_CHECK == "processed" ]]; then - PATH_TO_CHECK="$PATH_TO_CHECK/processed/*.done" - CMD_PATH="/usr/local/bigbluebutton/core/scripts/rap-publish-worker.rb" - elif [[ $FILES_TO_CHECK == "sanity" ]]; then - PATH_TO_CHECK="$PATH_TO_CHECK/sanity/*.done" - CMD_PATH="/usr/local/bigbluebutton/core/scripts/rap-process-worker.rb" - elif [[ $FILES_TO_CHECK == "ended" ]]; then - PATH_TO_CHECK="$PATH_TO_CHECK/ended/*.done" - CMD_PATH="/usr/local/bigbluebutton/core/scripts/rap-events-worker.rb" - elif [[ $FILES_TO_CHECK == "recorded" ]]; then - PATH_TO_CHECK="$PATH_TO_CHECK/recorded/*.done" - CMD_PATH="/usr/local/bigbluebutton/core/scripts/rap-archive-worker.rb" - elif [[ $FILES_TO_CHECK == "archived" ]]; then - PATH_TO_CHECK="$PATH_TO_CHECK/archived/*.done" - CMD_PATH="/usr/local/bigbluebutton/core/scripts/rap-sanity-worker.rb" - else - echo "invalid argument, exiting..." - exit - fi - else - echo "invalid argument, exiting..." - exit - fi -} - -# first check variables -initialize_variables -# main execution -do_monitoring diff --git a/mod/core/entrypoint.sh b/mod/core/entrypoint.sh index a17f38b..5eb5206 100755 --- a/mod/core/entrypoint.sh +++ b/mod/core/entrypoint.sh @@ -3,14 +3,21 @@ export LANG=en_US.UTF-8 # generate bbb folders +mkdir -p /var/bigbluebutton/events +mkdir -p /var/bigbluebutton/captions +mkdir -p /var/bigbluebutton/captions/inbox +mkdir -p /var/bigbluebutton/basic_stats mkdir -p /var/bigbluebutton/recording/raw mkdir -p /var/bigbluebutton/recording/process mkdir -p /var/bigbluebutton/recording/publish +mkdir -p /var/bigbluebutton/recording/publish/presentation +mkdir -p /var/bigbluebutton/recording/status mkdir -p /var/bigbluebutton/recording/status/recorded mkdir -p /var/bigbluebutton/recording/status/archived mkdir -p /var/bigbluebutton/recording/status/processed mkdir -p /var/bigbluebutton/recording/status/sanity mkdir -p /var/bigbluebutton/published +mkdir -p /var/bigbluebutton/published/presentation mkdir -p /var/bigbluebutton/deleted mkdir -p /var/bigbluebutton/unpublished mkdir -p /var/bigbluebutton/playback diff --git a/mod/core/supervisord.conf b/mod/core/supervisord.conf index 9bae66b..44d39f7 100644 --- a/mod/core/supervisord.conf +++ b/mod/core/supervisord.conf @@ -41,59 +41,4 @@ directory=/usr/share/bbb-transcode-akka stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - -[program:rap-archive-worker] -command=/usr/local/bin/prefix-log /usr/local/bin/record-monitor.sh recorded -user=bigbluebutton -directory=/usr/local/bigbluebutton/core/scripts -autostart=true -autorestart=true -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - -[program:rap-events-worker] -command=/usr/local/bin/prefix-log /usr/local/bin/record-monitor.sh ended -user=bigbluebutton -directory=/usr/local/bigbluebutton/core/scripts -autostart=true -autorestart=true -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - -[program:rap-process-worker] -command=/usr/local/bin/prefix-log /usr/local/bin/record-monitor.sh sanity -user=bigbluebutton -directory=/usr/local/bigbluebutton/core/scripts -autostart=true -autorestart=true -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - -[program:rap-publish-worker] -command=/usr/local/bin/prefix-log /usr/local/bin/record-monitor.sh processed -user=bigbluebutton -directory=/usr/local/bigbluebutton/core/scripts -autostart=true -autorestart=true -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 - -[program:rap-sanity-worker] -command=/usr/local/bin/prefix-log /usr/local/bin/record-monitor.sh archived -user=bigbluebutton -directory=/usr/local/bigbluebutton/core/scripts -autostart=true -autorestart=true -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/fd/2 -stderr_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 \ No newline at end of file diff --git a/mod/core/web/bigbluebutton.properties b/mod/core/web/bigbluebutton.properties index b1f4064..3f499c9 100644 --- a/mod/core/web/bigbluebutton.properties +++ b/mod/core/web/bigbluebutton.properties @@ -192,7 +192,11 @@ userActivitySignResponseDelayInMinutes=5 # Disable recording by default. # true - don't record even if record param in the api call is set to record # false - when record param is passed from api, override this default +{{ if isTrue .Env.ENABLE_RECORDING }} disableRecordingDefault=false +{{ else }} +disableRecordingDefault=true +{{ end }} # Start recording when first user joins the meeting. # For backward compatibility with 0.81 where whole meeting diff --git a/mod/freeswitch/Dockerfile b/mod/freeswitch/Dockerfile index a15c4fc..5b0ce8a 100644 --- a/mod/freeswitch/Dockerfile +++ b/mod/freeswitch/Dockerfile @@ -75,6 +75,16 @@ RUN cd /etc \ && svn checkout https://github.com/alangecker/bbb-packages/tags/$GIT_TAG/bbb-freeswitch-core/data/opt/freeswitch/etc/freeswitch \ && rm -rf /etc/freeswitch/.svn +# the current available freeswitch-mod-opusfile is broken, +# it can't write any .opus files. +# there is already a fix, but it is not included yet. +# https://github.com/signalwire/freeswitch/pull/719/files +# we rather switch to the binary built by bigbluebutton and add its dependencies +RUN wget -O /usr/lib/freeswitch/mod/mod_opusfile.so https://github.com/bbb-pkg/bbb-freeswitch-core/raw/43f3a47af1fcf5ea559e16bb28b900c925a7f2c3/opt/freeswitch/lib/freeswitch/mod/mod_opusfile.so \ + && wget -O /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb https://launchpad.net/~bigbluebutton/+archive/ubuntu/support/+files/libopusenc0_0.2.1-1bbb1_amd64.deb \ + && dpkg -i /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb \ + && rm /tmp/libopusenc0_0.2.1-1bbb1_amd64.deb + # add modifications COPY ./conf /etc/freeswitch/ diff --git a/mod/freeswitch/entrypoint.sh b/mod/freeswitch/entrypoint.sh index d252b27..072bcba 100755 --- a/mod/freeswitch/entrypoint.sh +++ b/mod/freeswitch/entrypoint.sh @@ -15,6 +15,9 @@ for IP in "${ADDR[@]}"; do iptables -I INPUT -p udp --dport 5060 -s $IP -j ACCEPT done +chown -R freeswitch:daemon /var/freeswitch/meetings +chmod 777 /var/freeswitch/meetings + 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 \ diff --git a/mod/nginx/Dockerfile b/mod/nginx/Dockerfile new file mode 100644 index 0000000..97a0877 --- /dev/null +++ b/mod/nginx/Dockerfile @@ -0,0 +1,14 @@ +FROM nginx:1.19-alpine + +RUN apk add subversion + +ENV TAG v2.2.20 + +# get bbb-playback-presentation web files +RUN mkdir /www \ + && cd /www \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/presentation/playback/presentation/ \ + && rm -rf /www/presentation/.svn /www/presentation/0.* + +COPY ./bbb /etc/nginx/bbb +COPY ./bigbluebutton /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/mod/nginx/bbb/presentation.nginx b/mod/nginx/bbb/presentation.nginx index 20ed5b4..6f8abca 100644 --- a/mod/nginx/bbb/presentation.nginx +++ b/mod/nginx/bbb/presentation.nginx @@ -16,18 +16,8 @@ # with BigBlueButton; if not, see . # - location /playback/presentation/playback.html { - return 301 /playback/presentation/0.81/playback.html?$query_string; - # If you have recordings from 0.9.0 beta versions and are sure - # that you will never want to play recordings made with - # BigBlueButton 0.81, comment the line above and uncomment the - # following line: - #return 301 /playback/presentation/0.9.0/playback.html?$query_string; - } - location /playback/presentation { - root /var/bigbluebutton; - index index.html index.htm; + alias /www/presentation; } location /presentation { diff --git a/mod/recordings/Dockerfile b/mod/recordings/Dockerfile new file mode 100644 index 0000000..7a903e4 --- /dev/null +++ b/mod/recordings/Dockerfile @@ -0,0 +1,84 @@ + +FROM ruby:2.4-slim-buster + +# install apt dependencies +RUN apt-get update && apt-get install -y \ + wget \ + subversion \ + rsync \ + build-essential \ + libsystemd-dev \ + python3 \ + python3-pyinotify \ + python3-lxml \ + python3-icu \ + ffmpeg \ + poppler-utils \ + imagemagick + +# compile and install mkclean +RUN cd /tmp \ + && wget https://netcologne.dl.sourceforge.net/project/matroska/mkclean/mkclean-0.8.10.tar.bz2 \ + && tar -xf /tmp/mkclean-0.8.10.tar.bz2 \ + && cd /tmp/mkclean-0.8.10 \ + && sed -i 's/\r//g' ./mkclean/configure.compiled \ + && ./mkclean/configure.compiled \ + && make -C mkclean \ + && cp ./release/gcc_linux_x64/mkclean /usr/bin/mkclean \ + && rm -r /tmp/mkclean-0.8.10 + +# add 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 + +RUN mkdir -p \ + /usr/local/bigbluebutton \ + /usr/local/bigbluebutton/core \ + /etc/bigbluebutton \ + /var/log/bigbluebutton \ + /var/log/bigbluebutton/presentation + +ENV TAG v2.2.22 + +# add bbb-record-core (lib, scripts and Gemfile) +RUN cd /usr/local/bigbluebutton/core \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/core/lib \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/core/scripts \ + && rm -rf /usr/local/bigbluebutton/core/*/.svn \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/record-and-playback/core/Gemfile.lock \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/record-and-playback/core/Gemfile + + +# add bbb-playback-presentation scripts +RUN cd /tmp \ + && svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/record-and-playback/presentation/scripts \ + && rsync -av /tmp/scripts/ /usr/local/bigbluebutton/core/scripts/ \ + && rm -rf /tmp/scripts + +# install ruby dependencies +RUN cd /usr/local/bigbluebutton/core \ + && gem install builder \ + && gem install bundler \ + && /usr/local/bin/bundle + +# add bbb-record with some adjustments so bbb-record works in this environment +RUN cd /usr/bin \ + && wget https://raw.githubusercontent.com/bigbluebutton/bigbluebutton/$TAG/bigbluebutton-config/bin/bbb-record \ + && chmod +x /usr/bin/bbb-record \ + && sed -i 's/^BBB_WEB.*/BBB_WEB=""/' /usr/bin/bbb-record \ + && sed -i 's/systemctl.*//' /usr/bin/bbb-record \ + && echo "BIGBLUEBUTTON_RELEASE=$TAG" > /etc/bigbluebutton/bigbluebutton-release \ + && touch /var/log/bigbluebutton/bbb-web.log + +# create user +# the ID should matcht the one creating the files in `core` +RUN groupadd -g 998 bigbluebutton && useradd -m -u 998 -g bigbluebutton bigbluebutton + +COPY bigbluebutton.yml /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml.tmpl +COPY log-collector.py /log-collector.py +COPY entrypoint.sh /entrypoint.sh +ENTRYPOINT dockerize \ + -template /usr/local/bigbluebutton/core/scripts/bigbluebutton.yml.tmpl:/usr/local/bigbluebutton/core/scripts/bigbluebutton.yml \ + /entrypoint.sh \ No newline at end of file diff --git a/mod/core/bigbluebutton.yml b/mod/recordings/bigbluebutton.yml similarity index 95% rename from mod/core/bigbluebutton.yml rename to mod/recordings/bigbluebutton.yml index b899051..9a57183 100644 --- a/mod/core/bigbluebutton.yml +++ b/mod/recordings/bigbluebutton.yml @@ -1,4 +1,4 @@ -bbb_version: '2.1.0' +bbb_version: '2.2.22' raw_audio_src: /var/freeswitch/meetings raw_video_src: /usr/share/red5/webapps/video/streams kurento_video_src: /var/kurento/recordings @@ -7,7 +7,7 @@ raw_screenshare_src: /usr/share/red5/webapps/screenshare/streams raw_webrtc_deskshare_src: /usr/share/red5/webapps/video-broadcast/streams raw_deskshare_src: /var/bigbluebutton/deskshare raw_presentation_src: /var/bigbluebutton -notes_endpoint: http://localhost:9001/p +notes_endpoint: http://etherpad:9001/p # Specify the notes formats we archive # txt, doc and odt are also supported notes_formats: diff --git a/mod/recordings/entrypoint.sh b/mod/recordings/entrypoint.sh new file mode 100644 index 0000000..5f916d5 --- /dev/null +++ b/mod/recordings/entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# print all logs to stdout +python3 -u /log-collector.py & + +cd /usr/local/bigbluebutton/core/scripts + +while true; do + echo "execute workers..." + bundle exec ruby rap-archive-worker.rb + bundle exec ruby rap-sanity-worker.rb + bundle exec ruby rap-process-worker.rb + bundle exec ruby rap-publish-worker.rb + + bundle exec ruby rap-caption-inbox.rb + bundle exec ruby rap-events-worker.rb + + sleep 30s \ No newline at end of file diff --git a/mod/recordings/log-collector.py b/mod/recordings/log-collector.py new file mode 100644 index 0000000..af683e6 --- /dev/null +++ b/mod/recordings/log-collector.py @@ -0,0 +1,45 @@ +# this script sends all entries from different logfiles +# to stdout, so that they appear in the docker logs + +import threading +import subprocess +import time +import pyinotify +import os +import re +import sys + +log_dir = '/var/log/bigbluebutton' + +def thread_function(name, filename): + f = subprocess.Popen(['tail','-F', '-n', '0', filename],\ + stdout=subprocess.PIPE,stderr=subprocess.PIPE) + while True: + line = f.stdout.readline().decode('utf-8').strip() + if len(line): + print(name.ljust(10)+' |', line) + sys.stdout.flush() + +def tail_file(name, filename): + x = threading.Thread(target=thread_function, args=(name, filename,)) + x.start() + + +tail_file('rap-worker', log_dir+'/bbb-rap-worker.log') +tail_file('sanity', log_dir+'/sanity.log') +tail_file('publish', log_dir+'/post_publish.log') + +class EventHandler(pyinotify.ProcessEvent): + def process_IN_CREATE(self, event): + filename = os.path.basename(event.pathname) + if re.match('^archive-.*\.log$', filename): + tail_file('archive', event.pathname) + elif re.match('^process-.*\.log$', filename): + tail_file('process', event.pathname) + + +wm = pyinotify.WatchManager() +handler = EventHandler() +notifier = pyinotify.Notifier(wm, handler) +wdd = wm.add_watch(log_dir, pyinotify.IN_CREATE, rec=True) +notifier.loop() \ No newline at end of file diff --git a/sample.env b/sample.env index 8782e2a..89da73b 100644 --- a/sample.env +++ b/sample.env @@ -24,6 +24,14 @@ ENABLE_GREENLIGHT=true # https://yourdomain/bbb-exporter #ENABLE_PROMETHEUS_EXPORTER=true +# 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 + # ==================================== # SECRETS # ==================================== diff --git a/scripts/bbb-record b/scripts/bbb-record new file mode 100755 index 0000000..c69c6f5 --- /dev/null +++ b/scripts/bbb-record @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +cd $(dirname $0)/.. + +# load .env +if [ -f .env ] +then + # exclude WELCOME_FOOTER because it may contain invalid characters + export $(cat .env | sed 's/#.*//g' | grep -v "WELCOME_FOOTER" | xargs) +fi + +if [ ! "$ENABLE_RECORDING" == true ]; then + echo "Error: recording is disabled why can't use bbb-record" + echo "set ENABLE_RECORDING in .env if you want to use it" + exit 1 +fi + +./scripts/compose exec recordings-process bbb-record $@ +./scripts/compose logs --tail=15 recordings-process \ No newline at end of file diff --git a/scripts/compose b/scripts/compose index 7d9d785..8f81127 100755 --- a/scripts/compose +++ b/scripts/compose @@ -57,4 +57,8 @@ if [ "$ENABLE_PROMETHEUS_EXPORTER" == true ]; then COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.prometheus.yml" fi +if [ "$ENABLE_RECORDING" == true ]; then + COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.recording.yml" +fi + docker-compose $COMPOSE_FILES $@