Репозиторий для изучения языка Go, демонстрирующий создание веб-сервера и gRPC-сервера с возможностью управления заметками и пользователями.
- Веб-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 # Документация проекта
- Аутентификация пользователей через JWT
- CRUD-операции для заметок и пользователей
- Swagger UI доступен по адресу
/swagger/index.html - Защищенные маршруты для изменения данных
- Открытые маршруты для чтения данных
- Сервис для управления заметками
- Сервис для управления пользователями
- Поддержка всех 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 swaggo run cmd/web-server/main.goСервер будет доступен по адресу http://localhost:8080, Swagger UI по адресу http://localhost:8080/swagger/index.html.
go run cmd/grpc-server/main.goСервер будет доступен по адресу localhost:5051.
go run cmd/grpc-client/main.goКлиент выполнит тестовые операции с gRPC-сервером.
# Запуск PostgreSQL и Redis с помощью Docker Compose
make docker-up
# Запуск миграций базы данных
make migrate
# Откат всех миграций базы данных
make cleanup-db
# Полный перезапуск с Docker и миграции
make setup-dbcurl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "email": "test@example.com", "password": "password123"}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "password": "password123"}'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/userscurl -X GET http://localhost:8080/api/users/{user_id}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": ""}'curl -X DELETE http://localhost:8080/api/users/{user_id} \
-H "Authorization: Bearer {jwt_token}"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/notescurl -X GET http://localhost:8080/api/notes/{note_id} \
-H "Authorization: Bearer {jwt_token}"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": "Обновленное содержимое"}'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 proto- генерация protobuf-кодаmake proto-deps- установка зависимостей protobufmake swag- генерация документации Swaggermake swag-deps- установка зависимостей Swaggermake test- запуск тестовmake build- сборка приложенияmake docker-down-v- остановка контейнеров и удаление volumes с БДmake docker-up- запуск сервисов с Docker Composemake 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)
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_HOST- хост Redis (по умолчанию: localhost)REDIS_PORT- порт Redis (по умолчанию: 6379)REDIS_PASSWORD- пароль RedisREDIS_DB- номер базы данных Redis (по умолчанию: 0)REDIS_POOL_SIZE- размер пула подключений (по умолчанию: 10)REDIS_URL- альтернативный способ указания подключения
JWT_SECRET_KEY- секретный ключ для подписи JWT токенов (по умолчанию: my_secret_key)JWT_ALGORITHM- алгоритм подписи токена (по умолчанию: HS256)BCRYPT_COST- стоимость хеширования паролей (по умолчанию: 10)ACCESS_TOKEN_TTL- время жизни access токена (по умолчанию: 15m)REFRESH_TOKEN_TTL- время жизни refresh токена (по умолчанию: 168h)
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)