Как это устроено
Как устроен 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 и не стоит использовать его для банковских реквизитов, документов, кодов восстановления или другой информации, которой опасно оказаться у третьего лица.
Это честная граница: публичный разговор — короткая сохраняемая история; приват между двумя людьми — доставка без серверного архива; пароль — необратимый хэш, а не секрет в читаемом виде. Понимать разницу полезнее, чем верить одной иконке замочка.