Jitsi Meet部署说明

推荐用docker部署。参考:https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/
1、下载最新的稳定版docker-jitsi-meet 的docker compose代码。
不要直接克隆docker-jitsi-meet项目,因为直接克隆默认安装的是unstable版本的镜像(其实可以修改.env文件指定镜像版本,但是直接克隆,默认的是用unstable版本的镜像)
wget $(wget -q -O - https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest | grep zip | cut -d\" -f4)
2、解压刚刚下载的文件
(一个没有后缀名的,名为stable-xxxxx 的文件,虽然没有.zip后缀名,但是放心执行下面的命令就好了)
unzip <filename>
3、拷贝env.example 成.env 文件
(环境变量文件,docker compose会使用这些环境变量来创建本地的docker镜像)
cp env.example .env
4、运行脚本,创建密码
(会将有关密码写入到刚刚创建的.env 文件里)
./gen-passwords.sh
5、创建配置目录
(在当前用户的主目录下创建一个.jitsi-meet-cfg 的目录,然后在其下面创建一批目录)
mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
6、修改.env 文件
可修改的项包括:
HTTP_PORT=8000 # HTTP端口
HTTPS_PORT=8443 # HTTPS端口
PUBLIC_URL=https://meet.example.com:${HTTPS_PORT} # 对外服务地址,注意使用了nginx转发之后,没有端口号了(使用https的默认443端口)
JVB_COLIBRI_PORT=8081 # 这一项默认没有,默认的JVB端口是8080,如果你服务器的8080端口被占用了,可以增加这一行,配置一个端口号给JVB(这是内部端口,不用对外)
#ENABLE_LETSENCRYPT=1 #这个以及配套的几项,如果需要用让脚本自动获取LETSENCRYPT的ssl证书,可以配置上,注意:这需要你的服务器在80端口能正确响应acm的验证
7、(推荐,非必要),修改docker-compose.yml中各个容器的名字
name: meet # 给整个项目一个名字
services:
web:
image: jitsi/web:${JITSI_IMAGE_VERSION:-unstable}
container_name: meet-web # 给每个容器一个名字
....
# 其他几个容器也一样修改
给容器起名主要是方便后续运维(比如进入容器,查看容器的日志)
8、运行docker compose up -d
docker compose up -d
9、修改nginx配置,反向代理到Jitsi Meet
主要内容包括:
1、http访问自动转https;
2、对https://meet.example.com的访问反向代理到Jitsi Meet(localhost:8443)3、对xmpp的websocket连接(wss://meet.example.com/xmpp-websocket)反向代理到wss://localhost:8443/xmpp-websocket)
server {
listen 80;
server_name meet.example.com;
rewrite ^ https://$http_host$request_uri? permanent; # force redirect http to https
server_tokens off;
}
server {
listen 443 ssl;
# http2 on;
server_name meet.example.com;
server_tokens off;
include ssl.conf;
location / {
proxy_pass https://localhost:8443;
proxy_ssl_verify off; # 不验证后端证书
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_read_timeout 1200s;
proxy_http_version 1.1;
client_max_body_size 0;
access_log off;
}
location /xmpp-websocket {
proxy_pass https://localhost:8443/xmpp-websocket;
proxy_ssl_verify off; # 不验证后端证书
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_http_version 1.1;
client_max_body_size 0;
access_log off;
}
}
10、reload nginx
nginx -s reload
这样,正常就能通过https://meet.example.com访问到你部署的Jitsi Meet了。
11、增加白板配置
只需要修改.env 文件,去掉WHITEBOARD_COLLAB_SERVER_URL_BASE前面的“#”,然后运行docker compose up即可
11.1、首先需要修改.env 文件
重点是设置这个配置项
WHITEBOARD_COLLAB_SERVER_URL_BASE=http://whiteboard.meet.jitsi
注意:其实配的是容器内到域名,参看whiteboard.yml里的aliases
11.2 启动docker容器
(在解压出来的docker-jitsi-meet项目源码目录下运行)
docker compose -f docker-compose.yml -f whiteboard.yml up -d
12、增加协同文档etherpad
如果只是想让Jitsi Meet支持etherpad(也就是“开启文件共享”)只需要修改.env 文件去掉ETHERPAD_URL_BASE前到“#”,然后运行docker compose up即可。这里修改很多,只是为了能让etherpad单独运行(单独打开https://etherpad.example.com也可以用etherpad)
12.1 修改.env 文件
也是需要配置两项:
ETHERPAD_URL_BASE=http://etherpad.meet.jitsi # 注意这其实是容器内的域名,参看etherpad.yml里的aliases
ETHERPAD_PUBLIC_URL=https://etherpad.example.com/p/ # 注意要带上/p/
12.2 修改etherpad.yml 文件
重点是将etherpad的后端应用的9001端口暴露出来,以便nginx可以反向代理
services:
# Etherpad: real-time collaborative document editing
etherpad:
image: etherpad/etherpad:2.0.3
container_name: meet-etherpad
restart: ${RESTART_POLICY:-unless-stopped}
environment:
- TITLE=${ETHERPAD_TITLE:-""}
- DEFAULT_PAD_TEXT=${ETHERPAD_DEFAULT_PAD_TEXT:-""}
- SKIN_NAME=${ETHERPAD_SKIN_NAME:-colibris}
- SKIN_VARIANTS=${ETHERPAD_SKIN_VARIANTS:-"super-light-toolbar super-light-editor light-background full-width-editor"}
- SUPPRESS_ERRORS_IN_PAD_TEXT=true
ports: #重点增加这里的配置
- '9001:9001'
networks:
meet.jitsi:
aliases:
- etherpad.meet.jitsi
12.3 修改nginx配置
配置的内容包括:
1、增加配置https://etherpad.example.com,用这个地址能单独运行etherpad
注意:如果不需要单独运行etherpad是可以不做这里的修改的(包括上面那个ETHERPAD_PUBLIC_URL和etherpad.yml的修改,都不需要)
server {
listen 443 ssl;
# http2 on;
server_name etherpad.example.com;
server_tokens off;
include ssl.conf;
location / {
proxy_pass http://localhost:9001;
proxy_ssl_verify off; # 不验证后端证书
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 1200s;
proxy_http_version 1.1;
client_max_body_size 0;
access_log off;
}
}
12.4 reload nginx
nginx -s reload
12.5 启动docker容器
(在解压出来的docker-jitsi-meet项目源码目录下运行)
docker compose -f docker-compose.yml -f whiteboard.yml -f etherpad.yml up -d
运行中会有一个console的报错:Failed to load hook function "ep_etherpad-lite/static/js/messageHandler" for plugin "ep_etherpad-lite" part "ep_message_all" hook set "client_hooks" hook "handleClientMessage_shoutMessage": Error: The module at "ep_etherpad-lite/static/js/messageHandler" does not exist.这是etherpad已知的一个历史原因造成的问题,不影响运行,可以不用管
13、增加transcriber
会议转录(也是会议字幕)需要依赖第三方的服务(比如Google Speech、Oracle Cloud Speech AI、Vosk、Whisper等)配置会有些不一样。这里是自己搭建Vosk。
第三方TTS服务的比较
这几个 STT(Speech-to-Text)引擎 Google Speech、Oracle Cloud Speech AI、Vosk、Whisper,各自定位和适用场景不同。详细的对比:
🔹 1. Google Cloud Speech-to-Text
优点:
- ✅ 准确率高(尤其在英语、主流语言上)
- ✅ 支持实时流式转写(latency 较低,适合会议字幕)
- ✅ 自动标点 / 语音活动检测
- ✅ 支持多种声学环境优化(电话音质 vs 高清音质)
- ✅ 多语言支持(100+)
缺点:
- ❌ 付费(按音频时长计费,长时间会议成本高)
- ❌ 依赖外部云(网络质量影响体验,数据合规风险)
- ❌ 不透明黑盒(不可本地部署)
适合场景:企业对准确率要求高,预算充足,且数据安全要求可以接受出云。
🔹 2. Oracle Cloud Speech AI
优点:
- ✅ 与 Oracle 生态整合(Oracle 云用户方便直接调用)
- ✅ API 风格类似 Google Speech,迁移容易
- ✅ 支持流式/批处理模式
缺点:
- ❌ 使用范围小(资料、社区支持远少于 Google/AWS/Azure)
- ❌ 准确率、延迟表现一般,整体不如 Google / Whisper
- ❌ 依赖云服务(与 Google 缺点类似)
适合场景:已经在 Oracle Cloud 上有应用的企业,可以“顺手”用。
🔹 3. Vosk
(开源,基于 Kaldi 的轻量级 STT 引擎)
优点:
- ✅ 本地部署(完全离线,数据安全)
- ✅ 资源消耗低(能在树莓派级硬件跑)
- ✅ 开源免费
- ✅ 支持多语言(几十种),但质量差异大
缺点:
- ❌ 准确率一般,尤其对嘈杂环境、方言、长句
- ❌ 模型较老(基于 Kaldi,没有大规模 Transformer 预训练)
- ❌ 功能有限(没有自动标点、多说话人分离)
适合场景:轻量级、对准确率要求不高,重点是“本地可跑”的 IoT/边缘设备/内网会议。
🔹 4. Whisper(OpenAI)
(开源,基于 Transformer,预训练在 680,000 小时多语言数据上)
优点:
- ✅ 非常高的准确率,尤其在多语言和口音场景
- ✅ 开源可本地部署(GPU 推荐,但 CPU 也能跑)
- ✅ 支持多语言转录 + 翻译(能直接把中文翻成英文文本)
- ✅ 鲁棒性强(噪音环境、跨领域数据表现好)
- ✅ 社区活跃,生态丰富(Whisper.cpp, faster-whisper)
缺点:
- ❌ 资源消耗大(大模型需要显存,实时性要求高时压力大)
- ❌ 没有官方流式接口(需要社区方案来做实时字幕)
- ❌ 缺乏商业支持 SLA(不像 Google 提供企业保障)
适合场景:对准确率和多语言支持要求高,但不想依赖云;有 GPU 资源可用;科研、产品原型、内部系统。
🔹 总体对比表
引擎 | 部署方式 | 成本 | 准确率 | 语言支持 | 实时性 | 数据安全 |
---|---|---|---|---|---|---|
Google Speech | 云端 | 按量计费(中高) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ❌(数据出云) |
Oracle Cloud Speech | 云端 | 按量计费(中) | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ❌ |
Vosk | 本地/开源 | 免费 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ✅ |
Whisper | 本地/开源 | 免费(需硬件) | ⭐⭐⭐⭐✨(接近商用顶级) | ⭐⭐⭐⭐ | ⭐⭐~⭐⭐⭐(取决于优化) | ✅ |
🔹 结论 & 推荐
- 最高准确率、企业级 SLA:👉 Google Speech
- Oracle 云用户:👉 Oracle Speech
- 轻量级本地部署:👉 Vosk
- 开源高精度、支持多语言:👉 Whisper(未来趋势,特别适合 Jitsi 私有化场景)
13.1 修改.env文件
需要配置:
ENABLE_TRANSCRIPTIONS=1
JIGASI_TRANSCRIBER_CUSTOM_SERVICE=org.jitsi.jigasi.transcription.VoskTranscriptionService
JIGASI_TRANSCRIBER_VOSK_URL=ws://vosk-zh:2700
13.2 增加vosk.yml文件
services:
vosk-en:
image: alphacep/kaldi-en:latest
container_name: meet-vosk-en
profiles:
- manual
networks:
meet.jitsi:
vosk-zh:
image: alphacep/kaldi-cn:latest
container_name: meet-vosk-zh
networks:
meet.jitsi:
13.3 启动docker容器
(在解压出来的docker-jitsi-meet项目源码目录下运行)
docker compose -f docker-compose.yml -f whiteboard.yml -f etherpad.yml -f transcriber.yml -f vosk.yml up -d
这一串 -f xxx.yml 真的有点太麻烦了,可以在.env 文件里增加这两行以指定compose的文件:
COMPOSE_FILE='docker-compose.yml,whiteboard.yml,etherpad.yml,transcriber.yml,vosk.yml'
COMPOSE_PATH_SEPARATOR=',' # 默认的分隔符是":"
这样,只需要这样就可以启动容器了:
docker compose up -d