{"id":3916,"date":"2024-02-29T23:44:05","date_gmt":"2024-03-01T04:44:05","guid":{"rendered":"https:\/\/dft.wiki\/?p=3916"},"modified":"2026-06-08T16:24:53","modified_gmt":"2026-06-08T20:24:53","slug":"deploying-a-virtual-classroom-infrastructure-with-bigbluebotton","status":"publish","type":"post","link":"https:\/\/dft.wiki\/?p=3916","title":{"rendered":"Deploying a Virtual Classroom Infrastructure with BigBlueBotton"},"content":{"rendered":"<p><strong>BigBlueButton<\/strong> (aka BBB) is an open-source [<a href=\"https:\/\/github.com\/bigbluebutton\/bigbluebutton\">Link<\/a>] software with features designed for teachers, professors, instructors, and tutors to deliver real-time audio, video, screen sharing, slide presentations, whiteboard collaboration, and more. All resources can be downloaded afterwards, including notes, chat logs, whiteboard annotations, polling results, and analytics.<\/p>\n<hr \/>\n<p><strong>SYSTEM PREPARATION<\/strong><\/p>\n<p>The minimum requirements depend on how many clients will be connected at the same time. The official documentation recommends the following, though half these resources are sufficient for a quick local test:<\/p>\n<ul>\n<li>Virtual Machine \/ VPS\n<ul>\n<li>8 vCPU (<strong>x86_64 only<\/strong>)<\/li>\n<li>16 GB of RAM<\/li>\n<li>500 GB of Storage<\/li>\n<li>1\/4 Gbps Bandwidth<\/li>\n<li>Ubuntu 22.04<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Apply the following basic configuration and customize as needed.<\/p>\n<pre>sudo apt update &amp;&amp; sudo apt upgrade -y\r\nsudo hostnamectl set-hostname bbb.domain.com\r\necho '127.0.0.1    bbb.domain.com' | sudo tee -a \/etc\/hosts\r\necho 'LANG=\"en_US.UTF-8\"' | sudo tee \/etc\/default\/locale\r\nsudo ufw allow 80\r\nsudo ufw allow 443\r\nsudo ufw allow 16384:32768\/udp\r\nsudo ufw limit 22\r\nsudo ufw enable\r\nsudo reboot<\/pre>\n<p><strong>Note:<\/strong> Do not expose SSH to the public internet. Ideally, it should only be accessible from a local network or VPN and restricted to a limited set of sources. Be cautious!<\/p>\n<p>For production, the server should have a public IPv4 and IPv6 address (mapped or directly assigned) with a subdomain pointing to it for SSL\/TLS. For local testing, a self-signed certificate will do the job.<\/p>\n<hr \/>\n<p><strong>BBB INSTALLATION SCRIPT<\/strong><\/p>\n<p><strong>For installation in production with a real FQDN resolving to the server:<\/strong><\/p>\n<ul>\n<li>BBB 3.0.x on Ubuntu 22.04<\/li>\n<\/ul>\n<pre>wget -qO- https:\/\/raw.githubusercontent.com\/bigbluebutton\/bbb-install\/v3.0.x-release\/bbb-install.sh | sudo bash -s -- -w -v jammy-300 -s bbb.domain.com -e info@domain.com -g<\/pre>\n<ul>\n<li>BBB 2.7.x on Ubuntu 20.04<\/li>\n<\/ul>\n<pre>wget -qO- https:\/\/raw.githubusercontent.com\/bigbluebutton\/bbb-install\/v2.7.x-release\/bbb-install.sh | sudo bash -s -- -w -v focal-270 -s bbb.domain.com -e info@domain.com -g<\/pre>\n<p><strong>Note:<\/strong> The subdomain and email in the command above are used to set up Let&#8217;s Encrypt automatically for a quick, easy, and free SSL\/TLS certificate. Optionally, the argument <code>-x<\/code> instructs Let&#8217;s Encrypt to challenge the domain via DNS using a generated TXT record at installation time. The argument <code>-g<\/code> installs the <strong>GreenLight<\/strong> frontend (recommended).<\/p>\n<hr \/>\n<p><strong>TROUBLESHOOTING<\/strong><\/p>\n<p>At the end of the installation, a series of checks runs to identify potential problems. The output may look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3919\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-12-53-37.png\" alt=\"\" width=\"926\" height=\"531\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-12-53-37.png 926w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-12-53-37-300x172.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-12-53-37-768x440.png 768w\" sizes=\"auto, (max-width: 926px) 100vw, 926px\" \/><\/p>\n<p>Read through and address any issues found. Use the following commands to check the status of running services and gather more information.<\/p>\n<pre>sudo bbb-conf --check\r\nsudo bbb-conf --status\r\nsudo bbb-conf --secret\r\nsudo dpkg -l | grep bbb-\r\n[ \"$(dig +short bbb.domain.com)\" = \"$(curl -s ip.me)\" ] &amp;&amp; echo \"DNS resolution confirmed.\" || echo \"DNS resolution FAILED!\"<\/pre>\n<hr \/>\n<p><strong>CREATING ACCOUNTS<\/strong><\/p>\n<p>Create accounts with the following commands:<\/p>\n<pre>sudo docker exec -it greenlight-v3 bundle exec rake admin:create['Admin','admin@domain.com','secret_password']\r\nsudo docker exec -it greenlight-v3 bundle exec rake user:set_admin_role['user@domain.com']\r\nsudo docker exec -it greenlight-v3 bundle exec rake user:student[\"Student\",\"student@domain.com\",\"password\",\"user\"]<\/pre>\n<p>Example output:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3920\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-14-13.png\" alt=\"\" width=\"1207\" height=\"130\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-14-13.png 1207w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-14-13-300x32.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-14-13-1024x110.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-14-13-768x83.png 768w\" sizes=\"auto, (max-width: 1207px) 100vw, 1207px\" \/><\/p>\n<hr \/>\n<p><strong>BASIC TESTS<\/strong><\/p>\n<p>Navigate to your server&#8217;s address. <strong>If this page loads, it is working!<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3922\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-06-09.png\" alt=\"\" width=\"1328\" height=\"802\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-06-09.png 1328w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-06-09-300x181.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-06-09-1024x618.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-06-09-768x464.png 768w\" sizes=\"auto, (max-width: 1328px) 100vw, 1328px\" \/><\/p>\n<p>Sign in as the administrator.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3923\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-18-30.png\" alt=\"\" width=\"575\" height=\"467\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-18-30.png 575w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-18-30-300x244.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/p>\n<p>Create a classroom.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3924\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-01.png\" alt=\"\" width=\"1328\" height=\"781\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-01.png 1328w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-01-300x176.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-01-1024x602.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-01-768x452.png 768w\" sizes=\"auto, (max-width: 1328px) 100vw, 1328px\" \/><\/p>\n<p>Start the class.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3925\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-08.png\" alt=\"\" width=\"332\" height=\"282\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-08.png 332w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-08-300x255.png 300w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><\/p>\n<p>As the presenter, allow microphone access.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3926\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36-presenter.png\" alt=\"\" width=\"677\" height=\"367\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36-presenter.png 677w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36-presenter-300x163.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/p>\n<p>Select the audio input and output devices.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3928\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-06.png\" alt=\"\" width=\"677\" height=\"445\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-06.png 677w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-06-300x197.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/p>\n<p>The class is now set up.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3929\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45.png\" alt=\"\" width=\"1668\" height=\"798\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45.png 1668w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45-300x144.png 300w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45-1024x490.png 1024w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45-768x367.png 768w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-08-45-1536x735.png 1536w\" sizes=\"auto, (max-width: 1668px) 100vw, 1668px\" \/><\/p>\n<p>Share the class link with students via the chat box.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3930\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-36-32.png\" alt=\"\" width=\"568\" height=\"409\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-36-32.png 568w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-36-32-300x216.png 300w\" sizes=\"auto, (max-width: 568px) 100vw, 568px\" \/><\/p>\n<p>Or share it from the main dashboard.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3931\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-09-43.png\" alt=\"\" width=\"339\" height=\"308\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-09-43.png 339w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-09-43-300x273.png 300w\" sizes=\"auto, (max-width: 339px) 100vw, 339px\" \/><\/p>\n<p>Students do not need an account. The URL alone grants access in a default installation (additional security measures can be configured to restrict access).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3932\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-10-19.png\" alt=\"\" width=\"697\" height=\"534\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-10-19.png 697w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-10-19-300x230.png 300w\" sizes=\"auto, (max-width: 697px) 100vw, 697px\" \/><\/p>\n<p>In most cases, students will only watch and listen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3933\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36.png\" alt=\"\" width=\"677\" height=\"367\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36.png 677w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-07-36-300x163.png 300w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/p>\n<p>The class is ready to begin.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3934\" src=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-11-15.png\" alt=\"\" width=\"418\" height=\"409\" srcset=\"https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-11-15.png 418w, https:\/\/dft.wiki\/wp-content\/uploads\/sites\/15\/2024\/03\/Screenshot-from-2024-03-01-14-11-15-300x294.png 300w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>BigBlueButton (aka BBB) is an open-source [Link] software with features designed for teachers, professors, instructors, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-3916","post","type-post","status-publish","format-standard","hentry","category-web"],"_links":{"self":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3916"}],"version-history":[{"count":7,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3916\/revisions"}],"predecessor-version":[{"id":5633,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/3916\/revisions\/5633"}],"wp:attachment":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}