Разработка мессенджера для Андроид и iOS
Разработка мессенджера для смартфонов или сайта может стать успешным стартапом. Уже сейчас мессенджеры занимают первое место по количеству скачиваний в мире.

Исследование компании SimilarWeb: в 168 странах мессенджеры лидируют по количеству скачиваний.
В 2016 году в мире было 1,58 млрд пользователей мессенджеров. По данным Портала статистики Statista к 2021 году эта цифра вырастет до 2,48 млрд. А это уже треть населения Земли. Так что, возможно, уже сейчас имеет смысл создать свой мессенджер на Андроид или iOS.
Стоит ли создавать еще одно приложение messenger?
У каждого пользователя на телефоне установлены два-пять мессенджеров. Все они используются в той или иной степени.
Со временем некоторые приложения-мессенджеры теряют лидерские позиции, уступая место новым. Так, за один год Skype с первого места, которое он занимал несколько лет, переместился на четвертое. На пятом месте Telegram. Но, похоже, это тоже временный расклад, так как тот же Telegram быстро завоевывает рынок. В 2017 году наметился новый тренд — публичные каналы и чаты. Их наличие привлекает новых пользователей, по сути, превращая мессенджеры в социальные медиа. Возможно, это и стало причиной роста популярности Telegram.

Статистика роста количества пользователей мессенджеров показывает: потенциал у приложений для обмена сообщениями есть. Но при запуске стартапа нужно быть готовым к конкуренции. Разработка мессенджера для iOs или на Andriod начинается с правильной постановки задачи и подбора инструментов. Так мы получим приложение, которое удовлетворит потребности пользователей.
Как создать мессенджер, востребованный пользователями
Изначально мессенджеры создавались или как чаты, например WhatsApp, или как приложение для звонков — Skype, Viber. Позже в мессенджеры стали добавлять функции, которых изначально не было. Так, в WhatsApp добавились функции аудиозвонков, потом видео. Дальше появились открытые API, боты, маски, статусы, приемы платежей, публичные каналы. Однако внедрить новый функционал или изменить структуру, когда у мессенджера миллионы пользователей, сложно. В том же WhatsApp до сих пор нет API и ботов.
Основная сложность при создании приложения для отправки сообщений на Android или iOS — разработка архитектуры. Структуру приложения нужно разработать таким образом, чтобы в нее можно было безболезненно добавлять новые возможности.
При разработке мессенджера мы закладываем в его основу не только то, что уже есть в других приложениях, но и то, что может быть востребовано в будущем.
Наш подход к разработке архитектуры мессенджера
Большинство подходов к проектированию и разработке архитектуры сводится к модульной системе. Но модульность разная, да и сами модули могут быть огромными и монолитными.
В WOXAPP мы проектируем и разрабатываем архитектуру по принципам Clean architecture.
Чистая архитектура, описанная Робертом Мартином, позволяет спроектировать гибкую и масштабируемую систему.
В современном программном обеспечении это распространенная практика, но достичь Clean architecture получается не у всех. В своей работе мы придерживаемся ряда определенных принципов и получаем ожидаемый результат. На рисунке новая архитектура, которую презентовал Google. C помощью этого подхода и наших собственных доработок мы реализовываем чистую архитектуру на Android.

Гибкость, масштабируемость и тестируемость
В процессе работы мы делаем так, чтобы архитектура делилась на автономные слои. Тогда бизнес-логика, представление и объекты данных разделены и могут меняться независимо друг от друга. Вне зависимости от размеров системы такой подход сохраняет ее гибкость, масштабируемость (масштабирование количества функций) и тестируемость.
Масштабируемым делаем не только код, но и саму инфраструктуру системы.
Производительность приложения
Часто бывает так, что команды гонятся за ставшим популярным языком программирования. Они разрабатывают на нем продукт клиента, но в процессе работы понимают, что язык используют неверно. Нужно понимать все плюсы и минусы любого языка и инструмента. Надо использовать тот язык, который лучше всего подходит для построения эффективной системы, а не тот, что сейчас популярен.
В процессе работы думаем о задаче клиента и с этим подходим к выбору инструментов.
Как правило, программируем на PHP. Этот язык программирования используется в Whatsapp, Facebook, Stackoverflow. PHP не уступает остальным языкам по производительности и способен выдержать высокие нагрузки. Плюс этого языка в том, что после выполнения задачи ресурсы сервера высвобождаются, а правильно построенная архитектура и хороший стек технологий перекрывают недостатки языка.
Стоимость разработки проекта на PHP в разы дешевле, чем на языках типа Java, Python. В то же время приложение не уступает по производительности.
При выборе инструментов ориентируемся на то, насколько эффективно с помощью того или иного из них можно решить задачу. По сути, подстраиваем инструменты под архитектуру, а не наоборот.
Работа с большим количеством пользователей и большими нагрузками
В работе используем платформу NodeJS. Как показывает наш опыт, эта платформа подходит для создания чатов и мобильных приложений. NodeJS хорошо устроена и позволяет строить высоконагруженные системы. С коробки чат на NodeJS способен выдержать нагрузку в 10 000 подключений.
Разработка мессенджера для Android или iOS под данную платформу требует использовать Java Script. Этот язык популярен, поэтому найти разработчиков не проблема.
Rethink — используем эту NoSQL DB, так как она производительнее конкурентов. У RethinkDB транслятор языка запросов, так называемого ReQL, реализован не на уровне сервера, а встраивается в качестве предметно-ориентированного языка в язык, на котором пишется клиентское приложение.
Таблицы базы данных хранят JSON-документы, допускающие любой уровень вложенности. У каждого документа прописан уникальный для таблицы-родителя первичный ключ «id». Ссылаясь на ключ, получаем документ. Каждая функция ReQL-запроса работает с данными, полученными из предыдущей функции цепочки. Это позволяет строить более гибкую архитектуру высоконагруженных проектов и не думать о сложности структур данных.
Конкурент NoSQL СУБД — MongoDB. Эта платформа популярна на рынке, но популярность не всегда залог успеха. У MongoDB ряд проблем: при удалении документов не чистится место на диске поэтому приложение должно быть построено так, чтобы документы (файлы объектов) не удалялись часто. Также MongoDB плохо работает с многочисленными массовыми операциями над документами, что противоречит правилам построения высоконагруженной системы.
Основная проблема при построении высоконагруженных проектов — построение архитектуры и потом подстраивания бизнес-логики системы под нее. Такой проект не всегда справляется с большими нагрузками. Поэтому мы делаем наоборот: прорабатываем бизнес-логику всей системы, а уже под нее создаем эффективную архитектуру. В такое приложение можно добавлять новые функции. Оно не потеряет в производительности и не боится высоких нагрузок.
Разработка интерфейса мессенджера
Пользователю должно быть понятно, как работать, и работать должно быть удобно. Поэтому чаще мы рекомендуем использовать нативный дизайн, так как он удобен и предсказуем. Приложение одинаково ведет себя на разных устройствах. Пользователь видит знакомые элементы, знает, как их использовать, и у него не возникает вопросов, как пользоваться мессенджером.
При разработке дизайна важно:
Проработать пустые состояния чатов, экранов, разделов, где пока еще ничего не происходило. Так пользователю будет понятно, какое действие нужно совершить.
Проработать обратную связь. Отправка сообщений, скачивание файлов занимает время. В этот момент пользователю важно показать, что процесс идет.
Все возможные ошибки, например, если пропал интернет, пользователь должен понять, что что-то пошло не так.
Для верификации номера телефона поставить ограничение по времени на повторную отправку sms с кодом верификации, так как сообщение может еще не дойти, а пользователь успеет шесть раз нажать на повторную отправку кода.
Предупредить пользователя о том, что он использует мобильный интернет в момент отправки большого файла.
Удобство внутри чата и предотвращение нелепых ошибок
Важно удобно организовать поиск внутри определенного чата. Быстро найти нужный момент в переписке, документ, фото или видео, при этом не пролистывая хаотично ленту.
Перед отправкой голосовых сообщений, важно, чтобы пользователь мог их прослушать. Должна быть также возможность исправить ошибку или удалить нежелательное сообщение. Создание приложения для отправки сообщений iPhone или Android требует скрупулезной проработки этих и других нюансов.
Приватность
В интернете можно найти программы, которые позволяют взломать мессенджер и получить личную переписку. Первая задача разработчиков — обеспечить полную анонимность, даже без привязки к номеру телефона и возможности как-то распознать личность. Вторая задача — исключить риски взлома.
Здесь есть нюансы. Скажем для полного анонимного чата собеседники без привязки к конкретным признакам — номеру телефона, имени, локации — должны понимать кто есть кто. Для этого нужно использовать одноразовый шифр, которым могут пользоваться все, но он не будет повторятся дважды. Приглашение людей в такую беседу, также происходит при помощи “ключа”, который работает только раз, и задается только самим человеком.
Защита от скриншотов. Шифрование приходящих уведомлений. Возможность быстро удалять сообщения, без лишних подтверждений.

Сколько стоит создать свой мессенджер
Цена разработки мессенджера зависит от того, сколько времени займет работа над приложением. Чем сложнее функционал, тем выше стоимость разработки. Окончательную цену на разработку мессенджера для iOS, андроид или сайта мы сможем назвать только после того, как поймем, какие задачи надо решить.
Стоимость продвижения и поддержки
Разработка мессенджера для Андроид или для iOS — первый этап. Если это не корпоративный чат, то мессенджер надо продвигать. Для этого надо в маркетинговый бюджет заложить определенную сумму. Сюда входит:
контекстная и баннерная реклама
реклама в социальных сетях
ASO-продвижение (App Store Optimization) — комплекс работ для оптимизации мобильного приложения. А именно правильное составление title (название), keywords (ключевые слова), descriptions (описание), в целях максимального увеличения видимости вашего приложения в поиске
оплата за размещение в магазинах Google Play и App Store.
После запуска приложение необходимо развивать и обновлять:
устранить ошибки и реагировать на поступившие жалобы пользователей
добавить новые функции.
С чего начать создание приложения для отправки сообщений на Android или iPhone
Разработка мессенджера под заказ начинается с постановки задачи.
Напишите или позвоните нам, мы договоримся о встрече, обсудим задачу и поможем найти оптимальное решение как создать востребованный мессенджер для Android и iOS.
Наши работы

Приложение для сети супермаркетов TA-DA!
Как мы помогли украинской региональной сети супермаркетов наладить коммуникацию с покупателями и тем самым открыли новый канал для увеличения продаж.

CRM система для завода «Экипаж»
Из этого кейса вы узнаете, как внедрение CRM на крупном заводе помогло повысить уровень продаж и продуктивность менеджеров. Мы расскажем и об инструментах, использованных нами для разработки системы, а также о сложностях, с которыми столкнулись.

Приложение для бега ZealStep
iOS / IoT / Web
ZealStep – уникальное приложение, где за пройденные шаги начисляются виртуальные деньги, которые можно обменять на товары и услуги. Потратить на приобретение скидок в спортивных залах, фитнес-центрах, при покупке товаров для спорта и здоровья.
Пишем свой мессенджер на PHP

Эта статья предназначена для тех кто уже знает или начинает учить PHP, Но также человек далёкий от программирования может написать свой мессенджер если просто будет следовать инструкциям.
Для начала давайте объясню что такое WebSocket, простыми словами это тоже самое что и AJAX (http) только тут Клиент (Фронтенду) подключается к Серверу (Бэкенду) и не разрывает соединение а соединение остаётся активным, и мы можем отправлять запросы сколько угодно и сервер тоже. То-есть сервер может на наш запрос не отвечать а мы просто отправлять и наоборот можем вез порядочно отправлять друг другу запросы. Иллюстрация принципа работы WebSocket.

1. Установка PHP

И так мы поняли что такое WebSocket, теперь давайте установим PHP (Язык программирования).
Для Windows пользователей:
Шаг 1: Заходим на официальный сайт ospanel.io.

Шаг 2: Нажимаем скачать и на открывшейся странице два раза нажимаем на кнопку «Нет, спасибо, хочу просто скачать» и начнётся скачивание Open Server (пока скачивайте можете попить чайку )

Шаг 3: Двойной клик по файлу. Откроется окошко с предложением выбрать место, куда распаковать файлы из архива. Я выбрал диск D.

Жмем кнопку ОК. Начнется процесс разархивации.

Шаг 4: Заходим в папку, которую выбрали на 3-ем шаге. Видим что появилась папка OpenServer. Входим в неё.

Видим два ярлыка запуска программы (ярлык может быть всего один, это зависит от разрядности Windows).
Два раза щелкаем по ярлычку Open Server x64.
Так как это первый запуск Опенсервера, то начнется процесс установки компонентов (MicrosoftVC++) для правильной работы программы.

После окончания установки программа подскажет, что нужно перезагрузить компьютер. Перезагружаем.
Шаг 5: Заново проходим четвертый шаг – то есть заходим в папку Опенсервера и запускаем программу.
В трее (область в нижнем правом углу там, где часы) видим новый значок – красный флажок.

Щелкаем мышкой по нему, и откроется меню программы.
Шаг 6: Нажимаем My favorites и Git-Bash

Шаг 7(Последний): Пишем на появившейся окошке php -v и видим

Для Linux Пользователей:
Шаг 1: Открываем терминал и пишем команду
Для Arch Linux -> sudo pacman -S php
Для Debiam Linux -> sudo apt -y install php8.2
Для Fedora/RHEL -> sudo dnf install dnf-plugins-core
sudo dnf install http://rpms.remirepo.net/fedora/remi-release-37.rpm
sudo dnf module reset php
sudo dnf config-manager —set-enabled remi
sudo dnf module enable php:remi-8.2
sudo dnf module install php:remi-8.2
Шаг 2 (Последний): Перезагружаем систему и вводим в терминале php -v
Должны увидеть

2. Установка Composer (Пакетный менеджер PHP)

Мы установили PHP, теперь давайте установим Composer чтобы использовать фреймворк Ratchet для написания WebSocket приложений на PHP.
Шаг 1: Зайдите на сайт — https://getcomposer.org/download/ потом спуститесь ниже и нажмите на ссылку Latest Stable у вас должно скачаться файл composer.phar .

Шаг 2: Создайте папку где нибудь в системе для проекта и перемещаем туда скачанный файл composer.phar .
Шаг 3: Открываем терминал и переходим на директорию проекта пишем cd [директория вашего проекта]
Шаг 4: Пишем в терминале php composer.phar require cboden/ratchet для установки фреймворка Ratchet
Теперь у нас всё готово для написания кода.
3. Пишем код
И так давайте в папке проекта создадим файлы client.html и server.php

Открываем server.php на любом вам удобном текстовом редакторе (не имеется введу Word или его аналог а именно текстовый редактор по типу блокнота в Windows или редактора кода к примеру Notepad++).
и пишем туда код
clients = new \SplObjectStorage; > // Обработчик нового подключения клиента public function onOpen(ConnectionInterface $conn) < $this->clients->attach($conn); echo "New client connected: resourceId>\n"; > // Обработчик получения сообщения от клиента public function onMessage(ConnectionInterface $from, $msg) < foreach ($this->clients as $client) < $client->send($msg); > > // Обработчик закрытия соединения клиента public function onClose(ConnectionInterface $conn) < $this->clients->detach($conn); echo "Client disconnected: resourceId>\n"; > // Обработчик ошибок соединения public function onError(ConnectionInterface $conn, \Exception $e) < echo "An error has occurred: getMessage()>\n"; $conn->close(); > > // Создаем новый WebSocket-сервер на порту 8080 $server = IoServer::factory( new HttpServer( new WsServer( new WebSocketHandler() ) ), 8080 ); // Запускаем сервер echo "WebSocket server started\n"; $server->run();
Код require __DIR__ . ‘/vendor/autoload.php’; запускает автозагрузку библиотек в папке проекта.
Код ниже импортирует фреймворк Ratchet и его элементы.
use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; use Ratchet\WebSocket\WsServer; use Ratchet\Http\HttpServer; use Ratchet\Server\IoServer;
а тут
class WebSocketHandler implements MessageComponentInterface <
создаём класс и реализуем интерфейс фреймворка Ratchet MessageComponentInterface к нашему классу WebSocketHandler
protected $clients;
создаём протектированную переменную $clients , эта переменная хранит все подключённые клиенты.
Ниже мы присваиваем к нашей переменной $clients объект SplObjectStorage чтобы мы могли удобно проводить манипуляцию со списком клиентов.
$this->clients = new \SplObjectStorage;
В функции ниже которая запускается при каждом подключений клиента к серверу, добавляется ID клиента к списку $clients и выводится на терминал его ID.
public function onOpen(ConnectionInterface $conn) < $this->clients->attach($conn); echo "New client connected: resourceId>\n"; >
Функция ниже запускается при каждой отправке сообщения, функция получает данные отправителя и его сообщение и перечисляет всех подключённых клиентов из списка и отправляет всем сообщение включая самого отправителя чтобы он сам мог видеть свои отправленные сообщения.
public function onMessage(ConnectionInterface $from, $msg) < foreach ($this->clients as $client) < $client->send($msg); > >
Функция ниже вызывается при разрывании соединения с сервера с клиентом, при этом удаляя его ID из списка $clients .
public function onClose(ConnectionInterface $conn) < $this->clients->detach($conn); echo "Client disconnected: resourceId>\n"; >
Функция ниже вызывается при ошибке с WebSocket, сервер выводит ошибку в терминал и отключает весь сервер.
public function onError(ConnectionInterface $conn, \Exception $e) < echo "An error has occurred: getMessage()>\n"; $conn->close(); >
В коде ниже создаём хост с портом 8080 если оно не доступно можете изменить на 8081.
// Создаем новый WebSocket-сервер на порту 8080 $server = IoServer::factory( new HttpServer( new WsServer( new WebSocketHandler() ) ), 8080 );
тут $server->run(); запускаем сервер.
И запускаем код на терминале написав php server.php .
Открываем client.html и пишем туда код
WebSocket Chat
Тут const socket = new WebSocket(‘ws://localhost:8080’); Создаётся WebSocket соединение с адресом ws://localhsot:8080 с портом 8080 как говорил выше если оно занято можете изменить на 8081.
Функция ниже выполняется при подключений с сервером и выводит текст Connected to server.
socket.addEventListener('open', function(event) < console.log('Connected to server.'); >);
Функция ниже запускается при каждом получений сообщения которая добавляет в тег с id messages текст сообщения.
socket.addEventListener('message', function(event) < const messages = document.getElementById('messages'); const message = document.createElement('div'); message.innerHTML = event.data; messages.appendChild(message); >);
Функция ниже вызывается при отправке сообщения, которая отправляет сообщение серверу.
form.addEventListener('submit', function(event) < event.preventDefault(); const message = input.value; socket.send(message); input.value = ''; >);
4. Пользование
Наш мессенджер готов теперь мы можем протестировать его чтобы протестировать открываем на двух вкладках браузера файл client.html и пишем любое сообщение потом нажимаем Enter или кнопку Send.

В продолжений этой статьи мы установим наш мессенджер на хостинг чтобы все могли им пользоваться.
Спасибо за просмотр!
Это моя первая статья и был бы благодарен, если отметите мои ошибки.
С уважением Туленов Темур.
При поддержке сообщества ThinkUP
Как создать свой мессенджер: аналог WhatsApp на конструкторе Bubble
Сегодня мессенджеры стали неотъемлемой частью нашей повседневной жизни, обеспечивая быструю и удобную связь с друзьями, семьей и коллегами. Приложения, такие как WhatsApp, стали настолько популярными, что многие задумываются о создании собственного мессенджера. В данной статье мы расскажем, как создать свой собственный мессенджер, аналог WhatsApp, с помощью популярного конструктора приложений Bubble.
Если вы еще не начали карьеру в IT, приходите на наш бесплатный вебинар, чтобы узнать, как начать зарабатывать с помощью зерокодинга и нейросетей!
Что такое Bubble и почему это хороший выбор
Bubble – это мощный визуальный конструктор веб-приложений, который позволяет создавать веб-приложения и мобильные приложения без необходимости писать код. Этот инструмент подходит как для новичков в сфере разработки приложений, так и для опытных разработчиков, которые хотят сэкономить время и усилия.
- Визуальный интерфейс: инструмент предоставляет удобный интерфейс для создания приложений методом «перетащи и брось».
- Множество функций: у Bubble есть компоненты и плагины, которые можно использовать для добавления различных функций в ваш мессенджер.
- Гибкость и масштабируемость: вы можете создавать программы различной сложности, начиная с простых прототипов и заканчивая полноценными мобильными приложениями.
- Низкие затраты: инструмент может быть гораздо более экономичным, чем разработка с нуля с привлечением программистов.
Шаги по созданию мессенджера на Bubble
Шаг 1: регистрация на Bubble и создание нового проекта
- Перейдите на официальный сайт Bubble (
- После создания нового проекта вы окажетесь в визуальном редакторе Bubble. В правой части экрана находится панель с элементами.
- Создайте главную страницу вашего мессенджера, добавив заголовок, логотип и другие элементы дизайна, которые хотите видеть на стартовой странице.
Шаг 3: создание базы данных
- Определите структуру вашей базы данных. Для мессенджера вам понадобятся таблицы для пользователей, сообщений, чатов и контактов.
- Перейдите в раздел «Data» («Данные») в левой части экрана и добавьте нужные таблицы.
- Определите поля для каждой таблицы. Например, у таблицы «Пользователи» может быть поля: Имя, Электронная почта, Пароль и т.д.

Шаг 4: создание функционала обмена сообщениями
- Вернитесь в визуальный редактор и создайте страницу «Чат», где пользователи будут обмениваться сообщениями.
- Добавьте элементы интерфейса для ввода текста, отображения сообщений и отправки сообщений.
- Создайте рабочий процесс для отправки сообщений, который будет записывать сообщения в базу данных.
Шаг 5: создание функционала регистрации и авторизации
- Создайте страницу для регистрации и авторизации пользователей.
- Добавьте элементы для ввода данных (например, электронной почты и пароля) и кнопки для выполнения операций.
- Создайте рабочие процессы для регистрации новых пользователей и проверки авторизации с учетом данных из базы данных.
Шаг 6: создание функционала добавления и управления контактами
- Создайте страницу «Контакты», где пользователи смогут управлять списком своих контактов.
- Добавьте возможность добавления и удаления контактов.
- Создайте рабочие процессы для обновления базы данных с новыми контактами.
Шаг 7: тестирование и публикация
- Перейдите во вкладку «Preview» («Предпросмотр») в правом верхнем углу экрана и протестируйте ваш мессенджер на различных устройствах.
- Если все работает правильно, перейдите во вкладку «Settings» («Настройки») и опубликуйте ваше приложение на веб или в мобильных магазинах (например, Google Play Store для Android).
Пример создания функционала обмена сообщениями
Для создания функционала обмена сообщениями вам понадобятся следующие элементы:
- Input Field («Поле ввода»): Для ввода текста сообщения пользователем.
- Repeating Group («Повторяющаяся группа»): Для отображения списка сообщений в чате.
- Button («Кнопка»): Для отправки сообщения.
- Вернитесь в визуальный редактор и перейдите на страницу «Чат».
- Добавьте элемент Input Field для ввода текста сообщения. Укажите имя этого поля, например, «MessageInput».
- Добавьте элемент Repeating Group для отображения списка сообщений. Назовите его, например, «ChatMessages».
- Настройте источник данных для Repeating Group таким образом, чтобы он отображал сообщения из базы данных, отсортированные по дате и времени.
- Внутри Repeating Group добавьте текстовый элемент для отображения текста каждого сообщения.
- Добавьте кнопку Button для отправки сообщения. Укажите действие для этой кнопки, чтобы она выполняла рабочий процесс, записывающий новое сообщение в базу данных.
Пример рабочего процесса отправки сообщения:
- Создайте новый рабочий процесс с именем «Send Message».
- Добавьте действие «Create a new thing» («Создать новый элемент») и выберите таблицу «Messages» («Сообщения»).
- Укажите, что поле «Text» («Текст») должно быть равно значению, введенному пользователем в Input Field «MessageInput».
- Добавьте действие «Make changes to a thing» («Изменить элемент») и выберите текущего пользователя.
- Внутри этого действия добавьте действие «Add a message» («Добавить сообщение») и укажите в качестве значения текущее созданное сообщение.
Теперь, когда пользователь вводит текст сообщения и нажимает кнопку отправки, новое сообщение будет сохранено в базе данных и отображено в чате.
Заключение
Создание собственного мессенджера может быть интересным и увлекательным проектом. С помощью инструментов, таких как Bubble, разработка приложений стала более доступной даже для тех, кто не является профессиональным программистом. Мы рассмотрели основные шаги создания мессенджера на примере Bubble.
Личный IM-мессенджер со сквозным шифрованием только для своих
В этой статье я рассказал, как сделать собственный безопасный мессенджер только для своей тусовки параноиков.
Сейчас есть много IM-мессенджеров с end-to-end шифрованием, но вариантов, которые можно быстро развернуть на своем сервере гораздо меньше.

Изучая варианты, мой взгляд упал на Delta Chat, о котором на Хабре уже упоминали — мессенджер без централизованной серверной инфраструктуры, использующий почтовые сервера для доставки сообщений, что позволяет развернуть его, например, на своем домашнем сервере и общаться с устройств, в том числе не имеющих доступ в интернет.
Среди преимуществ этого подхода можно отметить:
- Вы сами управляете своей информацией, в том числе ключами шифрования.
- Вы не отдаете свою адресную книгу никому.
- Нет необходимости использовать телефонный номер для регистрации.
- Наличие клиентов под все популярные системы: Windows, Linux, Android, MacOS, iPhone.
- Дополнительное шифрование STARTTLS/SSL при передаче сообщений, обеспечиваемое почтовым сервером.
- Возможность настроить удаление старых сообщений с устройства (исчезающие сообщения).
- Возможность настроить удаление сообщений с сервера, при получении.
- Быстрая доставка, благодаря IMAP push.
- Групповые защищенные чаты.
- Поддержка передачи файлов, фото и видео.
- Сервер и клиент относятся к открытому ПО и совершенно бесплатны.
- Нет возможности создавать нативные аудио и видео конференции.
- Необходимость экспортировать/импортировать ключи шифрования, для настройки одного аккаунта на нескольких устройствах.
End-to-end шифрование
Delta Chat для подключения к серверу может использовать StartTLS или SSL подключение к серверу, сообщения по умолчанию будут шифроваться по стандарту Autocrypt Level 1, после обмена первыми сообщениями (они передаются в незашифрованном виде). Таким образом если общение идет между пользователями одного сервера, информация не будет передаваться на другие сервера, в передаче сообщений будет занят только наш сервер и устройства пользователей.
Настройка сервера
Настройка сервера для Delta Chat сводится к установке Postfix + Dovecot с настроенными StartTLS/SSL и настройке записей домена.
Для настройки сервера я буду использовать CentOS 8, для других дистрибутивов могут быть несущественные расхождения. Выбираем подходящие параметры сервера под нашу задачу.

В DNS я создал две записи: домен третьего уровня будет и почтовым доменом и именем почтового сервера:
secureim.example.com A secureim MX secureim.example.com
Зададим hostname и установим postfix, dovecot и nginx (nginx — для получения сертификатов let’s encrypt, wget — для установки certbot-auto, nano — редактор):
hostnamectl set-hostname secureim.example.com dnf install postfix dovecot nginx wget nano -y
Разрешим Postfix принимать почту извне и настроим hostname, domain и origin сервера, так как почтовый домен и адрес сервера совпадают, то домен будет везде одинаковым:
postconf -e "inet_interfaces = all" postconf -e "myhostname = secureim.example.com" postconf -e "mydomain = secureim.example.com" postconf -e "myorigin = secureim.example.com"
Для того что бы Delta Chat был доступен для подключения из Интернета, нужно открыть порты 80, 143, 443, 465, 587, 993. Так же откроем порты 80, 443 что бы получить сертификаты let’s encrypt и обновлять их в дальнейшем. Если планируется получение писем от других почтовых серверов, так же понадобится открыть порт 25 (в моем случае я не планирую подключаться используя другие сервера, поэтому 25й порт я не указываю). И возможно потребуется добавить перенаправление портов 80, 143, 443, 465, 587, 993 на маршрутизаторе, если сервер планируется использовать в локальной сети.
Откроем порты 80, 143, 443, 465, 587, 993 в firewall:
firewall-cmd --permanent --add-service= systemctl reload firewalld
Создадим настройки сайта для нашего доменного имени, что бы получить сертификаты let’s encrypt используя certbot-auto
nano /etc/nginx/conf.d/secureim.example.com.conf server < listen 80; listen [::]:80; server_name secureim.example.com; root /usr/share/nginx/html/; >>
Включим и запустим nginx:
systemctl enable nginx systemctl start nginx
cd ~ wget https://dl.eff.org/certbot-auto mv certbot-auto /usr/local/bin/certbot-auto chown root /usr/local/bin/certbot-auto chmod 0755 /usr/local/bin/certbot-auto yes | certbot-auto --install-only
Сгенерируем сертификаты для сайта (в дальнейшем мы будем их использовать для TLS-шифрования соединения с сервером):
certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@example.com -d secureim.example.com
Будут созданы сертификаты и так же будет выведено в консоль их расположение:
# /etc/letsencrypt/live/secureim.example.com/fullchain.pem # /etc/letsencrypt/live/secureim.example.com/privkey.pem
Исправим соответственно файл конфигурации Postfix, что бы разрешить прием писем на портах 465 и 587:
nano /etc/postfix/master.cf submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=no -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth smtps inet n - y - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
Выполним команды, что бы указать расположение TLS сертификата и личного ключа сервера:
postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/secureim.example.com/fullchain.pem" postconf "smtpd_tls_key_file = /etc/letsencrypt/live/secureim.example.com/privkey.pem"
При необходимости можем включить логирование TLS подключений:
postconf "smtpd_tls_loglevel = 1" postconf "smtp_tls_loglevel = 1"
Добавим в конец файла конфигурации Postfix требование использовать протоколы не ниже TLS 1.2:
nano /etc/postfix/main.cf smtp_tls_mandatory_protocols = >=TLSv1.2 smtp_tls_protocols = >=TLSv1.2
# Включим и запустим Postfix:
systemctl start postfix systemctl enable postfix
Установим, включим и запустим Dovecot:
dnf install dovecot -y systemctl start dovecot systemctl enable dovecot
Изменим файл конфигурации Dovecot, что бы разрешить протокол imap:
nano /etc/dovecot/dovecot.conf protocols = imap
Настроим хранилище писем, что бы письма сохранялись в папках пользователей:
nano /etc/dovecot/conf.d/10-mail.conf mail_location = maildir:~/Maildir mail_privileged_group = mail
Добавим Dovecot в группу mail что бы Dovecot мог читать входящие:
gpasswd -a dovecot mail
Запретим авторизацию без TLS шифрования:
nano /etc/dovecot/conf.d/10-auth.conf disable_plaintext_auth = yes
Добавим автоподстановку домена при авторизации (только по имени пользователя):
auth_username_format = %n
Изменим расположение сертификата, ключа, расположения файла с ключом Диффи-Хеллмана, минимальную версию TLS 1.2 и предпочтение выбора протоколов шифрования сервера, а не клиента:
nano /etc/dovecot/conf.d/10-ssl.conf ssl_cert =
Сгенерируем ключ Диффи-Хеллмана, генерация ключа может занять продолжительное время:
openssl dhparam -out /etc/dovecot/dh.pem 4096
Изменим секцию service auth, так что бы Postfix смог подключиться к серверу авторизации Dovecot:
nano /etc/dovecot/conf.d/10-master.conf service auth < unix_listener /var/spool/postfix/private/auth < mode = 0600 user = postfix group = postfix >>
Включим автосоздание системных почтовых папок (на тот случай, если мы будем пользоваться сервером в том числе и для обычной почты) добавив строку auto = create в секции почтовых папок:
nano /etc/dovecot/conf.d/15-mailboxes.conf mailbox Drafts < auto = create special_use = \Drafts >mailbox Junk < auto = create special_use = \Junk >mailbox Trash < auto = create special_use = \Trash >mailbox Sent < auto = create special_use = \Sent >mailbox "Sent Messages"
Настроим что бы Dovecot доставлял письма в настроенное хранилище, добавив параметр lmtp:
nano /etc/dovecot/dovecot.conf protocols = imap lmtp
Настроим сервис LMTP следующим образом:
nano /etc/dovecot/conf.d/10-master.conf service lmtp < unix_listener /var/spool/postfix/private/dovecot-lmtp < mode = 0600 user = postfix group = postfix >>
Добавим следующие настройки в конец файла, что бы сообщить Postfix доставлять письма в локальное хранилище через сервис Dovecot LMTP. Так же отключим SMTPUTF8, так как Dovecot LMTP не поддерживает это расширение:
nano /etc/postfix/main.cf mailbox_transport = lmtp:unix:private/dovecot-lmtp smtputf8_enable = no
Создадим пользователей которые будут использовать сервер, создав соответствующую запись в системе и задав ей пароль, который будет использоваться для авторизации через smtps и imaps:
adduser user1 passwd user1
# Перезапустим Dovecot и Postfix:
systemctl restart dovecot systemctl restart postfix
Добавим в /etc/crontab задачу для автоматического обновления сертификатов:
nano /etc/crontab 30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
На данном этапе сервер должен функционировать как почтовый сервер, т.е. можно подключиться почтовым клиентом и попробовать отправить и принять письма на другие почтовые ящики этого сервера или если выше открыли 25 порт, то и на другие почтовые сервера.
Теперь настроим клиент Delta Chat на ПК и смартфоне с Android.

Для подключения достаточно ввести созданный ранее на сервере почтовый адрес и пароль, Delta Chat определит какие порты можно задействовать, после чего можно будет добавить новый контакт, так же по адресу электронной почты, использованием действующего почтового адреса.

Первые сообщения будут отправлены в незашифрованном виде, на этом этапе идет обмен ключами. Далее сообщения будут зашифрованы помимо TLS используемого при передаче данных, сквозным шифрованием Autocrypt Level 1.
Так же есть возможность создания группового проверенного чата — где все сообщения зашифрованы сквозным шифрованием, а участники могут присоединиться, сканируя приглашение с QR-кодом. Таким образом, все участники связаны друг с другом цепочкой приглашений, которые гарантируют криптографическую согласованность от активных сетевых атак или атак провайдера.
Один из самых интересных моментов, которые я хотел проверить — посмотреть как выглядит сообщение в хранилище сервера. Для этого я отправил сообщение на неактивный аккаунт — в данном случае сообщение будет ждать своего получателя на сервере, и мы имея доступ к серверу сможем просмотреть его:
Содержимое сообщения
Return-Path:
Delivered-To: user1@secureim.example.com
Received: from secureim.example.com
by secureim.example.com with LMTP
id g/geNIUWzl+yBQAADOhLJw
(envelope-from )
for ; Mon, 07 Dec 2020 14:48:21 +0300
Received: from [127.0.0.1] (unknown [192.87.129.58])
by secureim.example.com (Postfix) with ESMTPSA id AA72A3193E11
for ; Mon, 7 Dec 2020 11:48:21 +0000 (UTC)
MIME-Version: 1.0
References:In-Reply-To:
Date: Mon, 07 Dec 2020 11:48:20 +0000
Chat-Version: 1.0
Autocrypt: addr=user2@secureim.example.com; prefer-encrypt=mutual;
keydata=xjMEX83vexYJKwYBBAHaRw8BAQdAYgkiTiHDlJtzQqLCFxiVpma/X5OtALu8kJmjeTG3yo
7NIDx1c2VyMkBzZWN1cmVpbS5zYW1vaWxvdi5vbmxpbmU+wosEEBYIADMCGQEFAl/N73sCGwMECwkI
BwYVCAkKCwIDFgIBFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXgLNQEA17LrpEA2vF
1FMyN0ah5tpM6w/6iKoB+FVUJFAUALxk4A/RpQ/o6D7CuacuFPifVZgz7DOSQElPAMP4AHDyzcRxwJ
zjgEX83vexIKKwYBBAGXVQEFAQEHQJ7AQXbN5K6EUuwUbaLtFpEOdjd5E8hozmHkeeDJ0HcbAwEIB8
J4BBgWCAAgBQJfze97AhsMFiEEkuezqLPdoDjlA2dxYQc97rElXXgACgkQYQc97rElXXhYJgEA+RUa
RlnJjv86yVJthgv7w9LajPAgUGCVhbjFmccPQ4gA/iiX+nk+TrS2q2oD5vuyD3FLgpja1dGmqECYg1
ekyogL
Message-ID:
To:
From:
Subject:…
Content-Type: multipart/encrypted; protocol=«application/pgp-encrypted»;
boundary=«OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP»
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/pgp-encrypted
Content-Description: PGP/MIME version identification
--OfVQvVRcZpJOyxoScoY9c3DWqC1ZAP
Content-Type: application/octet-stream; name=«encrypted.asc»
Content-Description: OpenPGP encrypted message
Content-Disposition: inline; filename=«encrypted.asc»;
-----BEGIN PGP MESSAGE-----
wU4DKm2PBWHuz1cSAQdA4krEbgJjac78SUKlWKfVyfWt2drZf41dIjTH01J52HIg
aY/ZzCn/ch8LNGv3vuJbJS8RLHK7XyxZ4Z1STAtTDQPBTgNyNpRoJqRwSxIBB0AC
OVrbhsjNPbpojrm/zGWkE5berNF7sNnGQpHolcd+WyCdpqQAk3CaiQjxsm7jdO0A
gMtmXABw/TWcpTU/qOfW/9LBVwFZ/RPCKxCENfC0wau4TI+PMKrF0HODyWfBkEuw
e3WlQpN/t0eSUPKMiMhm7QM0Ffs52fPz0G6dfVJ2M6ucRRyU4Gpz+ZdlLeTLe3g2
PkKbb6xb9AQjdj/YtARCmhCNI48sv7dgU1ivh15r37FWLQvWgkY93L3XbiEaN/X9
EWBQxKql/sWP01Kf67PzbtL5uAHl8VnwInCIfezQsiAsPS2qiCb1sN3yBcNlRwsR
yTs2CPJTIi7xTSpM1S/ZHM5XXGnOmj6wDw69MHaHh9c9w3Yvv7q1rCMvudfm+OyS
/ai4GWyVJfM848kKWTCnalHdR4rZ3mubsqfuCOwjnZvodSlJFts9j5RUT87+j1DM
mQa4tEW8U5MxxoirFfbBnFXGUcU/3nicXI5Yy6wPP8ulBXopmt5vHsd68635KVRJ
2GMy7sMHcjyzujNCAmegIQgKqTLO5NUOtxW7v1OXL23pKx32OGcy8PtEJp7FBQYm
bUNAaz+rkmC971S2FOU0ZGV8LNp8ULioAbL629/JpPHhBOBJCsVnsXDIh6UBPbuM
06dU7VP6l8PNM87X/X1E3m2R1BCNkZghStQrt16fEoA+jm9F6PNtcap2S5rP9llO
klo/ojeciqWl0QoNaJMlMru70TT8a9sf6jYzp3Cf7qFHntNFYG1EcEy9YqaXNS7o
8UOVMfZuRIgNqI9j4g8wKf57/GIjtXCQn/c=
=bzUz
-----END PGP MESSAGE-----
Как видно, на сервере письма хранятся в зашифрованном виде, и в случае захвата сервера заинтересованными лицами, сообщения не будут под угрозой.
Для большей надежности можно использовать полное шифрование диска сервера и устройства на котором работает клиент, так же для подключения к серверу по ssh использовать ключи и использовать надежные, сложные пароли для почтовых учетных записей.
Вывод
Delta Chat — интересная альтернатива для self-hosted IM-мессенджера, позволяющий обмениваться сообщениями по существующим почтовым протоколам (что в перспективе позволяет не беспокоиться о блокировке), а высокая стойкость к перехвату сообщений, отсутствие центрального сервера и возможность развернуть на своем сервере, позволяет не беспокоится о том, что ваши данные попадут в чужие руки.