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.

Digital Ocean - Gerenciamento de Servidores e Serviços
Curso de Digital Ocean - Gerenciamento de Servidores e Serviços
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 - Fundamentos
Curso de Docker - Fundamentos
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) Intermediário
Curso de C# (C Sharp) Intermediário
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.

Deixe seu comentário

Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo.

© 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