Перейти к основному контенту

Установка и настройка личного XMPP сервера

intro-xmpp-install-debian-planetahost.png

Подробности урока

Уровень сложности Средний
Права root Требуются
Требования Терминал Linux
Категория Установка ПО
Совместимость с ОС Debian
Примерное время чтения 2 часа

Введение

В этой инструкции мы развернём полноценный XMPP-сервер для личного или корпоративного использования.

После завершения у вас будет:

  • собственный Jabber-сервер
  • поддержка федерации (другие сервера смогут писать вам)
  • шифрование TLS
  • поддержка OMEMO (сквозное шифрование в клиентах)
  • веб-админка
  • закрытая регистрация (без спама)
  • возможность голосовых и видео-звонков

В этой инструкции используется официальный .deb пакет проекта ejabberd с GitHub, а не версия из стандартного репозитория Debian.
У него отличается расположение файлов: конфигурация находится в /opt/ejabberd/conf/, а не в /etc/ejabberd/, как в Debian-пакете.
Если вы установили ejabberd через apt install ejabberd, пути и структура каталогов будут другими, и команды из этой инструкции могут не совпадать.

Подготовка VPS

XMPP сервер обязан знать своё правильное доменное имя. Если hostname не совпадает, то TLS и федерация будут работать с ошибками.

В примерах в инструкции будет использоваться домен ms.tex-lab.ru и IP сервера 62.173.138.27. Обязательно замените их на свои реальные домен и IP при настройке.

1) Устанавливаем FQDN

hostnamectl set-hostname ms.tex-lab.ru

Проверяем:

hostnamectl

Должно быть:

Static hostname: ms.tex-lab.ru

image.png

2) Правим /etc/hosts

Открываем

nano /etc/hosts

Добавляем:

127.0.0.1       localhost
IP_ВАШЕГО_VPS   ms.tex-lab.ru

image.png

Это нужно, чтобы сервер корректно сопоставлял своё имя и IP.

Настройка DNS

В панели домена создаём:

A-запись

ms.tex-lab.ru → IP_VPS

Это указывает домен на ваш сервер.

SRV-записи

_xmpp-client._tcp.ms.tex-lab.ru.  0 5 5222 ms.tex-lab.ru
_xmpp-server._tcp.ms.tex-lab.ru.  0 5 5269 ms.tex-lab.ru

SRV записи нужны для федерации и правильного подключения клиентов.

Проверка:

dig SRV _xmpp-client._tcp.ms.tex-lab.ru
dig SRV _xmpp-server._tcp.ms.tex-lab.ru

Если видите свой сервер, то DNS настроен правильно.

Установка ejabberd

Скачиваем официальный релиз:

wget https://github.com/processone/ejabberd/releases/download/26.02/ejabberd_26.02-1_amd64.deb

Если сервер ARM, то нужен arm64 пакет.

Обновляем список пакетов:

apt update

Устанавливаем:

apt install ./ejabberd_26.02-1_amd64.deb

Проверяем запуск:

ejabberdctl status

Установка прошла успешно, если сервис запустился и работает.

image.png

Открытие портов

Основные XMPP-порты

Порт Протокол Назначение
5222 TCP Подключение клиентов (STARTTLS)
5269 TCP Связь между XMPP-серверами (S2S)
5443 TCP Веб-админка
5280 TCP HTTP-bind / WebSocket (если используется)

Порты для звонков (STUN / TURN)

Порт Протокол Назначение
3478 UDP STUN / TURN
3478 TCP TURN
5349 TCP TURN over TLS

Эти порты обязательны, если используется coturn

Как открыть порты в Linux

Если используется UFW:

ufw allow 5222/tcp
ufw allow 5269/tcp
ufw allow 5443/tcp
ufw allow 5280/tcp

ufw allow 3478/tcp
ufw allow 3478/udp
ufw allow 5349/tcp

Проверить статус:

ufw status

Если UFW выключен:

ufw enable

Если используется iptables

Пример открытия портов:

iptables -A INPUT -p tcp --dport 5222 -j ACCEPT
iptables -A INPUT -p tcp --dport 5269 -j ACCEPT
iptables -A INPUT -p tcp --dport 5443 -j ACCEPT
iptables -A INPUT -p tcp --dport 5280 -j ACCEPT

iptables -A INPUT -p tcp --dport 3478 -j ACCEPT
iptables -A INPUT -p udp --dport 3478 -j ACCEPT
iptables -A INPUT -p tcp --dport 5349 -j ACCEPT

Не забудьте сохранить правила.

Получение SSL сертификата

Без TLS XMPP сервер считается небезопасным, а федерация может не работать.

1) Останавливаем ejabberd:

systemctl stop ejabberd

2) Устанавливаем certbot:

apt install certbot

3) Получаем сертификат:

certbot certonly --standalone -d ms.tex-lab.ru

image.png

4) Создаём группу (если её нет)

groupadd ssl-cert

Обычно она уже существует, но команда не повредит.

5) Добавляем пользователя ejabberd в эту группу

usermod -aG ssl-cert ejabberd

Важно: после этого может потребоваться перезапуск сервиса.

6) Назначаем группу для сертификатов

chgrp -R ssl-cert /etc/letsencrypt

7) Настраиваем права доступа

chmod -R 750 /etc/letsencrypt

8) Запускаем сервер:

systemctl start ejabberd


Настройка ejabberd

Открываем файл конфигурации:

nano /opt/ejabberd/conf/ejabberd.yml

Меняем hosts

Было:

hosts:
  - "localhost"

Станет:

hosts:
  - "ms.tex-lab.ru"

Это основной XMPP-домен.

Указываем сертификаты

Найдите блок:

certfiles:
  - "/etc/ejabberd/ejabberd.pem"

И замените на:

certfiles:
  - /etc/letsencrypt/live/ms.tex-lab.ru/fullchain.pem
  - /etc/letsencrypt/live/ms.tex-lab.ru/privkey.pem

В access_rules добавьте:

  register:
    deny: all

Это защита от спам-ботов.

Включаем обязательный TLS

В блоке порта 5222 включить:

starttls_required: true

Теперь клиенты будут обязаны подключаться через шифрование.

Проверяем модули для OMEMO

В блоке modules должны быть:

mod_mam:
  assume_mam_usage: true
  default: always

mod_pubsub:
  access_createnode: local

OMEMO работает в клиентах, сервер лишь поддерживает нужные функции.

Включаем Web-админку

В блоке listen:

  -
    port: 5280
    module: ejabberd_http
    request_handlers:
      "/admin": ejabberd_web_admin

Для HTTPS:

  -
    port: 5443
    module: ejabberd_http
    tls: true
    request_handlers:
      "/admin": ejabberd_web_admin

Задаем явно администратора

Найдем:

acl:
  local:
    user_regexp: ""

И укажем админа:

acl:
  admin:
    user: admin@ms.tex-lab.ru
  local:
    user_regexp: ""

Перезагрузите сервис:

systemctl restart ejabberd

Если ошибка, то просмотрите логи:

journalctl -u ejabberd -n 50 --no-pager

Создание администратора

1) Введем команду:

ejabberdctl register admin ms.tex-lab.ru СЛОЖНЫЙ_ПАРОЛЬ

image.png

Откройте в браузере:

https://ms.tex-lab.ru:5443/admin

Это защищённая HTTPS-панель администрирования XMPP-сервера.

Войдите под ранее созданной учётной записью администратора
(например, admin@ms.tex-lab.ru).

image.png

Веб-интерфейс позволяет управлять сервером без ручного редактирования конфигов:

  • Управление пользователями
  • Мониторинг подключений
  • Управление MUC (групповые чаты)
  • Управление модулями сервера
  • Просмотр статистики и состояния сервера

Проверка работы

После настройки сервера на базе ejabberd необходимо проверить подключение с клиентского устройства.

1) Установка клиента

XMPP поддерживается на большинстве платформ.

Android

  1. Conversations - современный, стабильный, поддерживает OMEMO и звонки
  2. Xabber - простой и понятный интерфейс

iOS

  1. Monal - стабильный и лёгкий клиент
  2. Siskin IM - поддержка современных расширений XMPP

Windows

  1. Gajim - функциональный и удобный
  2. Psi+ - лёгкий и минималистичный

Linux

  1. Gajim - один из лучших вариантов
  2. Dino - современный интерфейс

2) Проверка подключения

  1. Установите любой XMPP-клиент.

  2. Выберите «Добавить аккаунт».

  3. Укажите:

    • JID (логин): пользователь@ms.tex-lab.ru

    • Пароль: тот, который вы задали

    • Сервер: ms.tex-lab.ru (если требуется вручную)

  4. Подключитесь.

Если всё настроено правильно, то статус станет «В сети».

3) Проверка отправки сообщений

Для тестирования:

  1. Создайте второго пользователя через админ-панель или командой, как создавали админа,
  2. Авторизуйтесь под разными аккаунтами на двух устройствах.
  3. Добавьте собеседника в контакты (введите его JID).
  4. Отправьте сообщение.

Если сообщение дошло до собеседника, то сервер работает.

5249057353137591791.jpg


Подключение звонков и видео

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

1. Установка TURN-сервера

Устанавливаем coturn:

apt update
apt install coturn -y

Включаем автозапуск:

systemctl enable coturn

2. Генерация секрета

TURN должен использовать тот же secret, что и ejabberd.

Сгенерировать можно так:

openssl rand -hex 32

Пример:

a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4m5n6o7p8q9r0s1t2

3. Настройка TURN (/etc/turnserver.conf)

Открываем файл:

nano /etc/turnserver.conf

Приводим конфигурацию к такому виду:

listening-port=3478
tls-listening-port=5349

fingerprint
use-auth-secret
static-auth-secret=СЕКРЕТ_ИЗ_OPENSSL

realm=ms.tex-lab.ru

cert=/etc/letsencrypt/live/ms.tex-lab.ru/fullchain.pem
pkey=/etc/letsencrypt/live/ms.tex-lab.ru/privkey.pem

Сохраняем и перезапускаем:

systemctl restart coturn

Проверяем:

systemctl status coturn

image.png

4. Настройка ejabberd

Теперь подключаем TURN к ejabberd.

Открываем файл конфигурации:

nano /opt/ejabberd/conf/ejabberd.yml

В конфиге ejabberdmodules добавляем:

  mod_stun_disco:
    secret: "СЕКРЕТ_ТОТ_ЖЕ_ЧТО_В_TURN"
    services:
      - host: "ms.tex-lab.ru"
        port: 3478
        transport: udp
      - host: "ms.tex-lab.ru"
        port: 5349
        transport: tcp

В secret должен быть тот же static-auth-secret, что в turnserver.conf.

Перезапускаем ejabberd:

systemctl restart ejabberd

Проверка звонков:

  1. Откройте чат с пользователем.
  2. Нажмите кнопку звонка.
  3. Разрешите доступ к микрофону/камере.
  4. Проверьте соединение.

При успешной настройке звонок установится даже при работе через мобильную сеть или за NAT.

5248970384344814282.jpg

Подключение ejabberd к MariaDB

Зачем подключать базу

  1. Хранение пользователей, чатов, комнат (MUC), истории сообщений.
  2. Возможность масштабирования и резервного копирования.
  3. Поддержка больших нагрузок и интеграций.

Установка MariaDB

apt install mariadb-server mariadb-client -y

Настройка MariaDB для ejabberd

Создаём пользователя для ejabberd:

CREATE DATABASE ejabberd;
CREATE USER 'ejabberd'@'localhost' IDENTIFIED BY 'СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON ejabberd.* TO 'ejabberd'@'localhost';
FLUSH PRIVILEGES;

Таблицы ejabberd создаёт сам при подключении к базе.

Настройка ejabberd

В ejabberd.yml прописываем только подключение к БД  в начале файла:

sql_type: mysql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "СЛОЖНЫЙ_ПАРОЛЬ"
sql_port: 3306

В блоке modules должны быть:

Надо найти:

  mod_mam:
    assume_mam_usage: true
    default: always

Привести к виду:

  mod_mam:
    db_type: sql
    assume_mam_usage: true
    default: always

Перезапускаем ejabberd:

systemctl restart ejabberd

Теперь ejabberd будет писать данные на внешнюю БД.

Заключение

В этой статье мы показали, как настроить XMPP-сервер ejabberd на домене ms.tex-lab.ru с поддержкой:

  • Обмена сообщениями через WebSocket

  • Голосовых и видеозвонков через STUN/TURN

  • Хранения данных пользователей, чатов и истории сообщений в MariaDB с включённым MAM

  • Шифрования сообщений и федерации серверов

При этом важно понимать, что это лишь вершина настроек - ejabberd имеет множество дополнительных возможностей и модулей, которые мы не рассматривали.

Для полного изучения всех функций и оптимальных конфигураций рекомендуется обращаться к официальной документации.