# 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. Запустите все необходимые компоненты одной командой: ```bash 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: ```bash 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) и добавьте: ```env TURN_URL=turn:ОТКРЫТЫЙ_IP_ТУТ:3478 TURN_USERNAME=ВАШ_ЛОГИН TURN_PASSWORD=ВАШ_ПАРОЛЬ ``` После ввода этих данных клиенты Knot будут получать настройки TURN через бэкенд, и звонки (включая демонстрацию экрана) будут проходить со 100% вероятностью, шифруясь через DTLS.