# Эфир **Эфир** — это лёгкий и быстрый мессенджер на 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. Достаточно собрать бинарник под целевую платформу: ```bash GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o bin/efir-linux cmd/server/main.go ``` Затем запустить его через systemd или Docker. Для работы WebSocket рекомендуется использовать Nginx в качестве reverse proxy. ## Состояние проекта Проект полностью работоспособен и готов к использованию для личных целей или небольших команд. Реализованы все базовые функции мессенджера. В планах — улучшение фронтенда и добавление push-уведомлений.