forked from extern/docker
Merge branch 'develop' into ipv6
This commit is contained in:
commit
59947e1c7a
13
docker-compose.webhooks.yml
Normal file
13
docker-compose.webhooks.yml
Normal file
@ -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
|
@ -9,6 +9,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
DOMAIN: ${DOMAIN}
|
DOMAIN: ${DOMAIN}
|
||||||
SHARED_SECRET: ${SHARED_SECRET}
|
SHARED_SECRET: ${SHARED_SECRET}
|
||||||
|
WELCOME_MESSAGE: ${WELCOME_MESSAGE:-}
|
||||||
WELCOME_FOOTER: ${WELCOME_FOOTER}
|
WELCOME_FOOTER: ${WELCOME_FOOTER}
|
||||||
STUN_SERVER: stun:${STUN_IP}:${STUN_PORT}
|
STUN_SERVER: stun:${STUN_IP}:${STUN_PORT}
|
||||||
TURN_SERVER: ${TURN_SERVER:-}
|
TURN_SERVER: ${TURN_SERVER:-}
|
||||||
@ -34,6 +35,8 @@ services:
|
|||||||
EXTERNAL_IPv4: ${EXTERNAL_IPv4}
|
EXTERNAL_IPv4: ${EXTERNAL_IPv4}
|
||||||
EXTERNAL_IPv6: ${EXTERNAL_IPv6:-::1}
|
EXTERNAL_IPv6: ${EXTERNAL_IPv6:-::1}
|
||||||
SIP_IP_ALLOWLIST: ${SIP_IP_ALLOWLIST:-}
|
SIP_IP_ALLOWLIST: ${SIP_IP_ALLOWLIST:-}
|
||||||
|
DISABLE_SOUND_MUTED: ${DISABLE_SOUND_MUTED:-false}
|
||||||
|
DISABLE_SOUND_ALONE: ${DISABLE_SOUND_ALONE:-false}
|
||||||
volumes:
|
volumes:
|
||||||
- ./conf/sip_profiles:/etc/freeswitch/sip_profiles/external
|
- ./conf/sip_profiles:/etc/freeswitch/sip_profiles/external
|
||||||
- ./conf/dialplan_public:/etc/freeswitch/dialplan/public_docker
|
- ./conf/dialplan_public:/etc/freeswitch/dialplan/public_docker
|
||||||
@ -138,6 +141,12 @@ services:
|
|||||||
DOMAIN: ${DOMAIN}
|
DOMAIN: ${DOMAIN}
|
||||||
CLIENT_TITLE: ${CLIENT_TITLE}
|
CLIENT_TITLE: ${CLIENT_TITLE}
|
||||||
ETHERPAD_API_KEY: ${ETHERPAD_API_KEY}
|
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:
|
networks:
|
||||||
bbb-net:
|
bbb-net:
|
||||||
ipv4_address: 10.7.7.11
|
ipv4_address: 10.7.7.11
|
||||||
|
@ -146,7 +146,7 @@ defaultGuestPolicy=ALWAYS_ACCEPT
|
|||||||
#
|
#
|
||||||
# native2ascii -encoding UTF8 bigbluebutton.properties bigbluebutton.properties
|
# native2ascii -encoding UTF8 bigbluebutton.properties bigbluebutton.properties
|
||||||
#
|
#
|
||||||
defaultWelcomeMessage=Welcome to <b>%%CONFNAME%%</b>!<br><br>For help on using BigBlueButton see these (short) <a href="event:http://www.bigbluebutton.org/html5"><u>tutorial videos</u></a>.<br><br>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 }}
|
defaultWelcomeMessageFooter={{ .Env.WELCOME_FOOTER }}
|
||||||
|
|
||||||
# Default maximum number of users a meeting can have.
|
# Default maximum number of users a meeting can have.
|
||||||
|
284
mod/freeswitch/conf/autoload_configs/conference.conf.xml.tmpl
Normal file
284
mod/freeswitch/conf/autoload_configs/conference.conf.xml.tmpl
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
<!-- http://wiki.freeswitch.org/wiki/Mod_conference -->
|
||||||
|
<!-- None of these paths are real if you want any of these options you need to really set them up -->
|
||||||
|
<configuration name="conference.conf" description="Audio Conference">
|
||||||
|
<!-- Advertise certain presence on startup . -->
|
||||||
|
<advertise>
|
||||||
|
<room name="3001@$${domain}" status="FreeSWITCH"/>
|
||||||
|
</advertise>
|
||||||
|
|
||||||
|
<!-- These are the default keys that map when you do not specify a caller control group -->
|
||||||
|
<!-- Note: none and default are reserved names for group names. Disabled if dist-dtmf member flag is set. -->
|
||||||
|
<caller-controls>
|
||||||
|
<group name="default">
|
||||||
|
<control action="mute" digits="0"/>
|
||||||
|
<control action="deaf mute" digits="*"/>
|
||||||
|
<control action="energy up" digits="9"/>
|
||||||
|
<control action="energy equ" digits="8"/>
|
||||||
|
<control action="energy dn" digits="7"/>
|
||||||
|
<control action="vol talk up" digits="3"/>
|
||||||
|
<control action="vol talk zero" digits="2"/>
|
||||||
|
<control action="vol talk dn" digits="1"/>
|
||||||
|
<control action="vol listen up" digits="6"/>
|
||||||
|
<control action="vol listen zero" digits="5"/>
|
||||||
|
<control action="vol listen dn" digits="4"/>
|
||||||
|
<!--control action="hangup" digits="#"/ -->
|
||||||
|
</group>
|
||||||
|
</caller-controls>
|
||||||
|
|
||||||
|
<!-- Profiles are collections of settings you can reference by name. -->
|
||||||
|
<profiles>
|
||||||
|
<!--If no profile is specified it will default to "default"-->
|
||||||
|
<profile name="default">
|
||||||
|
<!-- Directory to drop CDR's
|
||||||
|
'auto' means $PREFIX/logs/conference_cdr/<confernece_uuid>.cdr.xml
|
||||||
|
a non-absolute path means $PREFIX/logs/<value>/<confernece_uuid>.cdr.xml
|
||||||
|
absolute path means <value>/<confernece_uuid>.cdr.xml
|
||||||
|
-->
|
||||||
|
<!-- <param name="cdr-log-dir" value="auto"/> -->
|
||||||
|
|
||||||
|
<!-- Domain (for presence) -->
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<!-- Sample Rate-->
|
||||||
|
<param name="rate" value="8000"/>
|
||||||
|
<!-- Number of milliseconds per frame -->
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<!-- Energy level required for audio to be sent to the other users -->
|
||||||
|
<param name="energy-level" value="100"/>
|
||||||
|
|
||||||
|
<!--Can be | delim of waste|mute|deaf|dist-dtmf waste will always transmit data to each channel
|
||||||
|
even during silence. dist-dtmf propagates dtmfs to all other members, but channel controls
|
||||||
|
via dtmf will be disabled. -->
|
||||||
|
<!-- <param name="member-flags" value="waste"/> -->
|
||||||
|
|
||||||
|
<!-- Name of the caller control group to use for this profile -->
|
||||||
|
<!-- <param name="caller-controls" value="some name"/> -->
|
||||||
|
<!-- Name of the caller control group to use for the moderator in this profile -->
|
||||||
|
<!-- <param name="moderator-controls" value="some name"/> -->
|
||||||
|
<!-- TTS Engine to use -->
|
||||||
|
<!-- <param name="tts-engine" value="cepstral"/> -->
|
||||||
|
<!-- TTS Voice to use -->
|
||||||
|
<!-- <param name="tts-voice" value="david"/> -->
|
||||||
|
|
||||||
|
<!-- If TTS is enabled all audio-file params beginning with -->
|
||||||
|
<!-- 'say:' will be considered text to say with TTS -->
|
||||||
|
<!-- Override the default path here, after which you use relative paths in the other sound params -->
|
||||||
|
<!-- Note: The default path is the conference's first caller's sound_prefix -->
|
||||||
|
<!-- <param name="sound-prefix" value="$${sounds_dir}/en/us/callie"/> -->
|
||||||
|
<!-- File to play to acknowledge succees -->
|
||||||
|
<!-- <param name="ack-sound" value="beep.wav"/> -->
|
||||||
|
<!-- File to play to acknowledge failure -->
|
||||||
|
<!-- <param name="nack-sound" value="beeperr.wav"/> -->
|
||||||
|
<!-- File to play to acknowledge muted -->
|
||||||
|
<param name="muted-sound" value="conference/conf-muted.wav"/>
|
||||||
|
<!-- File to play to acknowledge unmuted -->
|
||||||
|
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
|
||||||
|
<!-- File to play if you are alone in the conference -->
|
||||||
|
<param name="alone-sound" value="conference/conf-alone.wav"/>
|
||||||
|
<!-- File to play endlessly (nobody will ever be able to talk) -->
|
||||||
|
<!-- <param name="perpetual-sound" value="perpetual.wav"/> -->
|
||||||
|
<!-- File to play when you're alone (music on hold)-->
|
||||||
|
<param name="moh-sound" value="$${hold_music}"/>
|
||||||
|
<!-- File to play when you join the conference -->
|
||||||
|
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
|
||||||
|
<!-- File to play when you leave the conference -->
|
||||||
|
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
|
||||||
|
<!-- File to play when you are ejected from the conference -->
|
||||||
|
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
|
||||||
|
<!-- File to play when the conference is locked -->
|
||||||
|
<param name="locked-sound" value="conference/conf-locked.wav"/>
|
||||||
|
<!-- File to play when the conference is locked during the call-->
|
||||||
|
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
|
||||||
|
<!-- File to play when the conference is unlocked during the call-->
|
||||||
|
<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>
|
||||||
|
<!-- File to play to prompt for a pin -->
|
||||||
|
<param name="pin-sound" value="conference/conf-pin.wav"/>
|
||||||
|
<!-- File to play to when the pin is invalid -->
|
||||||
|
<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>
|
||||||
|
<!-- Conference pin -->
|
||||||
|
<!-- <param name="pin" value="12345"/> -->
|
||||||
|
<!-- <param name="moderator-pin" value="54321"/> -->
|
||||||
|
<!-- Max number of times the user can be prompted for PIN -->
|
||||||
|
<!-- <param name="pin-retries" value="3"/> -->
|
||||||
|
<!-- Default Caller ID Name for outbound calls -->
|
||||||
|
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||||
|
<!-- Default Caller ID Number for outbound calls -->
|
||||||
|
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||||
|
<!-- Suppress start and stop talking events -->
|
||||||
|
<!-- <param name="suppress-events" value="start-talking,stop-talking"/> -->
|
||||||
|
<!-- enable comfort noise generation -->
|
||||||
|
<param name="comfort-noise" value="true"/>
|
||||||
|
<!-- Uncomment auto-record to toggle recording every conference call. -->
|
||||||
|
<!-- Another valid value is shout://user:pass@server.com/live.mp3 -->
|
||||||
|
<!--
|
||||||
|
<param name="auto-record" value="$${recordings_dir}/${conference_name}_${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- IVR digit machine timeouts -->
|
||||||
|
<!-- How much to wait between DTMF digits to match caller-controls -->
|
||||||
|
<!-- <param name="ivr-dtmf-timeout" value="500"/> -->
|
||||||
|
<!-- How much to wait for the first DTMF, 0 forever -->
|
||||||
|
<!-- <param name="ivr-input-timeout" value="0" /> -->
|
||||||
|
<!-- Delay before a conference is asked to be terminated -->
|
||||||
|
<!-- <param name="endconf-grace-time" value="120" /> -->
|
||||||
|
<!-- Can be | delim of wait-mod|audio-always|video-bridge|video-floor-only
|
||||||
|
wait_mod will wait until the moderator in,
|
||||||
|
audio-always will always mix audio from all members regardless they are talking or not -->
|
||||||
|
<!-- <param name="conference-flags" value="audio-always"/> -->
|
||||||
|
<!-- Allow live array sync for Verto -->
|
||||||
|
<!-- <param name="conference-flags" value="livearray-sync"/> -->
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile name="wideband">
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<param name="rate" value="16000"/>
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<param name="energy-level" value="100"/>
|
||||||
|
<!-- <param name="sound-prefix" value="$${sounds_dir}/en/us/callie"/> -->
|
||||||
|
<param name="muted-sound" value="conference/conf-muted.wav"/>
|
||||||
|
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
|
||||||
|
<param name="alone-sound" value="conference/conf-alone.wav"/>
|
||||||
|
<param name="moh-sound" value="$${hold_music}"/>
|
||||||
|
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
|
||||||
|
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
|
||||||
|
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
|
||||||
|
<param name="locked-sound" value="conference/conf-locked.wav"/>
|
||||||
|
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
|
||||||
|
<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>
|
||||||
|
<param name="pin-sound" value="conference/conf-pin.wav"/>
|
||||||
|
<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>
|
||||||
|
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||||
|
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||||
|
<param name="comfort-noise" value="true"/>
|
||||||
|
<!-- <param name="tts-engine" value="flite"/> -->
|
||||||
|
<!-- <param name="tts-voice" value="kal16"/> -->
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile name="ultrawideband">
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<param name="rate" value="32000"/>
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<param name="energy-level" value="100"/>
|
||||||
|
<!-- <param name="sound-prefix" value="$${sounds_dir}/en/us/callie"/> -->
|
||||||
|
<param name="muted-sound" value="conference/conf-muted.wav"/>
|
||||||
|
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
|
||||||
|
<param name="alone-sound" value="conference/conf-alone.wav"/>
|
||||||
|
<param name="moh-sound" value="$${hold_music}"/>
|
||||||
|
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
|
||||||
|
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
|
||||||
|
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
|
||||||
|
<param name="locked-sound" value="conference/conf-locked.wav"/>
|
||||||
|
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
|
||||||
|
<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>
|
||||||
|
<param name="pin-sound" value="conference/conf-pin.wav"/>
|
||||||
|
<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>
|
||||||
|
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||||
|
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||||
|
<param name="comfort-noise" value="true"/>
|
||||||
|
|
||||||
|
<!-- <param name="conference-flags" value="video-floor-only|rfc-4579|livearray-sync|auto-3d-position|transcode-video|minimize-video-encoding"/> -->
|
||||||
|
|
||||||
|
<!-- <param name="video-mode" value="mux"/> -->
|
||||||
|
<!-- <param name="video-layout-name" value="3x3"/> -->
|
||||||
|
<!-- <param name="video-layout-name" value="group:grid"/> -->
|
||||||
|
<!-- <param name="video-canvas-size" value="1280x720"/> -->
|
||||||
|
<!-- <param name="video-canvas-bgcolor" value="#333333"/> -->
|
||||||
|
<!-- <param name="video-layout-bgcolor" value="#000000"/> -->
|
||||||
|
<!-- <param name="video-codec-bandwidth" value="2mb"/> -->
|
||||||
|
<!-- <param name="video-fps" value="15"/> -->
|
||||||
|
<!-- <param name="video-auto-floor-msec" value="100"/> -->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <param name="tts-engine" value="flite"/> -->
|
||||||
|
<!-- <param name="tts-voice" value="kal16"/> -->
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile name="cdquality">
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<param name="rate" value="48000"/>
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<param name="energy-level" value="100"/>
|
||||||
|
<!-- <param name="sound-prefix" value="$${sounds_dir}/en/us/callie"/> -->
|
||||||
|
|
||||||
|
{{if not (isTrue .Env.DISABLE_SOUND_MUTED) }}
|
||||||
|
<param name="muted-sound" value="conference/conf-muted.wav"/>
|
||||||
|
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
|
||||||
|
{{end}}
|
||||||
|
{{if not (isTrue .Env.DISABLE_SOUND_ALONE) }}
|
||||||
|
<param name="alone-sound" value="conference/conf-alone.wav"/>
|
||||||
|
{{end}}
|
||||||
|
<!--
|
||||||
|
<param name="moh-sound" value="$${hold_music}"/>
|
||||||
|
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
|
||||||
|
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
|
||||||
|
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
|
||||||
|
-->
|
||||||
|
<param name="locked-sound" value="conference/conf-locked.wav"/>
|
||||||
|
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
|
||||||
|
<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>
|
||||||
|
<param name="pin-sound" value="conference/conf-pin.wav"/>
|
||||||
|
<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>
|
||||||
|
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||||
|
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||||
|
<!-- param name="comfort-noise" value="true"/ -->
|
||||||
|
<param name="comfort-noise" value="1400"/>
|
||||||
|
|
||||||
|
<!-- <param name="conference-flags" value="video-floor-only|rfc-4579|livearray-sync|auto-3d-position|minimize-video-encoding"/> -->
|
||||||
|
|
||||||
|
<!-- <param name="video-mode" value="mux"/> -->
|
||||||
|
<!-- <param name="video-layout-name" value="3x3"/> -->
|
||||||
|
<!-- <param name="video-layout-name" value="group:grid"/> -->
|
||||||
|
<!-- <param name="video-canvas-size" value="1920x1080"/> -->
|
||||||
|
<!-- <param name="video-canvas-bgcolor" value="#333333"/> -->
|
||||||
|
<!-- <param name="video-layout-bgcolor" value="#000000"/> -->
|
||||||
|
<!-- <param name="video-codec-bandwidth" value="2mb"/> -->
|
||||||
|
<!-- <param name="video-fps" value="15"/> -->
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile name="video-mcu-stereo">
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<param name="rate" value="48000"/>
|
||||||
|
<param name="channels" value="2"/>
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<param name="energy-level" value="100"/>
|
||||||
|
<!-- <param name="tts-engine" value="flite"/> -->
|
||||||
|
<!-- <param name="tts-voice" value="kal16"/> -->
|
||||||
|
<param name="muted-sound" value="conference/conf-muted.wav"/>
|
||||||
|
<param name="unmuted-sound" value="conference/conf-unmuted.wav"/>
|
||||||
|
<param name="alone-sound" value="conference/conf-alone.wav"/>
|
||||||
|
<param name="moh-sound" value="local_stream://stereo"/>
|
||||||
|
<param name="enter-sound" value="tone_stream://%(200,0,500,600,700)"/>
|
||||||
|
<param name="exit-sound" value="tone_stream://%(500,0,300,200,100,50,25)"/>
|
||||||
|
<param name="kicked-sound" value="conference/conf-kicked.wav"/>
|
||||||
|
<param name="locked-sound" value="conference/conf-locked.wav"/>
|
||||||
|
<param name="is-locked-sound" value="conference/conf-is-locked.wav"/>
|
||||||
|
<param name="is-unlocked-sound" value="conference/conf-is-unlocked.wav"/>
|
||||||
|
<param name="pin-sound" value="conference/conf-pin.wav"/>
|
||||||
|
<param name="bad-pin-sound" value="conference/conf-bad-pin.wav"/>
|
||||||
|
<param name="caller-id-name" value="$${outbound_caller_name}"/>
|
||||||
|
<param name="caller-id-number" value="$${outbound_caller_id}"/>
|
||||||
|
<param name="comfort-noise" value="false"/>
|
||||||
|
<param name="conference-flags" value="video-floor-only|rfc-4579|livearray-sync|minimize-video-encoding"/>
|
||||||
|
<param name="video-mode" value="mux"/>
|
||||||
|
<param name="video-layout-name" value="3x3"/>
|
||||||
|
<param name="video-layout-name" value="group:grid"/>
|
||||||
|
<param name="video-canvas-size" value="1920x1080"/>
|
||||||
|
<param name="video-canvas-bgcolor" value="#333333"/>
|
||||||
|
<param name="video-layout-bgcolor" value="#000000"/>
|
||||||
|
<param name="video-codec-bandwidth" value="1mb"/>
|
||||||
|
<param name="video-fps" value="15"/>
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
|
||||||
|
<profile name="sla">
|
||||||
|
<param name="domain" value="$${domain}"/>
|
||||||
|
<param name="rate" value="16000"/>
|
||||||
|
<param name="interval" value="20"/>
|
||||||
|
<param name="caller-controls" value="none"/>
|
||||||
|
<param name="energy-level" value="200"/>
|
||||||
|
<param name="moh-sound" value="silence"/>
|
||||||
|
<param name="comfort-noise" value="true"/>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</configuration>
|
||||||
|
|
@ -17,4 +17,5 @@ done
|
|||||||
|
|
||||||
dockerize \
|
dockerize \
|
||||||
-template /etc/freeswitch/vars.xml.tmpl:/etc/freeswitch/vars.xml \
|
-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
|
/usr/bin/freeswitch -u freeswitch -g daemon -nonat -nf
|
||||||
|
@ -14,7 +14,7 @@ USER meteor
|
|||||||
ENV METEOR_VERSION 1.8.1
|
ENV METEOR_VERSION 1.8.1
|
||||||
RUN curl -sL https://install.meteor.com?release=$METEOR_VERSION | sed s/--progress-bar/-sL/g | /bin/sh
|
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 ~ \
|
RUN cd ~ \
|
||||||
&& svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/bigbluebutton-html5 \
|
&& svn checkout https://github.com/bigbluebutton/bigbluebutton/tags/$TAG/bigbluebutton-html5 \
|
||||||
&& mv ~/bigbluebutton-html5 ~/source \
|
&& mv ~/bigbluebutton-html5 ~/source \
|
||||||
@ -51,4 +51,4 @@ USER meteor
|
|||||||
ENTRYPOINT ["/entrypoint.sh"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
||||||
# lets set the tag again, so that it is include in the image for later version retrieval
|
# 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
|
||||||
|
@ -4,14 +4,14 @@ public:
|
|||||||
desktopFontSize: 14px
|
desktopFontSize: 14px
|
||||||
audioChatNotification: false
|
audioChatNotification: false
|
||||||
autoJoin: true
|
autoJoin: true
|
||||||
listenOnlyMode: true
|
listenOnlyMode: {{ .Env.LISTEN_ONLY_MODE }}
|
||||||
forceListenOnly: false
|
forceListenOnly: false
|
||||||
skipCheck: false
|
skipCheck: {{ .Env.DISABLE_ECHO_TEST }}
|
||||||
clientTitle: {{ .Env.CLIENT_TITLE }}
|
clientTitle: {{ .Env.CLIENT_TITLE }}
|
||||||
appName: BigBlueButton HTML5 Client
|
appName: BigBlueButton HTML5 Client
|
||||||
bbbServerVersion: 2.2
|
bbbServerVersion: 2.2
|
||||||
copyright: "©2020 BigBlueButton Inc."
|
copyright: "©2020 BigBlueButton Inc."
|
||||||
html5ClientBuild: 960
|
html5ClientBuild: 968
|
||||||
helpLink: https://bigbluebutton.org/html5/
|
helpLink: https://bigbluebutton.org/html5/
|
||||||
lockOnJoin: true
|
lockOnJoin: true
|
||||||
cdn: ""
|
cdn: ""
|
||||||
@ -86,6 +86,16 @@ public:
|
|||||||
packetLostThreshold: 10
|
packetLostThreshold: 10
|
||||||
kurento:
|
kurento:
|
||||||
wsUrl: wss://{{ .Env.DOMAIN }}/bbb-webrtc-sfu
|
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
|
chromeDefaultExtensionKey: akgoaoikmbmhcopjgakkcepdgdgkjfbc
|
||||||
chromeDefaultExtensionLink: https://chrome.google.com/webstore/detail/bigbluebutton-screenshare/akgoaoikmbmhcopjgakkcepdgdgkjfbc
|
chromeDefaultExtensionLink: https://chrome.google.com/webstore/detail/bigbluebutton-screenshare/akgoaoikmbmhcopjgakkcepdgdgkjfbc
|
||||||
chromeExtensionKey: KEY
|
chromeExtensionKey: KEY
|
||||||
@ -127,8 +137,8 @@ public:
|
|||||||
enableVideoStats: false
|
enableVideoStats: false
|
||||||
enableVideoMenu: true
|
enableVideoMenu: true
|
||||||
enableListenOnly: true
|
enableListenOnly: true
|
||||||
autoShareWebcam: false
|
autoShareWebcam: {{ .Env.AUTO_SHARE_WEBCAM }}
|
||||||
skipVideoPreview: false
|
skipVideoPreview: {{ .Env.DISABLE_VIDEO_PREVIEW }}
|
||||||
pingPong:
|
pingPong:
|
||||||
clearUsersInSeconds: 180
|
clearUsersInSeconds: 180
|
||||||
pongTimeInSeconds: 15
|
pongTimeInSeconds: 15
|
||||||
@ -149,8 +159,8 @@ public:
|
|||||||
lines: 2
|
lines: 2
|
||||||
time: 5000
|
time: 5000
|
||||||
chat:
|
chat:
|
||||||
enabled: true
|
enabled: {{ .Env.CHAT_ENABLED }}
|
||||||
startClosed: false
|
startClosed: {{ .Env.CHAT_START_CLOSED }}
|
||||||
min_message_length: 1
|
min_message_length: 1
|
||||||
max_message_length: 5000
|
max_message_length: 5000
|
||||||
grouping_messages_window: 10000
|
grouping_messages_window: 10000
|
||||||
@ -190,6 +200,7 @@ public:
|
|||||||
callHangupMaximumRetries: 10
|
callHangupMaximumRetries: 10
|
||||||
echoTestNumber: 'echo'
|
echoTestNumber: 'echo'
|
||||||
relayOnlyOnReconnect: false
|
relayOnlyOnReconnect: false
|
||||||
|
listenOnlyCallTimeout: 15000
|
||||||
presentation:
|
presentation:
|
||||||
defaultPresentationFile: default.pdf
|
defaultPresentationFile: default.pdf
|
||||||
panZoomThrottle: 32
|
panZoomThrottle: 32
|
||||||
|
4
mod/nginx/bbb/client.nginx
Normal file
4
mod/nginx/bbb/client.nginx
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
location = /client/guest-wait.html {
|
||||||
|
alias /etc/nginx/bbb/guest-wait.html;
|
||||||
|
}
|
||||||
|
|
81
mod/nginx/bbb/guest-wait.html
Normal file
81
mod/nginx/bbb/guest-wait.html
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Guest Lobby</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||||
|
<style></style>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function updateMessage(message) {
|
||||||
|
document.querySelector('#content > p').innerHTML = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSessionToken() {
|
||||||
|
return location.search
|
||||||
|
.substr(1)
|
||||||
|
.split('&')
|
||||||
|
.find(function(item) {
|
||||||
|
return item.split('=')[0] === 'sessionToken'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function fetchGuestWait(sessionToken) {
|
||||||
|
const GUEST_WAIT_ENDPOINT = '/bigbluebutton/api/guestWait';
|
||||||
|
return window.fetch(GUEST_WAIT_ENDPOINT+'?'+sessionToken+'&redirect=false')
|
||||||
|
.then(res => res.json())
|
||||||
|
};
|
||||||
|
|
||||||
|
function pollGuestStatus(token, attempt, limit, everyMs) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var REDIRECT_STATUSES = ['ALLOW', 'DENY'];
|
||||||
|
|
||||||
|
|
||||||
|
if (attempt >= limit) {
|
||||||
|
updateMessage('TIMEOUT_MESSAGE_HERE');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchGuestWait(token).then(function(data) {
|
||||||
|
console.log("data=" + JSON.stringify(data));
|
||||||
|
var status = data.response.guestStatus;
|
||||||
|
|
||||||
|
if (REDIRECT_STATUSES.includes(status)) {
|
||||||
|
window.location = data.response.url;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pollGuestStatus(token, attempt + 1, limit, everyMs);
|
||||||
|
})
|
||||||
|
}, everyMs);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
try {
|
||||||
|
var ATTEMPT_EVERY_MS = 5000;
|
||||||
|
var ATTEMPT_LIMIT = 100;
|
||||||
|
|
||||||
|
var sessionToken = findSessionToken();
|
||||||
|
|
||||||
|
if(!sessionToken) {
|
||||||
|
updateMessage('NO_SESSION_TOKEN_MESSAGE');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pollGuestStatus(sessionToken, 0, ATTEMPT_LIMIT, ATTEMPT_EVERY_MS);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
updateMessage('GENERIC_ERROR_MESSAGE');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="banner"></div>
|
||||||
|
<div id="content">
|
||||||
|
<p>Please wait for a moderator to approve you joining the meeting.</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
9
mod/nginx/bbb/webhooks.nginx
Normal file
9
mod/nginx/bbb/webhooks.nginx
Normal file
@ -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;
|
||||||
|
}
|
26
mod/webhooks/Dockerfile
Normal file
26
mod/webhooks/Dockerfile
Normal file
@ -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
|
||||||
|
|
||||||
|
|
69
mod/webhooks/config.yml
Normal file
69
mod/webhooks/config.yml
Normal file
@ -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
|
9
mod/webhooks/entrypoint.sh
Executable file
9
mod/webhooks/entrypoint.sh
Executable file
@ -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
|
||||||
|
|
28
sample.env
28
sample.env
@ -15,6 +15,9 @@ ENABLE_COTURN=true
|
|||||||
# https://docs.bigbluebutton.org/greenlight/gl-overview.html
|
# https://docs.bigbluebutton.org/greenlight/gl-overview.html
|
||||||
ENABLE_GREENLIGHT=true
|
ENABLE_GREENLIGHT=true
|
||||||
|
|
||||||
|
# Enable Webhooks
|
||||||
|
# used by some integrations
|
||||||
|
#ENABLE_WEBHOOKS=true
|
||||||
|
|
||||||
# ====================================
|
# ====================================
|
||||||
# SECRETS
|
# SECRETS
|
||||||
@ -63,6 +66,8 @@ SIP_IP_ALLOWLIST=
|
|||||||
|
|
||||||
CLIENT_TITLE=BigBlueButton
|
CLIENT_TITLE=BigBlueButton
|
||||||
|
|
||||||
|
# use following lines to replace the default welcome message and footer
|
||||||
|
WELCOME_MESSAGE=Welcome to <b>%%CONFNAME%%</b>!<br><br>For help on using BigBlueButton see these (short) <a href="event:http://www.bigbluebutton.org/html5"><u>tutorial videos</u></a>.<br><br>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 <a href="http://docs.bigbluebutton.org/" target="_blank"><u>BigBlueButton</u></a>.
|
WELCOME_FOOTER=This server is running <a href="http://docs.bigbluebutton.org/" target="_blank"><u>BigBlueButton</u></a>.
|
||||||
|
|
||||||
# use following line for an additional SIP dial-in message
|
# use following line for an additional SIP dial-in message
|
||||||
@ -72,6 +77,29 @@ WELCOME_FOOTER=This server is running <a href="http://docs.bigbluebutton.org/" t
|
|||||||
# adjust the following path
|
# adjust the following path
|
||||||
DEFAULT_PRESENTATION=./mod/nginx/default.pdf
|
DEFAULT_PRESENTATION=./mod/nginx/default.pdf
|
||||||
|
|
||||||
|
# set to false to disable listenOnlyMode
|
||||||
|
LISTEN_ONLY_MODE=true
|
||||||
|
|
||||||
|
# set to true to disable echo test
|
||||||
|
DISABLE_ECHO_TEST=false
|
||||||
|
|
||||||
|
# set to true to automatically share webcam
|
||||||
|
AUTO_SHARE_WEBCAM=false
|
||||||
|
|
||||||
|
# set to true to disable video preview for webcam sharing
|
||||||
|
DISABLE_VIDEO_PREVIEW=false
|
||||||
|
|
||||||
|
# set to false to disable chat
|
||||||
|
CHAT_ENABLED=true
|
||||||
|
|
||||||
|
# set to true to start chat closed
|
||||||
|
CHAT_START_CLOSED=false
|
||||||
|
|
||||||
|
# set to true to disable announcements "You are now (un-)muted"
|
||||||
|
DISABLE_SOUND_MUTED=false
|
||||||
|
|
||||||
|
# set to true to disable announcement "You are the only person in this conference"
|
||||||
|
DISABLE_SOUND_ALONE=false
|
||||||
|
|
||||||
# ====================================
|
# ====================================
|
||||||
# GREENLIGHT CONFIGURATION
|
# GREENLIGHT CONFIGURATION
|
||||||
|
@ -6,8 +6,8 @@ cd $(dirname $0)/..
|
|||||||
# load .env
|
# load .env
|
||||||
if [ -f .env ]
|
if [ -f .env ]
|
||||||
then
|
then
|
||||||
# exclude WELCOME_FOOTER because it may contain invalid characters
|
# exclude WELCOME_MESSAGE && WELCOME_FOOTER because it may contain invalid characters
|
||||||
export $(cat .env | sed 's/#.*//g' | grep -v "WELCOME_FOOTER" | xargs)
|
export $(cat .env | sed 's/#.*//g' | grep -v "WELCOME_FOOTER" | grep -v "WELCOME_MESSAGE" | xargs)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# concatenate docker-compose file
|
# concatenate docker-compose file
|
||||||
@ -24,4 +24,8 @@ if [ "$ENABLE_GREENLIGHT" == true ]; then
|
|||||||
COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.greenlight.yml"
|
COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.greenlight.yml"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$ENABLE_WEBHOOKS" == true ]; then
|
||||||
|
COMPOSE_FILES="$COMPOSE_FILES -f docker-compose.webhooks.yml"
|
||||||
|
fi
|
||||||
|
|
||||||
docker-compose $COMPOSE_FILES $@
|
docker-compose $COMPOSE_FILES $@
|
||||||
|
Loading…
Reference in New Issue
Block a user