Skip to content

Актуальная версия приложения находится по ссылке github.com/heavenyoung1/pricely

License

Notifications You must be signed in to change notification settings

heavenyoung1/pricely_v0

Repository files navigation

📉 Pricely

Python version Status License Codecov

Telegram-бот для отслеживания изменения цен на товары Ozon. Использует архитектуру Domain-Driven Design (DDD), паттерн Unit of Work, и чистый Dependency Injection без глобальных синглтонов.

🧠 Описание

Pricely — это Telegram-бот, который позволяет пользователям:

  • добавлять товары по ссылке с Ozon,

  • отслеживать текущие и предыдущие цены,

  • получать уведомления при изменении стоимости.

В основе — модульная, масштабируемая архитектура с чётким разделением слоёв:

  • Domain Layer — бизнес-сущности и правила;

  • Application Layer — Use Cases;

  • Infrastructure Layer — SQLAlchemy, репозитории, парсер, сервисы;

  • Presentation Layer — Telegram-интерфейс (Aiogram).

🚀 Основные возможности

✅ Добавление товара по ссылке Ozon
✅ Автоматическое обновление цен каждые N минут
✅ Уведомление пользователя при изменении цены
✅ Просмотр всех отслеживаемых товаров
✅ Удаление товаров из списка
✅ Интеграция с PostgreSQL
✅ Безопасная работа с транзакциями через Unit of Work
✅ Чистая Dependency Injection без контейнеров

🛠 Технологии

Компонент Технология
Язык Python 3.13
Telegram Bot Aiogram 3
База данных PostgreSQL
ORM SQLAlchemy 2.x
Планировщик задач APScheduler
Парсер Selenium
Логирование logging
Архитектура Domain-Driven Design, Unit of Work, Repository Pattern

🏗 Строение базы данных

Схема базы данных

📐 Архитектура приложения

Архитектура приложения

⚙️ Установка

  1. Клонирование репозитория
git clone https://github.com/heavenyoung1/pricely
cd pricely
  1. Активация виртуального окружения при помощи утилиты uv
uv sync
  1. Конфигурация подключений

Скопируйте файл .env.example в .env

cp .env.example .env

Откройте файл .env и настройте переменные окружения для подключения к базе данных и другим сервисам.

sudo nano .env
  1. Поднятие баз данных с помощью docker-compose

В файле docker-compose.yml настроены две базы данных (pricely_db и pricely_test_db). Чтобы поднять оба контейнера, используйте команду:

docker-compose up -d

Это поднимет обе базы данных в фоновом режиме. Проверьте, что контейнеры работают командой:

docker ps
  1. Применение миграций к БД.
make migrate-all     # Применить миграции на обе БД

Ожидаемый вывод:

ALEMBIC_DATABASE_URL=$(uv run python scripts/db_url.py dev) uv run alembic upgrade head
INFO  [alembic.runtime.migration] Используем заданный ALEMBIC_DATABASE_URL: postgresql://postgres:1234@192.168.154.121:5432/pricely_db
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
ALEMBIC_DATABASE_URL=$(uv run python scripts/db_url.py test) uv run alembic upgrade head
INFO  [alembic.runtime.migration] Используем заданный ALEMBIC_DATABASE_URL: postgresql://postgres:1234@192.168.154.121:5433/pricely_test_db
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
Миграции успешно применены к обеим БД
  1. Запуск тестов

Эта команда запустит все тесты и выведет подробный лог. Для запуска тестов, выполните команду:

make tests
  1. Запуск бота

Для запуска бота, после того как вы настроили БД и миграции, выполните команду:

make bot

⚙️ Развертывание при помощи скрипта

git clone https://github.com/heavenyoung1/pricely
cd pricely
sudo chmod +x scripts/deploy.sh
./scripts/deploy.sh

Ввод данных

Во время выполнения скрипта вам будет предложено:

  • Заполнить файл proxy.json с данными прокси-сервера (если необходимо). Proxy имеют подобный вид
[
 {
   "proxy": "192.168.101.1:2000",
   "user": "LOGIN",
   "password": "PASSWORD"
 },
 {
   "proxy": "192.168.101.1:2000",
   "user": "LOGIN",
   "password": "PASSWORD"
 }
]
  • Настроить файл .env, который будет содержать настройки подключения к базе данных и другие переменные окружения. После этого откроется редактор nano для изменения файла .env. Убедитесь, что все параметры в файле настроены правильно.