Как стать автором
Поиск
Написать публикацию
Обновить

Звонки через Jabber в докер-контейнере за 5 минут

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров30K
Всего голосов 96: ↑96 и ↓0+109
Комментарии83

Комментарии 83

Какие клиенты вы посоветуете, поддерживающие голосовой и видео траффик?

Голос через WebRTC, поэтому клиенты нужны с поддержкой XMPP-звонков.
Самое простое — использовать приложение, которое предлагает Snikket прямо в инвайте (скриншот с примером инвайта):

  • Android / iOS — Snikket App (основан на Conversations/Monal, всё работает «из коробки»).

  • Windows / macOS / Linux — Gajim (последние версии поддерживают звонки), также можно попробовать Dino под Linux.

  • Для iOS дополнительно есть Siskin IM.

То есть, если вы рассылаете инвайт, пользователю даже не нужно гадать — ссылки на подходящие клиенты уже там есть.

сколько по ресурсам кушает это решение??
если просто на условные 10ть человек

По ресурсам решение очень лёгкое. Для ~10 человек хватает даже 1 vCPU и 1–2 ГБ RAM, CPU почти не грузится, т.к. сервер ничего не транскодирует. Нагрузка заметна только если звонки идут через TURN, а не напрямую P2P.

У меня, например, видеозвонок между двумя странами шёл отлично — картинка супер, и это всё на старом CentOS 7. Так что по железу особых требований нет, главное нормальный канал.

Еще бы экран расшаривать, тогда можно было бы созвоны проводить по работе.

Я слышал, что для таких задач часто используют Jitsi — он умеет и видео, и демонстрацию экрана. Сам не пробовал.

Подтверждаю. Jitsi может. И даже предоставить управление может. Не Radmin конечно, для терпеливых пользователей, но все же.

Вчера пробовал jitsi поставить - к звонку подключаешься, вроде все в звонке, но голоса нет, микрофон у всех в муте, на кнопки не реагирует. Пробовал пока только локально, возможно нужно через домен публично выводить и будет лучше

На сколько я понимаю, ему для работы звонков нужен обязательно публичный домен с валидным HTTPS и корректным сертификатом.
Без этого WebRTC в браузере обычно не пропускает медиа.

Я вообще не понимаю зачем пользоваться xmpp в 2025-м. Есть nextcloud, bigbluebutton. Гораздо лучше и гораздо производительнее

Да, можно. Просто в моём случае нет смысла стрелять из пушки по воробьям. XMPP спокойно работает на виртуалке с 2 ГБ RAM и обслуживает сотни пользователей со звонками. А BigBlueButton — это уже совсем другой класс: для нормальной работы ему нужны многоядерный CPU и не меньше 8–12 ГБ памяти.

Так, вроде бы, как раз проблема вотсапа в том, что STUN-трафик детектится и блокируется?

В Snikket это обходится просто: если обычный STUN не проходит, клиенты автоматически переходят на TURN. А TURN можно поднять на порту 443/TLS и замаскировать трафик под HTTPS — тогда его уже не отличить от обычного веба.

Зря вы годноту палите. Понимаю конечно, технический ресурс и все дела, но чем популярнее будет решение, тем вероятнее на него нацелятся. Так уже случалось, может случиться и ещё. Между тем, xmpp с stun/turn это не только про локальные конфочки и зконки. Много у кого, например, тупо netbird может сдохнуть. Думаю, пора перестать тут обсуждать методы противодействия, т.к. у большинства посетителей сайта навыков в целом хватает разобраться.

Это, кстати, интересный и философский вопрос: стоит ли вообще что-то скрывать только из страха, что это могут заблокировать?

Ну чисто технически - это вовсе не метод противодействия, а скорее шаг вбок. Массовым данное решение не назовёшь, а тем кто в состоянии поднять его для себя и своих родных и близких ничего не угрожает, потому что сервер частный для частного обмена информацией. Защиту тайны связи никто ещё не отменял.

Защиту тайны связи никто ещё не отменял.

Ух ты, а что это такое? Это вот для вот этого операторы должны 3 месяца хранить весь трафик? Это вот для этого Яровая со своим пакетом ходила?

Это другое. Вы не понимаете.
В нашем государстве принято считать, что силовики имеют право подглядывать и подсматривать, ведь у нас нет причин им не доверять.
При этом конституция на месте. И если ваши протоколы связи не позволяют заглянуть в этот трафик, вы никому ничего не обязаны. Вы не оператор. С вас лично потребовать расшифровать ваш же трафик пока никто не может. Даже топнув ножкой от бессилия не выйдет. Особенно это смешно в контексте использования протокола, где шифрование end-to-end. Даже если интернет провайдер будет хранить весь ваш трафик, это ничего не даст.

Из контекста понятно, что я говорю про РФ. И какая разница что в США или Великобритании, если вопрос был про "закон Яровой"? Кроме того, в мире не осталось стран, которые не вводят цензуру или не пытаются запрещать доступ под видом любого надуманного предлога. Если я ошибаюсь (я бы хотел ошибаться), назовите свободные страны, думаю всем будет интересно знать.

Что за gatekeeping

Я категорически не согласен
Информация не должна ограничиваться

Я бы никогда в жизни не разобрался. И вообще не знал про то как устроены эти технологии.
Если всю информацию убирать из публичного доступа, то мы скоро в каменный век вернёмся

Подскажите, а групповые звонки поддерживаются? Хочется предложить знакомым альтернативу Discord

Группы для переписки — есть. А вот групповых звонков, как в Discord, нет. Для этого лучше поднять свой сервер Jitsi — он как раз рассчитан на видеоконференции.

Вроде как альтернатива discord'y - teamspeak

Если нужен только голос и хочется чтобы был свой сервер - Mumble
Есть клиент для Win/Mac/Linux и Android

  1. Лет 20 назад пользовал Jabber и даже вносил посильный вклад в развитие сообщества.

  2. Недавно надо было выбирать менеджер и тоже смотрел в сторону XMPP, но при беглом просмотре показалось, что Jabber скорее мертв, чем жив - все те же проблемы, что и были 20 лет назад с кучей расширений и несовместимыми клиентами. А клиенты за это время не сильно далеко ушли. В итоге решил остановиться на Synapse Matrix

  3. А пользователи в итоге "выбрали" телеграмм ¯\_(ツ)_/¯

Интересно сравнить современный jabber лицом к лицу с конкрутентами, может я и не прав был во 2м пункте

XMPP жив, и в 2025-м это уже не тот «зоопарк», что был 20 лет назад: Snikket берёт нужные XEP’ы (OMEMO, MUC, звонки), и всё работает «из коробки». Клиенты подтянулись — Conversations, Monal, Siskin, Dino, Gajim справляются со звонками и медиа.

Matrix (Synapse) тоже хорош, особенно для командных чатов.


А XMPP остаётся лёгким и автономным — отличный «запасной аэродром» на случай полного блокирования Telegram, WhatsApp и т. д. Не возвращаться же снова к сотовым звонкам и попадать на деньги при этом ))

Matrix (Synapse) тоже хорош, особенно для командных чатов.

Недавно поставил, красота!

 Не возвращаться же снова к сотовым звонкам и попадать на деньги при этом ))

Ага! Особенно когда кроме этих самых звонков и смс, от вышки ничего и не прилетает! Велком в эпоху 1G!

Я тут как раз новость видел:

«Блокировка звонков в Telegram и WhatsApp привела к тому, что Минцифры в августе зафиксировало рост голосового трафика в сетях на 20–30%.»

Большая тройка теперь озолотится.

После этого можно спокойно звонить и переписываться в защищённом мессенджере, который полностью под вашим контролем.

Как решаете проблему с шаловлимыми ручками скучающих сотрудников хостинг-провайдера?

Даже если хостер получит root-доступ к VPS, он не сможет расшифровать звонки или чаты. WebRTC использует SRTP с end-to-end ключами — они генерируются на клиентах и серверу недоступны. А переписка при OMEMO/OTR также шифруется сквозным образом: сервер видит только зашифрованные пакеты и метаданные.

Шаловливые ручки будут наслаждаться зашифрованными пакетами ))

Вспоминал ваш вопрос и думал, как ещё «шаловливый» хостер может насолить. Ну, допустим, он получил root-доступ, сбросил пароль у какого-то юзера, залогинился под ним и решил почитать переписку. Я провёл эксперимент: сбросил пароль и на новом устройстве вошёл в аккаунт. Всё, что я увидел — это: «Это сообщение было зашифровано с помощью OMEMO, но не для вашего устройства.»

Т.е. под одним аккаунтом с нескольких устройств общаться не получится?

Да, с одним аккаунтом можно сидеть сразу с нескольких устройств — всё работает. У меня Snikket одновременно запущен на Android и Windows, сообщения и звонки синхронизируются. А вот если сбросить пароль и подключить новое устройство «с нуля», то старые переписки не откроются: они зашифрованы под ключи предыдущих устройств.

А Вы под это дело с какими-то физическими телефонами не сталкивались - в самом деле для бабушек 80+? С железными и с кнопками?
А то со смартфонами в таком случае бывает проблемка...

Если бы такие XMPP-телефоны с кнопками реально продавались — я бы купил их не только бабушкам

А не знаете, обычный SIP блочат? Потому что sip-овских железных телефонов дофига и выше, я сам когда-то grandstream-ами пользвоался

Обычный SIP пока работает.

Если в смысле клиентского потока к известному провайдеру телефонии — нет. А к своему астериску — могут. Точнее, делали.

Очень глубокая статья. Может начнем публиковать инструкции для мебели Икеи.

Сколько ни собирал — всегда 5 лишних деталей оставалось

Не знаю было или нет, но вроде как Jami мессенджер работает без впн в России -звонки не блочат. SimpleX тоже неплохо работает но только с ВПН, хотя в наше время без него никуда

Да, Jami действительно интересный вариант — у него архитектура без центрального сервера, звонки идут напрямую, поэтому его и сложнее «задушить».
SimpleX тоже набирает популярность, но у него своя специфика.

Я же выбрал XMPP/Snikket как более проверенное и совместимое решение: клиенты есть под все платформы, плюс звонки можно замаскировать под HTTPS через TURN.

Есть ещё Tomy тоже распределенка но без голоса но в реалиях как и jami работает не всегда моментально. Simplex это первое на что я попытался переехать когда начались проблемы но работает он крайне не стабильно даже сообщения могут не приходить по долго. Пробовал и собственный сервер но он очень быстро попадает под тспу и собственный прокси тоже и 2 дня тспу. И тут либо надо постоянно быть на ВПН и тогда он норм работает а когда то ВПН то без ВПН он неохотно меняет линки и даже отправленное сообщение себе с телефона на PC может зависнуть минут на 5 приходится убивать приложение короче гемор использую для пересылки сообщений и файлов между своими гаджетами

Да, в этом и разница: полностью P2P-решения (Tox, Jami, SimpleX) хороши концептуально, но в реальности часто нестабильны. XMPP с TURN — золотая середина: децентрализация, но при этом можно замаскировать трафик под HTTPS и обойти блокировки без VPN.

Simplex-- поднял сервер, но 6 версии приложения не конектятся, 4 вроде работало. В чем дело пока не понял.

Snikket я поднял реально в две команды — и сразу всё готово: звонки, TURN, jitter-буфер, certbot внутри. На VPS с 1–2 ГБ RAM этого хватает за глаза.

Matrix (Synapse) — тяжелее и по установке, и по ресурсам: нужен PostgreSQL, coturn, nginx. В простое он ест ~1 ГБ+, а под нагрузкой легко уходит в 2–4 ГБ.
И нет такого готового «коробочного» решения, чтобы уложиться ровно в две команды init.sh и start.sh.

можно еще посмотреть в сторону отечественных (забугорные у меня работали плохо, видимо их фильтруют) SIP-провайдеров, типа sipnet или telphin. Сама регистрация у них бесплатна и звонки внутри сети тоже

У SIP-провайдеров (Sipnet, Telphin и т. п.) по закону весь трафик пишется и хранится. А в Snikket — даже если захочешь, не запишешь: звонки шифруются end-to-end, серверу остаются только зашифрованные пакеты

это да, но если консерн в том что не хочется ставить Макс потому что он не только звонки пишет, а много что еще, то может оказаться простым решением. Тем кто за содержание звонков не парится

Ну да, если исходить из принципа «семь бед — один ответ MAX», то конечно ))

Простите за глупый вопрос. Можно ли это реализовать без сервера?

Да, сервер можно поставить и на домашний компьютер (или, например, на Raspberry Pi). Главное — пробросить порты на роутере и привязать домен. В этом случае тоже будет работать

Не подскажете, почему не показывает статус пользователя "онлайн", хотя он сейчас в сети и добавлен в контакты?
И еще интересует вопрос по звонкам - если звонки не работают, полагаю, что заблокировано на уровне провайдера?

Чтобы отображался статус «онлайн», нужно, чтобы контакт подтвердил подписку на presence и находился с вами в одном Круге (Circle) — это стандартные roster-группы XMPP, просто Snikket называет их по-своему. На Android ещё важно выдать приложению работу в фоне и отключить энергосбережение, на iOS — включить push-уведомления.

По звонкам: если не коннектится вовсе, чаще всего виноват блок на уровне провайдера (STUN/UDP). Решение — свой TURN на 443/TLS: трафик выглядит как HTTPS, и звонки начинают работать.

Ещё проверьте порты: 5222 (клиенты), 5269 (s2s), 3478/3479 (STUN), 5349/5350 (TURN), 443 (TURN/TLS) и медиадиапазон 49152–65535/UDP. Если что-то закрыто — звонки не взлетят.

В файл /etc/coturn/turnserver.conf кладем следующее:
но у меня нет такого каталога, что я упустил?

Спасибо за внимательность. В контейнерной установке путь другой: /opt/turnserver/turnserver.conf, а не /etc/coturn (это внутри докера). Поправил.

Спасибо. Поставил. Конечно не обошлось без запинок. Но результат есть. При разговоре по видео двух человек канал кушает около 6 мегабит. Не совсем удобная схема с аккаунтами, люди путаются. Куда что вводить. В целом жить можно.. но вот нужно ли своё держать, каждый выбирает сам. Я поставил ради спортивного интереса.

Вам спасибо, что сказали. И рад, что получилось установить.

Спасибо за статью. Извините за глупый вопрос - в статье упоминается - "nginx как сплиттер" - его нужно как-то доустановить? (в новый docker контейнер?)

nginx действительно нужен отдельно — можно поставить на хост (apt/yum install nginx), можно завернуть в отдельный контейнер. Разницы особой нет: он просто слушает 443 и по SNI решает, куда слать трафик — в Snikket или в TURN.

Давно (год так 2010 +-) пробовал какой то xmmp сервер, но чёт не срослось. Сценарий - чатики внутри конторки. Судя по всему дофига поменялось. (Или нет?)

Как сие будет воркать если развернуть внутри LAN со своими сертами или центрами сертификации? В целом выглядит весьма работоспособно...

Больше всего интересуют чаты (в т.ч. групповые) с SSO kerberos/ldap (ну или хотя бы учётки из LDAP), шара экрана по возможности, видео/аудио звонки сильно вторичны, но будут хорошим бонусом...

Почитал, что то он для лана не оч то подходит...

Настроил все как описано, но у некоторых операторов не открывается страница с приглашением, причем видно что что-то грузиться начинает, т.к. видно что имя вкладки меняется на "Приглашаем на <имя домена>", но страница до конца не загружается - контента не видно. Поможет ли тут включение turn сервера или дело в чем-то другом?

Попробуйте поднять сервер в России, а не на зарубежном хостинге — похоже, некоторые операторы режут доступ на уровне сетей. TURN помогает только в случае, когда соединение устанавливается, но нет звука. Если страница вообще не открывается — дело в блокировках или ещё не разошедшейся DNS-записи.

Все поставил: сервер, клиента на android. Но вот вопрос поставил gajim на win11 там тупо пустые белые окна. Это что за глюк? Вижу что написано на питоне, мне что там до инсталляции нужно питон ставить/допиливать? Такое себе скажем...

У меня Gajim на Win11 работает без бубнов, Python отдельно ставить не нужно — он идёт уже в составе сборки. Скорее всего, это баг именно конкретной установки . Попробуйте взять «portable»-сборку с сайта Gajim.

И да, в Gajim надо вручную включить OMEMO (замочек внизу), иначе переписка идёт в открытом виде. Ну и имейте в виду — звонков в нём пока нет, только чаты.

Нормисы открывают забытые технологии древних... потому что всё остальное уже заблокировано или лагает без впн...

сказать что эта штука "из коробки" не работает из-за npm (в контейнере) - это не сказать ничего. Криво настроеный Certbot не может получить сертификат (на том-же сервере у mastodon всё прекрасно). После победы над сертботом с помощью трюка с доп. контейнером - snikket-proxy почему-то не перенаправляет трафик в нужную сторону.
В общем, может на отдельном сервере всё и работает "за 5 минут" - но для меня отдельный сервер на каждое приложение это непозволительная роскошь.
Если у кого-то есть опробованный docker-compose.yml (npm+snikket), поднимающийся одной up командой - буду счастлив (и думаю, далеко не я один) изменить мнение.

Snikket задуман как «коробка под отдельный сервер».. Всё это можно разрулить простым способом — добавить к VPS ещё один IP

Может я странный, но немного удивило название кукиса, который создается в Firefox при подключении к селфхостед Snikket - "tamtam.chat"

Да, tamtam.chat — это служебный локальный домен, который Snikket использует для авторизации. Наружу он не уходит, всё остаётся внутри контейнера. Название, конечно, забавное ))

Не в названии забавность. Попробуйте погуглить эту фразу...

Простите, я сначала подумал, что Snikket для прикола назвал служебный домен tamtam.chat. Но потом копнул глубже — в коде на GitHub ни строки про это не нашёл. Поставил плагин для просмотра кук — там тоже только сессия от моего домена.

В публичном коде Snikket tamtam.chat нигде не используется. Скорее всего, у вас в браузере осталась старая кука от реального мессенджера TamTam.

Дело в том, что в процессе "верчения" Snikket "протух" токен авторизации на портале. Попытка выяснить какой кук хранит токен поиском среди остальных привела к куку с именем " tamtam.chat". Его удаление ввостановило доступ к порталу. И так случилось несколько раз. Но сегодня воспроизвести не могу... Возможно, сбой в матрице...

И еще немного.
"Windows — Gajim" - поддержки звонков в последней версии не обнаружил. Автор в FAQ сказал о поддержке - "This feature is currently not available as it is broken and not maintained. ".
Не подскажите десктопную версию клиента с поддержкой хотя бы аудио звонков? На xmpp.org был - там все печально

Под Windows XMPP-клиенты со звонками (Jingle):

  • Jitsi Desktop — старый, но рабочий, вроде умеет звонки (проект заморожен).

  • AstraChat — коммерческий, но простой, у меня есть ребята которые с него звонят

  • Movim — веб-клиент в браузере, поддерживает WebRTC-звонки.

  • Dino — современный, с e2e-звонками, но официально только Linux (под Win можно собрать, если заморочится).

Мне просто пока без надобности на десктопе голосовые звонки. Поэтому не разбирался глубоко. Так что если у вас получится, то пожалуйста, напишите. Это интересно.

Dino - не завелся с Snikket;
AstraChat - взят с гитхаба, функционала звонков не обнаружил;
Jitsi Desktop - лично не щупал, но коллега вчера его помучил, подцепится к Snikket не удалось;
Movim - посмотрю;
Спс за инфу.

Я вот еще не пробовал в https://www.bluestacks.com/ru/index.html snikket засунуть. Эмулятор андроида. Может и Макс туда же за одно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации