Эфир

Эфир — это лёгкий и быстрый мессенджер на Go с поддержкой реального времени. Серверная часть написана с нуля, использует WebSocket для мгновенной доставки сообщений и AES-256-GCM для шифрования.

Основные возможности

  • 🔐 JWT-аутентификация — безопасный вход и регистрация
  • 💬 Личные чаты 1-1 — общение напрямую
  • 👥 Групповые чаты — беседы с несколькими участниками
  • WebSocket — сообщения приходят мгновенно без перезагрузки страницы
  • 🔒 Шифрование сообщений — все сообщения хранятся в БД в зашифрованном виде (AES-256-GCM)
  • 📎 Загрузка файлов — отправка изображений и документов
  • 👑 Ролевая модель — обычные пользователи и глобальный администратор
  • 📦 SQLite — не требует отдельного сервера БД, легко заменяется на PostgreSQL
  • 💾 Низкое потребление ресурсов — около 3-5 МБ оперативной памяти в простое

Как это работает

Клиент подключается к API-серверу через HTTP для обычных операций (регистрация, создание чатов, загрузка файлов) и через WebSocket для обмена сообщениями в реальном времени. Все сообщения перед сохранением в базу данных шифруются, а при отправке расшифровываются сервером и передаются клиенту.

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

  • Go 1.25 — основной язык
  • Chi — маршрутизация HTTP-запросов
  • Gorilla WebSocket — WebSocket соединения
  • SQLite — встраиваемая база данных
  • JWT — аутентификация
  • bcrypt — хэширование паролей
  • AES-256-GCM — шифрование сообщений

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

  1. Скопируйте .env.example в .env и настройте переменные окружения
  2. Запустите сервер: go run cmd/server/main.go
  3. Сервер будет доступен на порту, указанном в конфиге (по умолчанию 8080)

Структура проекта

Проект организован по принципу чистой архитектуры: обработчики (handlers) → сервисы (services) → репозитории (repositories). Это позволяет легко заменять компоненты, например, переходить с SQLite на PostgreSQL без изменения бизнес-логики.

  • cmd/server — точка входа, запуск сервера
  • internal/api — HTTP-обработчики, middleware и утилиты для ответов
  • internal/service — бизнес-логика (регистрация, чаты, сообщения)
  • internal/repository — работа с базой данных (интерфейсы + реализация для SQLite)
  • internal/websocket — WebSocket Hub, управление подключениями и комнатами
  • internal/crypto — шифрование и расшифровка сообщений
  • internal/models — структуры данных
  • migrations — SQL-миграции для инициализации базы данных

API

Основные эндпоинты:

  • POST /api/register — регистрация нового пользователя
  • POST /api/login — вход, получение JWT-токена
  • GET /api/me — информация о текущем пользователе
  • GET /api/users?q= — поиск пользователей по логину
  • POST /api/chats/private — создание личного чата
  • POST /api/chats/group — создание группового чата
  • GET /api/chats — список всех чатов пользователя
  • GET /api/chats/{id}/messages — история сообщений в чате
  • GET /ws?token= — WebSocket подключение для обмена сообщениями

Деплой

Сервер легко деплоится на Linux. Достаточно собрать бинарник под целевую платформу:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bin/efir-linux cmd/server/main.go

Затем запустить его через systemd или Docker. Для работы WebSocket рекомендуется использовать Nginx в качестве reverse proxy.

Состояние проекта

Проект полностью работоспособен и готов к использованию для личных целей или небольших команд. Реализованы все базовые функции мессенджера. В планах — улучшение фронтенда и добавление push-уведомлений.

Description
Эфир — это лёгкий и быстрый мессенджер на Go с поддержкой реального времени. Серверная часть написана с нуля, использует WebSocket для мгновенной доставки сообщений и AES-256-GCM для шифрования.
Readme 82 KiB
Languages
Go 100%