Этот проект представляет собой комплексную систему для управления задачами (ToDo List) через Telegram-бота. Бэкенд реализован на Django, а бот — на Aiogram. Весь проект упакован в Docker для легкого развертывания.
-
Backend (Django & DRF): Является "мозгом" системы и единственным источником правды (single source of truth). Реализует всю бизнес-логику по управлению задачами и категориями, используя архитектурный паттерн "Services/Selectors" для четкого разделения ответственности. Предоставляет REST API для взаимодействия с клиентами.
-
Telegram Bot (Aiogram & Aiogram-Dialog): Выступает в роли "тонкого клиента" и пользовательского интерфейса. Вся работа с данными происходит через вызовы API бэкенда. Для хранения сессионных данных (токенов аутентификации) используется Redis. Для создания и редактирования задач реализованы многошаговые диалоги.
-
Асинхронные задачи (Celery): Периодическая проверка просроченных задач и отправка уведомлений вынесены в Celery Beat и Celery Worker, чтобы не нагружать основной цикл приложения. Уведомления доставляются пользователю через механизм webhook, который вызывает бот.
-
Инфраструктура (Docker): Все компоненты системы (база данных PostgreSQL 16, Redis, Django-приложение, Celery, бот) изолированы в Docker-контейнерах и управляются через
docker-compose.yml. Это обеспечивает простоту развертывания, переносимость и консистентность окружения.
-
Клонируйте репозиторий:
git clone https://github.com/fluffy-dev/TelegramToDoBot.git cd ToDoListProject -
Создайте файл
.env: Скопируйте содержимое файла.env.exampleв новый файл.envи заполните его своими данными.cp .env.example .env
Вам необходимо указать как минимум ваш
BOT_TOKEN, полученный от @BotFather. Остальные значения можно оставить по умолчанию для локального запуска. -
Запустите проект с помощью Docker Compose: Эта команда соберет все образы, создаст контейнеры и запустит их в фоновом режиме.
docker-compose up --build -d
-
Создайте суперпользователя (опционально): Если вы хотите получить доступ к админ-панели Django, выполните эту команду и следуйте инструкциям в консоли.
docker-compose exec backend python manage.py createsuperuserАдмин-панель будет доступна по адресу
http://localhost:8000/admin/. -
Настройте периодические уведомления (обязательно):
- Зайдите в админ-панель (
http://localhost:8000/admin/). - Перейдите в раздел
Periodic Tasks. - Нажмите
Add Periodic Task. - Name:
Check for due tasks every minute - Task (registered): Выберите
todos.tasks.check_for_due_tasksиз списка. - Interval: Создайте новый интервал (1 минута).
- Убедитесь, что галочка
Enabledстоит, и сохраните.
- Зайдите в админ-панель (
-
Начните использовать бота: Найдите вашего бота в Telegram и отправьте ему команду
/start.
-
Проблема: Запрет на использование стандартных механизмов генерации PK (UUID, auto-increment).
- Решение: Был реализован собственный детерминированный генератор ID в сервисном слое. ID создается путем хеширования (SHA-1) строки, состоящей из ID пользователя, названия объекта и точной временной метки. Это гарантирует уникальность и соответствует требованиям. Переход с
sha256наsha1был необходим для соблюдения ограничения Telegram API на длинуcallback_data(64 байта).
- Решение: Был реализован собственный детерминированный генератор ID в сервисном слое. ID создается путем хеширования (SHA-1) строки, состоящей из ID пользователя, названия объекта и точной временной метки. Это гарантирует уникальность и соответствует требованиям. Переход с
-
Проблема: "Гонка состояний" при запуске Docker-контейнеров, когда Celery Beat или API-клиенты стартовали раньше, чем применялись миграции базы данных.
- Решение: Был внедрен
entrypoint.shскрипт для контейнераbackend. Скрипт сначала ожидает полной готовности базы данных, затем автоматически применяет все необходимые миграции, и только после этого запускает основной процесс (Gunicorn). Это гарантирует правильный порядок инициализации сервисов.
- Решение: Был внедрен
-
Проблема: Ошибки
400 Bad Requestпри обновлении задач (is_completed,categories).- Решение: Проблема была решена переходом от семантически некорректного
PUT-запроса (полная замена ресурса) кPATCH-запросу (частичное обновление). Это упростило логику на стороне клиента (не нужно отправлять все поля) и соответствует лучшим практикам REST API. Также был настроенDateTimeFieldв сериализаторе для приема разных форматов дат.
- Решение: Проблема была решена переходом от семантически некорректного