Files
efir-api-server/README.md

75 lines
5.5 KiB
Markdown
Raw Normal View History

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