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)?
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.
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',
]
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é)
Déclenché problème # 291 avec le superviseur pour ce bogue.
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: %%
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