Skip to content
William-zgx edited this page Dec 29, 2021 · 7 revisions

Quick Start

系统配置要求

  • 操作系统:ubuntu18

  • CPU架构:x86

  • 最小资源配置:8核16G

BBB与Canvas集成--BBB部署及配置文档

本文档记录及提供bbb服务器配置注意事项及部分问题解决方案,更多的问题解决方案建议参考项目开源社区。

安装前检查

  1. 服务器80、443端口空闲
  2. 用于配置SSL证书的解析到公网IP的域名。
  3. 服务器语言环境配置为"en_US.UTF-8"

BBB部署

提供部署脚本"bbb-install.sh" wget -qO- https://ubuntu.bigbluebutton.org/bbb-install.sh | bash -s -- -w -a -v bionic-23 -s bbb.example.com -e info@example.com 此命令拉取最新版本的bbb-install.sh,将其发送到 Bash shell 解释器,并使用提供的参数安装 BigBlueButton。其中:

  • -w 安装简单防火墙 (UFW) 以限制对 TCP/IP 端口 22、80 和 443 以及范围 16384-32768 内的 UDP 端口的访问,
  • -a 安装 API 演示(可以轻松地在服务器上进行一些快速测试),
  • -v bionic-23 安装最新版本的 BigBlueButton 2.3.x,
  • -s将服务器的主机名设置为bbb.example.com,并且
  • -e 为 Let's Encrypt 提供一个电子邮件地址,以便为主机生成有效的 SSL 证书。
  • (建议安装API演示,以检验各部分功能是否正常)
  • (执行wget命令部署BBB时,需要将bbb.example.cominfo@example.com更改为自己的域名和邮箱,尤其是域名需要解析到服务器公网IP)
  • 检验BBB部署是否完成(更多检查选项可通过sudo bbb-conf查询:
    • 开启BBB服务:sudo bbb-conf --start
    • 停止BBB服务:sudo bbb-conf --stop
    • 检查BBB服务状态:sudo bbb-conf --status
    • 检查BBB服务错误:sudo bbb-conf --check
  • 检验BBB部署后,可以使用sudo apt-get purge bbb-demo卸载API演示

BBB开发

  1. Git 环境配置
  • 克隆一个仓库
  • 创建一个分支
  • 将更改推送回存储库
  • (检查开源项目版本)
  1. 开发环境配置
  • 安装核心开发工具(java JDK)
    • sudo apt-get install git-core ant ant-contrib openjdk-8-jdk-headless
  • 设置 JAVA_HOME变量
    • sudo vi ~/.profile
    • export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64(在文件末尾添加)
    • 重新加载配置文件source ~/.profile
  • 安装开发工具
    • curl -s "https://get.sdkman.io" | bash
    • source "$HOME/.sdkman/bin/sdkman-init.sh"
    • sdk install gradle 5.5.1
    • sdk install grails 3.3.9
    • sdk install sbt 1.2.8
    • sdk install maven 3.5.0 (注意:开发测试前,将/usr/share/bbb-web/WEB-INF/classes/application.yml文件中的secure: false设置为false)
  1. HTML5客户端开发

    BigBlueButton 中的 HTML5 客户端是使用框架Meteor构建的。需要安装下列组件。

  • 安装 Meteor.js
    • curl https://install.meteor.com/ | sh
  • 打开文件位置bigbluebutton-html5/并设置适当的 Meteor 版本(需要在相应目录执行,不然后面会报错!!!)
    • meteor update --allow-superuser --release 1.10.2
  • NginX 重定向到 Meteor
    • 更改/etc/bigbluebutton/nginx/bbb-html5.nginx使用4100端口用于开发测试。
  • 更改设置以使得摄像头和屏幕共享正常使用
    • grep "wsUrl" /usr/share/meteor/bundle/programs/server/assets/app/config/settings.yml(记录得到的数据内容)
    • /private/config/settings.yml中的wsUrl值改为上一步中的值。
  • 修改代码及配置
  • 打包开发版本的 HTML5 客户端
    • sudo systemctl stop bbb-html5先暂停生产版本的HTML5客户端
    • 安装 npm 依赖
      • meteor npm install
    • 运行开发板程序
      • npm start
    • 注意:通过“npm start”启动开发HTML5客户端后,若在麦克风回声测试过程中可能会看到错误“呼叫超时(错误1006)”,需要将bigbluebutton-html5/private/config/settings.yml中的sipjsHackViaWs配置为true
    • 运行部署脚本bigbluebutton-html5/deploy_to_usr_share.sh,本地部署BBB HTML5。(需要将上面步骤中的nginx端口修改回poolhtml5servers)
  • 生产版部署:
    • meteor build --server-only ~/dev/bigbluebutton/bigbluebutton-html5/meteorbundle
    • Meteor 会将开发版本构建为一个.tar.gz文件,因此我们需要将其解压缩并将其放置在正确的目录中bbb-html5以供使用。
    • sudo tar -xzvf ~/dev/bigbluebutton/bigbluebutton-html5/meteorbundle/*.tar.gz -C /usr/share/meteor
    • 开启HTML5服务sudo systemctl start bbb-html5
  1. BBB-Web 开发
  • BigBlueButton 的一些组件需要 bbb-common-message。所以需要先构建这个。否则,您将遇到编译错误。
    • ~/dev/bigbluebutton/bbb-common-message路径下运行./deploy.sh
  • ~/dev/bigbluebutton/bigbluebutton-web/grails-app/conf/bigbluebutton.properties文件中修改BBB服务器的地址和密钥。(查看方法:sudo bbb-conf --secret)
  • 授权用户上传文稿及写入日志
    • sudo chmod -R ugo+rwx /var/bigbluebutton
    • sudo chmod -R ugo+rwx /var/log/bigbluebutton
  • 创建文件-p ~/.sbt/1.0,并写入
    • resolvers += "Artima Maven Repository" at "https://repo.artima.com/releases"
    • updateOptions := updateOptions.value.withCachedResolution(true)
  • ~/dev/bigbluebutton/bigbluebutton-web/中构建BBB Web
    • 下载依赖库./build.sh
    • 启动 grails 并告诉侦听端口 8090 ./run.sh
  • run bbb-web 时会提示必须是bbb user才可以(解决:将run.sh中的判断语句改为自己的用户名)
  1. BBB Web部署
  • 将所有项目编译到一个单一的 war
    • grails assemble
  • 创建新目录并打开
    • mkdir exploded && cd exploded
  • 解压新建目录下的war内容
    • jar -xvf ../build/libs/bigbluebutton-0.10.0.war
  • 检查所有jar依赖项都列出后复制.cp ../run-prod.sh .
  • 为当前的生产版本复制一份。
    • sudo cp -R /usr/share/bbb-web /usr/share/bbb-web-old
  • 删除所有我们需要复制用于生产的文件
    • sudo rm -rf /usr/share/bbb-web/assets/ /usr/share/bbb-web/META-INF/ /usr/share/bbb-web/org/ /usr/share/bbb-web/run-prod.sh /usr/share/bbb-web/WEB-INF/
  • 将编译好的文件复制到生产目录中
    • sudo cp -R . /usr/share/bbb-web/
  • 配置权限
    • sudo chown bigbluebutton:bigbluebutton /usr/share/bbb-web
    • sudo chown -R bigbluebutton:bigbluebutton /usr/share/bbb-web/assets/ /usr/share/bbb-web/META-INF/ /usr/share/bbb-web/org/ /usr/share/bbb-web/run-prod.sh /usr/share/bbb-web/WEB-INF/
  • 运行BBB Web服务
    • sudo service bbb-web start

Livego部署

docker安装

安装相关依赖

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

导入源

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新安装

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

docker安装验证,显示版本号则成功

docker -v

启动livego

sudo docker run -p 1935:1935 -p 7001:7001 -p 7002:7002 -p 8091:8090 -d gwuhaolin/livego

livego启动验证

docker ps -a

显示livego的容器则成功

Canvas快速配置(development)

前置工作(选做)

改密码

sudo passwd root

换源

sudo vim /etc/apt/sources.list

替换成如下内容

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

更新

sudo apt update

安装git

sudo apt-get install git

开始配置

postgresql

卸载已有postgresql

sudo apt purge postgresql*

添加postgresql-12的源与安装

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc  --no-check-certificate | sudo apt-key add -

sudo apt-get update
sudo apt-get -y install postgresql-12

启动postgresql

sudo service postgresql start

更改数据库默认用户postgres的密码,yourpasswd即密码

sudo su postgres
psql -c "alter user postgres with password 'yourpasswd'"

退出数据库终端(ctrll+D)

创建与目前操作系统用户对应的数据库用户并赋权

sudo -u postgres createuser $USER
sudo -u postgres psql -c "alter user $USER with superuser" postgres 

更改当前用户的密码,yourpasswd即密码

sudo -u postgres psql -c "alter user $USER with password 'yourpasswd'"

退出数据库终端(ctrll+D)

创建数据库

createuser canvas --no-createdb --no-superuser --no-createrole --pwprompt
createdb canvas --owner=canvas

验证,显示出用户canvas即成功

sudo -u postgres createuser $USER
\du

下载代码

mkdir ~/workspace; cd ~/workspace
git clone https://github.com/XDTD/guokehuiyi.git 
cd guokehuiyi/canvas
git checkout stable
git fetch

相关依赖安装

sudo apt-get update
sudo apt-get -y install postgresql-12 zlib1g-dev libxml2-dev libsqlite3-dev libpq-dev libxmlsec1-dev curl build-essential

ruby(apt安装方式)

sudo apt update
sudo apt -y install software-properties-common
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt -y install ruby2.7  ruby2.7-dev

ruby从2.5升级到2.7,ubuntu apt安装不会更新gem,这里需要手动更新软链接

sudo rm -rf /usr/bin/gem
sudo ln -s /usr/bin/gem2.7 /usr/bin/gem

一定是先执行上面的再安装bundler

验证,分别显示ruby 2.7.5p203和3.1.6则成功

ruby -v
gem -v

java安装

sudo apt update
sudo apt install -y openjdk-8-jdk 
java -version
sudo update-alternatives --config java
sudo vim /etc/environment

加入以下内容

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

使配置生效

source /etc/environment

验证,显示/usr/lib/jvm/java-8-openjdk-amd64则成功

echo $JAVA_HOME

bundle

sudo gem install bundle
sudo gem install bundler -v 2.2.24
sudo gem install nokogumbo scrypt sanitize
bundle _2.2.24_ install --without pulsar

验证,显示Bundler version 2.2.24则成功

bundle -v

yarn安装

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

验证,显示1.22.15则成功

yarn -v

nodejs 14

sudo apt remove nodejs*
sudo apt autoremove
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs

验证,显示v14.18.2则成功

node -v

切换yarn源

npm config set registry https://registry.npm.taobao.org/

使用yarn安装依赖

yarn install --pure-lockfile

配置文件

for config in amazon_s3 delayed_jobs domain file_store outgoing_mail security external_migration dynamic_settings database; \
          do cp -v config/$config.yml.example config/$config.yml; done

这一步删了--without pulsar,不知道影响大不大

export PGHOST=localhost
/usr/lib/postgresql/12/bin/initdb ~/postgresql-data/ -E utf8

改配置文件

cd ~/workspace/canvas
cp config/dynamic_settings.yml.example config/dynamic_settings.yml
cp config/database.yml.example config/database.yml
sudo vim  config/database.yml

将里边数据的name和用户密码更改,现在如果只是本地测试只用改test和development的,数据库都改成canvas,后续如果要发布需要额外建立s数据库对应production的

继续配置,将canvas的拥有权赋给当前用户,

sudo chown -R $USER config/environment.rb log tmp public/assets \
                              app/stylesheets/_brandable_variables_defaults_autogenerated.scss \
                              app/stylesheets/brandable_css_brands Gemfile.lock config.ru

canvas数据库初始化

bundle exec rails db:initial_setup

会要求输入管理员的邮箱,密码和机构名称,后续依靠这一步输入的邮箱和密码登录canvas,注意:在刚开始这个账户是登录canvas的唯一用户(相当于root),依靠这个用户登录后开放注册或者导入账号才能有其他账号

example@qq.com
examplePasswd
exampleInstitution

canvas初始化

这一步可能会报parallel的错误,网上查询是cpu核数不够,但去看canvas的issue应该是canvas自己的bug,不大影响后续安装使用

bundle exec rails canvas:compile_assets

防火墙

云服务器需要在云服务器商配置安全组规则,增加端口3000的tcp入规则,如果服务器上本身还安装了防火墙ufw,还需要在ufw上增加规则

sudo ufw allow 3000/tcp
sudo ufw reload

启动canvas

首先需要启动livego,bbb,posgresql

如果是本地直接运行如下命令,然后打开localhost:3000即可

bundle exec rails server

如果是在服务器上执行如下命令,然后打开ip:3000。

 bundle exec rails s -b 0.0.0.0 -p 3000

在浏览器访问http://127.0.0.1:3000/,账号密码即上面输入的邮箱和密码

重启canvas

development版本在后台运行的时候可能会因为资源配置太低等原因卡死,这个时候需要重启,执行如下命令即可,注意下面的目录/path_to_guokehuiyi/需要更改为canvas的安装目录

cat /path_to_guokehuiyi/canvas/tmp/pids/server.pid
kill -9  pid
bundle exec rails s -b 0.0.0.0 -p 3000

脚本相关参数

pdfListen.sh需要填入postgresql的密码,地址,端口,用户等参数

result=`psql "host=127.0.0.1 port=5432 user=canvas  password=yourpassword dbname=canvas" << EOF
select url from url_to_livego order by course_id;
\q
EOF `

以及果壳会议的路径

# path
guokehuiyiPath="your guokehuiyi path"

verify.sh中也需要上述参数

psql "host=127.0.0.1 port=5432 user=canvas  password=yourpassword dbname=canvas" << EOF

# path
guokehuiyiPath="your guokehuiyi path"

Software Design

整体架构

系统分为课程管理系统(canvas)和线上会议系统(Bigbulebutton)两部分,我们的设计是将用户权限控制集中于课程管理系统中,通过canvas进入Bigbulebutton,开启课堂/会议直播,从而实现二者的集成。系统框架如下图所示:

img

系统框架图

​ 其中,Postgresql作为数据库用于存储用户信息、课程信息等,Redis优化网站缓存,apache2用于课程管理网站的发布。BBB Web实现了BBB的API,允许进行第三方集成,本次软件项目中与Canvas的集成即通过BBB API实现。RedisPubSub提供了BBB服务器上运行的不同应用程序之间的通信通道。BBB Apps是主要应用程序,它将不同的应用程序整合在一起以在会议中提供实时协作。BBB HTML5客户端通过端口443(SSL)直接与BBB服务器连接。

对于该架构下的软件功能,我们分为Canvas复现、BBB复现、系统集成、板书记录功能实现和便携共享功能实现等几部分分别进行分析。

Canvas复现

Canvas对于用户权限的控制主要通过Postgresql数据库实现,通过数据库存储的信息来判定当前用户是否有执行某些操作的权限;

后续对Canvas的后台逻辑进行了分析,Canvas基于ruby on rails实现,其将用户的Dashboard作为应用的根目录,通过缓存中是否进行过登录验证来决定跳向登陆界面还是控制台界面,而其控制台会直接显示当前用户拥有/参加的课程,进入课程后会根据用户角色对应的权限显示不同的界面,而课程管理中文件传输、作业考试、讨论区等功能就在此处实现。我们对于代码的更改主要在课程界面处,对应course的controller和view。源码中相关目录为guokehuiyi/canvas/app/models和guokehuiyi/canvas/app/views/courses。

img Canvas界面

Bigbulebutton复现

概述

Bigbluebutton(BBB)是一个用于在线学习的开源网络会议系统,其使用浏览器对Web实时通信(WebRTC)库的内置支持,提供高质量的音频、视频和屏幕共享。其完整的线上会议系统为我们提供了音视频共享、PPT播放、分组讨论等诸多功能。

​ 通过在服务器部署BBB及其Demo,即可实现基于WebRTC的音频共享。BBB的部署及开发流程请参阅项目部署文档。果壳会议的集成实现并未修改BBB的主体代码及架构,而是在BBB Web实现BBB API的基础上进行集成开发。

​ 对BBB服务器进行API调用,应用程序会向BBB服务器API端点(服务器域名/bigbluebutton/api)发出HTTPS请求。BBB服务器向所有API调用返回一个XML响应。

img BBB界面图

​ 对于每个传入的API请求,控制器计算整个HTTPS查询字符串和服务器共享密钥的组合的校验和。然后它将传入的校验和与计算出的校验和进行匹配。如果它们匹配,则控制器接受传入的请求。

组件功能

BigBlueButton 建立在底层组件的坚实基础之上,包括 NginX、FreeSWITCH、Kurento、Redis、Node.js、React.js 等。如图3所示,BBB各部分功能如下:

· bbb-html5:在浏览器中加载的 HTML5 客户端。利用 MongoDB 和 React.js 的客户端服务器端 Meteor 应用程序。

· MongoDB:用于使每个 BigBlueButton 客户端的状态与 BigBlueButton 服务器保持一致。

· bbb-web:实现 BigBlueButton API 和用于演示的文档转换。

· Redis PubSub 提供了 BigBlueButton 服务器上运行的不同应用程序之间的通信通道。

· Redis 数据库:录制会议时,所有事件都存储在 Redis DB 中。当会议结束时,录制处理器将把所有录制的事件以及不同的原始(PDF、WAV、FLV)文件进行处理。

· akka-bbb-apps:处理服务器上会议状态的服务器端应用程序,它将不同的应用程序整合在一起以在会议中提供实时协作。它提供用户列表、聊天、白板、会议中的演示。

· bbb-fsesl-akka:向 FreeSWITCH 发送命令的组件。

· bbb-playback-presentation:录制和播放,创建演示布局。

· bbb-webrtc-sfu:将来自客户端的传入请求桥接到 Kurento 的服务器。

· kurento-media-server:用于发送/接收/录制视频的 WebRTC 媒体服务器(网络摄像头和屏幕共享)。

· bbb-freeswitch-core:用于发送/接收/录制音频的 WebRTC 媒体服务器。

基本API调用

其基本关键字及调用参数如下表,更多关键词请参与BBB官方文档。

表.1 API管理关键字
关键字 功能
create 创建会议
join 新用户加入会议
end 结束会议
表.2 API调用基本参数
参数 功能
name 定义会议名词
meetingID 会议编号
attendeePW 参会者密钥
moderatorPW 主持人密钥