Add README.md
This commit is contained in:
		
							parent
							
								
									ff24a023d4
								
							
						
					
					
						commit
						ae52ecabe8
					
				
							
								
								
									
										138
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -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 <URL репозитория>
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user