Comment utiliser les variables d'environnement avec le superviseur, gunicorn et django (1.6)
je veux configurer supervisor pour contrôler gunicorn dans mon projet django 1.6 en utilisant une variable d'environnement pour SECRET_KEY.
j'ai mis ma clé secrète .bashrc
export SECRET_KEY=[my_secret_key]
Et j'ai un script shell pour démarrer gunicorn:
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
puis configurer le serveur gunicorn de mon projet en superviseur:
[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
si je démarre gunicorn en utilisant mon script shell il ne lance pas d'erreur mais quand je démarre avec le superviseur il échoue et je vois dans les journaux qu'il ne "trouve" pas mon SECRET_KEY.
Quelle est la bonne façon de configurer supervisor pour lire mes variables shell (Je ne veux pas les garder dans my .bashrc à moins qu'il y ait un moyen plus approprié)?
4 réponses
OK, je suppose que je l'ai eu.
j'avais essayé y compris
environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"
dans le fichier conf pour le superviseur mais il n'a pas aimé les caractères non alphanumériques et je ne voulais pas avoir ma clé dans le fichier conf car je l'ai dans git.
Après loking Docs du superviseur j'avais aussi essayé avec:
HOME="/home/django", USER="django"
mais n'a pas fonctionné.
finalement j'ai essayé avec cela et travaille maintenant!:
environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY
peut-être bien que ce soit de travail c'est pas la meilleure solution. Je serais heureux d'en savoir plus.
EDIT:
finalement, Ewan m'a fait comprendre que l'utilisation de la bash pour configurer les var env ne serait pas la meilleure option. Donc une solution, comme indiqué par #Ewan, serait d'utiliser:
[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"
une autre solution j'ai trouvé, pour ceux qui utilisent virtualenv serait d'exporter les vars env dans le script "activate" du virtualenv, c'est-à-dire,modifier votre virtualenv/bin/activate fichier et ajouter à la fin de votre SECRET_KEY.
de Cette façon, vous pouvez utiliser % caractères généré par générateurs de clés pour django et est valide si vous n'utilisez pas le superviseur.
j'ai redémarré mon serveur sans me connecter pour vérifier qu'il fonctionnait. Avec cette option Je n'ai pas à éditer mes clés, je peux garder mes fichiers de conf et cela fonctionne que j'utilise supervisor, upstart ou n'importe quoi (ou rien, juste gunicorn).
De Toute Façon, Je je sais que je n'ai rien découvert de nouveau (bien @Ewan a soulevé un problème avec le superviseur) mais je suis en train d'apprendre des choses et j'espère que cela peut être utile à quelqu'un d'autre.
si vous utilisez aussi gunicorn config file:
gunicorn -c gunicorn.py myproject.wsgi
Il est possible de passer des variables d'environnement dans le gunicorn.py
le fichier comme ceci:
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:password@host/dbname',
'SECRET_KEY=mysecretkey',
]
.bashrc
ne fonctionnera que pour les shells interactifs et fonctionnera donc lors de l'exécution du script shell en tant qu'utilisateur.cependant, votre superviseur, qui tourne en arrière-plan, ne passera pas ces valeurs.
au lieu de cela, dans votre supervsior .ini
fichier définir la variable d'environnement (plus d'informations dans le documentation).
e.g.
[program:my_django_project]
environment=SECRET_KEY="my_secret_key"
Après un peu d'essais et d'erreurs, j'ai remarqué que le superviseur .ini
le fichier n'aime pas pour avoir %
dans la section des variables d'environnement (même si vous le citez...). Basé sur votre exemple dans les commentaires, j'ai essayé avec supervisor==3.0
installé via pip
et ça fonctionne:
environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l(+@xcr&)z^lmg+pqw^6wkyi"
la Seule différence est que j'ai enlevé le%
signe. (J'ai essayé de prendre la fuite avec \%
mais cela ne fonctionne toujours pas)
Edit 2
Soulevées question n ° 291 avec le superviseur pour ce bug.
Edit 3
Comme noté dans le problème ci-dessus, si un %
est présent dans votre clé secrète il doit être échappé de style python: %%
Vous pouvez échapper au caractère % en ajoutant un autre caractère%.
sinon, citer les valeurs est facultatif mais recommandé. Pour échapper à des caractères de pourcentage, il suffit d'utiliser deux. (par exemple,
URI="/first%%20name"
)
Prises à partir d'ici: http://supervisord.org/configuration.html