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

9.2 KiB
Raw Blame History

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

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 и укажите реквизиты:

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

(Также эти параметры можно переопределить через админ-панель в будущих версиях). После этого WebRTC звонки будут работать практически в 100% клиентских конфигураций.