# SelfHost Messenger SelfHost Messenger — это современный, безопасный и многофункциональный мессенджер с открытым исходным кодом, предназначенный для самостоятельного развертывания на собственных серверах (self-hosted). Проект разработан на стеке **React + TypeScript + Vite** для фронтенда и **.NET (C#) 8/10 + PostgreSQL + MinIO + SignalR** для бэкенда. ## 🚀 Основной функционал Мессенджер обладает всеми функциями полноценной современной платформы для общения и командной работы: ### Чаты и группы * **Личные сообщения (P2P):** Обмен сообщениями в реальном времени (SignalR). Текстовые сообщения, статусы отправки, доставки и прочитанности, индикаторы набора текста (typing). * **Групповые чаты:** Создание групп. Настройки группы (название, описание, аватар). Добавление и удаление участников администратором. В админ-панели можно установить лимит участников. * **Закрепление чатов (Pin/Unpin):** Важные чаты всегда под рукой вверху списка. * **Вложения и медиа:** Отправка фото, видео, голосовых сообщений (с генерацией waveform-волны), аудиофайлов и обычных документов. Плавный просмотр изображений и видео во встроенном полноэкранном лайтбоксе (галерее). * **Интеграция GIF (Klipy):** Встроенный поиск и отправка GIF-анимаций через Klipy. Ключи и ID клиента(Customer ID) настраиваются прямо из панели администратора. * **Реакции и действия с сообщениями:** Реакции на сообщения (эмодзи), редактирование, пересылка (Forward), ответы (Reply c цитатами), удаление (только для себя или для всех). * **Отложенные сообщения:** Возможность запланировать отправку сообщения на определенную дату и время. ### Конференц-связь (WebRTC) * **Аудио и видеозвонки:** Интеграция WebRTC для личных звонков P2P. * **Групповые звонки:** Аудио-конференции внутри групповых чатов со всеми участниками беседы. * **Демонстрация экрана (Screen Sharing):** Возможность поделиться экраном или окном. * Управление микрофоном, камерой, отображение статусов звонка прямо в чате. *Для стабильной работы необходим внешний TURN-сервер.* ### Социальные функции * **Истории (Stories):** Публикация фото/видео историй. Просмотр списка посмотревших (Viewer List). Истории автоматически удаляются через установленное время. * **Друзья (Friends):** Гибкая система отправки заявок в друзья, подтверждения и удаления из друзей. * **Продвинутый профиль пользователя:** Настройка никнейма, информации "о себе", даты рождения. Клиентский редактор аватарок (Crop/Zoom) с идеальной обрезкой прямо в браузере. * **Онлайн-статусы:** Индикация того, кто находится онлайн в данный момент (с точным временем "Был(а) в сети..."). ### Интерфейс и Панель Управления * **Премиальный дизайн:** Эффект стекла (glassmorphism), плавные анимации (Framer Motion), кастомизация тем на лету (Ocean, Nebula, Midnight, Forest и д.р.). * **Админ-панель (Dashboard):** Динамическое управление настройками системы "на лету" без перезагрузки сервера: * Включение/выключение звонков. * Настройка ключей Klipy API. * Установка максимального размера загружаемого файла. * Лимиты на количество участников в группах. * Управление пользователями системы. --- ## 🛠 Архитектура * **Бэкенд:** C# .NET (ASP.NET Core), Entity Framework Core (PostgreSQL). Паттерн CQRS (MediatR). Механизм SignalR для доставки событий и сообщений в реальном времени. * **Фронтенд:** React 18, Zustand (стейт-менеджер и кэширование параметров коннекта), TailwindCSS, lucide-react (векторные иконки), framer-motion (анимации), react-easy-crop, WebRTC APIs. * **База данных и S3:** * `PostgreSQL Server` — надежное и быстрое хранение реляционных данных. * `MinIO` (S3) — масштабируемое и независимое объектное хранилище для медиафайлов (аватарки, файлы, вложения). --- ## ⚙️ Установка и развертывание (Docker Compose) Проект изначально готов к `production` развертыванию через `docker-compose`. 1. Клонируйте репозиторий. 2. В корневой директории найдите файл `.env`. Там задаются секреты (пароль к базе данных, ключи JWT, доступы MinIO, ключи TURN). 3. Запустите стек: ```bash docker compose build --no-cache docker compose up -d ``` В результате поднимутся 4 контейнера: * `knot-db` — База данных PostgreSQL. * `knot-minio` — S3 хранилище файлов MinIO. * `knot-server` — Основной бэкенд на порту `:5034` / `:5059` * `knot-web` — Фронтенд (Nginx + React) на порту `:9090` (или на 80/443 при использовании Traefik/Dokploy). *Для продакшена (Dokploy / Coolify) можно использовать стандартный подход публикации через Docker Compose, указав SSL сертификаты и настроив домены.* --- ## 🌐 Настройка TURN-сервера (для стабильности звонков) Механизм аудио и видео звонков, а также демонстрации экрана основан на технологии **WebRTC**. Чтобы пользователи могли свободно общаться вне зависимости от локальных ограничений сети (NAT/Firewall/мобильные вышки), необходим внешний TURN сервер-ретранслятор. ### Требования к TURN 1. Вам нужен **отдельный сервер с белым (публичным) IP адресом**. 2. В файрволе этого сервера должны быть открыты порты: * `3478` (TCP/UDP) * `5349` (TCP/UDP, если настроен TLS) * Диапазон портов `49152 - 65535` (UDP) для прохода медиа-трафика. ### Развертывание Coturn Быстрое развертывание при помощи Docker на отдельном VPS: ```bash docker run -d \ --network=host \ --name coturn \ coturn/coturn \ -n --log-file=stdout \ --min-port=49152 \ --max-port=65535 \ --user=USER_NAME:SECRET_PASSWORD \ --realm=yourdomain.com ``` *Замените `USER_NAME` и `SECRET_PASSWORD` на собственные логин и пароль.* ### Подключение к приложению После установки Coturn, перейдите в файл `.env` корневого проекта SelfHost Messenger и укажите реквизиты: ```env TURN_URL=turn:ВАШ_БЕЛЫЙ_IP_ТУТ:3478 TURN_USERNAME=USER_NAME TURN_PASSWORD=SECRET_PASSWORD ``` (Также эти параметры можно переопределить через админ-панель в будущих версиях). После этого WebRTC звонки будут работать практически в 100% клиентских конфигураций.