MAATRIX / Блог / Celery + Redis: фоновые задачи на VPS

Celery + Redis: фоновые задачи на VPS

Celery + Redis на VPS: фоновые задачи для Python-приложений
Блог MAATRIX · 2026-07-07

Отправка писем, обработка изображений, отчёты — всё, что тормозит ответ, выносят в фон. Celery с брокером Redis решает это в Python-приложениях. Развернём воркеры и планировщик на VPS как systemd-сервисы.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Зачем выносить задачи в фон

Если пользователь ждёт ответа, пока сервер шлёт письмо или генерирует PDF, UX страдает, а воркеры веб-сервера заняты. Celery принимает задачу в очередь и отдаёт управление мгновенно, а обработка идёт отдельными процессами.

  • Брокер (Redis) — хранит очередь задач.
  • Воркеры — процессы, которые забирают и выполняют задачи.
  • Beat — планировщик периодических задач (аналог cron внутри приложения).

Redis держит очередь в памяти, а воркеры активно жгут CPU. AMD EPYC + NVMe у MAATRIX даёт и быстрый доступ к брокеру, и производительные ядра под параллельную обработку задач. Для CPU-bound задач вроде обработки изображений или генерации отчётов производительность на ядро напрямую определяет, сколько задач в минуту переварит один VPS.

Типичная схема — веб-приложение (Django/Flask/FastAPI) кладёт задачи в очередь, а пул воркеров разбирает их независимо от веб-процессов. Так пиковая нагрузка на фоновую обработку не влияет на отзывчивость сайта: медленные задачи стоят в очереди, а пользователь получает ответ сразу.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для Celery

Установка Redis и Celery

Redis ставим из пакетов и включаем автозапуск. Celery — в виртуальное окружение проекта.

sudo apt update && sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli ping   # PONG
python3 -m venv /var/www/app/venv
source /var/www/app/venv/bin/activate
pip install celery[redis]

Защитите Redis: он должен слушать только localhost. В /etc/redis/redis.conf проверьте bind 127.0.0.1 и при необходимости задайте requirepass.

Код приложения

Минимальный tasks.py: инстанс Celery с Redis-брокером и одна задача.

from celery import Celery

app = Celery(
    "myapp",
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/1",
)

@app.task
def send_email(to, subject):
    # долгая операция
    return f"sent to {to}"

Вызов задачи из веб-кода не блокирует ответ:

from tasks import send_email
send_email.delay("user@example.com", "Привет")

Воркер и beat как systemd-сервисы

Запускать celery в screen — путь к потерянным задачам после ребута. Оформляем воркер как systemd-юнит /etc/systemd/system/celery.service.

[Unit]
Description=Celery Worker
After=network.target redis-server.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/app
ExecStart=/var/www/app/venv/bin/celery -A tasks worker \
  --loglevel=info --concurrency=4
Restart=always

[Install]
WantedBy=multi-user.target

Планировщик beat — отдельный юнит celery-beat.service с ExecStart=... celery -A tasks beat --loglevel=info. Запускаем оба:

sudo systemctl daemon-reload
sudo systemctl enable --now celery celery-beat
sudo systemctl status celery

Периодические задачи и мониторинг

Расписание для beat задаётся в конфиге Celery через beat_schedule:

app.conf.beat_schedule = {
    "cleanup-every-hour": {
        "task": "tasks.cleanup",
        "schedule": 3600.0,
    },
}

Для наблюдения за очередью поставьте Flower — веб-панель Celery:

pip install flower
celery -A tasks flower --port=5555 --address=127.0.0.1

Открывайте Flower только через reverse proxy с авторизацией — наружу порт 5555 не публикуйте. Flower показывает реальную нагрузку: сколько задач выполнено и провалено, время обработки, активные воркеры. Это первый инструмент, к которому обращаются, когда задачи «залипают» или очередь растёт.

Для надёжности включите подтверждение задач после выполнения через task_acks_late = True и ограничьте время задачи через task_time_limit. Тогда зависшая задача не заблокирует воркер навсегда, а упавший при обработке воркер вернёт задачу в очередь, а не потеряет её.

Частые ошибки

  • Задачи копятся, не выполняются — воркер не запущен или подключён к другой базе Redis. Проверьте redis-cli -n 0 llen celery.
  • Connection refused — Redis не поднят или слушает не тот интерфейс.
  • Воркер съел всю память — большие результаты в backend. Ставьте result_expires и не храните тяжёлые объекты.
  • Beat дублирует задачи — запущено несколько экземпляров beat. Он должен быть строго один.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS для Celery

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Redis или RabbitMQ для Celery?

Redis проще ставить и достаточно для большинства задач. RabbitMQ выбирают при сложной маршрутизации и требованиях к гарантиям доставки.

Сколько воркеров запускать?

Начните с concurrency равным числу ядер CPU для CPU-bound задач. Для IO-bound задач можно больше или используйте пул gevent/eventlet.

Как не потерять задачи при рестарте?

Включите acks_late и настройте Redis на сохранение данных (AOF), чтобы очередь переживала перезапуск.