Автоматизация ИИ скриптов на VDS сервере с помощью Celery и диспетчера Supervisor

Автоматизация ИИ-скриптов на VDS: настройка Celery, Redis и Supervisor

В предыдущей главе мы запустили локальную нейросеть на VDS и научили её обрабатывать отзывы маркетплейсов поштучно. Но если вы собираетесь автоматизировать бизнес-процессы селлера по-настоящему, запускать скрипты вручную через консоль не получится.

Когда парсер собирает тысячи карточек товаров, а локальный ИИ начинает их массово анализировать, сервер сталкивается с двумя проблемами:

  1. Таймауты и зависания: Если скрипт попытается обработать 5000 отзывов одновременно «в лоб», оперативная память сервера мгновенно переполнится, и сработает системный OOM Killer, который наглухо убьет ваш процесс.
  2. Падения из-за сбоев сети: Если в процессе обработки на одну секунду пропадет связь с маркетплейсом, обычный скрипт выдаст ошибку и полностью остановится, похоронив всю многочасовую работу.

Чтобы сервер работал автономно в режиме 24/7, обработку данных нужно перевести на систему очередей задач (Celery + Redis) и поставить под жесткий контроль системного диспетчера (Supervisor). Давайте настроим этот отказоустойчивый конвейер.

1. Зачем нужны очереди задач и как это работает?

Представьте себе популярный склад маркетплейса: если все грузовики одновременно попытаются подъехать к одному окну разгрузки, случится коллапс. Поэтому на складах есть электронная очередь — машины ждут своей зоны выгрузки.

В автоматизации скриптов на VDS всё устроено точно так же:

  • Инициатор (Парсер): Мгновенно собирает тысячи артикулов или отзывов и не пытается обработать их сам, а просто «выбрасывает» их как мелкие задачи в общую корзину.
  • Брокер (Redis): Та самая корзина или диспетчер. Он хранит список всех задач в строгом порядке.
  • Воркеры (Celery Workers): Специальные фоновые процессы-трудяги. Они берут из Redis строго по 2–3 задачи одновременно, спокойно обрабатывают их через локальную нейросеть Ollama и складывают результат в базу данных.

Если один воркер упадет или столкнется с ошибкой сети, задача не пропадет — Redis просто передаст её другому воркеру.

2. Пошаговая настройка Celery и Redis на Ubuntu

Мы будем использовать связку Python, Celery и встроенную базу данных Redis, которую мы уже затрагивали в первой статье.

Шаг 1. Установка брокера Redis

Установим и запустим сервер Redis на вашем VDS:

sudo apt update
sudo apt install redis-server -y
sudo systemctl enable redis-server
sudo systemctl start redis-server

Шаг 2. Создание структуры ИИ-конвейера

Установим необходимые библиотеки для Python:

pip install celery ollama redis

Вставьте в него рабочий код:

from celery import Celery
import ollama

# Подключаем Celery к нашему брокеру Redis
app = Celery('ai_tasks', broker='redis://localhost:6379/0')

@app.task
def analyze_review_task(review_text):
    """Фоновая задача для обработки отзыва через локальный ИИ"""
    prompt = f"Определи тональность отзыва (Позитивная/Негативная) и выдели главную суть: {review_text}"
    
    try:
        # Отправляем задачу в локальную Ollama
        response = ollama.generate(model='llama3', prompt=prompt)
        return response['response']
    except Exception as e:
        # Если сервер Ollama перегружен, задача автоматически вернется в очередь
        print(f"Ошибка обработки: {e}")
        raise e

3. Настройка Supervisor: заставляем скрипты работать вечно

Если вы запустите воркер Celery обычной командой в консоли, он закроется, как только вы отключитесь от сервера по SSH. Чтобы скрипт работал 24/7, установим системный менеджер процессов Supervisor. Он будет следить за воркерами в фоновом режиме и автоматически перезапустит их, если они упадут из-за нехватки памяти.

Шаг 1. Установка диспетчера

sudo apt install supervisor -y

Шаг 2. Создание конфига для автоматизации

Создадим файл конфигурации, который укажет Supervisor, как управлять нашими воркерами Celery:

sudo nano /etc/supervisor/conf.d/celery_workers.conf

Вставьте следующий текст (замените /path/to/your/folder на реальный путь к папке, где лежат ваши скрипты):

[program:celery_worker]
command=celery -A tasks worker --loglevel=info --concurrency=2
directory=/path/to/your/folder
user=root
numprocs=1
autostart=true
autorestart=true
stdout_logfile=/var/log/celery_worker.log
stderr_logfile=/var/log/celery_worker_err.log

Параметр --concurrency=2 указывает, что одновременно сервер будет обрабатывать строго 2 отзыва, защищая оперативную память вашего VDS от перегрузки.

Шаг 3. Запуск конвейера автоматизации

Прикажем Supervisor перечитать конфигурацию и запустить процесс в вечный фоновый режим:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start celery_worker

Теперь, даже если ваш VDS полностью перезагрузится, Supervisor сам поднимет Redis, запустит Celery-воркеров и возобновит безопасную фоновую обработку данных маркетплейсов без вашего участия.

Зачем ограничивать количество воркеров через concurrency?

Локальные нейросети (например, Llama 3) потребляют очень много мощностей процессора в момент генерации текста. Если запустить 10 воркеров одновременно, процессор вашего VDS загрузится на 100%, сервер зависнет, и хостинг может временно ограничить вам ресурсы. Ограничение в 2–3 параллельных потока гарантирует стабильную работу 24/7.

Что произойдет, если база данных Redis переполнится?

По умолчанию Redis хранит очереди задач в оперативной памяти. Чтобы сервер не упал от нехватки ОЗУ при парсинге миллионов карточек, настройте скрипт-инициатор так, чтобы он закидывал задачи порциями (например, по 5–10 тысяч штук), либо используйте встроенную функцию очистки успешно выполненных задач в Celery.

Можно ли с помощью Celery настроить регулярный парсинг по расписанию?

Да, для этого у Celery есть встроенный планировщик задач под названием Celery Beat. С его помощью можно настроить скрипт так, чтобы он, например, автоматически запускал парсинг цен конкурентов на Wildberries каждый день ровно в 4 часа утра.

Прокрутить вверх