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 |
- Клонирование репозитория
git clone https://github.com/heavenyoung1/pricely
cd pricely- Активация виртуального окружения при помощи утилиты
uv
uv sync- Конфигурация подключений
Скопируйте файл .env.example в .env
cp .env.example .envОткройте файл .env и настройте переменные окружения для подключения к базе данных и другим сервисам.
sudo nano .env- Поднятие баз данных с помощью
docker-compose
В файле docker-compose.yml настроены две базы данных (pricely_db и pricely_test_db). Чтобы поднять оба контейнера, используйте команду:
docker-compose up -dЭто поднимет обе базы данных в фоновом режиме. Проверьте, что контейнеры работают командой:
docker ps- Применение миграций к БД.
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.
Миграции успешно применены к обеим БД- Запуск тестов
Эта команда запустит все тесты и выведет подробный лог. Для запуска тестов, выполните команду:
make tests- Запуск бота
Для запуска бота, после того как вы настроили БД и миграции, выполните команду:
make botgit 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.Убедитесь, что все параметры в файле настроены правильно.

