diff --git a/README.md b/README.md index a34a84a..3e10387 100644 --- a/README.md +++ b/README.md @@ -1 +1,99 @@ -# forkmessager +# SelfHost Messenger (Vortex) + +SelfHost Messenger — это современный, безопасный и многофункциональный мессенджер с открытым исходным кодом, который вы полностью можете развернуть на собственных серверах (self-hosted). Проект разработан на стеке **React + TypeScript + Vite** для фронтенда и **.NET (C#) + PostgreSQL + SignalR** для бэкенда. + +## 🚀 Текущий функционал + +Мессенджер обладает функциями полноценной современной платформы общения: + +### Чаты и группы +* **Личные сообщения (P2P):** Обмен сообщениями в реальном времени (на базе SignalR). Текстовые сообщения, статусы прочитанности, индикаторы набора текста (typing). +* **Групповые чаты:** Создание закрытых групп. Настройки группы (название, описание, аватар). Добавление и удаление участников администратором. +* **Закрепление чатов (Pin/Unpin):** Важные чаты всегда под рукой вверху списка. +* **Вложения и медиа:** Поддержка отправки фото, видео, обычных файлов, а также удобный просмотр отправленных ссылок (распределение по вкладкам в информации профиля и группы). Изображения открываются во встроенном полноэкранном лайтбоксе. +* **Интеграция GIF (Klipy):** Встроенный поиск и отправка GIF-анимаций через Klipy. +* **Реакции на сообщения:** Стандартный набор эмодзи-реакций с красивой анимацией. + +### Конференц-связь +* **Аудио и видеозвонки:** Интеграция WebRTC для личных звонков и групповых конференций. +* **Демонстрация экрана:** Возможность делиться экраном со всеми участниками беседы. +* Управление микрофоном, камерой, отображение статусов звонка в чате. *Для стабильной работы необходим внешний TURN-сервер.* + +### Социальные функции +* **Истории (Stories):** Публикация фото/видео историй на 24 часа. Просмотр списка посмотревших (Viewer List). +* **Друзья (Friends):** Гибкая система отправки заявок в друзья, подтверждения и удаления из друзей. +* **Продвинутый профиль пользователя:** Смена никнейма, информации "о себе", дня рождения. +* **Клиентский кроп фото:** Идеально ровная обрезка квадратных и круглых аватаров для профиля и групповых чатов происходит прямо в вашем браузере. Решение не смещает координаты кадра и на сервер летит уже готовый результат. +* **Онлайн-статусы:** Индикация того, кто находится онлайн в данный момент. + +### Интерфейс и Кастомизация +* Современно выглядит: эффект стекла (glassmorphism), плавные анимации (Framer Motion). +* **Кастомизация тем:** Встроенное меню выбора цветовых акцентов и фона чата (Ocean, Nebula, Midnight, Forest и д.р.). + +--- + +## 🛠 Архитектура + +* **Бэкенд:** C# .NET 8/10, Entity Framework Core (PostgreSQL). Паттерн CQRS. Механизм SignalR для мгновенных уведомлений. +* **Фронтенд:** React, zustand (стейт-менеджер), lucide-react (иконки), framer-motion (анимации), react-easy-crop, WebRTC APIs. +* **База данных:** PostgreSQL Server. Хранение медиа происходит прямо на сервере в папке `uploads`. + +--- + +## ⚙️ Установка и развертывание (Docker) + +Проект легко разворачивается с помощью `docker-compose`. + +1. Клонируйте репозиторий. +2. В корневой директории найдите файл `.env`. Там задаются секреты (базы данных, JWT-секреты, TURN параметры и API ключи). +3. Запустите стек: + ```bash + docker-compose build --no-cache + docker-compose up -d + ``` +В результате поднимутся 3 контейнера: +* `vortex-db` — База данных Postgres. +* `vortex-server` — Основной бэкенд на порту `:5059`. +* `vortex-web` — Фронтенд (Nginx + React) на порту `:9090`. + +*Для продакшена (Dokploy) используйте гайд из файла `DOKPLOY.md` и `DEPLOYMENT.md` в этом же или соседних файлах, указав SSL сертификаты и правильные домены.* + +--- + +## 🌐 Настройка TURN-сервера (для звонков) + +Механизм аудио и видео звонков, а также демонстрации экрана основан на технологии **WebRTC**. + +**Почему нужен TURN-сервер?** +Чтобы двое (или более) участников могли передавать медиа-трафик друг другу из своих частных сетей (из-за NAT или файрволов), им нужен промежуточный ретранслятор. Если прямое подключение (STUN) не удаётся, соединение будет перенаправлено через 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` корневого проекта Vortex и задайте переменные: +```env +TURN_URL=turn:ВАШ_БЕЛЫЙ_IP_ТУТ:3478 +TURN_USERNAME=USER_NAME +TURN_PASSWORD=SECRET_PASSWORD +``` +Также убедитесь, что ваш React клиент принимает эти параметры для создания WebRTC-соедения, после этого WebRTC звонки будут работать практически в 100% случаев.