A grande imagem
Eu tenho um site Flask que - anteriormente - estava rodando com sucesso no Ubuntu no Linode. Eu inicializei com Yeoman e, como resultado, não precisei descobrir a diferença entre nginx, wsgi/Werkzeug e gunicorn.
No entanto, isso está me incomodando agora que estou tentando migrá-lo para meu primeiro droplet Digitalocean, usando sua imagem de disco pré-configurada do Ubuntu 16.04 com Dokku 0.7.2. Esta é minha primeira vez com Docker ou Dokku, ou conteinerização em geral.
Dokku não apresentou erro ao implantar meu aplicativo Flask - ele me disse que o aplicativo está sendo executado no endereço IP do meu droplet seguido por :17520
. (Não estou usando um nome de domínio, apenas o endereço IP.)
Definição de problema
Meu site não responde a solicitações HTTP, apesar de Dokku dizer que a implantação foi bem-sucedida. O Chrome diz "Este site não pode ser acessado".
Soluções que já experimentei
Foram necessárias algumas tentativas para Dokku implantar meu aplicativo sem erros, porque eu precisava adicionar alguns arquivos à raiz do meu repositório local e tentar enviá-lo novamente.
O perfil
Primeiro eu precisava do Procfile, que contém a linha única web: python run.py
onde run.py
está:
from app import app app.run(host = '0.0.0.0', debug = True)
Ignorando minhas ferramentas de desenvolvimento Node.js
Em seguida, precisei evitar que Dokku visse minhas ferramentas de desenvolvimento Node.js e tentasse implantá-las como um aplicativo Node.js. Então adicionei .slugignore
contendo a linha única package.json
e .buildpacks
contendo a linha única https://github.com/heroku/heroku-buildpack-python
e empurrei novamente para git push dokku
.
Gunicórnio
Yeoman não incluiu gunicorn
quando inicializei este aplicativo - apenas nginx e wsgi/Werkzeug. Notei todos os exemplos do Procfile Python usados gunicorn
como servidor HTTP, então adicionei gunicorn==0.17.2
ao meu requirements.txt. I changed
Procfile to
web: gunicorn app:app`. Dokku não gerou erro ao instalar esta versão, mas ainda não há resposta às solicitações HTTP.
Histórico
Registro Dokku
Quando eu faço logon no meu droplet e executo o comando dokku log [my_app_name]
, ele diz:
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
Então também tentei acrescentar :5000 ao endereço IP. E claro, só por segurança, tentei a porta 80 também. Ainda sem sorte.
Depois de instalar gunicorn
, o log dizia:
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
Ainda logado no meu droplet, fui em var/log/dokku e abri o arquivo events.log
, terminando com isto:
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
Responder1
Qual é a sua configuração e logs do nginx? Esta instância nginx está sendo executada nativamente no host e gerenciada com systemd?
O que netstat -tulpn
diz no servidor?
Você vê a porta 5000 do contêiner encaminhada para uma porta no computador host? (verifique docker ps
esta informação)