Как использовать переменные окружения с супервизором, 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, если нет более подходящего способа)?
Ответы
Ответ 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