web-dev-qa-db-fra.com

Comment utiliser les variables d'environnement avec superviseur, gunicorn et Django (1.6)

Je veux configurer le superviseur pour contrôler gunicorn dans mon projet Django 1.6 en utilisant une variable d'environnement pour SECRET_KEY.

J'ai défini ma clé secrète dans .bashrc comme

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

Ensuite, pour configurer le serveur gunicorn de mon projet dans le 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 génère aucune erreur mais lorsque je le 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 le superviseur pour lire mes variables Shell (je ne veux pas les conserver dans mon .bashrc à moins qu'il n'y ait une manière plus appropriée)?

35
equalium

OK, je suppose que je l'ai.

J'avais essayé d'inclure

environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"

dans le fichier conf pour superviseur mais il n'aimait pas les caractères non alphanumériques et je ne voulais pas avoir ma clé dans le fichier conf car je l'ai en git.

Après avoir lu sur documents du superviseur j'avais également essayé avec:

HOME="/home/Django", USER="Django"

mais n'a pas fonctionné.

Enfin, j'ai essayé avec ça et je travaille maintenant!:

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

Peut-être bien que cela fonctionne, ce n'est pas la meilleure solution. Je serais ravi d'en savoir plus.

MODIFIER:

Enfin, Ewan m'a fait voir que l'utilisation de bash pour définir les vars env ne serait pas la meilleure option. Donc une solution , comme l'a souligné #Ewan, serait d'utiliser:

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

Une autre solution que j'ai trouvée, pour ceux qui utilisent virtualenv serait d'exporter les vars env dans le script "activate" du virtualenv, c'est-à-dire, éditez votre fichier virtualenv/bin/activate et ajoutez à la fin votre SECRET_KEY.

De cette façon, vous pouvez utiliser% chars comme généré par générateurs de clés pour Django et est valide si vous n'utilisez pas de superviseur.

J'ai redémarré mon serveur sans me connecter pour vérifier qu'il fonctionnait. Avec cette option, je n'ai pas à modifier mes clés, je peux garder mes fichiers de conf versionnés et cela fonctionne si j'utilise superviseur, parvenu ou autre (ou rien, juste gunicorn).

Quoi qu'il en soit, je sais que je n'ai rien découvert de nouveau (eh bien @Ewan a soulevé un problème avec le superviseur) mais j'apprends des choses et j'espère que cela peut être utile à quelqu'un d'autre.

25
equalium

De plus, si vous utilisez un fichier de configuration gunicorn:

gunicorn -c gunicorn.py myproject.wsgi

Il est possible de passer des variables d'environnement dans le gunicorn.py fichier comme celui-ci:

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',
]
8
MadisonTrash

Votre .bashrc ne fonctionnera que pour les shells interactifs et fonctionnera donc lors de l'exécution du script Shell en tant qu'utilisateur, mais le superviseur, exécuté en arrière-plan, ne recevra pas ces valeurs.

Au lieu de cela, dans votre superviseur .ini le fichier y définit la variable d'environnement (plus d'informations dans documentation ).

par exemple.

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

Après quelques essais et erreurs, j'ai remarqué que le superviseur .ini le fichier n'aime pas avoir % dans la section des variables d'environnement (même si vous le citez ...). Sur la base de votre exemple dans les commentaires, j'ai essayé ceci avec supervisor==3.0 installé via pip et ça marche:

environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l$0(+@x$3cr&)z^lmg+pqw^6wkyi"

La seule différence est que j'ai supprimé le% signe. (J'ai essayé de m'échapper avec \% mais cela n'a toujours pas fonctionné)

Modifier 2

Déclenché problème # 291 avec le superviseur pour ce bogue.

Modifier 3

Comme indiqué dans le numéro ci-dessus, si un % est présent dans votre clé secrète, il doit être échappé de style python: %%

6
Ewan

Vous pouvez échapper à% character en ajoutant un autre% character.

Sinon, la citation des valeurs est facultative mais recommandée. Pour échapper au pourcentage de caractères, utilisez simplement deux. (par exemple. URI="/first%%20name")

Extrait d'ici: http://supervisord.org/configuration.html

1
Simon Tremblay