Files
forkmessager/README.md
Халимов Рустам cc92c44b65 Дополнение
2026-03-16 14:54:23 +03:00

130 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.