Мессенджер на 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 # Точка входа, инициализация таблиц и запуск сервисов
- Клиент подключается по HTTPS к
/api/registerили/api/loginи получает токен. - С этим токеном клиент устанавливает WebSocket соединение (например,
wss://server:9000?token=...). - После успешного handshake происходит обмен ключами (X25519) для сквозного шифрования.
- Каждое сообщение шифруется на клиенте, отправляется в зашифрованном виде, сервер не расшифровывает содержимое, а только пересылает получателю.
- Сообщения также сохраняются в БД для истории.
- Регистрация (
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"