Lucas Simon

Web Developer. lucassrod@gmail.com

Deploy Flask na Digital Ocean - Parte 8 - Configurando o aplicativo

Clonando o repositório

Altere para o nosso diretório cd sites/ e execute o comando para clonar o projeto.

$ git clone git@github.com:lucassimon/flask-api-users.git

Configurando o projeto

Crie o virtualenv com o comando abaixo:

$ python3 -m venv venvs

Ative o virtualenv

$ source venvs/bin/activate

E instale os pacotes necessários

$ pip install -r sites/flask-api-users/requirements/prod.txt

Altere para o nosso diretório sites/

$ cd sites/flask-api-users

Crie um arquivo .env a partir do .env-example e configure a entrada correta para o PORT=9000,MONGODB_URI=, SECRET_KEY=

Copiando os scripts de configuração

Os arquivos do repositório podem ser considerados templates ou arquivos modelos. Fazendo a cópia podemos fazer as customizações quando necessárias.

Dado que nossos scripts se localizam no $HOME/sites/flask-api-users/confs, vamos copia-los para a nossa pasta $HOME/scripts.

Primeiro:

$ cd $HOME/scripts

E depois:

$ cp $HOME/sites/flask-api-users/confs/* .

Linkando os scripts criados

Acesse o servidor como root

Nginx

Criar apontamento dos links nas configurações do supervisor e nginx.

$ cd /etc/nginx/sites-enabled

Crie o link:

$ ln -s /home/apiflask/scripts/nginx_api_users.conf .

O diretório deve parecer com isso:

root@teste-devops:/etc/nginx/sites-enabled# ls -l
total 0
lrwxrwxrwx 1 root root 34 nov  8 19:49 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 43 nov  9 20:37 nginx_api_users.conf -> /home/apiflask/scripts/nginx_api_users.conf

Conferir as configurações do nginx.

root@teste-devops:/etc/nginx/sites-enabled# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Supervisor

$ cd /etc/supervisor/conf.d
$ ln -s /home/apiflask/scripts/supervisor_api_users.conf .

Executando os serviços

Primeiro reinicie o supervisord para pegar as informações acima. Também pode ser feito pelo supervisorctl reread e restart

# service supervisor restart

Confira se o serviço esta executando.

root@teste-devops:~# supervisorctl 
api_users:gunicorn_api_users     RUNNING   pid 6205, uptime 0:00:22
supervisor>

E reiniciar o nginx. Pode ser com reload ou restart

root@teste-devops:~# service nginx reload

Logs

Qualquer problema da aplicação ou de configuração pode ser vista na pasta do usuário apiflask

(venvs) 
# apiflask @ teste-devops in ~/logs [20:48:34] 
$ ls -l
total 12
drwxr-xr-x 2 apiflask apiflask 4096 nov  9 20:47 gunicorn
drwxr-xr-x 2 apiflask apiflask 4096 nov  9 20:44 nginx
drwxr-xr-x 2 apiflask apiflask 4096 nov  9 20:47 supervisor

Testando

# lucas @ notebook in /workspaces/python/flask-api-users on git:capitulo14/deploy-flask-na-digital-ocean x [18:51:08]
$ http -v POST 165.227.213.240/users full_name="07368680629" email="teste@teste.com" password='123456' confirm_password='123456' 

POST /users HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 108
Content-Type: application/json
Host: 165.227.213.240
User-Agent: HTTPie/0.9.8

{
    "confirm_password": "123456",
    "email": "teste@teste.com",
    "full_name": "07368680629",
    "password": "123456"
}

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 886
Content-Type: application/json
Date: Fri, 09 Nov 2018 20:52:21 GMT
Server: nginx/1.10.3

{
    "data": {
        "active": false,
        "cpf_cnpj": "",
        "email": "teste@teste.com",
        "full_name": "07368680629",
        "id": "5be5f385a2d3a21843f80d10"
    },
    "message": "Usuário criado(a).",
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDQzODg3NDEsImlhdCI6MTU0MTc5Njc0MSwibmJmIjoxNTQxNzk2NzQxLCJqdGkiOiJlZWM1Yzg2My0yMGZhLTQyMDktYmU3NC0zY2JhODc2NzZhYzMiLCJ0eXBlIjoicmVmcmVzaCIsImlkZW50aXR5IjoidGVzdGVAdGVzdGUuY29tIn0.ZQdOsOZejcBGwEApn_kOy2Rq9uvp-9K8BXWCZ5xnW_I",
    "resource": "Users",
    "status": 200,
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NDE3OTc5NDEsInVzZXJfY2xhaW1zIjp7ImFjdGl2ZSI6ZmFsc2V9LCJpYXQiOjE1NDE3OTY3NDEsIm5iZiI6MTU0MTc5Njc0MSwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIiwianRpIjoiM2MyOTY1MjctMWZmMy00YTE1LTg3NzMtNGU5Y2VkNzQzODM5IiwiaWRlbnRpdHkiOiJ0ZXN0ZUB0ZXN0ZS5jb20ifQ.oshZpyakyyWxolW6r4bFeJhdTg90U3j2MM7bTs0MfVU"
}

Fontes

RealPython