Giter Site home page Giter Site logo

de-ibh / b3lb Goto Github PK

View Code? Open in Web Editor NEW
14.0 4.0 2.0 347 KB

BigBlueButton Load Balancer

Home Page: https://b3lb.io

License: GNU Affero General Public License v3.0

Python 97.13% Dockerfile 0.73% Shell 1.24% Ruby 0.90%
bigbluebutton bbb load-balancer bigbluebutton-api

b3lb's Introduction

B3LB - BigBlueButton Load Balancer

B3LB is a open source BigBlueButton API load balancer similar to Scalelite. B3LB is based on the Django Python Web framework and is designed to work in large scale-out deployments with 100+ BigBlueButton nodes and high attendee join rates. The project started at IBH IT-Service GmbH in the fall 2020 and has been published in February 2021 during the second COVID-19 lock down in Germany.

More...

This project uses BigBlueButton and is not endorsed or certified by BigBlueButton Inc. BigBlueButton and the BigBlueButton Logo are trademarks of BigBlueButton Inc.

b3lb's People

Contributors

liske avatar philippkilian avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

liske taidos

b3lb's Issues

api: add tenant and secret attendee soft limit

Implement a tenant and secret attendee soft limit. A secret will not be able to create new meetings If the secrets or the overall tenant attendee limit has been already reached. On-going meetings should always allow attendees to join.

bug: http 500 error when adding parameters with an empty value

It seems that an empty value field is not handled when adding instances of the Parameters model:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 38, in inner
    response = await get_response(request)
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 233, in _get_response_async
    response = await wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/admin/options.py", line 1579, in _changeform_view
    form_validated = form.is_valid()
  File "/usr/local/lib/python3.10/site-packages/django/forms/forms.py", line 175, in is_valid
    return self.is_bound and not self.errors
  File "/usr/local/lib/python3.10/site-packages/django/forms/forms.py", line 170, in errors
    self.full_clean()
  File "/usr/local/lib/python3.10/site-packages/django/forms/forms.py", line 374, in full_clean
    self._post_clean()
  File "/usr/local/lib/python3.10/site-packages/django/forms/models.py", line 413, in _post_clean
    self.instance.full_clean(exclude=exclude, validate_unique=False)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 1229, in full_clean
    self.clean_fields(exclude=exclude)
  File "/usr/src/app/rest/models.py", line 1315, in clean_fields
    if not match(self.PARAMETER_REGEXES[self.parameter], self.value):
  File "/usr/lib/python3.10/re.py", line 190, in match
    return _compile(pattern, flags).match(string)

Exception Type: TypeError at /admin/rest/parameter/add/
Exception Value: expected string or bytes-like object
Request information:
USER: XXXXXXXX

GET: No GET data

POST:
csrfmiddlewaretoken = 'XXXXXXXX'
mode = 'SET'
parameter = 'disabledFeatures'
tenant = 'XXXXXXXX'
value = ''
_save = 'Sichern'

feature: improve end meeting callback handling

B3LB should use the meta_endCallbackUrl create parameter to get a callback from bbb if a meetings has ended. When the callback arrives the meeting state can be updated immediately. The callback should be protected by a nonce.

In case the original meeting creator has passed a meta_endCallbackUrl B3LB needs to call it by proxy.

assets: store logo and slide assets as db blobs

Drop the requirement to put logo an slide assets on the file system using docker volumes. Storing them in the database would allow to use Django's caching framework and does not require to synchronize them if multiple frontend nodes are used.

Somehow related to #13

Enable support for redis sentinal

redis sentinel is a fairly easy way to make redis high available.

django-cacheops has actual inbuilt support for this operation mode.

CACHEOPS_SENTINEL = {
    'locations': [('localhost', 26379)], # sentinel locations, required
    'service_name': 'mymaster',          # sentinel service name, required
    'socket_timeout': 0.1,               # connection timeout in seconds, optional
    'db': 0                              # redis database, default: 0
    ...                                  # everything else is passed to Sentinel()
}

Can this be implemented as well? Probably somewhere in /b3lb/loadbalancer/settings.py.

Or is a HA redis not necessary for b3lb?

feature: add recording support

Add recording support requires:

  • add B3LB backend API with dedicated backend secrets for each node
  • add a post script uploading the recordings using the node's secret (push only)
  • add some processing storing the recordings into an object storage (S3 like?) and store recording meta data in B3LB models
  • implement recording related APIs
  • make recording support optional per tenant/secret
  • add meta_bbb-recording-ready-url by proxy support

b3lb-recording-draft

Make meetings bijective

  • It's not possible to use the same meeting ID for two different secrets.
  • Also send a error if meeting id is too long (+ 100 chars)

api: prevent oversized create calls

BBB API create calls should not trigger http 413 errors (Request Entity Too Large) in the backend. Might be triggered by large startup slides.

Problem with greenlight and b3lb

Hello everyone
I encountered a bidard problem between greenlight and b3lb,
I installed and configure greenlight on a vps server everything works well I connected greenlight api with b3lb server and it works well.
My problem is when I start a meeting for the first time it works but when one person wants to join the meeting I have the error message 500 displayed by greenlight.
I changed the server by the bigbluebutton test server I did not have this problem it works well
b3lb works with moodle
So I don’t know where the problem is.
image

Too long titles leads to error

To long Meeting titles leads to erroneous answers by B3LB

DataError at /bigbluebutton/api/create
value too long for type character varying(100)

-> Need a fix

tenants: make create parameter overrides more generic

We already support overriding logo and startup slide. This should be more generic using another Model allowing to override more settings. It should be possible to block, set or override settings. Parameter candidates:

  • bannerText
  • bannerColor
  • muteOnStart
  • logoutURL
  • maxParticipants
  • welcome
  • duration

BBB plugins in (Next|Own)Cloud not working

NC/OC are encoding spaces in the query string by %20 rather than +. Although the BBB API suggests to use + BBB also accepts %20.

B3lb rejects those requests due how the checksum validation is implemented.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.