go-notes

module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 6, 2025 License: MIT

README

Go Notes

Репозиторий для изучения языка Go, демонстрирующий создание веб-сервера и gRPC-сервера с возможностью управления заметками и пользователями.

Release Go Version License Go Test Coverage Tests

Особенности проекта

  • Веб-API: RESTful API с использованием фреймворка Gin
  • gRPC-сервер: Реализация gRPC-сервисов для заметок и пользователей
  • Аутентификация: JWT-токены для защиты маршрутов
  • Хранение данных: Поддержка различных хранилищ (PostgreSQL для основных данных и Redis для токенов)
  • Документация API: Swagger UI для веб-API
  • Protocol Buffers: Для определения gRPC-сервисов
  • Тестирование: Модульные тесты

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

go-notes/
├── api/                    # Определения API (protobuf)
├── cmd/                    # Основные приложения
│   ├── grpc-client/        # Клиент gRPC
│   ├── grpc-server/        # Сервер gRPC
│   └── web-server/         # Веб-сервер (REST API)
├── config/                 # Конфигурационные файлы
├── docs/                   # Документация Swagger
├── internal/               # Внутренний код приложения
│   ├── app/                # Входные точки приложения
│   ├── auth/               # Аутентификация и токены
│   ├── config/             # Управление конфигурацией
│   ├── database/           # Подключения к базам данных
│   ├── delivery/           # Контроллеры/обработчики HTTP и gRPC
│   ├── domain/             # Бизнес-логика и модели
│   │   ├── model/          # Определения структур данных
│   │   └── repository/     # Интерфейсы репозиториев
│   ├── middleware/         # HTTP-мидлвары (например, аутентификация)
│   ├── repository/         # Реализации репозиториев (PostgreSQL, Redis)
│   ├── service/            # Бизнес-сервисы
│   └── util/               # Вспомогательные утилиты
├── migrations/             # SQL-скрипты миграций
├── pkg/                    # Публичные пакеты (сгенерированный protobuf-код)
├── scripts/                # Скрипты для генерации кода
├── test/                   # Тесты
├── docker-compose.yml      # Конфигурация Docker Compose
├── go.mod                  # Зависимости Go
├── go.sum                  # Чек-суммы зависимостей
├── LICENSE                 # Лицензия
├── Makefile                # Сборочные команды
└── README.md               # Документация проекта

Функциональность

Веб-сервер (REST API)
  • Аутентификация пользователей через JWT
  • CRUD-операции для заметок и пользователей
  • Swagger UI доступен по адресу /swagger/index.html
  • Защищенные маршруты для изменения данных
  • Открытые маршруты для чтения данных
gRPC-сервер
  • Сервис для управления заметками
  • Сервис для управления пользователями
  • Поддержка всех CRUD-операций через gRPC
Хранение данных
  • PostgreSQL для хранения пользователей и заметок
  • Redis для хранения отозванных токенов и кэширования

Запуск приложения

Предварительные требования
  • Go 1.25.4 или выше
  • protoc (компилятор Protocol Buffers)
  • make
Установка зависимостей
# Установка зависимостей для protobuf
make proto-deps

# Генерация protobuf-кода
make proto

# Установка зависимостей для Swagger
make swag-deps

# Генерация документации Swagger
make swag
Запуск веб-сервера
go run cmd/web-server/main.go

Сервер будет доступен по адресу http://localhost:8080, Swagger UI по адресу http://localhost:8080/swagger/index.html.

Запуск gRPC-сервера
go run cmd/grpc-server/main.go

Сервер будет доступен по адресу localhost:5051.

Запуск gRPC-клиента
go run cmd/grpc-client/main.go

Клиент выполнит тестовые операции с gRPC-сервером.

Запуск с Docker
# Запуск PostgreSQL и Redis с помощью Docker Compose
make docker-up

# Запуск миграций базы данных
make migrate

# Откат всех миграций базы данных
make cleanup-db

# Полный перезапуск с Docker и миграции
make setup-db

Примеры использования API

Работа с пользователями
Регистрация пользователя
curl -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{"username": "testuser", "email": "test@example.com", "password": "password123"}'
Аутентификация пользователя (получение JWT-токена)
curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username": "testuser", "password": "password123"}'
Выход пользователя (отзыв refresh токена)
curl -X POST http://localhost:8080/api/auth/logout \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {jwt_token}" \
  -d '{"refresh_token": "{refresh_token}"}'
Обновление токенов
curl -X POST http://localhost:8080/api/auth/refresh \
  -H "Content-Type: application/json" \
  -d '{"refresh_token": "{refresh_token}"}'
Проверка валидности токена
curl -X POST http://localhost:8080/api/auth/validate \
  -H "Content-Type: application/json" \
  -d '{"token": "{jwt_token}"}'

После успешной аутентификации вы получите JWT-токен. При использовании токена в других запросах не включайте фигурные скобки {} - они используются только для обозначения плейсхолдера в примерах.

Получение всех пользователей
curl -X GET http://localhost:8080/api/users
Получение пользователя по ID
curl -X GET http://localhost:8080/api/users/{user_id}
Обновление пользователя (требует JWT-токен)
curl -X PUT http://localhost:8080/api/users/{user_id} \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {jwt_token}" \
  -d '{"username": "updateduser", "email": "updated@example.com", "password": ""}'
Удаление пользователя (требует JWT-токен)
curl -X DELETE http://localhost:8080/api/users/{user_id} \
  -H "Authorization: Bearer {jwt_token}"
Работа с заметками
Создание заметки (требует JWT-токен)
curl -X POST http://localhost:8080/api/notes \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {jwt_token}" \
  -d '{"title": "Моя заметка", "content": "Содержимое заметки"}'
Получение всех заметок (открытый маршрут)
curl -X GET http://localhost:8080/api/notes
Получение заметки по ID (требует JWT-токен)
curl -X GET http://localhost:8080/api/notes/{note_id} \
  -H "Authorization: Bearer {jwt_token}"
Обновление заметки (требует JWT-токен)
curl -X PUT http://localhost:8080/api/notes/{note_id} \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {jwt_token}" \
  -d '{"id": "{note_id}", "title": "Обновленная заметка", "content": "Обновленное содержимое"}'
Удаление заметки (требует JWT-токен)
curl -X DELETE http://localhost:8080/api/notes/{note_id} \
  -H "Authorization: Bearer {jwt_token}"

Используемые технологии

  • Gin - веб-фреймворк
  • gRPC - фреймворк для RPC
  • Protocol Buffers - язык описания схемы данных
  • JWT - токены для аутентификации
  • Swaggo - генерация документации Swagger
  • Testify - библиотека для тестирования

Make-цели

  • make proto - генерация protobuf-кода
  • make proto-deps - установка зависимостей protobuf
  • make swag - генерация документации Swagger
  • make swag-deps - установка зависимостей Swagger
  • make test - запуск тестов
  • make build - сборка приложения
  • make docker-down-v - остановка контейнеров и удаление volumes с БД
  • make docker-up - запуск сервисов с Docker Compose
  • make migrate - запуск миграций базы данных
  • make cleanup-db - откат всех миграций базы данных
  • make setup-db - полный перезапуск с Docker и запуск миграций
  • make help - список всех целей

Переменные окружения

Приложение поддерживает настройку через переменные окружения. Ниже приведены доступные переменные:

Общие настройки
  • ENV - окружение (development, production, staging) (по умолчанию: development)
  • LOG_LEVEL - уровень логирования (по умолчанию: info)
Сервер
  • SERVER_PORT - порт для HTTP сервера (по умолчанию: :8080)
  • GRPC_PORT - порт для gRPC сервера (по умолчанию: :5051)
  • SERVER_READ_TIMEOUT - таймаут чтения запроса в секундах (по умолчанию: 15)
  • SERVER_WRITE_TIMEOUT - таймаут записи ответа в секундах (по умолчанию: 15)
Аутентификация
  • AUTH_ENABLE_HTTPS - включить HTTPS (по умолчанию: false)
PostgreSQL
  • POSTGRES_HOST - хост PostgreSQL (по умолчанию: localhost)
  • POSTGRES_PORT - порт PostgreSQL (по умолчанию: 5432)
  • POSTGRES_NAME - имя базы данных (по умолчанию: go_notes)
  • POSTGRES_USER - имя пользователя базы данных (по умолчанию: postgres)
  • POSTGRES_PASSWORD - пароль базы данных
  • POSTGRES_SSL_MODE - режим SSL для PostgreSQL (по умолчанию: disable)
  • POSTGRES_POOL_SIZE - размер пула подключений (по умолчанию: 10)
  • POSTGRES_PARAMETERS - дополнительные параметры подключения
Redis
  • REDIS_HOST - хост Redis (по умолчанию: localhost)
  • REDIS_PORT - порт Redis (по умолчанию: 6379)
  • REDIS_PASSWORD - пароль Redis
  • REDIS_DB - номер базы данных Redis (по умолчанию: 0)
  • REDIS_POOL_SIZE - размер пула подключений (по умолчанию: 10)
  • REDIS_URL - альтернативный способ указания подключения
JWT
  • JWT_SECRET_KEY - секретный ключ для подписи JWT токенов (по умолчанию: my_secret_key)
  • JWT_ALGORITHM - алгоритм подписи токена (по умолчанию: HS256)
  • BCRYPT_COST - стоимость хеширования паролей (по умолчанию: 10)
  • ACCESS_TOKEN_TTL - время жизни access токена (по умолчанию: 15m)
  • REFRESH_TOKEN_TTL - время жизни refresh токена (по умолчанию: 168h)
Refresh токены
  • REFRESH_SECRET_KEY - секретный ключ для подписи Refresh токенов (по умолчанию: refresh_secret_key)
  • REFRESH_REVOCATION_ENABLED - включено ли отслеживание отозванных токенов (по умолчанию: true)
Репозиторий
  • REPO_TYPE - тип репозитория (postgres, redis) (по умолчанию: postgres)
  • REPO_PATH - путь к файлу/директории для хранения данных (по умолчанию: ./data)
Безопасность
  • PASSWORD_MIN_LENGTH - минимальная длина пароля (по умолчанию: 8)
  • MAX_LOGIN_ATTEMPTS - максимальное количество попыток входа (по умолчанию: 5)
  • LOGIN_BLOCK_TIME - время блокировки после неудачных попыток (по умолчанию: 30m)
  • BCRYPT_COST_SEC - стоимость хеширования паролей (по умолчанию: 10)
Завершение работы
  • SHUTDOWN_TIMEOUT - таймаут завершения работы (по умолчанию: 25s)
  • SHUTDOWN_WAIT - время ожидания перед завершением (по умолчанию: 3s)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL