Files
bigbluebutton/compose.yml
2024-09-02 18:16:16 +02:00

422 lines
11 KiB
YAML

---
version: '3.8'
# html5 templates
x-html5-backend: &html5backend
image: alangecker/bbb-docker-html5:v2.7.3
restart: unless-stopped
depends_on:
- redis
- mongodb
- etherpad
environment: &html5backend-env
DOMAIN: ${DOMAIN}
CLIENT_TITLE: ${CLIENT_TITLE}
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}
BREAKOUTROOM_LIMIT: ${BREAKOUTROOM_LIMIT:-8}
DEV_MODE: ${DEV_MODE:-}
BBB_HTML5_ROLE: backend
x-html5-frontend: &html5frontend
<<: *html5backend
volumes:
- html5-static:/html5-static:rw
environment: &html5frontend-env
<<: *html5backend-env
BBB_HTML5_ROLE: frontend
# =========================
services:
bbb-web:
image: alangecker/bbb-docker-web:v2.7.3
restart: unless-stopped
depends_on:
- redis
- etherpad
- bbb-pads
# healthcheck:
# test: wget --no-proxy --no-verbose --tries=1 --spider http://10.7.7.2:8090/bigbluebutton/api || exit 1
# start_period: 2m
environment:
DEV_MODE: ${DEV_MODE:-}
DOMAIN: ${DOMAIN}
ENABLE_RECORDING: ${ENABLE_RECORDING:-false}
SHARED_SECRET: /run/secret/shared_secret
WELCOME_MESSAGE: ${WELCOME_MESSAGE:-}
WELCOME_FOOTER: ${WELCOME_FOOTER}
STUN_SERVER: stun:${STUN_IP}:${STUN_PORT}
TURN_SERVER: ${TURN_SERVER:-}
TURN_SECRET: ${TURN_SECRET:-}
ENABLE_LEARNING_DASHBOARD: ${ENABLE_LEARNING_DASHBOARD:-true}
NUMBER_OF_BACKEND_NODEJS_PROCESSES: 2
volumes:
- bigbluebutton:/var/bigbluebutton
- vol-freeswitch:/var/freeswitch/meetings
networks:
bbb-net:
ipv4_address: 10.7.7.2
html5-backend-1:
<<: *html5backend
environment:
<<: *html5backend-env
INSTANCE_ID: 1
PORT: 4000
networks:
bbb-net:
ipv4_address: 10.7.7.100
html5-backend-2:
<<: *html5backend
environment:
<<: *html5backend-env
INSTANCE_ID: 2
PORT: 4001
networks:
bbb-net:
ipv4_address: 10.7.7.101
html5-frontend-1:
<<: *html5frontend
environment:
<<: *html5frontend-env
INSTANCE_ID: 1
PORT: 4100
networks:
bbb-net:
ipv4_address: 10.7.7.200
html5-frontend-2:
<<: *html5frontend
environment:
<<: *html5frontend-env
INSTANCE_ID: 2
PORT: 4101
networks:
bbb-net:
ipv4_address: 10.7.7.201
# todo: freeswitch
freeswitch:
container_name: bbb-freeswitch
image: alangecker/bbb-docker-freeswitch:v2.7.0
restart: unless-stopped
cap_add:
- IPC_LOCK
- NET_ADMIN
- NET_RAW
- NET_BROADCAST
- SYS_NICE
- SYS_RESOURCE
environment:
DOMAIN: ${DOMAIN}
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}
SOUNDS_LANGUAGE: ${SOUNDS_LANGUAGE:-en-us-callie}
ESL_PASSWORD: ${FSESL_PASSWORD:-ClueCon}
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
logging:
# reduce logs to a minimum, so `docker compose logs -f` still works
driver: "local"
options:
max-size: "10k"
max-file: "1"
compress: "false"
# todo: nginx
nginx:
image: alangecker/bbb-docker-nginx:1.23-v5.0.2-v2.7.3
restart: unless-stopped
depends_on:
- etherpad
- webrtc-sfu
- html5-backend-1
volumes:
- bigbluebutton:/var/bigbluebutton
- html5-static:/html5-static:ro
- ${DEFAULT_PRESENTATION:-/dev/null}:/www/default.pdf
network_mode: host
extra_hosts:
- "host.docker.internal:10.7.7.1"
- "bbb-web:10.7.7.2"
- "etherpad:10.7.7.4"
- "webrtc-sfu:10.7.7.1"
- "html5:10.7.7.11"
- "greenlight:10.7.7.21"
# todo: etherpad
etherpad:
image: alangecker/bbb-docker-etherpad:1.9.1
restart: unless-stopped
depends_on:
- redis
environment:
ETHERPAD_API_KEY: /run/secret/etherpad_api_key
networks:
bbb-net:
ipv4_address: 10.7.7.4
# todo: bbb-pads
bbb-pads:
image: alangecker/bbb-docker-pads:v1.5.2
restart: unless-stopped
depends_on:
- redis
- etherpad
environment:
ETHERPAD_API_KEY: /run/secret/etherpad_api_key
networks:
bbb-net:
ipv4_address: 10.7.7.18
# todo: redis
redis:
image: redis:7.2-alpine
restart: unless-stopped
#healthcheck:
# test: ["CMD", "redis-cli", "ping"]
# interval: 1s
# timeout: 3s
# retries: 30
networks:
bbb-net:
ipv4_address: 10.7.7.5
# todo: monodb
mongodb:
container_name: bbb-mongodb
image: mongo:4.4
restart: unless-stopped
volumes:
- ./mod/mongo/mongod.conf:/etc/mongod.conf
- ./mod/mongo/init-replica.sh:/docker-entrypoint-initdb.d/init-replica.sh
tmpfs:
- /data/configdb
- /data/db
command: mongod --config /etc/mongod.conf --oplogSize 8 --replSet rs0 --noauth
# healthcheck:
# test: bash -c "if mongo --eval 'quit(db.runCommand({ ping':' 1 }).ok ? 0 ':' 2)'; then exit 0; fi; exit 1;"
networks:
bbb-net:
ipv4_address: 10.7.7.6
# todo: kurento (needed by webrtc-sfu)
kurento:
image: kurento/kurento-media-server:6.18
restart: unless-stopped
network_mode: host
volumes:
- vol-kurento:/var/kurento
# todo: webrtc-sfu
webrtc-sfu:
image: alangecker/bbb-docker-webrtc-sfu:v2.12.0
restart: unless-stopped
depends_on:
- redis
- freeswitch
- kurento
environment:
CLIENT_HOST: 10.7.7.1
REDIS_HOST: 10.7.7.5
FREESWITCH_IP: 10.7.7.1
FREESWITCH_SIP_IP: ${EXTERNAL_IPv4}
MCS_HOST: 0.0.0.0
MCS_ADDRESS: 127.0.0.1
ESL_IP: 10.7.7.1
ESL_PASSWORD: /run/secret/fsesl_password
# 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":"2010", "announcedIp":"2010"}, {"ip":"${EXTERNAL_IPv4}", "announcedIp":"${EXTERNAL_IPv4}"}]'
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
# todo: fsesl-akka
fsesl-akka:
image: alangecker/bbb-docker-fsesl-akka:v2.7.0
restart: unless-stopped
depends_on:
- redis
- freeswitch
environment:
FSESL_PASSWORD: ${FSESL_PASSWORD:-ClueCon}
networks:
bbb-net:
ipv4_address: 10.7.7.14
# todo: apps-akka
apps-akka:
image: alangecker/bbb-docker-apps-akka:v2.7.3
restart: unless-stopped
depends_on:
- redis
environment:
DOMAIN: ${DOMAIN}
SHARED_SECRET: /run/secret/shared_secret
volumes:
- vol-freeswitch:/var/freeswitch/meetings
networks:
bbb-net:
ipv4_address: 10.7.7.15
# todo: jodconverter
jodconverter:
image: alangecker/bbb-docker-jodconverter:latest
security_opt:
- 'no-new-privileges:true'
restart: unless-stopped
tmpfs:
- /tmp
deploy:
resources:
limits:
memory: 512M
networks:
bbb-net:
ipv4_address: 10.7.7.20
# todo: periodic
periodic:
image: alangecker/bbb-docker-periodic:v2.7.0
restart: unless-stopped
depends_on:
- mongodb
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- bigbluebutton:/var/bigbluebutton
- vol-mediasoup:/var/mediasoup
tmpfs:
- /var/log/bigbluebutton
environment:
ENABLE_RECORDING: ${ENABLE_RECORDING}
REMOVE_OLD_RECORDING: ${REMOVE_OLD_RECORDING}
RECORDING_MAX_AGE_DAYS: ${RECORDING_MAX_AGE_DAYS}
networks:
bbb-net:
ipv4_address: 10.7.7.12
# todo: coturn
coturn:
image: coturn/coturn:4.6-alpine
command:
- "--external-ip=${EXTERNAL_IPv4}/${EXTERNAL_IPv4}"
- "--external-ip=${EXTERNAL_IPv6:-::1}/${EXTERNAL_IPv6:-::1}"
- "--static-auth-secret=${TURN_SECRET}"
volumes:
- ${COTURN_TLS_CERT_PATH}:/tmp/cert.pem
- ${COTURN_TLS_KEY_PATH}:/tmp/key.pem
- ./mod/coturn/entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
- ./mod/coturn/turnserver.conf:/etc/coturn/turnserver.conf
environment:
ENABLE_HTTPS_PROXY:
user: root
network_mode: host
deploy:
update_config:
failure_action: rollback
order: start-first
rollback_config:
order: start-first
restart_policy:
max_attempts: 3
# todo: greenlight
greenlight:
image: bigbluebutton/greenlight:v3.1.0
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: /run/secret/shared_secret # can this use docker secrets?
SECRET_KEY_BASE: /run/secret/rails_secret # can this use docker secrets?
RELATIVE_URL_ROOT: /
volumes:
- greenlight_data:/usr/src/app/storage
networks:
bbb-net:
ipv4_address: 10.7.7.21
deploy:
update_config:
failure_action: rollback
order: start-first
rollback_config:
order: start-first
restart_policy:
max_attempts: 3
# postgres for greenlight
postgres:
image: postgres:12-alpine
environment:
POSTGRES_DB: greenlight-v3
POSTGRES_USER: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
POSTGRES_PASSWORD_FILE: /run/secret/postgresql_secret
volumes:
- "postgres_data:/var/lib/postgresql/data"
networks:
bbb-net:
ipv4_address: 10.7.7.22
deploy:
update_config:
failure_action: rollback
order: start-first
rollback_config:
order: start-first
restart_policy:
max_attempts: 3
volumes:
greenlight_data:
postgres_data:
secrets:
shared_secret:
external: true
name: ${STACK_NAME}_shared_secret_${SHARED_SECRET_VERSION}
etherpad_api_key:
external: true
name: ${STACK_NAME}_etherpad_api_key_${ETHERPAD_API_KEY_VERSION}
rails_secret:
external: true
name: ${STACK_NAME}_rails_secret_${RAILS_SECRET_VERSION}
postgresql_secret:
external: true
name: ${STACK_NAME}_postgresql_secret_${POSTGRESQL_SECRET_VERSION}
fsesl_password:
external: true
name: ${STACK_NAME}_fsesl_password_${FSESL_PASSWORD_VERSION}
networks:
bbb-net:
ipam:
driver: default
config:
- subnet: "10.7.7.0/24"