Top.Mail.Ru

Django + Celery + Redis в Docker: быстрые фоновые задачи и масштабирование

Django + Celery + Redis в Docker: быстрые фоновые задачи и масштабирование

В современных веб-приложениях скорость отклика — это не просто приятный бонус, а необходимость. Если 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. Загрузите ваш проект

Вы можете использовать scprsync или Git.

Либо просто загрузите ZIP-архив с проектом через интерфейс.

3. Соберите контейнер через веб-интерфейс или консоль

docker build -t myparser . docker run -d -p 8000:8000 myparser 

На dockerhosting.ru вы получите выделенный IP или домен

Автор:

33

Читайте также

1 комментарий

Оставьте комментарий

Комментарии

  • Имя автора
    Макс
    08.08.2025 в 11:48

    Можно подробно как на этот сайт загрузить dockerhosting.ru и какие там тарифы?


×
Подпишитесь на наш Telegram-канал, чтобы быть в курсе всех новостей и акций!
Подписаться