
# auto generated by ./scripts/generate-compose
# don't edit this directly.


version: '3.6'

# html5 templates
x-html5-backend: &html5backend
  build: 
    context: mod/html5
    additional_contexts:
      - source=./repos/bigbluebutton/bigbluebutton-html5
    args:
      BBB_BUILD_TAG: bbb27-2023-06-13-java17
      TAG_BBB: v2.7.3
  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:
    build: 
      context: mod/bbb-web
      additional_contexts:
        - src-web=./repos/bigbluebutton/bigbluebutton-web
        - src-common-message=./repos/bigbluebutton/bbb-common-message
        - src-common-web=./repos/bigbluebutton/bbb-common-web
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    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: ${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



  freeswitch:
    container_name: bbb-freeswitch
    build: 
      context: mod/freeswitch
      additional_contexts:
        - freeswitch=./repos/freeswitch/
        - build-files=./repos/bigbluebutton/build/packages-template/bbb-freeswitch-core/
        - fs-config=./repos/bigbluebutton/bbb-voice-conference/config/freeswitch/conf/
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    image: alangecker/bbb-docker-freeswitch:v1.10.10-v2.7.3
    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
      additional_contexts:
        - src-learning-dashboard=./repos/bigbluebutton/bbb-learning-dashboard
        - src-playback=./repos/bbb-playback
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    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"

  etherpad:
    build: 
      context: mod/etherpad
      additional_contexts:
        - plugin=./repos/bbb-etherpad-plugin
        - skin=./repos/bbb-etherpad-skin
      args:
        TAG_ETHERPAD: "1.9.1"
    image: alangecker/bbb-docker-etherpad:1.9.1-s8328b77-p068ded5
    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: 
      context: mod/bbb-pads
      additional_contexts:
        - src=./repos/bbb-pads
    image: alangecker/bbb-docker-pads:v1.5.2
    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
      additional_contexts:
        - source=./repos/bbb-webrtc-sfu
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    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: ${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
    
      MS_WEBRTC_LISTEN_IPS: '[{"ip":"2602:ff16:6:0:1:3de:0:1", "announcedIp":"2602:ff16:6:0:1:3de:0:1"}, {"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

  fsesl-akka:
    build: 
      context: mod/fsesl-akka
      additional_contexts:
        - src-common-message=./repos/bigbluebutton/bbb-common-message
        - src-fsesl-client=./repos/bigbluebutton/bbb-fsesl-client
        - src-fsesl-akka=./repos/bigbluebutton/akka-bbb-fsesl
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    image: alangecker/bbb-docker-fsesl-akka:v2.7.3
    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
      additional_contexts:
        - src-common-message=./repos/bigbluebutton/bbb-common-message
        - src-apps-akka=./repos/bigbluebutton/akka-bbb-apps
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
    image: alangecker/bbb-docker-apps-akka:v2.7.3
    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


  # recordings
  recordings:
    build: 
      context: mod/recordings
      additional_contexts:
        - record-core=./repos/bigbluebutton/record-and-playback/core
        - presentation=./repos/bigbluebutton/record-and-playback/presentation
        - bbb-conf=./repos/bigbluebutton/bigbluebutton-config
      args:
        BBB_BUILD_TAG: bbb27-2023-06-13-java17
        TAG_BBB_PRESENTATION_VIDEO: "4.0.3"
    image: alangecker/bbb-docker-recordings:v2.7.3
    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










  # greenlight
  greenlight:
    image: bigbluebutton/greenlight:v3.0.6.1
    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
      
      BIGBLUEBUTTON_ENDPOINT: https://${DOMAIN}/bigbluebutton/api
      
      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



  # 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
    

    # the exporter requires /etc/bigbluebutton/bigbluebutton-release
    tmpfs:
      - /etc/bigbluebutton:mode=777
    entrypoint: sh -c 'echo "BIGBLUEBUTTON_RELEASE=2.7.3" > /etc/bigbluebutton/bigbluebutton-release && python server.py'



volumes:
  bigbluebutton:
  vol-freeswitch:
  vol-kurento:
  vol-mediasoup:
  html5-static:


networks:
  bbb-net:
    ipam:
      driver: default
      config:
        - subnet: "10.7.7.0/24"
