Найти тему
Тюнинг Админа

Сервер для обмена мгновенными сообщениями на Ubuntu 22.04LTS + Ejabberd 22.10

Оглавление

Ejabberd - это один из самых популярных серверов XMPP с открытым исходным кодом, разработан для обеспечения высокой скорости работы и отказоустойчивостью, а также простотой настройки и масштабируемостью.

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

Ejabberd использует Mnesia  - распределенную внутреннюю базу данных, но поддерживаются и другие системы баз данных:

  • Базы данных SQL , такие как MySQL или PostgreSQL
  • Базы данных NoSQL , такие как Riak (также написанные на Erlang)

Содержание статьи

  • Возможности сервера
  • Системные требования
  • Подготовка сервера
  • Установка ejabberd
  • Настройка конфигурации сервера
  • Получение и привязка сертификатов Let's Encrypt
  • Настройка брандмауэра и Fail2ban
  • Установка и настройка клиентских приложений
  • Вывод

Возможности сервера

  • Управление потоками для обеспечения надежности сообщений на мобильных устройствах
  • Хранение и пересылка
  • Список контактов и присутствие
  • Обмен сообщениями один на один
  • Расширение присутствия пользователя: протокол персональных событий (PEP) и индикатор ввода
  • Профиль пользователя с vCards
  • Групповой чат
  • Архивация сообщений
  • Квитанции о доставке сообщений
  • Настройки конфиденциальности
  • Последнее действие
  • Метрики и полное администрирование из командной строки
  • Полнофункциональная веб-поддержка с BOSH и веб-сокетами

Системные требования

Минимальные системные требования:

  • Процессор: 1 ядро от 1Ггц
  • Оперативная память: 512МБ
  • Жёсткий диск: от 5ГБ

Системные требования для организации на 100 пользователей:

  • Процессор: от 2 ядер по 1,5Ггц
  • Оперативная память: от 2ГБ
  • Диск от 100ГБ

Подготовка сервера

Повысим наши права в системе:

sudo -s

Обновление системы:

apt update && apt upgrade -y

Перезагружаем сервер:

reboot

Устанавливаем дополнительные пакеты:

apt install mc nano wget net-tools -y

Переименуем наш сервер:

hostnamectl set-hostname ejabberd.tuning-admina.ru

Установка ejabberd

В репозиториях Ubuntu есть ejabberd, проверим версию:

apt show ejabberd

Package: ejabberd

Version: 21.12-1

Видим, что версия старая и нам не подходит.

Скачиваем и добавляем репозиторий разработчика:

curl -o /etc/apt/sources.list.d/ejabberd.list https://repo.process-one.net/ejabberd.list

curl -o /etc/apt/trusted.gpg.d/ejabberd.gpg https://repo.process-one.net/ejabberd.gpg

Обновляем информацию о пакетах в репозитории:

apt update

проверяем версию:

apt show ejabberd

Package: ejabberd

Version: 22.10-1

Вот совсем другое дело, переходим к установке:

apt install ejabberd

Проверяем статус службы:

systemctl status ejabberd

Active: active (running) since Tue 2023-01-10 23:56:26 MSK

Добавим в автозагрузку службу ejabberd:

systemctl enable ejabberd

Настройка конфигурации сервера

Добавление учётной записи пользователя, которому в дальнейшем добавим права администратора в Ejabberd:

ejabberdctl register admin ejabberd.tuning-admina.ru SuperP@ssw0rd

User admin@ejabberd.tuning-admina.ru successfully registered

Идем по адресу: http://ejabberd.tuning-admina.ru:5280/admin или https://ejabberd.tuning-admina.ru:5443/admin

Вводим имя администратора и пароль:

-2

Если видим пустую панель администрирования, то это говорит о том, что у данного пользователя недостаточно прав для доступа:

-3

Переходим к правке главного конфигурационного файла /opt/ejabberd/conf/ejabberd.yml и добавляем права ранее созданному пользователю:

nano /opt/ejabberd/conf/ejabberd.yml

acl:

admin:

- user:

admin@ejabberd.tuning-admina.ru

local:

user_regexp: ""

loopback:

ip:

- 127.0.0.0/8

- ::1/128

- ::FFFF:127.0.0.1/128

  • - Жирным я выделил добавляемый фрагмент, в котором указано пользователь какой учётной записи имеет административные права.

CTRL+O, CTRL+X

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

systemctl restart ejabberd

Переходим в панель администрирования: https://ejabberd.tuning-admina.ru:5443/admin

-4

Как видим у нас полные права на административный интерфейс.

Рассмотрим пункты интерфейса и настроек:

  • Виртуальные хосты
-5

Выбирая виртуальный хост мы попадаем во вложенное меню по администрированию, добавлять и редактировать виртуальные хосты можно в конфигурационном файле /opt/ejabberd/conf/ejabberd.yml в параметре hosts

-6

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

-7

Щелкнув по пользователю, мы можем сменить пароль пользователя, удалить пользователя и переписку.

-8

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

-9

- Последнее подключение - Страница статистики подключения пользователей

-10

- Группы общих контактов - Служат для создания общих контактов

-11

При выборе Группы попадаем на страницу настройки группы.

-12

  • Узлы - пункт отображающий состав и статус узлов кластера
-13

При выборе узла мы попадаем во вложенное меню

-14

Где можно перезапустить службу или остановить.

- База данных - Управление использованием и записью таблиц базы, очень полезная опция для оптимизации и ускорения работы

-15

- Резервное копирование - страница на которой можно перенастроить каталог для бэкапа данных разбитых на группы

-16

- Статистика - отображается статистика узла кластера

-17

- Обновить - Плагин для управления сценарием обновления узла кластера

-18

- Contrib Modules - Модуль для разработчиков

-19

  • Статистика - Краткая статистика по зарегистрированным и подключенным пользователям
-20
  • Конференция - Статистика по конференц комнатам
-21

Получение и обновление сертификатов Let's Encrypt

Для регистрации и получения сертификатов let's Encrypt установим web сервер nginx, клиент центра сертификации Certbot и плагин на Python3 для работы всей этой связки:

apt install nginx certbot python3-certbot-nginx -y

Выполним команду для создание запроса на получение сертификатов:

certbot --nginx -d ejabberd.tuning-admina.ru

При запросе сертификата Let's Encrypt, у вас попросят ввести почтовый ящик для регистрации:

-22

Сертификаты получены и записаны

-23

Перезаписываем сертификат в папке /opt/ejabberd/conf/:

cp /etc/letsencrypt/live/ejabberd.tuning-admina.ru/cert.pem /opt/ejabberd/conf/cacert.pem
cp /etc/letsencrypt/live/ejabberd.tuning-admina.ru/fullchain.pem /opt/ejabberd/conf/server.pem

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

systemctl restart ejabberd

Проверяем обновив страничку:

-24

Как видим сертификат валидный

Переходим в консоль и перемещаемся в директорию:

cd /etc/letsencrypt/renewal-hooks/post

Создаем скрипт:

nano copykeys.sh

Добавляем две команды для копирования сертификатов:

cp /etc/letsencrypt/live/ejabberd.tuning-admina.ru/cert.pem /opt/ejabberd/conf/cacert.pem
cp /etc/letsencrypt/live/ejabberd.tuning-admina.ru/fullchain.pem /opt/ejabberd/conf/server.pem

systemctl restart ejabberd

CTRL+O, CTRL+X

Сделаем скрипт исполняемым:

chmod +x copykeys.sh

Автоматизируем процесс замещения и обновления сертификатов, для этого нам понадобится планировщик заданий Cron:

apt install cron -y

Добавляем службу планировщика заданий в автозагрузку:

systemctl enable cron

Отредактируем crontab:

crontab -e

Нажимаем: 1 для выбора редактора nano

Добавляем в самый низ строчки:

0 3 * * * /usr/bin/certbot renew --quiet

0 4 * * * /etc/letsencrypt/renewal-hooks/post/copykeys.sh

CTRL+O, CTRL+X

Итого у нас с вами получаются две строчки в планировщике заданий:

1-я запускает тихий процесс обновления сертификатов Let's Encrypt каждую ночь в 3:00

2-я запускает скрипт копирования сертификатов и перезапуск службы Ejabberd каждую ночь в 4:00

Настройка брандмауэра и Fail2ban

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

systemctl status ufw

Если отсутствует в системе, то устанавливаем:

apt install ufw

Первым делом перед запуском службы необходимо добавить правило доступа к нашему серверу по SSH:

ufw allow ssh from ip_address_admina

Если не запущен, запускаем и добавляем службу в автозапуск:

systemctl start ufw

systemctl enable ufw

Команда systemctl enable --now ufw сочетает в себе две предыдущих

Добавляем правило для доступа к панели управления ejabberd:

ufw allow 5280/tcp //Доступ к панели управления по http.

ufw allow 5443 //Доступ к панели управления по https

Добавляем правило для доступа к 80-му порту для nginx, если планируете использовать certbot и сертификаты let's Encrypt:

ufw allow 80/tcp

Добавляем правило для доступа к порту отвечающего за регистрацию в системе и обмену данными между ejabberd сервером и клиентами по протоколу xmpp:

ufw allow 5222 xmpp-c2s //Порт для клиентских подключений Jabber/XMPP, обычный или STARTTLS

ufw allow 5223 xmpp/ssl-c2s //Порт для клиентских подключений Jabber с использованием старого метода SSL

ufw allow 5269 s2s //Используется для межсерверных подключений на порту 5269 с STARTTLS для защищенного трафика строго обязательны, и сертификаты проверяются

ufw allow 4369 порт erlang для связи с другими кластерными нодами

Наш файрволл запрещает всё, что не разрешено, но если вы настаиваете то заблокируем все остальные запросы не из списка разрешенных:

ufw deny all

Установка клиентских приложений

В качестве клиентского приложения советую использовать:

Процесс установки клиентов описывать не буду, так как устанавливаются в два клика мышки, рассмотрим вопрос подключения к серверу:

Запускаем Spark:

Подключаемся под администратором для проверки.

-25
-26

Как видим успешно.

Запускаем Gajim:

Входим под администратором

-27

Нажимаем вход:

-28

Указываем полное имя хоста и порт:

-29

Подключение прошло успешно, учетная запись добавлена в клиентском приложении, здесь можно выбрать цвет подсветки учетной записи и Имя аккаунта, например Павел Иванов:

-30
-31

Запускаем Pidgin:

При запуске клиент предложит первым делом добавить учетную запись, нажимаем Добавить:

-32

Выбираем протокол XMPP, указываем нашу учетную запись

-33
-34
-35
-36

Как видим успешно.

Запускаем Psi+:

Заходим в настройки

-37

Добавляем учетную запись для подключения к серверу

-38
-39
-40
-41

Как видим подключение прошло успешно.

Вывод

Нагрузка в режиме простоя в работе:

-42

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