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.
- Клонируйте репозиторий.
- В корневой директории найдите файл
.env. Там задаются секреты (пароль к базе данных, ключи JWT, доступы MinIO, ключи TURN). - Запустите стек:
docker compose build --no-cache docker compose up -d
В результате поднимутся 4 контейнера:
knot-db— База данных PostgreSQL.knot-minio— S3 хранилище файлов MinIO.knot-server— Основной бэкенд на порту:5034/:5059knot-web— Фронтенд (Nginx + React) на порту:9090(или на 80/443 при использовании Traefik/Dokploy).
Для продакшена (Dokploy / Coolify) можно использовать стандартный подход публикации через Docker Compose, указав SSL сертификаты и настроив домены.
🌐 Настройка TURN-сервера (для стабильности звонков)
Механизм аудио и видео звонков, а также демонстрации экрана основан на технологии WebRTC. Чтобы пользователи могли свободно общаться вне зависимости от локальных ограничений сети (NAT/Firewall/мобильные вышки), необходим внешний TURN сервер-ретранслятор.
Требования к TURN
- Вам нужен отдельный сервер с белым (публичным) IP адресом.
- В файрволе этого сервера должны быть открыты порты:
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% клиентских конфигураций.