Heroku

Publicando uma aplicação ASP.NET Core no Heroku

No desenvolvimento de uma aplicação web pode ser necessário a sua publicação para testes, ou mesmo, para apresentar algo para um futuro usuário. Durante os estudos, também é muito comum o desejo de publicar a aplicação web que está sendo criada.

Por não ser algo definitivo, o desenvolvedor pode não desejar (ou não poder) pagar por uma hospedagem para publicar a aplicação web que está desenvolvendo. Infelizmente não existem muitas opções de hospedagem gratuita. Dos que existem, sempre há alguma limitação.

Um dos serviços que mais se destacam neste requisito é o Heroku.

Amazon Web Services (AWS) - S3 - Fundamentos
Curso de Amazon Web Services (AWS) - S3 - Fundamentos
CONHEÇA O CURSO

Heroku

O Heroku é uma platform as a service (PaaS) que permite que desenvolvedores criem, executem e publiquem aplicações na nuvem, sendo que a sua versão mais básica é grátis. Mesmo nesta versão, ele fornece uma URL, o que permite testar a aplicação sem necessitar de um domínio.

Entretanto, nativamente o Heroku fornece suporte apenas as linguagens JavaScript (via Node), Ruby, Java, PHP, Python, Go, Scala e Clojure. É possível executar outras linguagens via Buildpacks, que são scripts criados pela comunidade.

Contudo, esses buildpacks podem possuir limitações que impedem o seu uso na sua aplicação. Algo simples, para uma linguagem nativa, como a publicação de uma aplicação Django, pode ser complexo com o uso de um buildpack criado pela comunidade.

Felizmente, o Heroku também permite a publicação de uma imagem Docker, o que elimina praticamente todos os limites que um buildpack possa ter.

Assim, por não fornecer suporte nativo ao ASP.NET Core, neste artigo veremos como publicar este tipo de aplicação na plataforma via container do Docker.

Preparando a casa

Para acompanhar este artigo é importante que tenha o Docker instalado na sua máquina. Há versões dele para todos os sistemas operacionais. Também é importante que tenha uma conta no Heroku e o seu utilitário de linha comando configurado na máquina. O Fagner (instrutor aqui da Treinaweb) explicou como isso pode ser feito no seu artigo sobre a publicação de uma aplicação Django.

Por fim, mas não menos importante, a aplicação utilizada neste artigo será a API a criada com o framework Carter que mostrei anteriormente.

Docker - Gerenciamento de Imagens
Curso de Docker - Gerenciamento de Imagens
CONHEÇA O CURSO

Containeralizando” a aplicação ASP.NET Core

A primeira coisa que temos que fazer na aplicação é adicioná-la a um container Docker, para isso, deve ser adicionado ao projeto o arquivo Dockerfile. Será neste arquivo que definiremos como o nosso container será criado.

Também é recomendado que seja criado na aplicação um arquivo .dockerignore. Assim como o .gitignore, neste arquivo são definidos diretórios e arquivos que o docker deve ignorar. Para esta aplicação, o conteúdo do .dockerignore será:

**/.dockerignore
**/.git
**/.gitignore
**/.vs
**/.vscode
**/*.*proj.user
**/bin
**/obj

Já o Dockerfile conterá:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY . .
RUN dotnet restore 
RUN dotnet build --no-restore -c Release -o /app

FROM build AS publish
RUN dotnet publish --no-restore -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
# Padrão de container ASP.NET
# ENTRYPOINT ["dotnet", "CarterAPI.dll"]
# Opção utilizada pelo Heroku
CMD ASPNETCORE_URLS=http://*:$PORT dotnet CarterAPI.dll

Um arquivo Dockerfile é como um script. Este em questão implementa multi-stage, o que significa que é definido um passo para cada processo definido no script. Assim, se um passo falhar, não é necessário refazer os passos que já foram concluídos.

Acima, inicialmente se obtém a imagem de runtime do ASP.NET Core, na imagem do SDK as bibliotecas da aplicação são obtidas e ela é compilada. Caso não ocorra nenhum erro, a aplicação é publicada e por fim, ela é iniciada.

Geralmente quando uma aplicação ASP.NET Core é adicionada em um container, ela é iniciada com o comando:

ENTRYPOINT ["dotnet", "CarterAPI.dll"]

Mas o Heroku recomenda que a aplicação seja iniciada com o comando:

CMD ASPNETCORE_URLS=http://*:$PORT dotnet CarterAPI.dll

Isso ocorre porque o processo web do Heroku “escuta” as requisições HTTP na porta $PORT, que não necessariamente é a porta 80. A porta que ele utilizará é atribuído a variável de ambiente $PORT, assim antes de iniciar a aplicação, a porta utilizada pela aplicação é alterada para ser a mesma esperada pelo Heroku.

Agora está tudo pronto e podemos criar uma imagem da nossa aplicação. Para isso, utilizamos o comando abaixo:

docker build -t carter-api .

Lembrando que este comando deve ser executado pelo terminal no mesmo nível do arquivo Dockerfile, ou seja, na raiz da aplicação.

Pronto, com a imagem do projeto criado, podemos publicá-la no Heroku.

Publicando a aplicação no Heroku

Após se registrar no site, no dashboard crie um novo projeto:

O nome do projeto irá definir a URL da aplicação, que seguirá o padrão <nome-aplicacao>.herokuapp.com.

Voltando a aplicação, acesse pelo terminal a pasta da sua aplicação e nela execute o comando:

heroku container:push web -a carter-api

Note que no parâmetro -a é informado o nome da aplicação definida no Heroku. Com isso, uma imagem Docker será gerada e enviada para o registro do Heroku:

Como é apresentado no final deste comando, para que a aplicação seja disponibilizada é necessário executar o comando container:release:

heroku container:release web -a carter-api

Que irá apenas “liberar” a aplicação:

Agora é possível acessá-la na url <nome-aplicacao>.herokuapp.com:

Até o Swagger está disponível:

Simples não é?

C# (C Sharp) - Introdução ao ASP.NET Core
Curso de C# (C Sharp) - Introdução ao ASP.NET Core
CONHEÇA O CURSO

Para tudo e além…

O processo que utilizamos aqui é bem simples e por fazer uso de um container Docker, isso nos permite publicar qualquer tipo de aplicação web que funciona em container. Isso vale desde aplicações de linguagens suportadas nativamente pelo Heroku, mas que utilize outra versão da linguagem, até aplicações que ainda nem existem atualmente.

Uma aplicação web de uma nova linguagem que suporte Docker, poderia ser publicada utilizando este mesmo processo, sem problemas.

Então é isso. Você pode obter os códigos da aplicação demostrada aqui no meu Github.

Deploy de uma aplicação Django no Heroku

Hoje, a principal forma de entrega e uso de uma aplicação é por meio da nuvem. É por lá que as aplicações são armazenadas e acessadas. Sendo assim, é imprescindível que uma aplicação seja armazenada em algum servidor e disponível pela internet.

Pensando nisso, veremos neste artigo como realizar o Deploy de uma aplicação Django e disponibilizá-la no Heroku, serviço de armazenamento em nuvem de aplicações.

Clonando o repositório da aplicação

Como exemplo, iremos utilizar a aplicação feita no curso “Django – Fundamentos” aqui da TreinaWeb. Apesar de ser uma aplicação simples, será um ótimo exemplo para testes.

Django - Fundamentos
Curso de Django - Fundamentos
CONHEÇA O CURSO

Para realizar o clone do projeto, vamos até o CMD (se você usa o Windows) ou Terminal (caso você use o macOS ou Linux) e utilizamos o seguinte comando:

git clone https://github.com/treinaweb/treinaweb-django-fundamentos.git

Feito isso, o projeto será baixado em seu computador e você terá todo o seu código-fonte.

Criar conta no Heroku

Após baixar o código-fonte do projeto, precisamos criar uma conta (ou realizar o login) no Heroku. O processo é bem simples, basta preencher o formulário na página de cadastro do site (https://signup.heroku.com/):

Caso você já possua uma conta no Heroku, só será necessário realizar o login (https://id.heroku.com/login).

Depois disso, você será redirecionado para a página inicial do Heroku:

Criar app no Heroku

Depois de criar uma conta no Heroku, precisamos criar uma app para armazenar a aplicação Django. Para isso, na página inicial, clicamos no botão “Create New App”. Depois, na próxima página, definimos o nome da aplicação que estamos criando e clicamos no botão “Create App”:

Com isso, seremos redirecionados para a página de configuração da aplicação. É nela que configuramos o servidor em que a aplicação será armazenado.

Instalar o Heroku CLI

Para que seja possível enviar o código-fonte do projeto para o servidor que acabamos de criar, precisamos instalar o CLI (Command Line Interface) do Heroku. É com ele que conseguimos executar determinados comandos utilizando nosso computador para gerenciar o servidor da aplicação.

Para isso, há uma página que contém todas as informações necessárias para esse processo. Lembrando que o Heroku CLI é multi-plataforma, ou seja, poderá ser utilizado em qualquer SO (Windows, macOS ou Linux).

Todo o processo de instalação está descrito na documentação do Heroku (https://devcenter.heroku.com/articles/heroku-cli) e é bastante simples.

Se você utiliza o macOS, você precisa digitar o seguinte comando em seu terminal:

brew tap heroku/brew && brew install heroku

Caso você utilize o Linux, o comando é o seguinte:

sudo snap install --classic heroku

Agora, caso você utilize o Windows, você precisará baixar e executar o instalador do Heroku CLI, também disponível na página citada acima:

Lembrando que, para qualquer SO, é necessário possuir o Git instalado. Mas, já que você fez o clone do repositório do projeto, isso já deve estar funcionando 🙂

Logar no Heroku CLI

Depois de baixar e instalar o Heroku CLI, precisamos logar com nossa conta na ferramenta. Para isso, vamos até o CMD (ou Terminal) e digitamos o seguinte comando:

heroku login

Uma mensagem no terminal será exibida e podemos clicar em qualquer tecla do teclado. Neste momento, o navegador irá abrir uma página para realizarmos o login no Heroku. Após digitarmos nossos dados de acesso, clicamos no botão “Login” e o processo será encerrado com sucesso:

Configurar Projeto

Com todas as configurações do Heroku prontas, chegou a hora de configurarmos a aplicação que será armazenada no servidor. Para isso, o primeiro passo é instalar a biblioteca django-heroku, responsável por automatizar as configurações do nosso projeto com o Heroku.

Instalar o django-heroku

Para instalar o django-heroku, vamos até a janela de configuração da nossa virtualenv do PyCharm (Arquivo > Settings > Project Interpreter, caso você utilize o Windows ou Linux ou PyCharm Community Edition > Preferences > Project Interpreter, caso você utilize o macOS), clicamos no botão “+” no canto inferior esquerdo e buscamos a biblioteca pelo seu nome, como podemos ver abaixo:

Depois disso, a biblioteca será instalada em nossa virtualenv e estaremos prontos para configurá-la em nosso projeto. Sendo assim, vamos até o arquivo settings.py e ativamos o django-heroku adicionando o seguinte conteúdo no final do arquivo :

# Configure Django App for Heroku.
import django_heroku
django_heroku.settings(locals())

Feito isso, as configurações do Heroku em nossa aplicação estão prontas.

Criar Procfile

Depois de instalar o django-heroku, precisamos criar o arquivo Procfile na raiz do nosso projeto. É ele quem vai definir qual arquivo será usado para processar as requisições da nossa aplicação. No Django, esse arquivo é o wsgi.py, localizado na pasta da nossa aplicação.

Sendo assim, criamos um arquivo de texto simples com o nome Procfilee salvamos na raiz do nosso projeto. Dentro dele, colamos o seguinte conteúdo:

web: gunicorn tw_clientes.wsgi

Lembrando que o nome da sua aplicação pode variar, caso você não esteja utilizando o mesmo projeto citado anteriormente. Se este for o seu caso, altere o “tw_cliente.wsgi” para o nome da sua aplicação.

Depois disso, precisamos instalar a biblioteca gunicorn, servidor HTTP para aplicações Python. O processo é o mesmo que o django-heroku, porém devemos pesquisar por gunicornna janela de instalação de bibliotecas:

Criar requirements.py

Depois disso, precisamos criar o arquivo requirements.py para armazenar as bibliotecas utilizadas no projeto. Lembrando que você precisa estar com a virtualenv ativa no PyCharm.

Sendo assim, o comando para gerar o arquivo requirements.pycom base nas bibliotecas instaladas na virtualenv do projeto é o seguinte:

pip freeze > requirements.txt

Com isso, o arquivo requirements.txtserá criado na raiz do projeto com o seguinte conteúdo:

dj-database-url==0.5.0
Django==2.1.7
django-heroku==0.3.1
gunicorn==19.9.0
mysqlclient==1.4.2
psycopg2==2.7.7
pytz==2018.9
whitenoise==4.1.2

São essas as bibliotecas utilizadas em nosso projeto. Lembrando que o conteúdo deste arquivo pode variar caso você tenha mais bibliotecas em sua virtualenv.

Lembrando que a lista de bibliotecas utilizadas pode ser vista na janela de configurações do PyCharm (Arquivo > Settings > Project Interpreter, caso você utilize o Windows ou Linux ou PyCharm Community Edition > Preferences > Project Interpreter, caso você utilize o macOS):

Realizar o Deploy

Finalmente, após todas as configurações, estamos prontos para subir nosso projeto no Heroku o/.

Subindo aplicação

Para isso, vamos até o terminal e digitamos o seguinte comando:

heroku git:remote -a django-treinaweb
git add .
git commit -m "Deploy da aplicação"
git push -u heroku master

Depois disso, uma mensagem será exibida no terminal indicando que o deploy foi feito com sucesso:

Clicando no link indicado, somos redirecionados para a página da aplicação que acabou de ser armazenada. Neste momento, a página que será exibida terá o seguinte visual:

Como sabemos, essa é a página de erro do Django. Sendo assim, ao que tudo indica, o Deploy foi feito com sucesso. Sendo assim, se navegarmos até a página https://django-treinaweb.herokuapp.com/clientes/listar teremos o seguinte:

O erro acima indica que o Django não conseguiu encontrar as tabelas que estamos utilizando no banco de dados. E isso faz sentido, já que, até o momento, não migramos o conteúdo dos arquivos de migração para o Heroku. Sendo assim, este é o último passo a ser realizado.

Criando banco de dados

Para executar o comando responsável por criar o banco de dados no heroku, vamos até o terminal e digitamos o seguinte comando:

heroku run python manage.py migrate

O comando acima irá executar as migrações no banco de dados do Heroku e criar toda a sua estrutura:

Agora, ao retornar para a página anterior, podemos ver que a aplicação está sendo executada sem qualquer erro:

Inclusive, podemos utilizar qualquer recurso da nossa aplicação, como o cadastro de novos clientes:


Agora, toda a nossa aplicação já está disponível e funcional diretamente da nuvem através do Heroku 🙂

© 2004 - 2019 TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58 Av. Paulista, 1765, Conj 71 e 72 - Bela Vista - São Paulo - SP - 01311-200