Подтвердить что ты не робот

Как использовать переменные окружения с супервизором, gunicorn и django (1.6)

Я хочу настроить супервизора для управления gunicorn в моем проекте django 1.6 с использованием переменной среды для SECRET_KEY.

Я установил свой секретный ключ в .bashrc как

export SECRET_KEY=[my_secret_key] 

И у меня есть оболочка script, чтобы запустить guniororn:

NAME="myproject"
LOGFILE=/home/django/myproject/log/gunicorn.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
DJANGO_WSGI_MODULE=myproject.wsgi

USER=django
GROUP=django
IP=0.0.0.0
PORT=8001

echo "Starting $NAME"

cd /home/django/myproject/myproject
source /home/django/.virtualenvs/myproject/bin/activate

test -d $LOGDIR || mkdir -p $LOGDIR

exec gunicorn ${DJANGO_WSGI_MODULE} \
 --name $NAME \
 --workers $NUM_WORKERS \
 --user=$USER --group=$GROUP \
 --log-level=debug \
 --bind=$IP:$PORT
 --log-file=$LOGFILE 2>>$LOGFILE

Затем, чтобы сконфигурировать мой проект gunicorn server в супервизоре:

[program:my_django_project]
directory=/home/django/my_django_project/my_django_project
command=/home/django/my_django_project/my_django_project/gunicorn.sh
user=django
autostart=true
autorestart=true
stdout_logfile=/home/django/my_django_project/log/supervisord.log
stderr_logfile=/home/django/my_django_project/log/supervisor_error.log

Если я запускаю пушки, используя мою оболочку script, это не вызывает никакой ошибки, но когда я запускаю ее с помощью супервизора, она терпит неудачу, и я вижу в журналах, что она не "находит" мой SECRET_KEY.

Каков правильный способ настройки супервизора для чтения моих переменных оболочки (я не буду хранить их в моем .bashrc, если нет более подходящего способа)?

4b9b3361

Ответ 1

Хорошо, наверное, я понял.

Я попытался включить

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"

в файле conf для супервизора, но ему не понравились не буквенно-цифровые символы, и я не хотел иметь свой ключ в файле conf, поскольку у меня есть его в git.

После loking в документах диспетчера я также пробовал:

HOME="/home/django", USER="django"

но не работает.

Наконец, я попытался с этим и сейчас работает!:

environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY

Может быть, хотя он работает, это не лучшее решение. Я был бы рад узнать больше.

EDIT:

Наконец, Эван заставил меня понять, что использование bash для установки env vars не будет лучшим вариантом. Итак, одно решение, как указано #Ewan, должно было бы использовать:

[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"

Другое решение Я нашел, для тех, кто использует virtualenv, было бы экспортировать env vars в "активировать" script виртуального, т.е. отредактировать ваш файл virtualenv/bin/активируйте файл и добавьте в конец свой SECRET_KEY.

Таким образом, вы можете использовать% chars, сгенерированные генераторами ключей для django, и действительны, если вы не используете супервизор.

Я перезапустил свой сервер без регистрации, чтобы проверить, что он сработал. С этой опцией мне не нужно редактировать мои ключи, я могу сохранить файлы в conf, и он работает независимо от того, использую ли я супервизор, выскочку или что-то еще (или ничего, просто пушечный).

В любом случае, я знаю, что я не обнаружил ничего нового (хорошо @Ewan поднял проблему с супервизором), но я изучаю вещи и надеюсь, что это может быть полезно кому-то другому.

Ответ 2

Также, если вы используете конфигурационный файл gunicorn:

gunicorn -c gunicorn.py myproject.wsgi

Возможно передать переменные среды в файле gunicorn.py следующим образом:

bind = "0.0.0.0:8001"
workers = 3
proc_name = "myproject"
user = "django"
group = "django"
loglevel = "debug"
errorlog = "/home/django/myproject/log/gunicorn.log"
raw_env = [
   'DATABASE_URL=postgres://user:[email protected]/dbname',
   'SECRET_KEY=mysecretkey',
]

Ответ 3

Ваш .bashrc будет работать только для интерактивных оболочек, поэтому будет работать при запуске оболочки script, так как ваш пользователь, однако, супервайзер, работающий в фоновом режиме, не получит эти значения.

Вместо этого в вашем файле supersior .ini установите переменную окружения (дополнительная информация в документации).

например.

[program:my_django_project]
environment=SECRET_KEY="my_secret_key"

После небольшого количества проб и ошибок я заметил, что файл супервизора .ini не любит иметь % в разделе переменных среды (даже если вы его цитируете...). Основываясь на вашем примере в комментариях, я пробовал это с supervisor==3.0, установленным через pip, и он работает:

environment=SECRET_KEY="*[email protected]$0([email protected]$3cr&)z^lmg+pqw^6wkyi"

Единственное отличие - я удалил знак %. (Я попытался убежать с помощью \%, но это все еще не сработало)

Изменить 2

Поднял issue # 291 с супервизором для этой ошибки.

Изменить 3

Как отмечено выше, если в вашем секретном ключе присутствует %, он должен быть экранирован в стиле python: %%

Ответ 4

Вы можете избежать символа%, добавив еще один символ%.

В противном случае цитирование значений является необязательным, но рекомендуется. Чтобы избежать процентов символов, просто используйте два. (например, URI="/first%%20name")

Взято отсюда: http://supervisord.org/configuration.html