|
| 1 | +Title: Configurando OpenShift com Python 3.5 + Flask + Gunicorn |
| 2 | +Slug: configurando-python-3.5-openshift-flask-gunicorn |
| 3 | +Date: 2017-04-23 20:37:39 |
| 4 | +Category: Python |
| 5 | +Tags: python,tutorial,install,cloud |
| 6 | +Author: Horácio Dias |
| 7 | +Email: horacio.dias92@gmail.com |
| 8 | +Gravatarid:57db1afcce141efc81193425d4a5bbf0 |
| 9 | +Github: nenodias |
| 10 | +Linkedin: nenodias92 |
| 11 | +Facebook: nenodias |
| 12 | +Summary: Tutorial básico de como configurar o python 3.5 com o openshift + flask + gunicorn, utilizando o diy (Do It Yourself), carregando um cartridge customizado ... |
| 13 | + |
| 14 | +Configurando OpenShift com Python 3.5 |
| 15 | + |
| 16 | +### Introdução |
| 17 | + |
| 18 | +O [OpenShift](https://www.openshift.com/) é uma plataforma de PasS que possibilita aos desenvolvedores "subir" aplicações na nuvem de uma maneira simples e rápida. Ele funciona a partir de gears(engrenagens) que representam máquinas que irão rodar as aplicações. Dentro de cada gear é possível instalar serviços, os são chamados de "cartridges". |
| 19 | + |
| 20 | +Existem 3 planos: |
| 21 | + |
| 22 | ++ Online (gratuito, com três gears) |
| 23 | ++ Enterprise (pago com suporte) |
| 24 | ++ Origin (versão da comunidade e pode ser utilizado livremente) |
| 25 | + |
| 26 | +Um problema que me deparei ao utilizar o Openshift é que ele não possui um cartridge com Python3.5. Porém existe uma forma um pouco mais complicada de resolver esse problema. |
| 27 | + |
| 28 | +Após fazer seu cadastro no OpenShift e instalar o [client tools](https://developers.openshift.com/managing-your-applications/client-tools.html) que contém as ferramentas necessárias para configurar nossa aplicação. |
| 29 | + |
| 30 | +Após tudo isso vamos colocar a mão na massa, abra seu terminal e vamos lá. |
| 31 | + |
| 32 | +### Criando a aplicação |
| 33 | + |
| 34 | +``` shell |
| 35 | +rhc app create <app-name> https://raw.githubusercontent.com/Grief/openshift-cartridge-python-3.5/master/metadata/manifest.yml diy-0.1 |
| 36 | +``` |
| 37 | +Substituindo "<app-name>" pelo nome de sua aplicação. |
| 38 | +O arquivo manifest.yml criado por Changaco(github) e "forkeado" por Grief(github) contém as configurações de um cartridge customizado que contém o python 3.5. |
| 39 | + |
| 40 | +Para os curiosos o conteúdo do arquivo |
| 41 | +``` |
| 42 | +--- |
| 43 | +Name: python |
| 44 | +Cartridge-Short-Name: PYTHON |
| 45 | +Display-Name: Only Python |
| 46 | +Description: 'An embedded cartridge that provides only python, nothing else.' |
| 47 | +Version: '3.5.0' |
| 48 | +Versions: ['3.5.0', '2.7.11'] |
| 49 | +License: The Python License |
| 50 | +License-Url: http://docs.python.org/3/license.html |
| 51 | +Vendor: python.org |
| 52 | +Cartridge-Version: 0.0.2 |
| 53 | +Cartridge-Vendor: praisebetoscience |
| 54 | +Categories: |
| 55 | +- service |
| 56 | +- python |
| 57 | +- embedded |
| 58 | +Website: https://github.com/praisebetoscience/openshift-cartridge-python-3.5 |
| 59 | +Help-Topics: |
| 60 | + Developer Center: https://www.openshift.com/developers |
| 61 | +Provides: |
| 62 | +- python |
| 63 | +Publishes: |
| 64 | +Subscribes: |
| 65 | + set-env: |
| 66 | + Type: ENV:* |
| 67 | + Required: false |
| 68 | + set-doc-url: |
| 69 | + Type: STRING:urlpath |
| 70 | + Required: false |
| 71 | +Scaling: |
| 72 | + Min: 1 |
| 73 | + Max: -1 |
| 74 | +Version-Overrides: |
| 75 | + '2.7.11': |
| 76 | + Display-Name: Python 2.7 |
| 77 | + License: The Python License, version 2.7 |
| 78 | + Provides: |
| 79 | + - python-2.7 |
| 80 | + - python |
| 81 | + - python(version) = 2.7 |
| 82 | + '3.5.0': |
| 83 | + Display-Name: Python 3.5 |
| 84 | + License: The Python License, version 3.5 |
| 85 | + Provides: |
| 86 | + - python-3.5 |
| 87 | + - python |
| 88 | + - python(version) = 3.5 |
| 89 | +``` |
| 90 | + |
| 91 | +Após isso sua aplicação já estárá executando, caso deseje acessar o endereço da mesma deverá ser http://<app-name>-<username>.rhcloud.com. |
| 92 | +Você verá que a página do seu projeto não é nada mais do que o diy (Dot It Yourself), que é uma aplicação Ruby de exemplo que você pode alterar, e é o que vamos fazer. |
| 93 | + |
| 94 | +Se você acessar o diretório do seu projeto verá que existe um diretório ".openshift", dentro desse diretório existe um outro diretório chamado "action_hooks", e dentro desse diretório existem dois arquivos "start" e "stop". |
| 95 | + |
| 96 | ++ "<app-name>/.openshift/action_hooks/start" |
| 97 | ++ "<app-name>/.openshift/action_hooks/stop" |
| 98 | + |
| 99 | +Os dois arquivos são respectivamente os comandos para "subir" e "pausar" sua aplicação. |
| 100 | + |
| 101 | +### Flask |
| 102 | +Vamos criar um projeto de exemplo, bem simples, que apenas nos retorne a versão do python utilizada. |
| 103 | +Primeiramente vamos criar nosso requirements.txt, com gunicorn e o flask. |
| 104 | + |
| 105 | +"requirements.txt" |
| 106 | +``` |
| 107 | +gunicorn |
| 108 | +flask |
| 109 | +``` |
| 110 | + |
| 111 | +Depois disso vamos criar o arquivo app.py que conterá nossa aplicação. |
| 112 | + |
| 113 | +"app.py" |
| 114 | +``` |
| 115 | +import sys |
| 116 | +from flask import Flask |
| 117 | +
|
| 118 | +app = Flask(__name__) |
| 119 | +
|
| 120 | +@app.route('/') |
| 121 | +def index(): |
| 122 | + return sys.version |
| 123 | +
|
| 124 | +``` |
| 125 | + Após isso basta fazer o commit de suas alterações. |
| 126 | + |
| 127 | + ``` shell |
| 128 | + git add . |
| 129 | + git commit -am 'Minhas alterações' |
| 130 | + ``` |
| 131 | + |
| 132 | +Após isso você verá que sua aplicação não está rodando, pois ainda não alteramos os arquivos "start" e "stop". |
| 133 | + |
| 134 | +### Configurando o Gunicorn no Start e Stop |
| 135 | +O projeto diy do openshift nos deixa uma variável de ambiente $OPENSHIFT_DIY_IP com o IP da máquina, dessa forma podemos passar a variável e porta ao gunicorn. |
| 136 | + |
| 137 | +"start" |
| 138 | +``` shell |
| 139 | +#!/bin/bash |
| 140 | +nohup $HOME/python/usr/bin/pip3 install -r $OPENSHIFT_REPO_DIR/requirements.txt |
| 141 | +cd $OPENSHIFT_REPO_DIR |
| 142 | +nohup $HOME/python/usr/bin/gunicorn app:app --bind=$OPENSHIFT_DIY_IP:8080 |& /usr/bin/logshifter -tag diy & |
| 143 | +``` |
| 144 | + |
| 145 | +A primeira linha é o [Shebang](https://pt.wikipedia.org/wiki/Shebang), o que significa que esse arquivo será executado pelo bash. |
| 146 | +Na segunda linha vemos [nohup](https://pt.wikipedia.org/wiki/Nohup), que executa os comandos em uma sessão separada, vemos logo apóes vemos o uma chamada ao pip para instalar nossas dependências. |
| 147 | +Na terceira linha vemos o nohup, e depois o gunicorn inicializa nossa aplicação flask. |
| 148 | + |
| 149 | +Isso só funciona pois o cartridge customizado instala o python3.5 dentro da pasta home do servidor do openshift. |
| 150 | + |
| 151 | +"stop" |
| 152 | +``` shell |
| 153 | +#!/bin/bash |
| 154 | +source $OPENSHIFT_CARTRIDGE_SDK_BASH |
| 155 | + |
| 156 | +# The logic to stop your application should be put in this script. |
| 157 | +if [ -z "$(ps -ef | grep gunicorn | grep -v grep)" ] |
| 158 | +then |
| 159 | + client_result "Application is already stopped" |
| 160 | +else |
| 161 | + kill `ps -ef | grep gunicorn | grep -v grep | awk '{ print $2 }'` > /dev/null 2>&1 |
| 162 | +fi |
| 163 | +``` |
| 164 | +Podemos ver que o comando ps procura algum processo do gunicorn, caso ele exista o kill será chamado. |
| 165 | + |
| 166 | +Após isso, é só fazer o commit das alterações e você verá sua aplicação rodando. |
| 167 | + |
| 168 | +Espero que o post ajude a quem quer subir alguma aplicação com python3.5 e só tem o heroku como opção. |
| 169 | + |
| 170 | +### Referências |
| 171 | +- [Imaster](https://www.profissionaisti.com.br/2015/04/openshift-paas-de-verdade/) |
0 commit comments