В современных веб-приложениях скорость отклика — это не просто приятный бонус, а необходимость. Если API делает сложные вычисления или отправляет письма синхронно, пользователи будут ждать.
Решение? Вынести тяжёлую работу в фоновые задачи с помощью Django + Celery + Redis. А чтобы развёртывание было быстрым и масштабируемым — упакуем всё в Docker.
В этой статье разберём:
-
зачем нужен Celery и Redis;
-
как их интегрировать с Django;
-
как запустить всё в Docker;
-
рабочий пример с кодом.
Почему именно Celery и Redis
-
Celery — это очередь задач (task queue), которая берёт на себя выполнение тяжёлых операций в фоне.
-
Redis — сверхбыстрая in-memory база, которую мы будем использовать как брокер (хранилище задач) и как backend для результатов.
-
Docker — позволяет локально и в продакшене запускать одинаковое окружение без «у меня работает / у меня нет».
📌 Пример задач: отправка email, генерация отчётов, интеграция с API, конвертация файлов, обработка изображений.
📂 Структура проекта
myproject/
│ docker-compose.yml
│ Dockerfile
│ requirements.txt
│
├── myproject/
│ │ __init__.py
│ │ settings.py
│ │ urls.py
│ │ celery.py
│
└── app/
│ __init__.py
│ tasks.py
│ views.py
requirements.txt
Django==5.0.7
celery==5.4.0
redis==5.0.1
Docker Compose
docker-compose.yml
version: "3.9"
services:
django:
build: .
command: python manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
- .:/code
depends_on:
- redis
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
celery:
build: .
command: celery -A myproject worker -l info
volumes:
- .:/code
depends_on:
- redis
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- CELERY_RESULT_BACKEND=redis://redis:6379/0
redis:
image: redis:7.4
ports:
- "6379:6379"
Dockerfile
Dockerfile
FROM python:3.12-slim
WORKDIR /code
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
Настройка Celery
myproject/celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
myproject/__init__.py
from .celery import app as celery_app
__all__ = ("celery_app",)
myproject/settings.py
(добавляем)
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL", "redis://localhost:6379/0")
CELERY_RESULT_BACKEND = os.environ.get("CELERY_RESULT_BACKEND", "redis://localhost:6379/0")
Пример фоновой задачи
app/tasks.py
import time
from celery import shared_task
@shared_task
def long_task(name):
time.sleep(5) # эмуляция долгой задачи
return f"Привет, {name}! Задача выполнена."
Django View для запуска задачи
app/views.py
from django.http import JsonResponse
from .tasks import long_task
def start_task(request):
task = long_task.delay("Евгений")
return JsonResponse({"task_id": task.id})
myproject/urls.py
from django.contrib import admin
from django.urls import path
from app.views import start_task
urlpatterns = [
path('admin/', admin.site.urls),
path('task/', start_task),
]
Запуск проекта
docker-compose up --build
Открываем в браузере:
http://127.0.0.1:8000/task/
Получим:
{"task_id": "d5a1b3e0-0a2d-4c41-b8a0-5fbb57c9e567"}
В логах Celery увидим:
[INFO] Task app.tasks.long_task[...] succeeded in 5.00s: 'Привет, Евгений! Задача выполнена.'
Размещение на DockerHost.ru
1. Зарегистрируйтесь или войдите на dockerhosting.ru
Платформа предоставляет готовые Docker-окружения и быстрое развертывание.
2. Загрузите ваш проект
Вы можете использовать scp
, rsync
или Git.
Либо просто загрузите ZIP-архив с проектом через интерфейс.
3. Соберите контейнер через веб-интерфейс или консоль
docker build -t myparser .
docker run -d -p 8000:8000 myparser
На dockerhosting.ru вы получите выделенный IP или домен
Автор: Евгений Морковин
1 комментарий
Оставьте комментарий
Комментарии
Можно подробно как на этот сайт загрузить dockerhosting.ru и какие там тарифы?