Skip to content

A robust URL shortening service with redirect logic and link management capabilities.

Notifications You must be signed in to change notification settings

Nicksok2413/URL_shortener

Repository files navigation

🚀 Async URL Shortener API

Python FastAPI PostgreSQL Docker Code Style

Производительный асинхронный сервис сокращения ссылок (URL Shortener) с современной архитектурой. Проект демонстрирует использование передовых практик разработки на Python: Clean Architecture, Layered Design, Async SQLAlchemy 2.0 и Production-ready Docker Infrastructure.


⚡ Особенности и Технические решения

  • Архитектура: Четкое разделение ответственности (Router → Service → Repository → Database).
  • High Performance: Полностью асинхронный стек (FastAPI + Psycopg 3).
  • Атомарность: Инкремент счетчика переходов (click_count) выполнен через атомарный SQL-запрос для защиты от Race Conditions.
  • Фоновые задачи: Обновление статистики вынесено в BackgroundTasks, чтобы не блокировать редирект пользователя.
  • Алгоритм: Генерация коротких ссылок с использованием secrets (криптостойкий рандом) и стратегией Retry при коллизиях.
  • Инфраструктура:
    • Docker Multi-stage build: Оптимизированный образ с использованием su-exec для безопасности (запуск от non-root пользователя).
    • Makefile: Единая точка входа для управления проектом.
    • Loguru: Централизованная система логирования с перехватом стандартных логов (Uvicorn, Alembic).
    • SSOT: Вся конфигурация (Linter, Tests, Alembic) собрана в pyproject.toml.

🛠 Технологический стек

Категория Технологии
Core Python 3.12, FastAPI, Pydantic V2
Database PostgreSQL, SQLAlchemy 2.0 (Async), Alembic
Driver Psycopg 3 (Binary)
DevOps Docker, Docker Compose, Makefile
Quality Ruff (Linter/Formatter), Mypy (Static Typing)
Logging Loguru
Package Mgr Poetry

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

.
├── docker/                 # Dockerfiles и скрипт инициализации (entrypoint)
├── migrations/             # Миграции базы данных (Alembic)
├── src/
│   ├── api/
│   │   ├── core/           # Конфигурация, БД, исключения
│   │   ├── models/         # SQLAlchemy модели
│   │   ├── repositories/   # Слой доступа к данным (CRUD)
│   │   ├── routes/         # API эндпоинты
│   │   ├── schemas/        # Pydantic схемы
│   │   ├── services/       # Бизнес-логика
│   │   ├── utils/          # Утилиты (генерация кодов, форматирование URL)
│   │   └── main.py         # Точка входа приложения
│   └── core_shared/        # Общие модули (настройка логгера)
├── Makefile                # Команды для управления проектом
├── docker-compose.yml      # Оркестрация контейнеров
├── docker-compose.test.yml # Изолированный контейнер БД для тестов
├── poetry.lock             # Фиксация версий зависимостей
└── pyproject.toml          # Единый конфиг проекта

🚀 Быстрый старт

Для запуска вам понадобятся Docker и Docker Compose. Make (рекомендуется).

1. Клонирование и настройка

Клонируйте репозиторий:

git clone https://git@github.com:Nicksok2413/URL_shortener.git
cd URL_shortener

Скопируйте .env.example в .env:

cp .env.example .env
# **Важно:** Используйте надежный пароль `DB_PASSWORD`.
# При необходимости отредактируйте другие переменные в .env

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

Используйте make для быстрого старта. Команда поднимет БД, приложение и применит миграции.

make up

Или классическим способом: docker compose up -d --build docker compose run --rm api-migrate

3. Применение миграций

Если таблицы не создались автоматически или вы добавили новые модели:

make migrate

Или классическим способом: docker compose run --rm api-migrate

4. Доступ


👨‍💻 Команды разработки (Makefile)

Управление проектом через Makefile для удобства разработки:


  • make install — Установить все зависимости.

  • make up — Собрать и запустить контейнеры в фоне.
  • make down — Остановить контейнеры.
  • make rebuild — Пересобрать контейнеры.
  • make prune — Остановить контейнеры и УДАЛИТЬ ВСЕ ДАННЫЕ (БД, логи).
  • make logs — Просмотр логов всех сервисов в реальном времени.

  • make migrate — Применить миграции к БД.
  • make revision m="message" — Создать новую миграцию (автогенерация).

  • make lint — Проверить код линтером Ruff.
  • make lint-fix — Исправить код линтером Ruff.
  • make format-check — Проверить код форматтером Ruff.
  • make format — Отформатировать код форматтером Ruff.
  • make types — Проверить статическую типизацию mypy.
  • make checkЗапустить статический анализ (lint, format-check, types).

Автор

Developed by Mikalai Sakalouski with ❤️ and Python.

About

A robust URL shortening service with redirect logic and link management capabilities.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published