Демонизация 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}")
Вернуться на верх