Knot Messenger
Knot Messenger — это современный, безопасный и высокопроизводительный мессенджер с открытым исходным кодом, созданный для самостоятельного развертывания (self-hosted). Проект разработан на стеке React + TypeScript + Vite для фронтенда и .NET (C#) 8/10 + PostgreSQL + MinIO + SignalR для бэкенда.
🚀 Основной функционал
Knot Messenger обладает всеми функциями полноценной современной платформы для общения:
Сообщения и чаты
- Личные и групповые чаты: Мгновенный обмен сообщениями через веб-сокеты (SignalR). Добавление и удаление участников, роли администраторов.
- Статусы сообщений: Гарантированная доставка, статусы "Отправлено", "Доставлено", "Прочитано" (Double Check) и индикаторы набора текста (Typing).
- Богатое взаимодействие: Эмодзи-реакции, ответы (Reply c цитатами), пересылка сообщений (Forward) и возможность закреплять важные чаты (Pin).
- Редактирование и удаление: Редактирование текста, а также удаление сообщений (только у себя или у всех участников).
- Отложенные сообщения: Встроенный планировщик, позволяющий отправить сообщение в назначенную дату и время.
Медиа и файлы
- Отправка файлов: Поддержка документов, изображений, видео файлов.
- Голосовые сообщения: Запись голоса прямо из браузера с красивой генерацией и отрисовкой waveform-волны в интерфейсе чата.
- Интеграция Klipy (GIF): Встроенный и быстрый поиск трендовых GIF-анимаций (ключи API управляются "на лету" из админ-панели).
- Полноэкранная галерея (Lightbox): Удобный просмотр отправленных фото и видео без необходимости скачивания.
Конференц-связь и Звонки
- Личные (P2P) звонки: Качественные аудио- и видеозвонки благодаря WebRTC.
- Групповые аудиоконференции: Возможность подключиться к голосовому каналу непосредственно внутри группы со всеми участниками.
- Демонстрация экрана: Захват и расшаривание экрана или конкретного окна в режиме реального времени.
- Все медиаконфигурации работают в закрытых NAT сетях благодаря внешнему TURN-серверу.
Социализация и Профиль
- Истории (Stories): Публикация временных (на 24 часа) фото и видео историй с просмотром списка зрителей (Viewer List).
- Система друзей: Отправка заявок в друзья, список контактов, онлайн/офлайн статусы ("Был в сети...").
- Продвинутый профиль: Редактор "О себе", даты рождения, установка и смена кастомного никнейма.
- Умный кроп изображений: Идеальная клиентская обрезка и масштабирование (Zoom) аватарок (квадрат/круг) еще до отправки на сервер.
Премиальный UI и Админ-панель
- Современный дизайн: Эффект матового стекла (Glassmorphism), плавные переходы (Framer Motion) и темы оформления (Ocean, Nebula, Midnight, Forest и др., меняющиеся "на лету").
- Панель управления (Admin Dashboard): Динамическое управление системой без перезагрузок сервера:
- Настройки Klipy API (Customer ID, ключи).
- Управление лимитами загрузки файлов (File Size Limits).
- Ограничения на максимальное количество участников в группе.
- Глобальное отключение звонков (Toggle Calls).
- Управление пользователями, блокировка (Бан), статистика.
🛡 Безопасность и Шифрование
Безопасность является одним из приоритетов Knot Messenger:
- Аутентификация: Безопасные JWT-токены с механизмом ротации Refresh-токенов.
- Шифрование трафика (Transport Security): Все данные между клиентом и сервером передаются поверх TLS (HTTPS и WSS/WebSockets Secure).
- Безопасность звонков (WebRTC): Весь аудио/видео трафик и демонстрация экрана обязательно шифруется встроенными протоколами DTLS (Datagram Transport Layer Security) и SRTP (Secure Real-time Transport Protocol), что исключает возможность перехвата медиа-данных (Man-in-the-Middle) даже на стороне TURN-сервера.
- Хранение секретов: Изолированное управление секретами через переменные окружения
.env(ключи, пароли БД, credentials MinIO). - Система прав: Строгое разграничение на уровне ролей (Admin/User) и проверки участия пользователя в конкретном чате перед выдачей контента через CQRS (MediatR Behaviours/Policies).
🛠 Архитектура
Проект построен как масштабируемая система с раздельными фронтендом, бэкендом и сервисами:
- Backend (.NET 8/10):
- Построен на архитектурном паттерне CQRS с использованием MediatR. Логика работы с чатами, пользователями и вызовами изолирована по модулям.
- Работа в реальном времени осуществляется через SignalR Hub, с умным учетом подключений и распределением сообщений по группам (Groups).
- Выделенные background-сервисы (потоки Worker) очищают устаревшие данные (например, удаление "Stories" спустя 24 часа).
- Database (PostgreSQL) + Entity Framework Core:
- Хранение реляционных связей, чатов, истории сообщений и метаданных. Применяются строгие миграции.
- Object Retrieval (MinIO S3):
- Полноценное объектное S3-совместимое хранилище (MinIO) отвечает за отдачу и хранение всех медиа (изображений, файлов, аудио, аватарок). Снимает нагрузку с основного бэкенда и позволяет гибко масштабировать файловое пространство.
- Frontend (React 18):
- SPA-приложение, сборка происходит через быстрый бандлер Vite.
- Стилизация компонентов осуществлена через TailwindCSS.
- Глобальное и легковесное управление состоянием конфигураций, чатов и профилей реализовано через Zustand.
⚙️ Установка и развертывание (Docker Compose)
Мессенджер спроектирован для моментального локального запуска или production развертывания через docker-compose.
- Клонируйте репозиторий.
- В корневой директории найдите файл
.env. Задайте там собственные секреты (пароли к Postgres, JWT-ключи, доступы MinIO/S3, ключи TURN). - Запустите все необходимые компоненты одной командой:
docker compose build --no-cache docker compose up -d
В результате поднимутся 4 контейнера:
knot-db— Реляционная база данных PostgreSQL.knot-minio— S3-хранилище файлов (с UI интерфейсом для менеджмента бакетов).knot-server— Основной API и SignalR-сервер (:5034/:5059).knot-web— Фронтенд (Nginx + распределение статики) на порту:9090.
Для продакшена (Dokploy / Coolify / Traefik) вы можете экспонировать фронтенд на порты 80/443 и подключить самоподписные или Let's Encrypt SSL-сертификаты для безупречной работы HTTPS и WSS.
🌐 Настройка TURN-сервера (для звонков без сбоев)
Аудио, видео и демонстрация экрана используют технологию WebRTC. Чтобы пользователи могли свободно устанавливать P2P-соединения вне зависимости от NAT (4G/LTE вышки, роутеры, корпоративные брэндмауэры), серверу звонков необходим внешний TURN (Relay) сервер.
Требования к TURN
- VPS-сервер с белым публичным IP-адресом.
- Открытые порты на файрволе:
3478(TCP/UDP)5349(TCP/UDP для TLS)- Диапазон портов
49152 - 65535(UDP) под сквозной медиа-трафик.
Запуск Coturn
Самый быстрый способ развернуть Coturn через Docker:
docker run -d \
--network=host \
--name coturn \
coturn/coturn \
-n --log-file=stdout \
--min-port=49152 \
--max-port=65535 \
--user=ВАШ_ЛОГИН:ВАШ_ПАРОЛЬ \
--realm=yourdomain.com
Настройка в Knot
После запуска TURN-ретранслятора откройте файл .env в корне проекта (или укажите это прямо в Variables вашего CI/CD) и добавьте:
TURN_URL=turn:ОТКРЫТЫЙ_IP_ТУТ:3478
TURN_USERNAME=ВАШ_ЛОГИН
TURN_PASSWORD=ВАШ_ПАРОЛЬ
После ввода этих данных клиенты Knot будут получать настройки TURN через бэкенд, и звонки (включая демонстрацию экрана) будут проходить со 100% вероятностью, шифруясь через DTLS.