{{/* if you read this, you can ignore the following lines */}} # auto generated by ./scripts/generate-compose # don't edit this directly. {{/* -------- */}} version: '3.6' # html5 templates x-html5-backend: &html5backend build: context: mod/html5 args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_HTML5: {{ .Env.TAG_HTML5 }} image: alangecker/bbb-docker-html5:{{ .Env.TAG_HTML5 }} 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: build: context: mod/bbb-web args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_COMMON_MESSAGE: {{ .Env.TAG_COMMON_MESSAGE }} TAG_BBB_WEB: {{ .Env.TAG_BBB_WEB }} image: alangecker/bbb-docker-web:{{ .Env.TAG_BBB_WEB }} 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: ${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: {{ .Env.NUMBER_OF_BACKEND_NODEJS_PROCESSES }} volumes: - bigbluebutton:/var/bigbluebutton - vol-freeswitch:/var/freeswitch/meetings networks: bbb-net: ipv4_address: 10.7.7.2 {{ range $i := loop 0 (atoi .Env.NUMBER_OF_BACKEND_NODEJS_PROCESSES) }} html5-backend-{{ add $i 1 }}: <<: *html5backend environment: <<: *html5backend-env INSTANCE_ID: {{ add $i 1 }} PORT: {{ add 4000 $i }} networks: bbb-net: ipv4_address: 10.7.7.{{ add 100 $i }} {{end}} {{ range $i := loop 0 (atoi .Env.NUMBER_OF_FRONTEND_NODEJS_PROCESSES) }} html5-frontend-{{ add $i 1 }}: <<: *html5frontend environment: <<: *html5frontend-env INSTANCE_ID: {{ add $i 1 }} PORT: {{ add 4100 $i }} networks: bbb-net: ipv4_address: 10.7.7.{{ add 200 $i }} {{end}} freeswitch: container_name: bbb-freeswitch build: context: mod/freeswitch args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_FS_BUILD_FILES: {{ .Env.TAG_FS_BUILD_FILES }} TAG_FS_CONFIG: {{ .Env.TAG_FS_CONFIG }} TAG_FREESWITCH: {{ .Env.TAG_FREESWITCH }} image: alangecker/bbb-docker-freeswitch:{{ .Env.TAG_FS_CONFIG }} 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" nginx: build: context: mod/nginx args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_LEARNING_DASHBOARD: {{ .Env.TAG_LEARNING_DASHBOARD }} image: alangecker/bbb-docker-nginx:1.23-{{ .Env.TAG_PLAYBACK }}-{{ .Env.TAG_LEARNING_DASHBOARD }} 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" etherpad: build: mod/etherpad image: alangecker/bbb-docker-etherpad:1.9.1 restart: unless-stopped depends_on: - redis environment: ETHERPAD_API_KEY: ${ETHERPAD_API_KEY} networks: bbb-net: ipv4_address: 10.7.7.4 bbb-pads: build: mod/bbb-pads image: alangecker/bbb-docker-pads:{{ .Env.TAG_PADS }} restart: unless-stopped depends_on: - redis - etherpad environment: ETHERPAD_API_KEY: ${ETHERPAD_API_KEY} networks: bbb-net: ipv4_address: 10.7.7.18 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 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: remove as soon as not required anymore by webrtc-sfu kurento: image: kurento/kurento-media-server:6.18 restart: unless-stopped network_mode: host volumes: - vol-kurento:/var/kurento webrtc-sfu: build: context: mod/webrtc-sfu args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} image: alangecker/bbb-docker-webrtc-sfu:{{ .Env.TAG_WEBRTC_SFU }} 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: ${FSESL_PASSWORD:-ClueCon} # TODO: add mediasoup IPv6 # TODO: can listen to 0.0.0.0 for nat support? https://github.com/versatica/mediasoup/issues/487 {{ if .Env.EXTERNAL_IPv6 }} MS_WEBRTC_LISTEN_IPS: '[{"ip":"{{ .Env.EXTERNAL_IPv6 }}", "announcedIp":"{{ .Env.EXTERNAL_IPv6 }}"}, {"ip":"${EXTERNAL_IPv4}", "announcedIp":"${EXTERNAL_IPv4}"}]' {{else}} MS_WEBRTC_LISTEN_IPS: '[{"ip":"${EXTERNAL_IPv4}", "announcedIp":"${EXTERNAL_IPv4}"}]' {{end}} 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 fsesl-akka: build: context: mod/fsesl-akka args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_COMMON_MESSAGE: {{ .Env.TAG_COMMON_MESSAGE }} TAG_FSESL_AKKA: {{ .Env.TAG_FSESL_AKKA }} image: alangecker/bbb-docker-fsesl-akka:{{ .Env.TAG_FSESL_AKKA }} restart: unless-stopped depends_on: - redis - freeswitch environment: FSESL_PASSWORD: ${FSESL_PASSWORD:-ClueCon} networks: bbb-net: ipv4_address: 10.7.7.14 apps-akka: build: context: mod/apps-akka args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_COMMON_MESSAGE: {{ .Env.TAG_COMMON_MESSAGE }} TAG_APPS_AKKA: {{ .Env.TAG_APPS_AKKA }} image: alangecker/bbb-docker-apps-akka:{{ .Env.TAG_APPS_AKKA }} restart: unless-stopped depends_on: - redis environment: DOMAIN: ${DOMAIN} SHARED_SECRET: ${SHARED_SECRET} volumes: - vol-freeswitch:/var/freeswitch/meetings networks: bbb-net: ipv4_address: 10.7.7.15 jodconverter: build: mod/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 periodic: build: mod/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 {{ if isTrue .Env.ENABLE_RECORDING }} # recordings recordings: build: context: mod/recordings args: BBB_BUILD_TAG: {{ .Env.BBB_BUILD_TAG }} TAG_RECORDINGS: {{ .Env.TAG_RECORDINGS }} TAG_BBB_PRESENTATION_VIDEO: {{ .Env.TAG_BBB_PRESENTATION_VIDEO }} image: alangecker/bbb-docker-recordings:{{ .Env.TAG_RECORDINGS }} restart: unless-stopped depends_on: - redis - bbb-pads environment: DOMAIN: ${DOMAIN} SHARED_SECRET: ${SHARED_SECRET} volumes: - bigbluebutton:/var/bigbluebutton - vol-freeswitch:/var/freeswitch/meetings - vol-mediasoup:/var/mediasoup - vol-kurento:/var/kurento tmpfs: - /var/log/bigbluebutton - /tmp networks: bbb-net: ipv4_address: 10.7.7.16 {{end}} {{ if isTrue .Env.ENABLE_WEBHOOKS }} # webhooks webhooks: build: mod/webhooks image: alangecker/bbb-docker-webhooks:{{ .Env.TAG_WEBHOOKS }} restart: unless-stopped environment: DOMAIN: ${DOMAIN} SHARED_SECRET: ${SHARED_SECRET} depends_on: - redis networks: bbb-net: ipv4_address: 10.7.7.17 {{end}} {{ if isTrue .Env.ENABLE_HTTPS_PROXY }} # https https_proxy: image: valian/docker-nginx-auto-ssl restart: unless-stopped volumes: - ssl_data:/etc/resty-auto-ssl {{ if .Env.EXTERNAL_IPv6 }} - ./mod/https/site.conf:/etc/nginx/conf.d/bbb-docker.conf {{else}} - ./mod/https/site-ipv4only.conf:/etc/nginx/conf.d/bbb-docker.conf {{end}} {{ if isTrue .Env.DEV_MODE }} # allow bbb api access without https - ./mod/https/force-https.conf:/usr/local/openresty/nginx/conf/force-https.conf {{end}} environment: {{ if isTrue .Env.DEV_MODE }} ALLOWED_DOMAINS: "" {{else}} ALLOWED_DOMAINS: ${DOMAIN} {{end}} {{ if .Env.RESOLVER_ADDRESS }} RESOLVER_ADDRESS: ${RESOLVER_ADDRESS} {{end}} network_mode: host {{end}} {{ if isTrue .Env.ENABLE_COTURN }} # coturn coturn: image: coturn/coturn:4.6-alpine restart: unless-stopped command: - "--external-ip=${EXTERNAL_IPv4}/${EXTERNAL_IPv4}" - "--external-ip=${EXTERNAL_IPv6:-::1}/${EXTERNAL_IPv6:-::1}" - "--static-auth-secret=${TURN_SECRET}" volumes: {{ if isTrue .Env.ENABLE_HTTPS_PROXY }} - ssl_data:/etc/resty-auto-ssl {{else}} - ${COTURN_TLS_CERT_PATH}:/tmp/cert.pem - ${COTURN_TLS_KEY_PATH}:/tmp/key.pem {{end}} - ./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 {{end}} {{ if isTrue .Env.ENABLE_GREENLIGHT }} # greenlight greenlight: image: bigbluebutton/greenlight:{{ .Env.TAG_GREENLIGHT }} restart: unless-stopped env_file: .env depends_on: - postgres - redis environment: DATABASE_URL: postgres://postgres:${POSTGRESQL_SECRET:-password}@postgres:5432/greenlight-v3 REDIS_URL: redis://redis:6379 {{ if isTrue .Env.DEV_MODE }} BIGBLUEBUTTON_ENDPOINT: http://10.7.7.1/bigbluebutton/api {{else}} BIGBLUEBUTTON_ENDPOINT: https://${DOMAIN}/bigbluebutton/api {{end}} BIGBLUEBUTTON_SECRET: ${SHARED_SECRET} SECRET_KEY_BASE: ${RAILS_SECRET} RELATIVE_URL_ROOT: / volumes: - ./greenlight-data:/usr/src/app/storage networks: bbb-net: ipv4_address: 10.7.7.21 postgres: image: postgres:12-alpine restart: unless-stopped environment: POSTGRES_DB: greenlight-v3 POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRESQL_SECRET:-password} healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 volumes: - ./postgres-data:/var/lib/postgresql/data networks: bbb-net: ipv4_address: 10.7.7.22 {{end}} {{ if isTrue .Env.ENABLE_PROMETHEUS_EXPORTER }} # prometheus prometheus-exporter: image: greenstatic/bigbluebutton-exporter:latest restart: unless-stopped environment: API_BASE_URL: http://10.7.7.1:48087/bigbluebutton/api/ API_SECRET: ${SHARED_SECRET} RECORDINGS_METRICS_READ_FROM_DISK: "${ENABLE_PROMETHEUS_EXPORTER_OPTIMIZATION:-false}" networks: bbb-net: ipv4_address: 10.7.7.33 {{ if isTrue .Env.ENABLE_PROMETHEUS_EXPORTER_OPTIMIZATION }} volumes: - bigbluebutton:/var/bigbluebutton:ro {{end}} # the exporter requires /etc/bigbluebutton/bigbluebutton-release tmpfs: - /etc/bigbluebutton entrypoint: sh -c 'echo "BIGBLUEBUTTON_RELEASE=2.7.3" > /etc/bigbluebutton/bigbluebutton-release && python server.py' {{end}} volumes: bigbluebutton: vol-freeswitch: vol-kurento: vol-mediasoup: html5-static: {{ if isTrue .Env.ENABLE_HTTPS_PROXY }} ssl_data: {{end}} networks: bbb-net: ipam: driver: default config: - subnet: "10.7.7.0/24"