JitsiMeet Docker 安装及负载均衡配置
jitsi 是一款开源的视屏会议软件,最大支持 75 人同时在线。本文将介绍如何在 docker 中安装和使用 jitsi。本文主要以 Ubuntu 为例,若是 Windows,建议使用 wsl 进行安装。
安装 Docker
Windows: 下载 Download Docker Desktop | Docker 进行安装
Ubuntu: Install Docker Engine on Ubuntu
安装 Jitsi-meet
本节主要参考:Self-Hosting Guide - Docker | Jitsi Meet
下载最新发布版本
1
2
3# 查找最新版本下载地址,然后使用 wget 下载
# 下载后的文件可能没有后缀,需要使用 mv 添加一个 `.zip` 后缀
wget $(curl -s https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep 'zip' | cut -d\" -f4)解压
1
unzip <filename>
配置
.env
1
2# 复制示例配置
cp env.example .env设置强密码
1
2
3
4# linux 中,在 .env 目录中执行
# 若执行报错,主检查 ./gen-passwords.sh 的结束符是否为 LF
# 可以通过 cat ./gen-passwords.sh -ne 查看结束符,若为 ^M$ 为则 CRLF,若为 $ 则是 LF
bash ./gen-passwords.sh创建所需的
CONFIG
目录Linux
1
mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
Windows
1
echo web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri | % { mkdir "~/.jitsi-meet-cfg/$_" }
启动服务
1
docker compose up -d
浏览器访问
https://localhost:8443
下面将介绍如何进行生产环境配置,修改完成后,需要再次执行以下命令重新应用配置
1 | docker compose down |
修改 .env 进行自定义配置
编辑 .env 文件
1 | vim .env |
修改内容如下:
1 | # 修改 Docker 对外暴露的端口 |
所有 .env 的配置,可在以下地方查到:
docker-jitsi-meet/jicofo/rootfs/defaults/jicofo.conf
配置 jwt 授权
jitsi 默认任何人都可以创建房间,为了使自建的 jitsi 资源不被恶意使用,需要限制创建房间的权限。
通过 修改 .env 配置文件
来添加权限认证,当 ENABLE_AUTH=1
后,只有有合法正确的
jwt
值时,才可以新建房间。
具体的 .env
配置如下
1 | # Select authentication type: internal, jwt, ldap or matrix |
在生成 jwt 时,payload 内容如下:
1 | { |
可以通过 JSON Web Tokens -
jwt.io 来生成 token,然后在 url 后面添加 jwt=your-token
参数来传递授权进行使用。
例如:https://your-domain/room-name?jwt=your-token
插件
插件位置
从 docker-compose.yml
文件中可知,自定义插件被挂载到了
${CONFIG}/prosody/prosody-plugins-custom
中,$(CONFIG)
默认值为 ~/.jitsi-meet-cfg
。
因此,可以将自定义插件保存到
~/.jitsi-meet-cfg/prosody/prosody-plugins-custom
。
插件查找
当功能不满足要求时,可以从以下地址查找插件实现:
- jitsi-contrib/prosody-plugins: Prosody plugins for Jitsi
- jitsi-meet/resources/prosody-plugins
- 在 github 上搜索
jitsi mod
设置用户角色
jitsi 默认所有使用 token 加入会议的用户都有主持人,为了更好地管理会议,可以使用插件通过 token 的 payloads 来分配所属角色。
目前找到两个插件皆可实现该功能,但测试下来,都有一些 bug :
prosody-plugins/token_affiliation
这个插件通过在用户加入会议后,再次修改角色来实现权限控制,但它存在滞后性,经常用户加入会议后,提示为主持人,然后才被修改为普通成员
jitsi-token-moderation-plugin/mod_token_moderation.lua
这个插件通过重写
set_affiliation
方法来实现控制但是会议中,无法为其它用户分配主持人角色
经权衡,最终选择方案 2
mod_token_affiliation 插件
插件安装
1 | cd ~/.jitsi-meet-cfg/prosody/prosody-plugins-custom |
启用插件
打开 .env
文件,添加如下内容:
1 | # 取消自动赋予 owner |
生成 token 时,向 content.user
中添加 affiliation
字段,示例如下:
1 | { |
方案 2
安装插件
1 | cd ~/.jitsi-meet-cfg/prosody/prosody-plugins-custom |
启用插件
打开 .env
文件,添加如下内容:
1 | # 启用组件,多个组件之间使用 , 号分隔 |
生成 token 时,添加 moderator 字段,示例如下:
1 | { |
添加事件回调
本节主要参考:prosody-plugins/event_sync
jitis meet 使用 prosody 进行即时通讯,诸多业务都可以使用 prosody 插件来实现,本节使用event_sync/mod_event_sync_component.lua 插件来实现事件回调
为了接入既有系统,需要获取会议的创建结束信息,通过该插件来添加事件回调到既有的系统中。
插件安装
1 | # 进入自定义插件库 |
插件修改
可以使用 vscode 远程服务器后对文件进行修改
回调返回 display_name
原插件没有返回用户的 display_name,当用户通过网址进入时,无法确定用户的身份,因此需要返回用户自己设置的 display_name 供回调服务器处理。
修改 occupant_joined 调用:
1 | -- 找到 occupant_joined 函数调用位置 |
修改 EventData:on_occupant_joined 函数:
1 | -- 找到 EventData:on_occupant_joined 函数,修改为如下代码: |
添加单点参会功能
可选,实践下来不太好用
本节参考:mod_http_muc_kick - Prosody Community Modules
当用户加入后,检测是否有同名用户,若有,则踢出存在的同名用户,保证同一时间,只有一个同名用户参会
1 | -- 1. 在顶部添加导入 |
启用插件
向 ~/.jitsi-meet-cfg/prosody/config/conf.d
目录中添加以
.cfg.lua
为后缀的配置文件,配置文件格式参考
~/.jitsi-meet-cfg/prosody/config/prosody.cfg.lua
。
~/.jitsi-meet-cfg/prosody/config/prosody.cfg.lua
是
prosody 的配置入口文件,conf.d 目录中任何 .cfg.lua
都会被包含在这个配置中。
每个插件建议都新建一个配置文件,保证配置独立。
1 | # 进入到配置目录 |
编辑 sudo vim event_sync.cfg.lua
配置,添加如下内容:
1 | Component "event_sync.meet.jitsi" "event_sync_component" |
注意:api_prefix 末尾没有 / 号
该组件回调的 api
为:post http://your.api.server/api/events/xx
触发的事件回调如下:
1 | local URL_EVENT_ROOM_CREATED = api_prefix..'/events/room/created'; |
打开防火墙端口
docker-jitsi-meeting 中的通信结构如下图所示
80,443/tcp
是 UI 的 web 端口80,443 通过 修改 .env 配置文件 章节进行指定,本文中分别修改为:7080,7043
10000/udp
是 RTP media 端口,即 Jitsi Vedio Bridge 使用的端口
通过以下命令新建防火墙入站规则:
windows 中:
1 | # 开放 tcp |
ubuntu 中:
1 | sudo ufw allow 7043,7080/tcp |
配置端口转发
若服务器位于 NAT 中,需要在 NAT 中配置端口转发,将外网的
80/tcp,443/tcp,10000/udp
端口分别转发到服务器对应的端口上。
配置 nginx 反向代理
有时候外网的80,443
被 nginx 占用了,我们需要设置 nginx
反向代理 jitsi,此时需要将 10000/udp
转发到 docker
所在服务器,然后在 nginx 中添加如下设置:
1 | # nginx.conf 主文件 |
完成上述步骤的设置后,即可通过 https://yourdomain
来进行访问了
通过 IFrame 集成进现有系统
可以使用 IFrame API与现有系统进行集成。
加载
external_api
1
<script src='https://<your-domain>/external_api.js'></script>
实例化 api
1
api = new JitsiMeetExternalAPI(domain, options)
- domain 不带协议号(https/http)
- options 见 IFrame API | Jitsi Meet
jitsi 相关镜像简介
base
Debian stable base image with the S6 Overlay for process control and the Jitsi repositories enabled. All other images are based on this one.
base-java
Same as the above, plus Java (OpenJDK).
web
Jitsi Meet web UI, served with nginx.
Jitsi Meet 的 web 界面
prosody
Prosody, the XMPP server.
用于即时通讯的开源库
jicofo
Jicofo, the XMPP focus component.
jvb
Jitsi Videobridge, the video router.
Jitsi 的视屏中转中心,处理视屏流的分发
jigasi
Jigasi, the SIP (audio only) gateway.
jibri
Jibri, the broadcasting infrastructure.
参考
本文参考以下文章,在此致以诚挚谢意!
jitsi/docker-jitsi-meet: Jitsi Meet on Docker
Self-Hosting Guide - Docker | Jitsi Meet
lib-jitsi-meet/doc/tokens.md at master · jitsi/lib-jitsi-meet · GitHub
prosody-plugins/event_sync/README.md at main · jitsi-contrib/prosody-plugins · GitHub
A tutorial on how to customize the Jitsi meet front end - Meetrix.IO
JSON Web Token (JWT) authentication Prosody plugin