Эфир
Эфир — это лёгкий и быстрый мессенджер на 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 — шифрование сообщений
Быстрый старт
- Скопируйте
.env.exampleв.envи настройте переменные окружения - Запустите сервер:
go run cmd/server/main.go - Сервер будет доступен на порту, указанном в конфиге (по умолчанию 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-уведомлений.