From ae52ecabe8e30b0279f6918d196c3493a8eeb775 Mon Sep 17 00:00:00 2001 From: AndreyIgorevich Date: Thu, 10 Jul 2025 01:01:29 +0700 Subject: [PATCH] Add README.md --- README.md | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..440f752 --- /dev/null +++ b/README.md @@ -0,0 +1,138 @@ +# Yobble Gateway (Go) + +## О проекте + +Это высокопроизводительный API-шлюз, написанный на Go. Он служит единой точкой входа для всех клиентских запросов и направляет их в соответствующие микросервисы. + +## Основные возможности + +* **Динамическая маршрутизация:** Маршруты определяются в файле `configs/routes.json` и могут быть легко изменены без перезапуска шлюза. +* **Балансировка нагрузки:** Простая балансировка нагрузки (в настоящее время случайный выбор) между несколькими экземплярами сервиса. +* **SSL/TLS Termination:** Шлюз обрабатывает HTTPS-запросы, снимая нагрузку по шифрованию с внутренних сервисов. +* **Фильтрация по GeoIP:** Возможность блокировать запросы из определенных стран. +* **Конфигурация через переменные окружения:** Удобная настройка для различных сред (разработка, продакшн). +* **Логирование:** Структурированное логирование с использованием `slog`. +* **Graceful Shutdown:** Корректное завершение работы приложения, позволяющее завершить обработку текущих запросов. + +## Технологический стек + +* **Go (Golang)** +* **Gorilla Mux** для маршрутизации +* **maxmind/geoip2-golang** для GeoIP +* **YAML** и **JSON** для конфигурации +* **Docker** для контейнеризации + +## Структура проекта + +``` +. +├── cmd/gateway/main.go # Точка входа в приложение +├── configs/ # Файлы конфигурации +│ ├── config.yml # Основной файл конфигурации +│ └── routes.json # Файл с маршрутами +├── internal/ # Внутренняя логика приложения +│ ├── config/ # Работа с конфигурацией +│ ├── logger/ # Логирование +│ ├── middleware/ # Промежуточное ПО (например, для получения Real IP) +│ ├── proxy/ # Логика проксирования и маршрутизации +│ └── server/ # Настройка и запуск HTTP-сервера +├── pkg/ # Пакеты, которые могут быть использованы в других проектах +│ └── geoip/ # Работа с GeoIP +├── geodb/ # База данных GeoIP +├── SSL/ # SSL-сертификаты +├── .env.example # Пример файла с переменными окружения +├── Dockerfile # Файл для сборки Docker-образа +└── go.mod # Зависимости проекта +``` + +## Быстрый старт + +### 1. Клонирование репозитория + +```bash +git clone +cd yobbly-gateway-go +``` + +### 2. Конфигурация + +Скопируйте файл с примером переменных окружения: + +```bash +cp .env.example .env +``` + +Отредактируйте `.env` и `configs/config.yml` при необходимости. + +### 3. Запуск с помощью Docker + +Для сборки и запуска приложения в Docker-контейнере выполните: + +```bash +docker-compose up --build +``` + +### 4. Локальный запуск (без Docker) + +#### а) Установка зависимостей + +```bash +go mod tidy +``` + +#### б) Запуск приложения + +```bash +go run cmd/gateway/main.go --config=configs/config.yml +``` + +## Конфигурация + +### Основная конфигурация (`config.yml`) + +* `server`: Настройки хоста и порта сервера. +* `gateway`: Настройки шлюза, включая путь к файлу с маршрутами и базу GeoIP. +* `tls`: Пути к SSL-сертификатам. +* `logging`: Уровень и формат логирования. + +### Переменные окружения (`.env`) + +Переменные окружения, определенные в `.env`, переопределяют значения по умолчанию в `config.yml`. + +### Маршрутизация (`routes.json`) + +Файл `routes.json` определяет, как шлюз будет перенаправлять запросы. + +**Пример:** + +```json +{ + "v1": { + "/auth": [ + { + "url": "https://auth-service:5201", + "role": "master", + "allow_self_signed": true + } + ] + }, + "default": { + "/docs": [ + { + "url": "https://docs-service:5199", + "role": "slave", + "allow_self_signed": true + } + ] + } +} +``` + +* **Ключи верхнего уровня (`v1`, `default`)** - это версии API. Запросы, начинающиеся с `/v1/...`, будут сопоставляться с маршрутами в секции `"v1"`. Если версия не указана, используется секция `"default"`. +* **Ключи второго уровня (`/auth`, `/docs`)** - это префиксы путей. Шлюз ищет наиболее длинное совпадение префикса. +* **`url`** - URL внутреннего сервиса. +* **`allow_self_signed`** - Разрешает использование самоподписанных сертификатов для внутреннего сервиса. + +## GeoIP Фильтрация + +Шлюз может блокировать доступ для стран, перечисленных в `blocked_countries` в файле `config.yml`. Для работы этой функции необходима база данных `GeoLite2-Country.mmdb` от MaxMind.