digitalocean - supervisor django
Cómo usar variables de entorno con supervisor, gunicornio y django(1.6) (4)
Además, si usas el archivo de configuración de gunicorn:
gunicorn -c gunicorn.py myproject.wsgi
Es posible pasar variables de entorno en el archivo gunicorn.py
esta manera:
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'',
]
Quiero configurar el supervisor para controlar gunicorn en mi proyecto django 1.6 utilizando una variable de entorno para SECRET_KEY.
Configuré mi clave secreta en .bashrc como
export SECRET_KEY=[my_secret_key]
Y tengo un script de shell para iniciar 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
Luego, para configurar el servidor gunicorn de mi proyecto en supervisor:
[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 inicio gunicornio utilizando mi script de shell no arroja ningún error, pero cuando lo comienzo con el supervisor falla y veo en los registros que no "encuentra" mi SECRET_KEY.
¿Cuál es la forma correcta de configurar al supervisor para que lea mis variables de shell (quiero guardarlas en mi .bashrc a menos que haya una manera más apropiada)?
OK, supongo que lo tengo.
Yo había intentado incluir
environment=SECRET_KEY="secret_key_with_non_alphanumeric_chars"
en el archivo conf para el supervisor, pero no me gustaron los caracteres no alfanuméricos y no quería tener mi clave en el archivo conf ya que lo tengo en git.
Después de ver los documentos del supervisor, también probé con:
HOME="/home/django", USER="django"
pero no funcionó.
¡Finalmente probé con esto y ahora estoy trabajando !:
environment=HOME="/home/django", USER="django", SECRET_KEY=$SECRET_KEY
Tal vez aunque esté funcionando no sea la mejor solución. Yo estaría feliz de aprender más.
EDITAR:
Finalmente, Ewan me hizo ver que usar el bash para configurar los envás no sería la mejor opción. Entonces, una solución , como lo señala #Ewan, sería usar:
[program:my_project]
...
environment=SECRET_KEY="secret_key_avoiding_%_chars"
Otra solución que encontré, para aquellos que usan virtualenv sería exportar los archivos en el script "activar" del virtualenv, es decir, editar su archivo virtualenv / bin / activate y agregar al final su SECRET_KEY.
De esta forma, puede usar% caracteres generados por generadores de claves para django y es válido si no usa el supervisor.
Reinicié mi servidor sin iniciar sesión para comprobar que funcionó. Con esta opción no tengo que editar mis claves, puedo mantener mis archivos conf versionados y funciona si utilizo supervisor, upstart o lo que sea (o nada, solo gunicornio).
De todos modos, sé que no he descubierto nada nuevo (bueno @Ewan planteó un problema con el supervisor) pero estoy aprendiendo cosas y espero que esto pueda ser útil para otra persona.
Puede escapar del carácter% agregando otro% del carácter.
De lo contrario, la cotización de los valores es opcional pero se recomienda. Para escapar del porcentaje de caracteres, simplemente use dos. (por ejemplo,
URI="/first%%20name"
)
Tomado desde aquí: http://supervisord.org/configuration.html
Su .bashrc
solo funcionará para shells interactivos, por lo que funcionará cuando ejecute el script de shell como su usuario; sin embargo, el supervisor, ejecutándose en segundo plano, no obtendrá estos valores.
En su lugar, en su supervsior archivo .ini
configure la variable de entorno allí (más información en la documentation ).
p.ej
[program:my_django_project]
environment=SECRET_KEY="my_secret_key"
Después de un poco de prueba y error, noté que al archivo supervisor .ini
no le gusta tener %
en la sección de variables de entorno (incluso si lo cita ...). Basado en su ejemplo en los comentarios, lo he intentado con supervisor==3.0
instalado a través de pip
y funciona:
environment=SECRET_KEY="*wi4h$kqxp84f3w6uh8w@l$0(+@x$3cr&)z^lmg+pqw^6wkyi"
La única diferencia es que eliminé el signo %
. (Intenté escapar con /%
pero esto todavía no funcionaba)
Editar 2
Problema planteado # 291 con el supervisor para este error.
Editar 3
Como se señaló en el problema anterior, si un %
está presente en su clave secreta, debe escaparse a python-style: %%