Демонизация celery worker и beat (проблема с переменными окружения или с settings.py?)
Я пытался демонизировать celery и celerybeat с помощью скриптов init и systemd. Проблема в том, что задачи celery не могут получить доступ к rabbitmq и базе данных django (postgresql в моем случае), потому что я перенес имя пользователя и пароли в ~/.bashrc. Для решения этой проблемы документация celery предлагает:
Сценарий демонизации конфигурируется файлом /etc/default/celeryd. Это сценарий оболочки (sh), в который можно добавить переменные окружения, подобные приведенным ниже параметрам конфигурации. Чтобы добавить реальные переменные окружения, влияющие на рабочего, вы должны также экспортировать их (например, export DISPLAY=":0") Документы по демонизации
это дало мне подсказку установить переменные в /etc/default/celeryd следующим образом:
export DJANGO_SETTINGS_MODULE="project.settings"
export CELERY_BROKER_URL="ampq..."
export DATABASE_USER="username"
export DATABASE_PASSWORD="password"
export REDIS_PASS="password"
После этого celery worker иногда подключается к виртуальному хосту rabbitmq! Большую часть времени он подключается к rabbitmq как гостевой пользователь по умолчанию. до этого он всегда подключался как гостевой пользователь. когда он подключается как мой пользователь, worker и beat выполняют задачи без проблем. мои задачи получают и обновляют объекты из базы данных и кэша (redis). они работают нормально, когда я запускаю их вручную. Я прочитал журналы и это всегда ошибка postgresql auth от beat или тот факт, что worker подключен к rabbitmq как гостевой пользователь.
Какое здесь решение? Это происходит потому, что celery не может найти settings.py или из-за переменных окружения? Есть ли способ импортировать переменные ~/.bashrc непосредственно в /etc/default/celeryd ?
Я пробовал использовать супервизор, но ошибки в логах те же. Я почти ничего не знаю о bash скриптах.
/etc/default/celeryd:
export DJANGO_SETTINGS_MODULE="project.settings"
export CELERY_BROKER_URL="ampq..."
export DATABASE_USER="username"
export DATABASE_PASSWORD="password"
export REDIS_PASS="password"
CELERYD_NODES="worker"
CELERY_BIN="/home/user/env/bin/celery"
CELERY_APP="project"
CELERYD_CHDIR="/home/user/project"
CELERYD_OPTS=""
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_LEVEL="INFO"
CELERYD_USER="user"
CELERYD_GROUP="user"
CELERY_CREATE_DIRS=1
CELERYBEAT_CHDIR="/home/user/project"
CELERYBEAT_OPTS="--scheduler=django_celery_beat.schedulers.DatabaseScheduler"
CELERYBEAT_LOG_FILE="/var/log/celerybeat/beat.log"
CELERYBEAT_PID_FILE="/var/run/celerybeat/beat.pid"
CELERYBEAT_LOG_LEVEL="INFO"
settings.py:
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL")
CELERY_RESULT_BACKEND = "django-db"
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = "Asia/Tehran"
celery.py:
import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
app = Celery("project")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f"Request: {self.request!r}")