Найти в Дзене
Тюнинг Админа

Корпоративный чат в Docker на Ubuntu 24.04LTS + Snikket

В этой статье речь пойдет о том, как поднять свой собственный мессенджер аналог заблокированным, я в свою очередь буду поднимать решение на Ubuntu 24.04LTS в Docker контейнере. Snikket — это платформа для безопасного общения с друзьями или коллегами, которую часто используют в качестве корпоративного мессенджера. Решение представляет собой бесплатный, открытый и безопасный сервер обмена мгновенными сообщениями, работающий на протоколе XMPP. В DNS панели управления вашего хостинг провайдера добавляем учетную запись типа А и в поле значение указываем ip адрес нашей VDS: A chat.tuning-admina.ru → <белый IP VDS/VPS> Добавляем записи типа CNAME: CNAME groups.chat.tuning-admina.ru → chat.tuning-admina.ru
CNAME share.chat.tuning-admina.ru → chat.tuning-admina.ru На маршрутизаторе создаем два правила типа DST-NAT на WAN интерфейсе со следующим списком портов и указанием адреса для форварда запросов: Обновим систему: apt update -y && apt upgrade -y Устанавливаем имя нашему серверу: hos
Оглавление

В этой статье речь пойдет о том, как поднять свой собственный мессенджер аналог заблокированным, я в свою очередь буду поднимать решение на Ubuntu 24.04LTS в Docker контейнере.

Snikket — это платформа для безопасного общения с друзьями или коллегами, которую часто используют в качестве корпоративного мессенджера. Решение представляет собой бесплатный, открытый и безопасный сервер обмена мгновенными сообщениями, работающий на протоколе XMPP.

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

  • Возможности решения
  • Системные требования
  • Настройка DNS
  • Настройка маршрутизатора
  • Подготовка системы
  • Установка Docker
  • Создание каталога под проект
  • Установка Snikket
  • Настройка решения
  • Настройка брандмауэра
  • Клиентские приложения
  • Вывод

Возможности решения

  • Сквозное шифрование. Сообщения и файлы, которые один пользователь отправляет другому, попадают прямо адресату, без посредников. Это гарантирует конфиденциальность общения.
  • Обмен фотографиями, видео и документами.
  • Голосовые и видеозвонки. Звонки проводятся в зашифрованном режиме.
  • Создание нескольких аккаунтов. Можно разделить личные и рабочие коммуникации.
  • Синхронизация сообщений. Доступ к аккаунту можно получить с нескольких устройств, при этом переписка будет автоматически синхронизироваться.
  • Групповые чаты. Можно создавать, присоединяться к группам и выбирать, какие из них приватные или публичные.
  • Создание зашифрованных резервных копий. Резервные копии можно хранить в безопасном месте и восстанавливать на новом устройстве, если, например, потерян телефон.
  • Поддержка различных платформ. Клиенты Snikket доступны для Android, iOS, Windows, macOS и Linux.

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

  • Процессор: 1- ядерный от 2ГГц
  • Оперативная память: от 1ГБ
  • Накопитель: от 10ГБ
-2

Настройка DNS

В DNS панели управления вашего хостинг провайдера добавляем учетную запись типа А и в поле значение указываем ip адрес нашей VDS:

A chat.tuning-admina.ru → <белый IP VDS/VPS>

-3

Добавляем записи типа CNAME:

CNAME groups.chat.tuning-admina.ruchat.tuning-admina.ru
CNAME share.chat.tuning-admina.ruchat.tuning-admina.ru

-4

Настройка маршрутизатора

На маршрутизаторе создаем два правила типа DST-NAT на WAN интерфейсе со следующим списком портов и указанием адреса для форварда запросов:

-5

Подготовка системы

Обновим систему:

apt update -y && apt upgrade -y

Устанавливаем имя нашему серверу:

hostnamectl set-hostname chat.tuning-admina.ru

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

apt install mc net-tools git curl ca-certificates software-properties-common -y

Перезагружаем машинку:

reboot

Установка Docker

Добавим GPG key от репозитория Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Добавим репозиторий Docker:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновим сведения о пакетах в репозиториях:

apt update

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

apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Стартуем службу Docker:

systemctl start docker

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

systemctl status docker

-6

Установка Snikket

Создадим каталог для конфигурации Snikket:

mkdir /etc/snikket

Переходим в каталог:
cd /etc/snikket

Скачиваем docker-compose.yml файл:

curl -o docker-compose.yml https://snikket.org/service/resources/docker-compose.yml

-7

Создаем файл конфигурации snikket.conf:

nano snikket.conf

# The primary domain of your Snikket instance
SNIKKET_DOMAIN=chat.tuning-admina.ru

# An email address where the admin can be contacted
# (also used to register your Let's Encrypt account to obtain certificates)
SNIKKET_ADMIN_EMAIL=admin@tuning-admina.ru

Сохраняем файл и выходим из редактора:

CTRL+O, CTRL+X

Запускаем процесс создания и запуска контейнеров:

docker compose up -d

-8

Запускаем процедуру принудительного получения SSL сертификатов let's Encrypt:

docker compose exec snikket_certs /etc/cron.daily/certbot

-9

Сгенерируем ссылку для создания административного аккаунта:

docker exec snikket create-invite --admin --group default

Переходим по сгенерированной ссылке и регистрируемся, после чего

переходим на главную страницу и проходим авторизацию:

https://chat.tuning-admina.ru

-10

Поздравляю установка и первичная настройка завершена!!!

Настройка решения

В этом блоке я вам расскажу и покажу как производить регистрацию пользователей, создание Кругов(Блоков по отделам компании), а также чатов внутри этих кругов.

Заходим в управление кругами:

-11

Здесь мы видим круг созданный по умолчанию, который нельзя править или удалять:

-12

Представим что мы работаем в средней статистической компании и у нас есть к примеру отдел ИТ, АХО, Менеджеры по продажам, Руководство, Бухгалтерия, Отдел закупок, создадим круги согласно этим отделам, должно получиться так:

-13

Выбираем ИТ отдел и нажимаем на значок редактировать:

-14

В рамках ИТ отдела мы добавим общий групповой чат и назовем его Заявки пользователей:

-15

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

-16

Также можно создавать отдельные чаты по направлениям деятельности: СКУД, Видеонаблюдение, ЛВС, Сервера, ip телефония, оргтехника, Заявки от Руководства, для удобства общения в рамках отдела между сотрудниками и обсуждения планов работ и прочих моментов.

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

На главной странице переходим в раздел Приглашения и генерируем ссылку для регистрации наших пользователей согласно отделу компании:

-17

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

-18

Получаем страницу где присутствует сгенерированная системой ссылка на приглашение:

-19

Пользователь видит страницу где присутствует ссылки на приложение в Google Play или App Store, а также в самом нижу он может нажав на ссылку Зарегистрировать учетную запись в системе, что мы и сделаем:

-20

Указываем ваш nick name или фамилию и нажимаем Зарегистрироваться:

-21

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

-22
-23

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

Порты необходимые для корректной работы решения:

Только TCP:

  • 80/443 - порты на которых доступен Вэб интерфейс портала Snikket
  • 5222 - порт для подключения клиентского приложения (XMPP-c2s)
  • 5269 - порт синхронизации с другими серверами Snikket (XMPP-s2s)
  • 5000 - порт прокси-сервера для передачи файлов (proxy65)

TCP и UDP:

  • 3478/3479 - Аудио/видеоданные Прокси-переговоры и IP-открытие
  • 5349/5350 - Аудио/видеоданные Прокси-переговоры и IP-обнаружение по TLS

Только UDP:

  • 49152-65535 - Аудио/видео Data Proxy

В качестве брандмауэра я буду использовать UFW, установим его:

apt install ufw -y

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

ufw allow from "мой_ip" to any port 22 proto tcp

Добавляем правила для доступа по вэб интерфейсу:
ufw allow 80/tcp
ufw allow 443/tcp


Добавляем правила для клиент серверного взаимодействия по протоколу XMPP:
ufw allow 5222/tcp
ufw allow 5269/tcp


Добавляем правила для корректной работы STUN/TURN:
ufw allow 3478/tcp
ufw allow 3478/udp
ufw allow 3479/tcp
ufw allow 3479/udp
ufw allow 5349/tcp
ufw allow 5349/udp
ufw allow 5350/tcp
ufw allow 5350/udp


Добавляем правило для корректной работы RTP-реле TURN (медиа)
ufw allow 49152:65535/udp

Добавляем правило для корректной работы proxy65 для file-transfer
ufw allow 5000/tcp

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

systemctl enable ufw

systemctl start ufw

проверяем статус службы брандмауэра:

systemctl status ufw

-24

Решение проблем

Проверка логов на наличие ошибок связанных с получением сертификатов Let's Encrypt:

cd /etc/snikket
docker compose exec snikket_certs cat /var/log/letsencrypt/errors.log

Принудительный запуск процедуры получения или продления сертификатов:

cd /etc/snikket
docker compose exec snikket_certs su letsencrypt -- -c "certbot renew --config-dir /snikket/letsencrypt --cert-path /etc/ssl/certbot --force-renew"

Если по каким то причинам ваше решение перестало работать, то предлагаю выполнить следующие шаги:

  • Останавливаем контейнеры

docker compose stop

  • Удаляем контейнеры

docker container prune

  • Создаем и запускаем контейнеры в фоновом режиме

docker compose up -d

Обновление решения

Для обновления решения вам необходимо перейти в каталог где лежит наш docker-compose.yml файл:

cd /etc/snikket

Запускаем команду для загрузки свежих образов наших сервисов:
docker compose pull

Запускаем контейнеры в фоновом режиме:
docker compose up -d

Клиентские приложения

От разработчиков решения представлены клиентские приложения под Android и ios устройства:

Вывод

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