Files
forkmessager/README.md
Халимов Рустам c31a531a6a Описание
2026-03-14 02:00:49 +03:00

8.0 KiB
Raw Blame History

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. Запустите стек:
    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):

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 и задайте переменные:

TURN_URL=turn:ВАШ_БЕЛЫЙ_IP_ТУТ:3478
TURN_USERNAME=USER_NAME
TURN_PASSWORD=SECRET_PASSWORD

Также убедитесь, что ваш React клиент принимает эти параметры для создания WebRTC-соедения, после этого WebRTC звонки будут работать практически в 100% случаев.