搭建〖jitsi meet〗视频会议服务
前言
最终诉求,只允许纯域名访问,禁止〖IP + 端口〗访问,禁止〖域名+端口〗访问。若干关键节点。若不暴露宿主端口,尽管不存在两个“禁止”顾虑,可是除个别浏览器(火狐、360浏览器)之外其余浏览器均无法使用麦克风。若暴露容器 443 端口映射至宿主,则必须〖域名+端口〗才能使用麦克风。通过 Cloudflare Origin Rules 规则,可去除域名端口。常规修改 Nginx 配置实现 IP 访问返回 403 之方法,不适用于 jitsi meet docker 服务,只能通过自定义配置追加到生效配置中,才能实现 403 界面。
选定并进入目录,执行以下命令。
1 2 3 4 5 |
wget $(curl -s https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep 'zip' | cut -d\" -f4) #获取最新版本 unzip <filename> #解压 cp env.example .env #复制创建变量文件 ./gen-passwords.sh #设置强密码 mkdir -p 路径/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri} #创建 CONFIG 目录 |
修改 .env 变量文件内容。其余未修改选项,保持默认。
1 2 3 4 5 6 7 8 9 10 11 |
CONFIG=路径/.jitsi-meet-cfg #路径自定义 HTTPS_PORT=端口 #端口设置 TZ=Asia/Shanghai #时区配置 PUBLIC_URL=域名 #访问域名 ENABLE_AUTH=1 #会议主持人验证 ENABLE_AUTO_LOGIN=0 #禁止自动登录 ENABLE_GUESTS=1 #启用访客 AUTH_TYPE=internal #验证方式 ENABLE_SCTP=1 #启用SCTP ENABLE_COLIBRI_WEBSOCKET=0 #禁用Colibri_WebSocket ENABLE_XMPP_WEBSOCKET=0 #禁用XMPP_WebSocket |
修改 docker-compose.yml 端口,与官方文档不同在于不暴露 80 端口,只要 443 映射。通过 docker compose up -d 启动。解析第一个域名,指向 jitsi meet docker 所在服务器,反向代理即可〖域名+端口〗访问,同时可〖IP + 端口〗访问,额外注意,反代时需定义 https 路径,而不是 http 路径,且路径最后不带端口,若带端口会导致域名访问时,大部分浏览器麦克风不可用,反而〖域名 + 端口〗访问一切正常。至此常规部署结束。
1 2 3 |
ports: #- '${HTTP_PORT}:80' #这里不暴露80映射端口 - '${HTTPS_PORT}:443' |
配置主持人验证,增加账号和密码。用来防止任何人在任何地方都可以无限制开启视频会议。
1 2 3 4 |
docker compose exec prosody /bin/bash #在容器路径下执行此命令 prosodyctl --config /config/prosody.cfg.lua register 用户名 meet.jitsi 密码 #配置用户名和密码 find /config/data/meet%2ejitsi/accounts -type f -exec basename {} .dat \; #验证是否配置成功 prosodyctl --config /config/prosody.cfg.lua unregister 用户名 meet.jitsi #用此命令可以删除用户 |
设置必须输入名字方可进入会议,取消视频会议中 jitsi 水印字样。注意是在 /.jitsi-meet-cfg/web/ 路径新建配置文件。官方说是追加配置,经过测试,需要把全部配置项目复制到自定义 js 文件中,然后修改。执行 docker-compose restart web 命令使配置生效。
1 2 |
config.requireDisplayName = true; #新建 custom-config.js 配置必须输入名字方可进入会议 SHOW_JITSI_WATERMARK: false, #新建 custom-interface_config.js 配置去除会议中 jitsi 水印 |
要用到第二个域名,通过 Cloudflare Origin Rules 规则,去除第一个域名端口,具体方法是先定义第二个域名 DNS CNAME 记录指向第一个域名,添加一条 Origin 规则,端口选择 jitsi meet docker 服务所在端口。因为要禁止〖域名+端口〗访问,这样就只能通过 第二个域名 才能访问。
进入路径 /.jitsi-meet-cfg/web/nginx 并新建 custom-meet.conf 文件,写入如下内容。阻止通过 IP 直接访问服务,执行 docker-compose restart web 命令。补充:这里还需要定义 ipv6 参数。至此,达成禁止〖IP + 端口〗访问、禁止〖域名+端口〗访问。
1 2 3 4 5 6 7 8 9 |
# 阻止直接通过IP访问 (IPv4 和 IPv6) set $blocked_ip "IPv4地址"; set $blocked_ipv6 "[IPv6地址]"; if ($host = $blocked_ip) { return 403; } if ($host = $blocked_ipv6) { return 403; } |
主页左上角标志,以及主页底部移动端应用之推广,经过测验以及网络搜索后得知,需要自行构建,方可达到自定义效果。显然超出目前掌握范围,不再纠结。
每个节点均耗费至少两天时间去摸索,无头苍蝇一般。中间几度想放弃,压根儿没方向,不知从何入手,不知如何向 ChatGPT 提问。异常痛苦及折磨!一点一点把 jitsi meet docker 相关配置丢进 ChatGPT ,经过异常痛苦之反复实验、印证、探索,先后通过三个 VPS 充当实验品,反复印证修改某一处或某几处配置是否可以左右最终效果,围绕多个层面去尝试,包括防火墙层面、反向代理层面、修改配置文件层面,以往之经验,均无效,若直接通过 VPS 服务商防火墙屏蔽固定端口,则所有途径均无法访问最终服务,甚至尝试,直接暴露宿主 443 端口去实验,如此这般,倒是省去反向代理和 Cloudflare 步骤,通过修改证书相关变量已经内置证书之获取,但根本诉求仍未解决,中途顺便把 seafile docker 配置加以优化,屏蔽 https://IP 访问,取而代之返回 403 界面。
所有尝试之结果,均毫无惊喜,均事与愿违。好在一步一步,大致解决方向逐渐清晰,只需要锁定最关键配置文件所在位置即可。最终在 /web/rootfs/etc/cont-init.d/10-config 找到如下代码。通过 ChatGPT 得知可以自定义 custom-meet.conf 并追加到 meet.conf 中。一语点醒梦中人,山重水复后、柳暗花明时。
1 2 3 4 5 6 7 8 |
# copy config files tpl /defaults/nginx.conf > /config/nginx/nginx.conf tpl /defaults/meet.conf > /config/nginx/meet.conf if [[ -f /config/nginx/custom-meet.conf ]]; then cat /config/nginx/custom-meet.conf >> /config/nginx/meet.conf fi tpl /defaults/ssl.conf > /config/nginx/ssl.conf tpl /defaults/default > /config/nginx/site-confs/default |