Jitsi Meet部署说明

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