Files
forkmessager/README.md
2026-03-16 14:49:31 +03:00

107 lines
9.2 KiB
Markdown
Raw 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.
# 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% клиентских конфигураций.