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.

  1. Клонируйте репозиторий.
  2. В корневой директории найдите файл .env. Задайте там собственные секреты (пароли к Postgres, JWT-ключи, доступы MinIO/S3, ключи TURN).
  3. Запустите все необходимые компоненты одной командой:
    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

  1. VPS-сервер с белым публичным IP-адресом.
  2. Открытые порты на файрволе:
    • 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.

Description
No description provided
Readme 190 MiB
Languages
TypeScript 55.5%
C# 44%
CSS 0.4%