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é)?

31
demandé sur equalium 2013-09-27 19:01:54

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.

24
répondu equalium 2014-07-09 17:05:35

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',
]
7
répondu MadisonTrash 2015-07-09 08:56:29

.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: %%

6
répondu Ewan 2015-02-23 22:07:27

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

1
répondu Simon Tremblay 2014-08-18 14:32:26