alangecker / bigbluebutton-docker

merged into https://github.com/bigbluebutton/docker
GNU Lesser General Public License v3.0
99 stars 33 forks source link

Server error after successful login #62

Closed monochromec closed 3 years ago

monochromec commented 3 years ago

After container admin and account creation as described in the README file, I get a "Server Error Invalid BigBlueButton Endpoint and Secret" error message instead of the dashboard.

Tracing this back via the generated HTML I can narrow it down to an exception in line #221 of app/controllers/application_controller.rb but here my lack of Ruby skills / never mind the used web framework fails to take me any further.

alangecker commented 3 years ago

the BigBlueButton API is not reachable.

I posted here https://github.com/alangecker/bigbluebutton-docker/issues/35#issuecomment-660343584 some hints how to trace down the error a little bit more, maybe that helps?

cjhille commented 3 years ago

Getting the same error after upgrade to the current 2.2.x (3117dea). Before I removed all containers+volumes (compose down -v) and rebuilt core image from scratch.

The bbb-web process apparently crashed, hence nothing is listening on port 8090:

bbb-web        | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'meetingService' defined in class path resource [spring/resources.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'long' for property 'usersTimeout'; nested exception is java.lang.NumberFormatException: For input string: "${usersTimeout}"
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
core_1        | bbb-web        |    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
core_1        | bbb-web        |    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
core_1        | bbb-web        |    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
core_1        | bbb-web        |    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
core_1        | bbb-web        |    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
core_1        | bbb-web        |    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
core_1        | bbb-web        |    at grails.boot.GrailsApp.run(GrailsApp.groovy:84)
core_1        | bbb-web        |    at grails.boot.GrailsApp.run(GrailsApp.groovy:393)
core_1        | bbb-web        |    at grails.boot.GrailsApp.run(GrailsApp.groovy:380)
core_1        | bbb-web        |    at grails.boot.GrailsApp$run.call(Unknown Source)
core_1        | bbb-web        |    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
core_1        | bbb-web        |    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
core_1        | bbb-web        |    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
core_1        | bbb-web        |    at org.bigbluebutton.web.Application.main(Application.groovy:8)
core_1        | bbb-web        |    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
core_1        | bbb-web        |    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
core_1        | bbb-web        |    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
core_1        | bbb-web        |    at java.lang.reflect.Method.invoke(Method.java:498)
core_1        | bbb-web        |    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
core_1        | bbb-web        |    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
core_1        | bbb-web        |    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
core_1        | bbb-web        |    at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59)
core_1        | bbb-web        | Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'long' for property 'usersTimeout'; nested exception is java.lang.NumberFormatException: For input string: "${usersTimeout}"
core_1        | bbb-web        |    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:608)
core_1        | bbb-web        |    at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:615)
core_1        | bbb-web        |    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:216)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1580)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1539)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1281)
core_1        | bbb-web        |    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:551)
core_1        | bbb-web        |    ... 28 common frames omitted
core_1        | bbb-web        | Caused by: java.lang.NumberFormatException: For input string: "${usersTimeout}"
core_1        | bbb-web        |    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
core_1        | bbb-web        |    at java.lang.Long.parseLong(Long.java:578)
core_1        | bbb-web        |    at java.lang.Long.valueOf(Long.java:803)
core_1        | bbb-web        |    at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:211)
core_1        | bbb-web        |    at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:113)
core_1        | bbb-web        |    at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:470)
core_1        | bbb-web        |    at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:443)
core_1        | bbb-web        |    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:200)
core_1        | bbb-web        |    at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:588)
core_1        | bbb-web        |    ... 34 common frames omitted
cjhille commented 3 years ago

@alangecker after some digging around in the upstream commits I saw that bigbluebutton.properties has changed and needs to be updated for the current branch to work. https://github.com/bigbluebutton/bigbluebutton/commit/2fb26ff0cf8de7a0779eec354fcdc5ff0b24ee79#diff-497ed85f0ee8170360c5c42a78c52810998253ce7d6ac49a8560007283dca31cR218-R227 Can you think of a proper mechanism to achieve a version lock? This might break again at any time if they update configs in bbb-web ubuntu packages.

alangecker commented 3 years ago

@cjhille This should be fixed with Release v2.2.27-1 #64 I'm about to test this and merge it soon to the main branch v2.2.x

I recently wrote something regarding the current state and goal for version locking here: Hacktoberfest #61 In the v2.3.x branch there is only the instable dependency to bbb-web and bbb-apps-akka left, everything else is already somehow 'version pinned' and, hopefully, everything will be until the official BBB v2.3 release :)

alangecker commented 3 years ago

@monochromec could you resolve your issue already with my debugging hints in https://github.com/alangecker/bigbluebutton-docker/issues/35#issuecomment-660343584 or with an upgrade to the newer version with ./scripts/upgrade?

monochromec commented 3 years ago

Unfortunately upgrading didn't solve the problem. And none of the hints in #35 solved the problem either. Let's see what the further RCA holds in stock.

monochromec commented 3 years ago

I'm afraid that my lack of Ruby skills actually prevent me from progressing this further...

inventivejon commented 3 years ago

Just ran into the same issue simply following the installation instructions from the README on a new clean server. So is branch 2.2.x broken? Should I try with 2.3.x instead or will it behave the same?

alangecker commented 3 years ago

@inventivejon I just tried the v2.2.x branch on a fresh debian 10 server and everything worked fine.

After the login there was indeed the "Server Error Invalid BigBlueButton Endpoint and Secret" error, but this was just due to bbb-web was still starting and the machine I used is really slow, so it took ~2 more minutes until it was fully running.

is your machine maybe also slow and did you check to early? There shoud always be following lines present in the logs which indicate that bbb-web fully started.

$ ./scripts/compose logs -f --tail=20
core_1         | bbb-web        | 2020-10-30T22:31:52.390Z INFO  o.b.p.i.PresentationConversionCompletionService - Ready to process presentation files!
core_1         | bbb-web        | 2020-10-30T22:31:52.564Z INFO  o.b.w.s.callback.CallbackUrlService - Starting callback url service.
core_1         | bbb-web        | 2020-10-30T22:31:52.581Z INFO  o.bigbluebutton.api.MeetingService - Starting Meeting Service.
core_1         | bbb-web        | 2020-10-30T22:31:52.611Z INFO  o.b.api.ClientConfigService - ClientConfigService initialised
core_1         | bbb-web        | 2020-10-30T22:31:53.636Z INFO  org.bigbluebutton.web.Application - Started Application in 152.584 seconds (JVM running for 209.176)
core_1         | bbb-web        | Grails application running at http://0.0.0.0:8090 in environment: production

You could also check whether bbb-web is available...

regarding v2.3.x I would strongly discourage from using it, since BigBlueButton itself is still in an early and unstable alpha phase and also the bbb-docker branch wasn't really tested yet.

inventivejon commented 3 years ago

Thank you for the detailed explanation. Unfortunately I switched to v2.3.x over night and checked the result this morning. On v2.3.x I result in the same behaviour. Followed your checks and this is the result:

curl http://10.7.7.2:8090/bigbluebutton/api

SUCCESS 2.0 curl http://localhost:8080/bigbluebutton/api SUCCESS 2.0 curl https://bbbtest.local/bigbluebutton/api curl: (60) SSL certificate problem: self signed certificate More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above. I wonder if the SSL certificate is the problem. Of course I can curl it with --insecure: curl https://bbbtest.local/bigbluebutton/api --insecure SUCCESS 2.0 Could this be the issue? Anyway I will switch back to v2.2.x and try again with confirming that bbb-web is running.
alangecker commented 3 years ago

ah, apparently you use bbbtest.local as the domain? it won't be able to get a certificate via lets encrypt for that because it is not a valid public domain. so either use (during setup or manually the .env file) a publicly reachable domain or - if you want to run it only locally - use the "development" setup: https://github.com/alangecker/bigbluebutton-docker/blob/v2.2.x/docs/development.md

inventivejon commented 3 years ago

My bad. I will try and let you know.

inventivejon commented 3 years ago

Hm, I don't think I will be able to get the development mode running in an internal network and still to look like a normal bbb setup. Also using an official address for the application is the opposite of what I am trying to achieve. I guess bbb is just not the right thing to use for my use case. But still, thank you very much for your help on the issue 👍

alangecker commented 3 years ago

unfortunately https - and therefore a valid certificate - is necessary for using WebRTC. If you want to use it only locally in the internal network you still need to get a certificate somehow (e.g. a let's encrypt wildcard certificate) and use it manually in an own nginx setup (the "auto https proxy" included here is not suitable for external certificates).

as soon as you have a valid certificate running, you do not need the DEV_MODE anymore! ;)

inventivejon commented 3 years ago

Sounds good. I will try that before I finally give up :) I will give feedback within this issue.

inventivejon commented 3 years ago

So that was a good step forward I am now able to login to greenlight. I will post the details in a separate message later. But now I am stuck a the home room entry. It is constantly telling me "Connecting to echo test". As far as I can see something is wrong with the websocket? Any ideas? Should I move to a separate issue? image

image

image

inventivejon commented 3 years ago

Okay, intermediate state. Looks like my nginx needs to explicitely forward the socket connection. Just not sure to which port. Will continue investigation...

alangecker commented 3 years ago

@inventivejon ah jeps! you can have a look into the auto https proxy config, how the websocket forwarding is done there: https://github.com/alangecker/bigbluebutton-docker/blob/v2.2.x/mod/https/site-ipv4only.conf

inventivejon commented 3 years ago

Thank you so much. That actually did the trick. Here is what I did.

  1. During executing the setup script selection https with no (as mention on the "Integration into an existing web server")
  2. Executing letsencrypt to create a wildcard certificate (as suggested) based on a domain I control and add the preferred subdomain as an entry with a specific local IP.
  3. Spinning of a new nginx with the following auth.conf config:
    
    map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
    }

server { listen 80 default_server; listen [::]:80 default_server; servername ; return 301 https://your-domain-name; }

server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; servername ; error_log /var/log/nginx/error.log warn; ssl_certificate /etc/nginx/ssl/your-domain-name.chained.crt; ssl_certificate_key /etc/nginx/ssl/your-domain-name.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:EECDH+AESGCM:EDH+AESGCM; ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 ssl_stapling on; # Requires nginx >= 1.3.7 ssl_stapling_verify on; # Requires nginx => 1.3.7 resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; http2_idle_timeout 5m; # up from 3m default

location / { proxy_http_version 1.1; proxy_pass http://10.7.7.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_cache_bypass $http_upgrade; proxy_read_timeout 6h; proxy_send_timeout 6h; client_body_timeout 6h; send_timeout 6h; proxy_redirect http://10.7.7.1:8080/ https://your-domain-name/; } }


And sorry @monochromec and @cjhille for using this issue discussion a bit to much :)

----

#edit by @chandi: I allowed myself to put the config into a markdown code block :)
alangecker commented 3 years ago

Thank you so much. That actually did the trick.

great :)