W WhisperChat
Техническая документация

WhisperChat: архитектура, безопасность и сервер

Документ для презентации и проверки: как устроены мобильное приложение, сервер, realtime, сквозное шифрование, медиа, звонки, Control, VIP, админка и хранение данных. Без паролей, токенов, инфраструктурных секретов и данных по деплою.

Кратко

WhisperChat — приватный мессенджер с личными чатами, группами, каналами, голосовыми и видеозвонками, QR-добавлением, VIP-функциями, поддержкой, модерацией, админ-панелью и модулем Control для команд.

Содержимое защищённых личных сообщений шифруется на клиенте. Сервер отвечает за авторизацию, доставку, хранение ciphertext, realtime-события, медиа, роли, администрирование и контроль доступа.

1. Общая архитектура

Mobile App ── HTTPS REST ──► Fastify API ──► PostgreSQL │ │ Redis ├── WSS realtime ────────► WebSocket Gateway ├── WebRTC media ────────► Peer / TURN / relay └── Media upload ────────► File/Object Storage Admin App/Web ── HTTPS + role/admin access ──► Fastify API
Клиент

UI, чаты, звонки, QR, локальная криптография, secure storage, медиа-загрузка, уведомления.

Сервер

REST API, WebSocket, права, БД, медиа-ссылки, модерация, VIP, Control, админка.

База данных

Пользователи, сессии, чаты, сообщения, каналы, VIP, Control, жалобы, аудит.

Realtime

События сообщений, presence, звонки, typing, Control-события, уведомления.

2. Мобильное приложение

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

ЗонаНазначение
core/apiREST-клиент, refresh token, медиа, Control, VIP, админ-методы.
core/wsПодписки на события, звонки, presence, Control-уведомления.
core/cryptoX25519 + AES-256-GCM для E2E-сообщений.
features/chatsСписок чатов, экран диалога, сообщения, реакции, медиа.
features/callsWebRTC, overlay звонка, системный звук и вибрация.
features/controlКоманды, задачи, календарь, org-chat, очистка и удаление.

3. Авторизация и сессии

  1. Клиент отправляет номер телефона.
  2. Сервер создаёт проверку по звонку и выдаёт checkId.
  3. Пользователь звонит на указанный номер.
  4. Клиент опрашивает статус проверки.
  5. После подтверждения сервер выдаёт access JWT и refresh token.

Access token короткоживущий и используется для REST/WebSocket. Refresh token хранится как серверная сессия устройства и может быть отозван.

4. Сквозное шифрование

Защищённые личные сообщения шифруются на устройстве отправителя и расшифровываются на устройстве получателя. Сервер маршрутизирует ciphertext и метаданные доставки.

X25519

Используется для получения общего секрета между двумя пользователями.

AES-256-GCM

Используется для шифрования текста и проверки целостности.

Secure storage

Private seed хранится локально на устройстве.

Public key

Публичный ключ хранится на сервере и отдаётся собеседнику.

Формат ciphertext

Base64( nonce 12 bytes + ciphertext + mac 16 bytes )

Что видит сервер

Граница модели: E2E защищает содержимое сообщения, но не скрывает весь социальный граф и технические метаданные. Для multi-device E2E нужна отдельная схема синхронизации ключей.

Почему это вызывает доверие

5. Чаты и сообщения

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

  1. Клиент проверяет права и E2E-настройки.
  2. При необходимости шифрует текст.
  3. Загружает медиа и получает URL.
  4. Отправляет сообщение через REST.
  5. Сервер проверяет членство, блокировки, права канала и media URL.
  6. Сервер сохраняет запись и рассылает 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-ссылки.

КатегорияХранениеПримеры
Аватарыavatarsjpg, png, webp
Изображенияimagesфото, GIF
Голосvoicem4a, mp3, aac, ogg, wav
Видеоvideomp4, mov, webm, 3gp
Файлыfilesпрочие вложения

Для выдачи медиа применяются whitelist директорий, защита от path traversal, проверка подписи и TTL ссылки для не-avatar файлов.

8. Звонки

Аудио/видео идут через WebRTC. Сервер не хранит записи разговоров и не проксирует медиапоток, а выполняет роль сигналинг-релея.

  1. Caller создаёт callId и отправляет invite.
  2. Receiver принимает или отклоняет.
  3. Клиенты обмениваются offer/answer и ICE candidates.
  4. Медиа идёт peer-to-peer или через TURN при необходимости.
  5. После завершения создаётся один call-log в чате.

На Android звонки следуют системному режиму: normal — системный ringtone/call tone, vibrate — вибрация, silent — приложение не форсирует звук.

9. Control

Control — Business PRO модуль для команд, задач и контроля исполнения.

Команды

Создание, приглашения, роли OWNER/ADMIN/MANAGER/MEMBER, полная очистка и удаление.

Задачи

Дедлайны, приоритеты, отчёты, комментарии, подзадачи, повторения.

Org-chat

Командный чат с удалением сообщений автором или руководителем.

Выговоры

До 5 активных выговоров на участника, снятие руководителем.

Управление требует активного Business PRO у владельца команды. Удалить команду может владелец, очистить данные — руководитель.

10. Админка, VIP и эксплуатация

Админка

Админка показывает статистику, пользователей, жалобы, тикеты, VIP/rentals, каналы, content alerts, audit logs и позволяет писать от имени официальной поддержки.

VIP

Эксплуатационный чеклист