Skip to content
rocksteady591Public

About

This is a high-performance messenger written in C++.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

56 Commits

Folders and files

Repository files navigation

Messenger Server (C++)

Мессенджер на C++ с поддержкой WebSocket, HTTP API, сквозного шифрования и хранения данных в PostgreSQL.

🚀 О проекте

Messenger Server — это бэкенд реального времени для мессенджера, написанный на C++ с использованием Boost.Asio, Beast и PostgreSQL. Проект обеспечивает:

  • 🔐 Безопасную передачу сообщений с сквозным шифрованием (на базе libsodium).
  • 🌐 Двустороннюю связь через WebSocket с поддержкой TLS.
  • 🗄️ Надёжное хранение данных пользователей, чатов и сообщений в PostgreSQL.
  • 📡 Гибкое API для регистрации, входа, поиска и получения сообщений.
  • 📊 Централизованное логирование в формате JSON для удобного мониторинга.

Проект находится в стадии активной разработки и уже достиг состояния MVP, позволяя базовое общение между пользователями в реальном времени.

Технологический стек

Компонент Технология
Язык C++23
Сборка CMake (≥ 3.15)
Сеть Boost.Asio, Boost.Beast (WebSocket/HTTP)
Шифрование libsodium
Сериализация Google Protocol Buffers
База данных PostgreSQL (libpqxx)
Тестирование
Логирование Boost.Log

🏗️ Архитектура проекта

Проект организован по модульному принципу: ├── connection_pool # Пул соединений с PostgreSQL ├── user # Менеджер пользователей (регистрация, аутентификация, токены) ├── chat # Менеджер чатов и сообщений (создание, получение, запись) ├── http_server # HTTPS-сервер для REST API (регистрация, логин, поиск) ├── websocket_server # WebSocket-сервер для обмена сообщениями в реальном времени ├── request_handler # Обработчик HTTP-запросов ├── log # Форматирование логов в JSON └── main # Точка входа, инициализация таблиц и запуск сервисов

Взаимодействие компонентов:

  1. Клиент подключается по HTTPS к /api/register или /api/login и получает токен.
  2. С этим токеном клиент устанавливает WebSocket соединение (например, wss://server:9000?token=...).
  3. После успешного handshake происходит обмен ключами (X25519) для сквозного шифрования.
  4. Каждое сообщение шифруется на клиенте, отправляется в зашифрованном виде, сервер не расшифровывает содержимое, а только пересылает получателю.
  5. Сообщения также сохраняются в БД для истории.

✅ Реализованные возможности (MVP)

👤 Управление пользователями

  • Регистрация (POST /api/register) — создание нового пользователя с логином и паролем (хэш хранится в БД).
  • Авторизация (POST /api/login) — получение токена для дальнейших запросов.
  • Поиск пользователей (POST /api/find_user) — по логину для начала диалога.

💬 Работа с чатами и сообщениями

  • Автоматическое создание чата — при отправке первого сообщения между двумя пользователями создаётся (или находится существующий) чат.
  • Запись сообщений — все сообщения сохраняются в БД (таблица messages).
  • Получение истории (POST /api/get_messages) — пагинированная выгрузка сообщений из чата (с указанием количества и смещения).
  • Пересылка в реальном времени — если получатель онлайн, сообщение доставляется мгновенно через WebSocket.

🔐 Безопасность

  • SSL/TLS — все HTTP и WebSocket соединения защищены.
  • Сквозное шифрование — на основе X25519 (обмен ключами) и crypto_box (аутентифицированное шифрование).
  • Токен-сессии — после логина клиент получает уникальный токен для идентификации.

📊 Хранение данных

  • PostgreSQL с индексами для быстрых запросов по чатам и сообщениям.
  • Пул соединений для эффективного использования БД в многопоточном окружении.
  • Автоматическое создание таблиц при первом запуске.

📝 Логирование

  • Все события логируются в структурированном JSON с временной меткой (UTC).
  • Поддержка уровней: info, warning, error.

🧪 Что в планах (ближайшие задачи)

  • Уведомления о прочтении — добавить подтверждение доставки и прочтения сообщений.
  • Сплит чатов для веб (пк) и десктопной версий — открывать одновременной и писать в нескольких чатах а также drag and drop файлов или сообщений между чатами.
  • Групповые чаты — поддержка бесед с несколькими участниками.
  • Групповые звонки — сделать аналогичный с дискордом функционал по звонкам.
  • Медиа-файлы — отправка изображений и файлов (через отдельный поток или base64).
  • Статус «печатает» — индикация набора текста.
  • История сообщений с возможностью поиска по дате и ключевым словам.
  • Административная панель — мониторинг активных сессий, статистика.
  • Тестирование — написание юнит- и интеграционных тестов.
  • Документация API — OpenAPI/Swagger спецификация.

🚀 Быстрый старт

Требования

  • C++17 компилятор (GCC, Clang, MSVC)
  • CMake 3.10+
  • PostgreSQL (локально или удалённо)
  • libpqxx, Boost (Asio, Beast, Log), libsodium, OpenSSL

Сборка

для сборки проекта должен быть установлен CMake, Conan если конан установили в первый раз в терминале выполните команду conan profile detect --force

далее универсальная команда: conan install . --output-folder=build --build=missing --build=boost -s build_type=Debug -s arch=x86_64 -s compiler.cppstd=23 -c tools.cmake.cmaketoolchain:generator="Ninja"

более короткая под все системы conan install . --build=missing --output-folder=build -s build_type=Debug -s compiler.cppstd=23

под все системы: cmake --preset conan-debug или cd build потом cmake .. -G "Ninja" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug

под xcode: cd build потом cmake .. -G Xcode
-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++

cmake --build .

Пример добавления переменной среды Linux/MacOs export PG_DB_URL="postgres://user:password@host:port/db_name"

About

This is a high-performance messenger written in C++.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages