Vertigo
← Все статьи

Как это устроено

Как устроен Vertigo: сообщения, приват и пароли

Без магии и расплывчатых обещаний: что происходит с сообщением после кнопки «отправить» и какие данные мы сознательно не сохраняем.

6 сентября 2026 · 7 минут чтения

Короткая схема

Путь сообщения зависит от его типа

Общее сообщение

Браузер → Phoenix → PostgreSQL → открытые окна чата.

В истории остаются последние 30 сообщений комнаты.

Личное сообщение человеку

Браузер → Phoenix PubSub → два открытых окна.

В базу и в историю комнаты оно не записывается.

У слова «чат» есть немного обманчивая простота. Нажал Enter — фраза появилась у собеседника. Но между этими двумя событиями есть транспорт, проверка, доставка, иногда сохранение, а иногда принципиальное решение ничего не записывать. У Vertigo эти маршруты различаются, и это важнее любого красивого слова про «приватность».

Почему сообщения приходят сразу

Интерфейс Vertigo работает на Phoenix LiveView: страница держит живое соединение с сервером. Серверная часть написана на Elixir, а события между открытыми окнами разносит Phoenix PubSub. Поэтому новое публичное сообщение не требует обновлять страницу и опрашивать сервер раз в несколько секунд — оно приходит в подключённые окна как событие.

Отдельно работает Presence: он помогает понять, кто сейчас действительно в комнате. Это не «список всех когда-либо зарегистрированных», а состояние текущих подключений. Когда вкладка закрывается или связь пропадает, присутствие меняется.

Что хранится в общей истории

Публичные сообщения общей комнаты сохраняются в PostgreSQL. Вместе с текстом в истории могут оказаться ник автора, время, тип сообщения, выбранное оформление, реакции и данные прикреплённого GIF или трека. Это нужно, чтобы история не исчезла при перезапуске приложения и новый человек в комнате видел контекст.

История намеренно ограничена: для каждой комнаты сохраняются только последние 30 сообщений. Когда приходит следующее, более старые записи этой комнаты удаляются. Это не бесконечный архив и не поиск по всей переписке за годы.

Как устроен приват между чатланами

Личное сообщение человеку — то, которое отправляется из общего чата конкретному нику, — живёт иначе. Сервер проверяет получателя и ограничения на частоту, затем отправляет событие только в два активных LiveView: отправителю и адресату. Такое сообщение не публикуется в общий канал и не записывается в таблицу истории.

Практический смысл простой: после перезагрузки страницы или ухода из чата эту переписку нельзя «достать из архива» Vertigo, потому что сервер его не создаёт. Если адресат офлайн, сообщение не превращается в отложенное письмо и не ждёт его в базе данных.

Важно не смешивать это с разговором с ботом: обращения к Хичкоку — отдельная функция, которой может понадобиться контекст диалога для ответа. Правило «не хранить» относится к приватам между двумя чатланами, а не ко всем сообщениям с любым адресатом.

Как хранятся пароли

Пароль зарегистрированного пользователя не сохраняется в базе как обычный текст. При регистрации сервер создаёт случайную соль длиной 16 байт и получает ключ с помощью PBKDF2-HMAC-SHA-256: 210 000 итераций, ключ длиной 32 байта. В базе остаётся только строка с параметрами алгоритма, солью и результатом вычисления.

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

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

Границы этой модели

«Не сохраняется» не равно сквозному шифрованию. Чтобы доставить приват, сервер на мгновение получает его содержимое и пересылает в нужные подключённые окна. Vertigo не заявляет end-to-end encryption и не стоит использовать его для банковских реквизитов, документов, кодов восстановления или другой информации, которой опасно оказаться у третьего лица.

Это честная граница: публичный разговор — короткая сохраняемая история; приват между двумя людьми — доставка без серверного архива; пароль — необратимый хэш, а не секрет в читаемом виде. Понимать разницу полезнее, чем верить одной иконке замочка.