В этой статье речь пойдет о том, как поднять свой собственный мессенджер аналог заблокированным, я в свою очередь буду поднимать решение на Ubuntu 24.04LTS в Docker контейнере.
Snikket — это платформа для безопасного общения с друзьями или коллегами, которую часто используют в качестве корпоративного мессенджера. Решение представляет собой бесплатный, открытый и безопасный сервер обмена мгновенными сообщениями, работающий на протоколе XMPP.
Содержание статьи
- Возможности решения
- Системные требования
- Настройка DNS
- Настройка маршрутизатора
- Подготовка системы
- Установка Docker
- Создание каталога под проект
- Установка Snikket
- Настройка решения
- Настройка брандмауэра
- Клиентские приложения
- Вывод
Возможности решения
- Сквозное шифрование. Сообщения и файлы, которые один пользователь отправляет другому, попадают прямо адресату, без посредников. Это гарантирует конфиденциальность общения.
- Обмен фотографиями, видео и документами.
- Голосовые и видеозвонки. Звонки проводятся в зашифрованном режиме.
- Создание нескольких аккаунтов. Можно разделить личные и рабочие коммуникации.
- Синхронизация сообщений. Доступ к аккаунту можно получить с нескольких устройств, при этом переписка будет автоматически синхронизироваться.
- Групповые чаты. Можно создавать, присоединяться к группам и выбирать, какие из них приватные или публичные.
- Создание зашифрованных резервных копий. Резервные копии можно хранить в безопасном месте и восстанавливать на новом устройстве, если, например, потерян телефон.
- Поддержка различных платформ. Клиенты Snikket доступны для Android, iOS, Windows, macOS и Linux.
Системные требования
- Процессор: 1- ядерный от 2ГГц
- Оперативная память: от 1ГБ
- Накопитель: от 10ГБ
Настройка DNS
В 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
Устанавливаем имя нашему серверу:
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
Установка Snikket
Создадим каталог для конфигурации Snikket:
mkdir /etc/snikket
Переходим в каталог:
cd /etc/snikket
Скачиваем docker-compose.yml файл:
curl -o docker-compose.yml https://snikket.org/service/resources/docker-compose.yml
Создаем файл конфигурации 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
Запускаем процедуру принудительного получения SSL сертификатов let's Encrypt:
docker compose exec snikket_certs /etc/cron.daily/certbot
Сгенерируем ссылку для создания административного аккаунта:
docker exec snikket create-invite --admin --group default
Переходим по сгенерированной ссылке и регистрируемся, после чего
переходим на главную страницу и проходим авторизацию:
https://chat.tuning-admina.ru
Поздравляю установка и первичная настройка завершена!!!
Настройка решения
В этом блоке я вам расскажу и покажу как производить регистрацию пользователей, создание Кругов(Блоков по отделам компании), а также чатов внутри этих кругов.
Заходим в управление кругами:
Здесь мы видим круг созданный по умолчанию, который нельзя править или удалять:
Представим что мы работаем в средней статистической компании и у нас есть к примеру отдел ИТ, АХО, Менеджеры по продажам, Руководство, Бухгалтерия, Отдел закупок, создадим круги согласно этим отделам, должно получиться так:
Выбираем ИТ отдел и нажимаем на значок редактировать:
В рамках ИТ отдела мы добавим общий групповой чат и назовем его Заявки пользователей:
И ниже созданного чата мы добавляем в чат всех наших пользователей, которые могут оставлять заявки в режиме реального времени:
Также можно создавать отдельные чаты по направлениям деятельности: СКУД, Видеонаблюдение, ЛВС, Сервера, ip телефония, оргтехника, Заявки от Руководства, для удобства общения в рамках отдела между сотрудниками и обсуждения планов работ и прочих моментов.
В круги и чаты можно по выбору добавлять тех или иных сотрудников, подрядчиков и внештатных специалистов, образуя тем самым тематическую подборку.
На главной странице переходим в раздел Приглашения и генерируем ссылку для регистрации наших пользователей согласно отделу компании:
Выбираю тип ссылки для группы лиц, так как буду добавлять несколько сотрудников, выбираю тип обычный пользователь, время жизни ссылки на ваше усмотрение, а также выбираю круг пользователей, в моем случае ИТ и нажимаю Новая ссылка на приглашение:
Получаем страницу где присутствует сгенерированная системой ссылка на приглашение:
Пользователь видит страницу где присутствует ссылки на приложение в Google Play или App Store, а также в самом нижу он может нажав на ссылку Зарегистрировать учетную запись в системе, что мы и сделаем:
Указываем ваш nick name или фамилию и нажимаем Зарегистрироваться:
После этого переходим на главную страницу и авторизуемся в системе, рекомендую отредактировать ваш профиль задав в роли синонима ваше Имя и Фамилию, чтобы сотрудники безошибочно вас идентифицировали:
Настройка брандмауэра
Порты необходимые для корректной работы решения:
Только 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
Решение проблем
Проверка логов на наличие ошибок связанных с получением сертификатов 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 устройства:
Вывод
На мой взгляд это одно из самых простых в установке и администрированию решений, в управлении которым разберется даже школьник, но в тоже самое отвечает всем необходимым требованиям и имеет приятный и дружелюбный интерфейс. Одним словом очень рекомендую.