Когда в октябре 2024-го заблокировали Дискорд, я сидел в голосовом канале с друзьями. Связь оборвалась, все полезли за впн-ками, кто-то ушёл в Телеграм, кто-то просто пропал. Серверы, которые мы строили годами, с каналами, ролями, ботами, в один момент стали недоступны.

Я фрилансер, пишу на React и Node.js. В тот вечер подумал: а насколько сложно вообще сделать свой мессенджер с серверной структурой? Не чат на вебсокетах из туториала, а нормальный. С серверами, каналами, ролями, голосовыми комнатами, ботами. Такой, чтобы можно было перетащить своё сообщество и не чувствовать разницы.

Оказалось, сложно. Но я всё равно сделал.

Что получилось

Проект называется Vela (с латыни «парус»). Это десктопное приложение на Электроне и веб-версия. Вот что работает прямо сейчас:

  • Серверы и каналы. Создаёшь сервер, внутри текстовые и голосовые каналы, категории. Всё как привычно.

  • Голосовые каналы. Заходишь и разговариваешь. Видео, демонстрация экрана, управление громкостью каждого участника. Под капотом WebRTC и Opus.

  • Роли и разрешения. 12 настраиваемых прав. Можно выдать роль «Модератор» с правом удалять сообщения, но без доступа к настройкам сервера. Разрешения работают и на уровне отдельных каналов.

  • Боты. Полноценный API: токены, вебхуки, слэш-команды с автодополнением, интерактивные кнопки, колбэки. Если писали ботов для Телеграма, разберётесь быстро, принцип похожий.

  • Личные сообщения. Отдельно от серверов. Файлы, реакции, стикеры, поиск по переписке.

  • Двухфакторная аутентификация, экспорт данных, удаление аккаунта. Всё что требует 152-ФЗ.

Серверы физически находятся в России. Работает без впн.

Стек

Тут будет скучно, но для Хабра в самый раз.

Клиент: React 18, TypeScript, Tailwind CSS, Framer Motion, Vite. Десктоп на Электроне с песочницей, изоляцией контекста и безопасным хранилищем для токенов (DPAPI на Виндоус, Keychain на Маке). Виртуализация сообщений через react-virtual, без неё при 10 000 сообщений в канале всё умирало.

Сервер: Node.js, Express, Prisma, PostgreSQL, Redis. Вебсокеты на ws, не Socket.io, чтобы контролировать протокол. Файлы льются в S3-совместимое хранилище (TWC Storage, серверы в России).

Голос: WebRTC, peer-to-peer. Кодек Opus 48 кГц. Web Audio API для микширования, шумоподавления и анализа громкости. Самая болезненная часть проекта, об этом ниже.

Инфраструктура: один VPS на Aéza (Россия), PM2, Nginx, Let's Encrypt. Бэкапы базы каждую ночь. Мониторинг через свой эндпоинт /health + Яндекс Метрика на лендинге.

Что было больнее всего

Голосовые каналы

Думал, будет просто. Взял WebRTC, написал сигналинг, и готово. Нет.

Первая проблема: NAT traversal. В России у многих пользователей двойной NAT (оператор + роутер). STUN-сервер помогает не всегда, нужен TURN для ретрансляции. А TURN это трафик через мой сервер, и он стоит денег.

Вторая: обратная связь от микрофона. Без эхоподавления голос возвращается с задержкой 200мс и начинается ад. Пришлось ковырять Web Audio API: анализатор громкости, voice activity detection, автоматическое отключение микрофона при тишине.

Третья: утечки памяти. MediaStream и AudioContext не отпускают ресурсы если их не закрыть вручную. После часа звонка приложение начинало тормозить. Пока не расставил disconnectSource() и close() в нужных местах, было больно.

Вебсокеты и реконнект

Казалось бы: клиент подключается, сервер шлёт события. Но нет.

Что если у пользователя пропал вайфай на 3 секунды? Сообщения, отправленные за это время, просто теряются. Пришлось делать: экспоненциальный бэкофф при реконнекте (от 1 до 30 секунд с джиттером), хартбит каждые 30 секунд с таймаутом на понг, и гэп-филл после переподключения, когда клиент запрашивает пропущенные сообщения.

Звучит очевидно, но каждый из этих пунктов это баги, которые я ловил в продакшене неделями.

Безопасность

Когда делаешь мессенджер, безопасность не «потом допилим». Я провёл полный аудит: от XSS (нашёл, что маркдаун-рендерер не санитизировал HTML, привет DOMPurify) до привилегий в ролевой системе (роль с правом «управление ролями» могла назначить себе все права, классический privilege escalation).

Полный список того, что пришлось закрыть:

  • Шифрование токена через системное хранилище (а не JSON-файл на диске)

  • Проверка origin при подключении к вебсокетам

  • Тайминг-безопасное сравнение TOTP-кодов

  • Блокировка аккаунта после 5 неудачных попыток входа

  • Rate limiting на все мутационные эндпоинты

  • Content Security Policy, HSTS, безопасные куки

Размер проекта

Чтобы понять масштаб, вот цифры на сегодня:

  • Около 300 компонентов на клиенте

  • 50+ API-маршрутов на сервере

  • 20+ таблиц в Prisma-схеме

  • 51 API-тест, 5 E2E-тестов

  • 14 ErrorBoundary (после аудита было 6)

  • Сборка: ~800 КБ основной бандл (разбит на чанки), установщик ~93 МБ

Это не стартап с командой из десяти человек. Это один человек с ноутбуком и Claude Code в терминале. Да, я активно использую ИИ-ассистенты для кодинга и не стесняюсь этого. Но каждое архитектурное решение, каждый компромисс, каждый баг в три часа ночи, всё это моё.

Зачем это всё

Честный ответ: я не планировал «убить Дискорд». Я хотел сделать инструмент, которым сам бы пользовался. Мессенджер с серверной структурой, который работает в России без костылей.

Сейчас на рынке есть альтернативы: Lenza Arena (115 тысяч пользователей, но лимит 15 человек в голосовом канале), Revolt (международный, на бета-стадии, серверы за границей), корпоративные решения вроде VK Teams и SaluteJazz (не для сообществ). Полноценного российского аналога с серверами, каналами, ролями, ботами и голосовыми комнатами я не нашёл. Поэтому сделал.

Что дальше

Я выпустил Vela в открытый доступ. Прямо сейчас можно:

  • Скачать приложение для Windows: velachat.ru

  • Открыть в браузере без установки velachat.online

  • Создать свой сервер и позвать друзей

Мне интересна обратная связь. Не абстрактная «ну, прикольно», а конкретная: что сломалось, чего не хватает, что раздражает. Я один, и мне важно понять, куда вкладывать следующие 200 часов разработки.

В ближайших планах:

  • Версия для macOS и Linux (сборки настроены, нужно тестирование)

  • Мобильное приложение (это отдельная большая история)

  • Рассматриваю возможность открыть исходный код

Если зайдёте, попробуете и напишете мне, буду благодарен. На официальном сервере Vela есть каналы для обратной связи и баг-репортов.


Я Денис, фрилансер из Нижнего Новгорода. Занимаюсь веб-разработкой, Телеграм-ботами и иногда мессенджерами. Сайт проекта: velachat.ru и веб приложение velachat.online

Комментарии (12)


  1. RodionGork
    13.03.2026 06:20

    Занятный опыт, спасибо :)

    Только написать-то это полдела - в наше сложное время главное ещё убедить пользователей.

    Ах да, не упоминая ещё про поддержку :)))

    Полноценного российского аналога с серверами, каналами, ролями, ботами и голосовыми комнатами я не нашёл. Поэтому сделал.

    честно говоря не уверен что аудио-видео возможности принципиально нужно в чат встраивать. в корпоративной среде окажется что используют kontur talk и важнее интеграция с календарём например

    ну и что значит "российский аналог"? что "главный разработчик" может предъявить паспорт подтверждающий гражданство РФ? это будет весомый довод для корпоративного клиента который рассматривает "velachat vs mattermost" например?

    Скачать приложение для Windows: velachat.ru Открыть в браузере без установки velachat.online Создать свой сервер и позвать друзей Мне интересна обратная связь.

    Это очевидное - вы и сами об этом дальше пишете - но в наше время без мобильного клиента чат продвигать вряд ли реалистично. На этом стоит сконцентрироваться раньше чем пытаться вычищать текущую версию.


    1. Mhessel Автор
      13.03.2026 06:20

      Спасибо за развёрнутый комментарий, тут есть над чем подумать.

      Про мобильный клиент: полностью согласен, это приоритет номер один. Сейчас в работе, без него действительно сложно всерьёз говорить о продвижении.

      Про "российский аналог": имею в виду что серверы физически в РФ, данные хранятся по 152-ФЗ, работает без VPN. Юрлицо российское (ИП). Для корпоративных клиентов, если до этого дойдёт, готов к сертификации и реестру отечественного ПО. Но пока фокус на community-сегменте, не на корпоративном.

      Про аудио/видео: для геймерской аудитории (а это основная ЦА) голосовые каналы это не опция, а причина номер один почему они вообще сидели в Discord. Без голоса смысла делать аналог нет, проще было бы форум поднять. Корпоратив с календарями и Kontur Talk это другая ниша, туда пока не целюсь.

      Про поддержку: да, это больное место любого соло-проекта :) Пока справляюсь, дальше видно будет.

      Спасибо что зашли и написали, такая обратная связь ценнее лайков.


  1. Alanir
    13.03.2026 06:20

    >Полноценного российского аналога с серверами, каналами, ролями, ботами и голосовыми комнатами я не нашёл.
    Например squadus или dion, и примерно ещё пяток других


    1. Mhessel Автор
      13.03.2026 06:20

      Squadus и Dion смотрел, оба корпоративные (B2B, платные лицензии, заточены под рабочие процессы). Для компании с бюджетом на IT они подходят, для геймерского сообщества на 500 человек которое вчера сидело в Discord, не очень. Разные задачи, разная аудитория.

      Но спасибо за наводку, полезно видеть полную картину рынка.


  1. cartonworld
    13.03.2026 06:20

    Полноценного российского аналога

    Lenza Arena например

    И другие, https://habr.com/ru/companies/lenza/articles/958952/


  1. Ingref
    13.03.2026 06:20

    Вот я не понимаю комментаторов выше. Человек сделал аналог дискорда для игр. И предлагает им воспользоваться забесплатно. Без танцев с бубном. Без ограничений на 15 человек в голосовом канале, как у Lenza. Нет, всё равно какой-то непонятный хейт.


    1. cartonworld
      13.03.2026 06:20

      Интересные у вас интерпретация и принятие действительности. Нет никакого хэйта; автор написал "не нашёл", ему дали пару ссылок, без какой-либо оценки самого автора и его решения.


      1. Ingref
        13.03.2026 06:20

        Ему дали ссылки либо на платные корпоративные решения, либо на сервисы с ограничениями. Про Lenza и Revolt он сам упомянул, остальные сервисы имеют серверы за границей, либо требуют поднятия своего сервера. Конкретно того, что сделал автор, там нет. Поэтому и выглядят такие комменты немного странно.


        1. cartonworld
          13.03.2026 06:20

          О, тут я не прав, про Lenza не видел в статье


        1. Mhessel Автор
          13.03.2026 06:20

          Спасибо за понимание контекста. Именно так: корпоративные решения есть, а вот бесплатный community-мессенджер с серверами, ролями, голосовыми каналами и ботами, на российских серверах, этого пока нет. Поэтому и делаю.


    1. eugustus
      13.03.2026 06:20

      незабесплатно


      1. Mhessel Автор
        13.03.2026 06:20

        Бесплатно. Серверы, каналы, голос, боты, роли. Без лимитов, без пробного периода. Расходы на хостинг пока тяну сам, если дорастёт до серьёзных масштабов, появится опциональная подписка на косметику (аватары, темы, повышенные лимиты файлов). Базовый функционал останется бесплатным.