Jitsi Meet: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 5: Строка 5:
Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API {{path|/about/health}} для опроса о состоянии сервиса.
Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API {{path|/about/health}} для опроса о состоянии сервиса.


Jitsi Videobridge — ключевой компонент системы, abbr title="Selective Forwarding Unit">SFU</abbr>. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга ({{path|/colibri/debug}}).
Jitsi Videobridge — ключевой компонент системы, <abbr title="Selective Forwarding Unit">SFU</abbr>. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга ({{path|/colibri/debug}}).


Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> — он не занимается транскодингом и поэтому потребляет относительно мало CPU.
Это <abbr title="Selective Forwarding Unit">SFU</abbr>, не <abbr title="Multipoint Conferencing Unit">MCU</abbr> — он не занимается транскодингом и поэтому потребляет относительно мало CPU.
Строка 11: Строка 11:
Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию.
Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию.


Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении. Также заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций сразу.
Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.


== Как развернуть? ==
== Как развернуть? ==
Строка 30: Строка 30:
Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.
Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать {{pkg|prosody}} и {{pkg|jicofo}} на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.


При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}.
При настройке будем предполагать, что в качестве базового доменного имени выбрано {{term|$DOMAIN}}.
На всех используемых машинах убедитесь, что команда <source lang="shell">ping $(hostname)</source> успешно срабатывает: уходят запросы и приходят ответы.


Настройка XMPP-сервера
==== Настройка XMPP-сервера ====


В файл {{path|/etc/prosody/$DOMAIN.cfg.lua}} напишите:
В файл {{path|/etc/prosody/$DOMAIN.cfg.lua}} напишите:
Строка 106: Строка 107:
Component "conferenceduration.$DOMAIN" "conference_duration_component"
Component "conferenceduration.$DOMAIN" "conference_duration_component"
     muc_component = "conference.$DOMAIN"
     muc_component = "conference.$DOMAIN"


</source>
</source>
Строка 124: Строка 124:
</pre>
</pre>


Настройка Jicofo
==== Настройка Jicofo ====


Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}}
Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID {{term|focus@auth.$DOMAIN}}
Строка 135: Строка 135:


# sets the XMPP domain (default: none)
# sets the XMPP domain (default: none)
JICOFO_HOSTNAME=cs.msu.ru
JICOFO_HOSTNAME=$DOMAIN


# sets the secret used to authenticate as an XMPP component
# sets the secret used to authenticate as an XMPP component
Строка 147: Строка 147:


# sets the XMPP domain name to use for XMPP user logins
# sets the XMPP domain name to use for XMPP user logins
JICOFO_AUTH_DOMAIN=auth.videoconf.cs.msu.ru
JICOFO_AUTH_DOMAIN=auth.$DOMAIN


# sets the username to use for XMPP user logins
# sets the username to use for XMPP user logins
Строка 185: Строка 185:
curl -i localhost:8888/about/health
curl -i localhost:8888/about/health
</pre>
</pre>
Так как пока что ни одного Jitsi Videobridge к серверу не подключено, будет код ответа 500 и сообщение {{term|No operational bridges available}}.
Так как пока что ни одного Jitsi Videobridge к серверу не подключено, jicofo ответит кодом ответа 500 и сообщением {{term|No operational bridges available}}.
Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo.
Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo.


Настройка Jitsi Videobridge (JVB)
==== Настройка Jitsi Videobridge (JVB) ====


В /etc/jitsi/videobridge/config укажите:
В /etc/jitsi/videobridge/config укажите:
Строка 209: Строка 209:


В файле /etc/jitsi/videobridge/application.conf укажите:
В файле /etc/jitsi/videobridge/application.conf укажите:
<pre>
videobridge {
        stats {
                enabled = true
                transports = [
                        { type = "muc" }
                ]
        }
        apis {
                xmpp-client {
                        configs {
                                shard {
                                        hostname = "localhost"
                                        domain = "auth.$DOMAIN"
                                        username = "jvb"
                                        password = "[yyy-jvb]"
                                        muc_jids = "JvbBrewery@internal.auth.$DOMAIN"
                                        # The muc_nickname must be unique across all instances
                                        muc_nickname = "jvb-mid-123"
                                }
                        }
                }
        }
}
</pre>
Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo).
Аккаунт {{term|jvb@auth.$DOMAIN}} тоже нужно завести на XMPP-сервере:
<pre>
prosodyctl register jvb auth.$DOMAIN "[yyy-jvb]"
</pre>
Если JVB-машина отделена от клиентов при помощи NAT, то потребуется донастройка: подробнее [https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart#advanced-configuration здесь].
Запустите JVB:
<pre>
systemctl start jitsi-videobridge
</pre>
Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.
==== Настройка web-приложения Jitsi Meet ====
В `/usr/share/doc/jitsi-meet-*` есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера. Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.
<div class="toccolours mw-collapsible mw-collapsed">
Приведём ниже подробный разбор этого примера:
<div class="mw-collapsible-content">
<pre>
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name $DOMAIN;
    root /usr/share/jitsi-meet;
    # ssi on with javascript for multidomain variables in config.js
    ssi on;
    ssi_types application/x-javascript application/javascript;
</pre>
Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере.
SSI нужны как минимум для динамической подстановки этих значений в {{term|config.js}}.
<pre>
    index index.html index.htm;
    error_page 404 /static/404.html;
</pre>
<pre>
    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    gzip_vary on;
    location = /config.js {
        alias /etc/jitsi/meet/jitsi.murbly.net-config.js;
    }
    location = /external_api.js {
        alias /usr/share/jitsi-meet/libs/external_api.min.js;
    }
    #ensure all static content can always be found first
    location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
    {
        add_header 'Access-Control-Allow-Origin' '*';
        alias /usr/share/jitsi-meet/$1/$2;
    }
    # BOSH
    location = /http-bind {
        proxy_pass      http://localhost:5280/http-bind;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
    }
    # xmpp websockets
    location = /xmpp-websocket {
        proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        tcp_nodelay on;
    }
</pre>
</div>
</div>


TODO
Чтобы проверить, всё ли в порядке, зайдите на {{term|https://$DOMAIN}} и присоединитесь к произвольной конференции, а затем 2-3 раза продублируйте вкладку веб-браузера.
Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.


=== Подключение SIP-шлюза jigasi ===
=== Подключение SIP-шлюза jigasi ===
Строка 221: Строка 332:
Краткий ответ: нет.
Краткий ответ: нет.


В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet.
В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет.
В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал {{term|openfire}}.
В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер {{term|openfire}}.

Версия от 01:36, 20 июня 2020

Jitsi Meet — веб-приложение на базе технологии WebRTC. Для сигналинга использует XMPP через BOSH с использованием собственного XEP. В системах на базе Альт оно расположено в пакете jitsi-meet-web

Jicofo — XMPP-компонент, модератор видеоконференций. Клиенты договариваются о связи, заходя в общую XMPP-комнату с ним, и обмениваются там XMPP-сообщениями. Имеет HTTP API /about/health для опроса о состоянии сервиса.

Jitsi Videobridge — ключевой компонент системы, SFU. Он передаёт видео и аудио между участниками, осуществляя роль посредника, терминирует RTP/RTCP, определяет доступные рамки битрейта в обе стороны на конкретного клиента. Имеет свой внутренний HTTP API для мониторинга (/colibri/debug).

Это SFU, не MCU — он не занимается транскодингом и поэтому потребляет относительно мало CPU.

Jigasi — шлюз для участия в Jitsi-конференциях через SIP-телефонию.

Jibri — appliance для записи конференции. использует Selenium с Chromium внутри (и тянет за собой зависимости на Xorg, icewm, модуль ядра snd-aloop). Ведёт себя как ничего не передающий участник записываемой конференции, но Jicofo и клиенты его держат на особом положении: не отображают в списке участников и т. п. Также, как и JVB, Jigasi, заходит по отдельному аккаунту в специальную XMPP-комнату для рекордеров. Их можно (и нужно!) воткнуть несколько, если планируется вести запись нескольких конференций одновременно.

Как развернуть?

Minimal Viable Product

Вам потребуются пакеты prosody, jitsi-meet-prosody, jitsi-meet-web, jicofo, jitsi-videobridge. Для размещения нужны:

  • jitsi-videobridge: хост с доступными портами 10000/udp, 4443/tcp и хорошей пропускной способностью (рекомендуется минимум 100Mbps симметрично)
  • веб-сервер: хост с доступным портом 443/tcp
    • Шаблон:Caution обратите внимание: веб-сервер должен поддерживать HTTPS, иначе браузеры откажутся поддерживать на нём WebRTC. Лучше всего сначала выписать SSL-сертификат, а потом продолжать настройку веб-сервера.
  • xmpp-сервер: хост с доступным портом 5280/tcp для работы XMPP-over-HTTP (BOSH).

Установите пакеты:

apt-get install prosody jitsi-meet-prosody jitsi-meet-web jicofo jitsi-videobridge

Теоретически компоненты могут размещаться на разных машинах; на практике мы не рекомендуем устанавливать prosody и jicofo на разные машины — это может привести к низкой производительности сервиса и большим колебаниям задержки связи.

При настройке будем предполагать, что в качестве базового доменного имени выбрано $DOMAIN.

На всех используемых машинах убедитесь, что команда

ping $(hostname)

успешно срабатывает: уходят запросы и приходят ответы.

Настройка XMPP-сервера

В файл /etc/prosody/$DOMAIN.cfg.lua напишите:

plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "$DOMAIN";

cross_domain_bosh = false;
consider_bosh_secure = true;

VirtualHost "$DOMAIN"
    authentication = "anonymous"
    --app_id="example_app_id"
    --app_secret="example_app_secret"
    -- Assign this host a certificate for TLS, otherwise it would use the one
    -- set in the global section (if any).
    -- Note that old-style SSL on port 5223 only supports one certificate, and will always
    -- use the global one.
    ssl = {
        key = "/etc/prosody/certs/$DOMAIN.key";
        certificate = "/etc/prosody/certs/$DOMAIN.crt";
    }
    speakerstats_component = "speakerstats.$DOMAIN"
    conference_duration_component = "conferenceduration.$DOMAIN"
    -- we need bosh
    modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "speakerstats";
        "turncredentials";
        "conference_duration";
    }
    c2s_require_encryption = false

Component "conference.$DOMAIN" "muc"
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        -- "token_verification";
    }
    admins = { "focus@auth.$DOMAIN" }
    muc_room_locking = false
    muc_room_default_public_jids = true

VirtualHost "auth.$DOMAIN"
    ssl = {
        key = "/etc/prosody/certs/auth.$DOMAIN.key";
        certificate = "/etc/prosody/certs/auth.$DOMAIN.crt";
    }
    authentication = "internal_plain"

-- internal muc component, meant to enable pools of jibri and jigasi clients
Component "internal.auth.$DOMAIN" "muc"
    storage = "memory"
    modules_enabled = {
      "ping";
    }
    admins = { "focus@auth.$DOMAIN", "jvb@auth.$DOMAIN" }
    muc_room_locking = false
    muc_room_default_public_jids = true

Component "focus.$DOMAIN"
    component_secret = "xxx" -- достаточно длинный пароль, он же JICOFO_SECRET

Component "speakerstats.$DOMAIN" "speakerstats_component"
    muc_component = "conference.$DOMAIN"

Component "conferenceduration.$DOMAIN" "conference_duration_component"
    muc_component = "conference.$DOMAIN"

Сгенерируйте сертификаты для виртуалхостов $DOMAIN и auth.$DOMAIN:

prosodyctl cert generate $DOMAIN
prosodyctl cert generate auth.$DOMAIN

Позже их нужно будет зарегистрировать в системе, на которой установлен Jicofo, как доверенные:

ln -s /etc/prosody/certs/$DOMAIN.crt /etc/pki/ca-trust/source/anchors/
ln -s /etc/prosody/certs/auth.$DOMAIN.crt /etc/pki/ca-trust/source/anchors/
update-ca-certs

Настройка Jicofo

Jicofo подключается к XMPP-серверу и как внешний XMPP-компонент, и как юзер-аккаунт с JID focus@auth.$DOMAIN

В /etc/jitsi/jicofo/config укажите:

# Jitsi Conference Focus settings
# sets the host name of the XMPP server
JICOFO_HOST=localhost

# sets the XMPP domain (default: none)
JICOFO_HOSTNAME=$DOMAIN

# sets the secret used to authenticate as an XMPP component
JICOFO_SECRET=xxx

# overrides the prefix for the XMPP component domain. Default: "focus"
#JICOFO_FOCUS_SUBDOMAIN=focus

# sets the port to use for the XMPP component connection
JICOFO_PORT=5347

# sets the XMPP domain name to use for XMPP user logins
JICOFO_AUTH_DOMAIN=auth.$DOMAIN

# sets the username to use for XMPP user logins
JICOFO_AUTH_USER=focus

# sets the password to use for XMPP user logins
JICOFO_AUTH_PASSWORD="[yyy]"

# extra options to pass to the jicofo daemon
JICOFO_OPTS="${JICOFO_FOCUS_SUBDOMAIN:+ --subdomain=$JICOFO_FOCUS_SUBDOMAIN}"

# adds java system props that are passed to jicofo (default are for home and logging config file)
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=jicofo -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/jicofo/logging.properties"

"[yyy]" — достаточно длинный пароль для аккаунта focus@auth.$DOMAIN, который нужно завести на машине с prosody:

prosodyctl register focus auth.$DOMAIN "[yyy]"

В /etc/jitsi/jicofo укажите:

org.jitsi.jicofo.health.ENABLE_HEALTH_CHECKS=true

org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.$DOMAIN


Запустите jicofo:

systemctl start jicofo

Убедитесь, что он подключается к XMPP-серверу:

curl -i localhost:8888/about/health

Так как пока что ни одного Jitsi Videobridge к серверу не подключено, jicofo ответит кодом ответа 500 и сообщением No operational bridges available. Если в ответе сообщение об ошибке иного рода — проверьте настройки и связь между prosody и jicofo.

Настройка Jitsi Videobridge (JVB)

В /etc/jitsi/videobridge/config укажите:

# Jitsi Videobridge settings

# extra options to pass to the JVB daemon
JVB_OPTS="--apis=,"


# adds java system props that are passed to jvb (default are for home and logging config file)
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties -Dconfig.file=/etc/jitsi/videobridge/application.conf"

Если в файле config есть другие настройки, рекомендуем их убрать — и способ передачи этих настроек, и сами некоторые эти настройки являются устаревшими.

В качестве файлов конфигурации используются /etc/jitsi/videobridge/{application.conf,sip-communicator.properties}.

В файле /etc/jitsi/videobridge/application.conf укажите:

videobridge {
        stats {
                enabled = true
                transports = [
                        { type = "muc" }
                ]
        }

        apis {
                xmpp-client {
                        configs {
                                shard {
                                        hostname = "localhost"
                                        domain = "auth.$DOMAIN"
                                        username = "jvb"
                                        password = "[yyy-jvb]"
                                        muc_jids = "JvbBrewery@internal.auth.$DOMAIN"
                                        # The muc_nickname must be unique across all instances
                                        muc_nickname = "jvb-mid-123"
                                }
                        }
                }
        }
}

Вместо слова shard можно использовать любой идентификатор (оно идентифицирует подключение к xmpp-серверу и jicofo).

Аккаунт jvb@auth.$DOMAIN тоже нужно завести на XMPP-сервере:

prosodyctl register jvb auth.$DOMAIN "[yyy-jvb]"

Если JVB-машина отделена от клиентов при помощи NAT, то потребуется донастройка: подробнее здесь.

Запустите JVB:

systemctl start jitsi-videobridge

Если всё сделано правильно и между JVB и jicofo есть связь, jicofo на healthcheck-запрос будет отдавать HTTP-код 200.

Настройка web-приложения Jitsi Meet

В `/usr/share/doc/jitsi-meet-*` есть примеры конфигурации для веб-клиента (*-config.js) и веб-сервера. Мы рекомендуем при настройке веб-сервера за основу взять пример оттуда.

Приведём ниже подробный разбор этого примера:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name $DOMAIN;

    root /usr/share/jitsi-meet;

    # ssi on with javascript for multidomain variables in config.js
    ssi on;
    ssi_types application/x-javascript application/javascript;

Помимо конференций вида https://jitsi-meet.example.com/ConferenceName, Jitsi Meet также поддерживает URL-адреса конференций вида https://jitsi-meet.example.com/Subdomain/ConferenceName, где для разных значений Subdomain используются разные настройки и виртуалхосты на XMPP-сервере. SSI нужны как минимум для динамической подстановки этих значений в config.js.

    index index.html index.htm;
    error_page 404 /static/404.html;
    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    gzip_vary on;

    location = /config.js {
        alias /etc/jitsi/meet/jitsi.murbly.net-config.js;
    }

    location = /external_api.js {
        alias /usr/share/jitsi-meet/libs/external_api.min.js;
    }

    #ensure all static content can always be found first
    location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
    {
        add_header 'Access-Control-Allow-Origin' '*';
        alias /usr/share/jitsi-meet/$1/$2;
    }

    # BOSH
    location = /http-bind {
        proxy_pass      http://localhost:5280/http-bind;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
    }

    # xmpp websockets
    location = /xmpp-websocket {
        proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        tcp_nodelay on;
    }



Чтобы проверить, всё ли в порядке, зайдите на https://$DOMAIN и присоединитесь к произвольной конференции, а затем 2-3 раза продублируйте вкладку веб-браузера. Трёх (в случае выключенного p2p — двух) анонимных участников достаточно, чтобы начать обмен медиапотоками; если увидите три изображения с камеры — система готова к использованию.

Подключение SIP-шлюза jigasi

Подключение рекордера jibri

FAQ

Можно ли использовать не prosody, а другой XMPP-сервер?

Краткий ответ: нет.

В комплекте с Jitsi идут модули для расширения функциональности XMPP-сервера prosody, написанные на Lua; они считаются частью продукта Jitsi Meet. Без этих модулей или эквивалентных им система ВКС работать не будет. В теории, ничего не мешает написать и поддерживать эти модули для вашего XMPP-сервера; одно время проект Jitsi использовал XMPP-сервер openfire.