https://github.com/aquaracer/fastapi-user-profile-microservice
Асинхронный микросервис для управления профилями пользователей с поддержкой геолокационного поиска, кэширования и JWT-аутентификации. Стек: Python, Fastapi, Sqlalchemy, PostgreSQL, Postgis, Redis, JWT, Poetry Redis,
https://github.com/aquaracer/fastapi-user-profile-microservice
alembic docker-compose fastapi jwt-authentication postgis postgres pydantic python3 redis-cache
Last synced: 3 months ago
JSON representation
Асинхронный микросервис для управления профилями пользователей с поддержкой геолокационного поиска, кэширования и JWT-аутентификации. Стек: Python, Fastapi, Sqlalchemy, PostgreSQL, Postgis, Redis, JWT, Poetry Redis,
- Host: GitHub
- URL: https://github.com/aquaracer/fastapi-user-profile-microservice
- Owner: aquaracer
- Created: 2025-07-11T06:16:24.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2025-07-11T06:44:25.000Z (12 months ago)
- Last Synced: 2025-07-11T10:20:30.399Z (12 months ago)
- Topics: alembic, docker-compose, fastapi, jwt-authentication, postgis, postgres, pydantic, python3, redis-cache
- Language: Python
- Homepage:
- Size: 44.9 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# User Profile Microservice
[](https://fastapi.tiangolo.com/)
[](https://postgis.net/)
[](https://redis.io/)
[](https://docs.docker.com/compose/)
[](https://www.python.org/)
[](https://www.sqlalchemy.org/)
[](https://www.postgresql.org/)
[](https://www.docker.com/)
[](https://docs.pydantic.dev/)
[](https://docs.astral.sh/ruff/)
[](https://prometheus.io/)
[](https://grafana.com/)
---
## Описание
Асинхронный микросервис для управления профилями
пользователей с поддержкой геолокационного поиска, кэширования и JWT-аутентификации.
Сервис построен на FastAPI, использует PostgreSQL с расширением PostGIS для хранения
геоданных и Redis для кэширования.
---
## 🚀 Основные возможности
- Регистрация и обновление профиля пользователя (с валидацией возраста 18+)
- Поиск профилей по радиусу и возрасту (геолокация через PostGIS)
- Кэширование результатов поиска в Redis (ускорение повторных запросов)
- JWT-аутентификация (доступ только с валидным токеном)
- Асинхронная работа с БД и кэшем
- Докеризация и миграции через Alembic
- Cбор, хранение и визуализация метрик через Prometheus, Grafana
## 🛠️ Технологический стек
- **Python 3.12** — основной язык разработки
- **FastAPI** — современный асинхронный web-фреймворк
- **SQLAlchemy** — ORM для работы с базой данных (async)
- **Alembic** — миграции схемы БД
- **PostgreSQL + PostGIS** — реляционная база данных с поддержкой геоданных
- **Redis** — кэширование и хранение сессий (асинхронный доступ)
- **Docker, docker-compose** — контейнеризация и оркестрация сервисов
- **Poetry** — управление зависимостями и пакетами
- **Pydantic** — валидация и сериализация данных
- **Ruff** — быстрый и современный линтер для Python
- **Prometheus** — сбора и хранения метрик микросервиса
- **Grafana** — визуализация метрик и построения дашбордов на основе данных из Prometheus
---
### Слои приложения
- **Контроллеры**: обработка HTTP-запросов, валидация, возврат ошибок
- **Сервисы**: бизнес-логика, кэширование, агрегация данных
- **Репозитории**: работа с БД через SQLAlchemy
- **Кэш**: асинхронное взаимодействие с Redis
- **Модели и схемы**: структура данных, Pydantic и SQLAlchemy
- **Исключения**: централизованная обработка ошибок
---
### Метрики по приложению в Grafana

## Быстрый старт
### Развертывание с помощью Docker
1. Создайте папку с проектом и склонируйте репозиторий:
```bash
mkdir user_profile_service
cd user_profile_service
git clone https://github.com/aquaracer/Fastapi-User-Profile-Microservice.git
```
2. Настройте переменные окружения в файле .env
3. Соберите и запустите контейнеры:
```bash
docker-compose up --build
```
4. Примените миграции базы данных:
```bash
docker exec -it user_profile_service bash
poetry run alembic upgrade head
```
Приложение будет доступно по следующим адресам:
- API: `http://localhost:8000`
- Swagger UI: `http://localhost:8000/docs`
- ReDoc: `http://localhost:8000/redoc`