El panorama
Tengo un sitio Flask que, anteriormente, se ejecutaba correctamente en Ubuntu en Linode. Lo inicié con Yeoman y, como resultado, no tuve que descubrir la diferencia entre nginx, wsgi/Werkzeug y gunicorn.
Sin embargo, eso me está molestando ahora que estoy intentando migrarlo a mi primer droplet de Digitalocean, usando su imagen de disco preconfigurada de Ubuntu 16.04 con Dokku 0.7.2. Esta es la primera vez que uso Docker o Dokku, o la contenedorización en general.
Dokku no dio ningún error al implementar mi aplicación Flask; me dijo que la aplicación se está ejecutando en la dirección IP de mi droplet seguida de :17520
. (No estoy usando un nombre de dominio, solo la dirección IP).
Definición del problema
Mi sitio no responde a solicitudes HTTP, a pesar de que Dokku dijo que su implementación fue exitosa. Chrome dice "No se puede acceder a este sitio".
Soluciones que ya he probado
Dokku tardó algunos intentos en implementar mi aplicación sin errores, porque necesitaba agregar algunos archivos a la raíz de mi repositorio local e intentar enviarla nuevamente.
El perfil
Primero necesitaba Procfile, que contiene la web de una sola línea: python run.py
donde run.py
está:
from app import app app.run(host = '0.0.0.0', debug = True)
Ignorar mis herramientas de desarrollo de Node.js
Lo siguiente que necesitaba era evitar que Dokku viera mis herramientas de desarrollo de Node.js e intentara implementarlas como una aplicación de Node.js. Entonces agregué .slugignore
que contiene la línea única package.json
y .buildpacks
que contiene la línea única https://github.com/heroku/heroku-buildpack-python
y presioné nuevamente a git push dokku
.
gunicornio
Yeoman no incluyó gunicorn
cuando inicié esta aplicación, solo nginx y wsgi/Werkzeug. Noté que todos los ejemplos de Python Procfile se usaban gunicorn
como servidor HTTP, así que agregué gunicorn==0.17.2
a mi web requirements.txt. I changed
Procfile to
: gunicorn app:app`. Dokku no arrojó ningún error al instalar esta versión, pero aún no hay respuesta a las solicitudes HTTP.
Registros
registro de dokku
Cuando inicio sesión en mi droplet y ejecuto el comando dokku log [my_app_name]
, dice:
2017-01-17T17:11:04.733185275Z app[web.1]: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 2017-01-17T17:11:04.734938531Z app[web.1]: * Restarting with stat 2017-01-17T17:11:05.024834922Z app[web.1]: * Debugger is active! 2017-01-17T17:11:05.029750092Z app[web.1]: * Debugger pin code: 208-261-801
Entonces también intenté agregar :5000 a la dirección IP. Y, por supuesto, para estar seguro, también probé el puerto 80. Todavía no hubo suerte.
Después de instalar gunicorn
, el registro decía:
2017-01-18T17:09:38.303046670Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Starting gunicorn 0.17.2 2017-01-18T17:09:38.303864158Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Listening at: http://0.0.0.0:5000 (8) 2017-01-18T17:09:38.304140278Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Using worker: sync 2017-01-18T17:09:38.310057688Z app[web.1]: 2017-01-18 17:09:38 [148] [INFO] Booting worker with pid: 148
Eventos.log
Todavía conectado a mi droplet, fui a var/log/dokku y abrí el archivo events.log
, terminando con esto:
Jan 17 16:27:55 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:27:55] "GET /favicon.ico HTTP/1.0" 200 - Jan 17 16:28:27 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:28:27] "HEAD / HTTP/1.0" 200 - Jan 17 16:29:49 [my-app-name] dokku-installer.py[7291]: SHA256: [then the SHA] Jan 17 16:29:50 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:29:50] "POST /setup HTTP/1.0" 200 - Jan 17 16:29:50 [my-app-name] dokku-installer.py[7291]: Stopping nginx (via systemctl): nginx.service. Jan 17 16:29:51 [my-app-name] dokku-installer.py[7291]: Starting nginx (via systemctl): nginx.service. Jan 17 16:29:51 [my-app-name] dokku-installer.py[7291]: /bin/sh: 1: stop: not found
Respuesta1
¿Cuál es su configuración de nginx y sus registros de nginx? ¿Esta instancia de nginx se ejecuta de forma nativa en el host y se administra con systemd?
¿Qué dice netstat -tulpn
en el servidor?
¿Ve el puerto 5000 del contenedor reenviado a un puerto en la computadora host? (verifique docker ps
esta información)