1. Общая архитектура
UI, чаты, звонки, QR, локальная криптография, secure storage, медиа-загрузка, уведомления.
REST API, WebSocket, права, БД, медиа-ссылки, модерация, VIP, Control, админка.
Пользователи, сессии, чаты, сообщения, каналы, VIP, Control, жалобы, аудит.
События сообщений, presence, звонки, typing, Control-события, уведомления.
2. Мобильное приложение
Мобильный клиент хранит сессию, ключи шифрования, пользовательские настройки, показывает интерфейс, шифрует сообщения, загружает медиа и подключается к realtime-каналу.
| Зона | Назначение |
|---|---|
core/api | REST-клиент, refresh token, медиа, Control, VIP, админ-методы. |
core/ws | Подписки на события, звонки, presence, Control-уведомления. |
core/crypto | X25519 + AES-256-GCM для E2E-сообщений. |
features/chats | Список чатов, экран диалога, сообщения, реакции, медиа. |
features/calls | WebRTC, overlay звонка, системный звук и вибрация. |
features/control | Команды, задачи, календарь, org-chat, очистка и удаление. |
3. Авторизация и сессии
- Клиент отправляет номер телефона.
- Сервер создаёт проверку по звонку и выдаёт
checkId. - Пользователь звонит на указанный номер.
- Клиент опрашивает статус проверки.
- После подтверждения сервер выдаёт access JWT и refresh token.
Access token короткоживущий и используется для REST/WebSocket. Refresh token хранится как серверная сессия устройства и может быть отозван.
4. Сквозное шифрование
Защищённые личные сообщения шифруются на устройстве отправителя и расшифровываются на устройстве получателя. Сервер маршрутизирует ciphertext и метаданные доставки.
Используется для получения общего секрета между двумя пользователями.
Используется для шифрования текста и проверки целостности.
Private seed хранится локально на устройстве.
Публичный ключ хранится на сервере и отдаётся собеседнику.
Формат ciphertext
Base64( nonce 12 bytes + ciphertext + mac 16 bytes )
Что видит сервер
- ID отправителя и чата;
- время создания;
- тип сообщения;
- факт вложения и media URL;
- ciphertext вместо plaintext для E2E-текста.
Граница модели: E2E защищает содержимое сообщения, но не скрывает весь социальный граф и технические метаданные. Для multi-device E2E нужна отдельная схема синхронизации ключей.
Почему это вызывает доверие
- Содержимое защищённых личных сообщений шифруется до отправки на сервер.
- Private key не передаётся серверу и хранится в защищённом хранилище устройства.
- Сервер хранит ciphertext и технические метаданные доставки, а не plaintext E2E-сообщений.
- Access token короткоживущий, refresh-сессии можно отзывать по устройствам.
- Медиа-ссылки для вложений имеют подпись и срок действия.
- Админ-действия и модерация разделены по ролям, критичные действия должны попадать в аудит.
- Окно приложения защищено от системных оверлеев и снимков на чувствительных экранах.
5. Чаты и сообщения
Поддерживаются личные чаты, группы и каналы. Сообщения могут быть текстовыми, медиа, голосовыми, видео, системными и исчезающими.
- Клиент проверяет права и E2E-настройки.
- При необходимости шифрует текст.
- Загружает медиа и получает URL.
- Отправляет сообщение через REST.
- Сервер проверяет членство, блокировки, права канала и media URL.
- Сервер сохраняет запись и рассылает realtime-событие.
6. Сервер и WebSocket
API-сервер построен на Fastify/TypeScript. Он регистрирует маршруты авторизации, пользователей, чатов, каналов, сообщений, медиа, звонков, VIP, Control, модерации, поддержки и админки.
WebSocket
WebSocket подключение проходит JWT-проверку. После подключения сервер отмечает presence, если не включён невидимый режим, и принимает события подписки, typing и call signaling.
| Событие | Назначение |
|---|---|
message | Новое сообщение или системное событие. |
presence | Онлайн/оффлайн и last seen. |
typing | Индикатор набора. |
call:* | Сигналинг звонков. |
control | События команд, задач и org-chat. |
7. Медиа
Медиа принимается через multipart upload, сохраняется в категорию по MIME/ext и отдаётся через защищённые media-ссылки.
| Категория | Хранение | Примеры |
|---|---|---|
| Аватары | avatars | jpg, png, webp |
| Изображения | images | фото, GIF |
| Голос | voice | m4a, mp3, aac, ogg, wav |
| Видео | video | mp4, mov, webm, 3gp |
| Файлы | files | прочие вложения |
Для выдачи медиа применяются whitelist директорий, защита от path traversal, проверка подписи и TTL ссылки для не-avatar файлов.
8. Звонки
Аудио/видео идут через WebRTC. Сервер не хранит записи разговоров и не проксирует медиапоток, а выполняет роль сигналинг-релея.
- Caller создаёт
callIdи отправляет invite. - Receiver принимает или отклоняет.
- Клиенты обмениваются offer/answer и ICE candidates.
- Медиа идёт peer-to-peer или через TURN при необходимости.
- После завершения создаётся один call-log в чате.
На Android звонки следуют системному режиму: normal — системный ringtone/call tone, vibrate — вибрация, silent — приложение не форсирует звук.
9. Control
Control — Business PRO модуль для команд, задач и контроля исполнения.
Создание, приглашения, роли OWNER/ADMIN/MANAGER/MEMBER, полная очистка и удаление.
Дедлайны, приоритеты, отчёты, комментарии, подзадачи, повторения.
Командный чат с удалением сообщений автором или руководителем.
До 5 активных выговоров на участника, снятие руководителем.
Управление требует активного Business PRO у владельца команды. Удалить команду может владелец, очистить данные — руководитель.
10. Админка, VIP и эксплуатация
Админка
Админка показывает статистику, пользователей, жалобы, тикеты, VIP/rentals, каналы, content alerts, audit logs и позволяет писать от имени официальной поддержки.
VIP
- градиент имени, VIP badge, avatar ring;
- скрытие last seen и приватные настройки;
- премиальные темы и обои;
- HD-звонки, расширенные медиа, приоритет поддержки;
- Business Control для команд.
Эксплуатационный чеклист
- Проверять QR, вход, отправку текста/медиа/voice/video.
- Проверять E2E direct chat и звонки normal/vibrate/silent.
- Проверять Control cleanup/delete и VIP plans.
- Контролировать PostgreSQL, Redis, медиа-хранилище и audit logs.
- Регулярно ротировать админ-доступы и проверять резервные копии.