75 lines
5.5 KiB
Markdown
75 lines
5.5 KiB
Markdown
# Эфир
|
||
|
||
**Эфир** — это лёгкий и быстрый мессенджер на 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-уведомлений. |