Запуск Celery Celery в качестве службы не считывает переменные окружения на Ubuntu
Я завершил свой проект Django и хотел развернуть его. Поскольку проект использует celery, он должен быть демонизирован, чтобы запускаться после перезагрузки автоматически. Я могу запустить celery в окне терминала, и так как я установил кучу переменных окружения, он может определить их все.
(vuenv) vue@server:/home/dushyant/server/appdir/app$ celery -A appname worker --loglevel=INFO
This is BASE Directory /home/dushyant/server/appdir/app
Env Var: SK Exist
Env Var: ENV Exist
Current Environment is production
Env Var: DB_PASS Exist
Env Var: DB_PASS Exist
This is static Root Directory /home/dushyant/server/appdir/app/static/
This is Media Root /mnt/mediadir/media/
Env Var: SERVER_EMAIL Exist
Env Var: SERVER_EMAIL Exist
Env Var: EMAIL_PASS Exist
[2021-09-28 18:47:32,648: WARNING/MainProcess] No hostname was supplied. Reverting to default 'localhost'
-------------- celery@server v5.1.2 (sun-harmonics)
--- ***** -----
-- ******* ---- Linux-5.11.0-27-generic-x86_64-with-glibc2.29 2021-09-28 18:47:32
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: app:0x7fd24f21fa90
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
Изменил имена приложений и каталогов на общие имена для размещения их здесь.
Теперь я настроил службу для celery как пользователь vue
и группа vue
.
Файл: /etc/conf.d/celery
CELERYD_NODES="celery-worker"
CELERY_BIN="/home/dushyant/server/vuenv/bin/celery"
CELERY_APP="app"
CELERYD_MULTI="multi"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_USER ="vue"
CELERYD_GROUP="vue"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"
Файл: /etc/systemd/system/celery.service
[Unit]
Description=Celery Service
After=network.target
[Service]
Type=forking
User=vue
Group=vue
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/home/dushyant/server/appdir/app/
ExecStart=/usr/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
--pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
--loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
ExecStop=/usr/bin/sh -c '${CELERY_BIN} multi stopwait $CELERYD_NODES \
--pidfile=${CELERYD_PID_FILE} --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/usr/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
--pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
--loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=on-failure
[Install]
WantedBy=multi-user.target
Ошибки при запуске службы с помощью journalctl
File "/home/dushyant/server/vuenv/lib/python3.8/site-packages/django/conf/__init__.py", line 189, in __init__
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
This is BASE Directory /home/dushyant/server/appdir/app
Env Var: SK do not exist
Env Var: ENV do not exist
Current Environment is None
Env Var: DB_PASS do not exist
Env Var: DB_PASS do not exist
This is static Root Directory /home/dushyant/server/appdir/app/static/
This is Media Root /mnt/mediadir/media/
Env Var: SERVER_EMAIL do not exist
Env Var: SERVER_EMAIL do not exist
Env Var: EMAIL_PASS do not exist
celery multi v5.1.2 (sun-harmonics)
> Starting nodes...
> celery-worker@server: * Child terminated with exit code 1
Этот журнал ошибок показывает, что при запуске celery в качестве службы он не может получить переменные окружения, что приводит к ошибке. У меня все переменные окружения установлены для пользователя "vue" и для моего администратора "dushyant". Похоже, что он не получает переменные ни от одного из них. Я хотел бы получить помощь по этому поводу или есть ли другой способ сделать то же самое.
В вопросе спрашивается, что переменные окружения не считываются. EnvironmentFile упоминается в /etc/conf.d/celery должен содержать все окружения, необходимые для запуска.Для службы и для любой задачи, запущенной после службы. Упомяните все ваши переменные окружения в файле следующим образом.
CELERYD_NODES="celery-worker"
CELERY_BIN="/home/dushyant/server/vuenv/bin/celery"
CELERY_APP="app"
CELERYD_MULTI="multi"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_USER ="vue"
CELERYD_GROUP="vue"
...
SK="Secret Key"
MEDIA_DIR= "Media/direcotory/location"
EMAIL = "app@email.com"
.
.
Это передаст переменные окружения в службу celery для использования при инициировании службы.