JitsiMeet docker 部署及设置 jw 授权

image-20230625233244755

jitsi 是一款开源的视屏会议软件,最大支持 75 人同时在线。本文将介绍如何在 windows 的 docker 中安装和使用 jitsi。

安装步骤

安装 docker-desktop

Download Docker Desktop | Docker 下载安装

下载 docker-jitsi-meet

latest release 下载安装文件,该文件为源码,下载后解压到自己希望安装的目录即可。

新建所需配置目录

1
2
3
4
5
6
7
8
# 从命令行进入到安装的目录,假设目录为:D:\Develop\TestTemp\docker-jitsi-meet-stable-8615
cd d:
cd D:\Develop\TestTemp\docker-jitsi-meet-stable-8615

# 在用户目录下新建.jitsi-meet-cfg,在里面新建以下目录:
# web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri
# 可以在 powershell 中使用下列命令批量新建
echo web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri | % { mkdir "~/.jitsi-meet-cfg/$_" }

在 bash 中,可以使用下列命令创建目录:

1
mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}

修改 .env 配置文件

将目录中的 env.example文件重命名为 .env,使用记事本打开编辑,以下仅列出修改的部分:

增加 xmpp 密码

1
2
3
4
# linux 中,在 .env 目录中执行
# 若执行报错,主检查 ./gen-passwords.sh 的结束符是否为 LF
# 可以通过 cat ./gen-passwords.sh -ne 查看结束符,若为 ^M$ 为则 CRLF,若为 $ 则是 LF
bash ./gen-passwords.sh

修改其它配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 修改docker对外暴露的端口
# Exposed HTTP port
HTTP_PORT=7080
# Exposed HTTPS port
HTTPS_PORT=7043

# 修改访问的网址
# Public URL for the web service (required)
# 如果是本机测试,不要添加协议,但要添加端口,如下
# PUBLIC_URL=192.168.3.240:7043
PUBLIC_URL=https://yourdomain
# 容器主机的 IP, 当服务器位于 NAT 环境时,需要配置
JVB_ADVERTISE_IPS=192.168.23.12

# 添加 jwt 认证
# Enable authentication
ENABLE_AUTH=1
# 创建房间后,其他人只需要输入房间名称即可进入
# Enable guest access
ENABLE_GUESTS=1
# Select authentication type: internal, jwt, ldap or matrix
AUTH_TYPE=jwt
# JWT authentication
# Application identifier
JWT_APP_ID=my_jitsi_app_id
# Application secret known only to your token generator
JWT_APP_SECRET=my_jitsi_app_secret

启动 docker-compose.yml

docker-compose up -d

防火墙开放端口

docker-jitsi-meeting 中的通信结构如下图所示

  • 80,443/tcp 是 UI 的 web 端口

    80,443 通过 修改 .env 配置文件 章节进行指定,本文中分别修改为:7080,7043

  • 10000/udp 是 RTP media 端口,即 Jitsi Vedio Bridge 使用的端口

通过以下命令新建防火墙入站规则:

windows 中:

1
2
3
4
5
# 开放 tcp
netsh advfirewall firewall add rule name=jitsi-meeting-tcp dir=in action=allow protocol=TCP localport=7043,7080

# 开放 udp
netsh advfirewall firewall add rule name=jitsi-meeting-udp dir=in action=allow protocol=UDP localport=10000

ubuntu 中:

1
2
3
sudo ufw allow 7043/tcp
sudo ufw allow 7080/tcp
sudo ufw allow 10000/udp

配置端口转发

若服务器位于 NAT 中,需要在 NAT 中配置端口转发,将外网的 80/tcp,443/tcp,10000/udp 端口分别转发到服务器对应的端口上。

配置 nginx 反向代理

有时候外网的80,443 被 nginx 占用了,我们需要设置 nginx 反向代理 jitsi,此时需要将 10000/udp 转发到 docker 所在服务器,然后在 nginx 中添加如下设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# nginx.conf 主文件
http {
include mime.types;

# http_servers/jitsi.conf
# jitsi 会议配置
server {
listen 443 ssl;
server_name yourdomain;

#ssl_certificate F:/encrypt/keys/web/iepc/iepc.shenweitech.cn-chain.pem;
#ssl_certificate_key F:/encrypt/keys/web/iepc/iepc.shenweitech.cn-key.pem;

ssl_certificate F:/encrypt/keys/root/fullchain.pem;
ssl_certificate_key F:/encrypt/keys/root/privkey.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_pass https://192.168.23.12:7043;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}

location /xmpp-websocket {
proxy_pass https://192.168.23.12:7043;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location /colibri-ws {
proxy_pass https://192.168.23.12:7043;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

add_header Access-Control-Allow-Origin "*";
default_type 'text/html';
charset utf-8;
}
}

完成上述步骤的设置后,即可通过 https://yourdomain 来进行访问了

jwt 认证

jitsi 默认任何人都可以创建房间,为了使自建的 jitsi 资源不被恶意使用,需要限制创建房间的权限。

通过 修改 .env 配置文件 来添加权限认证,当 ENABLE_AUTH=1 后,只有有合法正确的 jwt 值时,才可以新建房间。

jwt 的 payload 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"context": {
"user": {
"avatar": "https:/gravatar.com/avatar/abc123",
"name": "John Doe",
"email": "[email protected]",
"id": "abcd:a1b2c3-d4e5f6-0abc1-23de-abcdef01fedcba"
},
"group": "a123-123-456-789"
},
"aud": "jitsi",
"iss": "my_client",
"sub": "meet.jit.si",
"room": "*",
"exp": 1500006923
}

可以通过 JSON Web Tokens - jwt.io 来生成 token,然后按在 url 后面添加 jwt=your-token 参数来传递授权。

例如:https://your-domain/room-name?jwt=your-token

通过 IFrame 集成进现有系统

可以使用 IFrame API与现有系统进行集成。

  1. 加载 external_api

    1
    <script src='https://<your-domain>/external_api.js'></script>
  2. 实例化 api

    1
    api = new JitsiMeetExternalAPI(domain, options)

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.

参考

lib-jitsi-meet/doc/tokens.md at master · jitsi/lib-jitsi-meet · GitHub

Self-Hosting Guide - Docker | Jitsi Meet

IFrame API | Jitsi Meet

A tutorial on how to customize the Jitsi meet front end - Meetrix.IO

JSON Web Token (JWT) authentication Prosody plugin