The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Implantando na Heroku

Neste guia, você aprenderá a publicar uma Aplicação da Web baseado no Quarkus como um web-dyno no Heroku.

Este guia inclui:

  • Atualizar a porta HTTP do Quarkus

  • Instalar a CLI do Heroku

  • Publicar a aplicação no Heroku

  • Publique a aplicação como imagem de container no Heroku

  • Usando o Docker

  • Usando o Podman

  • Publique a aplicação nativa como imagem de container no Heroku

Pré-requisitos

Para concluir este guia, você precisa:

Introdução

O Heroku é uma plataforma como serviço (PaaS) que permite que os desenvolvedores criem, executem e operem aplicações inteiramente na nuvem. Ele oferece suporte a várias linguagens, como Java, Ruby, Node.js, Scala, Clojure, Python, PHP e Go. Além disso, oferece um registro de containers que pode ser usado para publicar imagens de containers pré-construídas.

O Heroku pode ser usado de diferentes maneiras para executar uma Aplicação Quarkus:

  • Como um programa Java simples executado em um container definido pelo ambiente do Heroku

  • Como um programa Java em container executado em um container definido pelo processo de compilação do Quarkus

  • Como um programa nativo containerizado executado em um container definido pelo processo de compilação do Quarkus

Todas as três abordagens precisam estar cientes da porta que o Heroku atribui a ele para lidar com o tráfego. Felizmente, há uma propriedade de configuração dinâmica para isso.

Configuração comum do projeto

This guide will take as input an application developed in the Getting Started guide.

Make sure you have the getting-started application at hand, or clone the Git repository: git clone -b 3.8 https://github.com/quarkusio/quarkus-quickstarts.git, or download an archive. The solution is located in the getting-started directory.

O Heroku pode reagir às alterações no seu repositório, executar a CI e republicar a aplicação quando o código for alterado. Portanto, já começamos com um repositório válido.

Além disso, verifique se a CLI do Heroku está funcionando:

heroku --version
heroku login

Preparar a porta HTTP do Quarkus

O Heroku escolhe uma porta aleatória e a atribui ao container que eventualmente executará seu aplicativo Quarkus. Essa porta está disponível como uma variável de ambiente em $PORT . A maneira mais fácil de fazer com que o Quarkus esteja ciente disso em todos os cenários de publicação é usar a seguinte configuração:

quarkus.http.port=${PORT:8080}

Isso é o seguinte: "Ouça em $PORT se essa for uma variável definida, caso contrário, ouça em 8080 como de costume." Execute o seguinte para adicionar isso ao seu application.properties :

echo "quarkus.http.port=\${PORT:8080}" >> src/main/resources/application.properties
git commit -am "Configure the HTTP Port."

Publicar o repositório e buildar no Heroku

A primeira variante usa a compilação do Quarkus Maven para criar a estrutura da aplicação quarkus-app que contém o "fast-jar" executável, bem como todas as bibliotecas necessárias dentro da infraestrutura de compilação do Heroku e, em seguida, publica esse resultado; a outra usa um processo de compilação local para criar um container otimizado.

Para a primeira variante, são necessários dois arquivos adicionais no diretório raiz da sua aplicação:

  • system.properties para configurar a versão do Java

  • Procfile para configurar como o Heroku inicia seu aplicativo

O Quarkus precisa do JDK 17, portanto, especificamos isso primeiro:

echo "java.runtime.version=17" >> system.properties
git add system.properties
git commit -am "Configure the Java version for Heroku."

Vamos publicar uma aplicação da Web, portanto, precisamos configurar o tipo web no Heroku Procfile da seguinte forma:

echo "web: java \$JAVA_OPTS -jar target/quarkus-app/quarkus-run.jar" >> Procfile
git add Procfile
git commit -am "Add a Procfile."

Your application should already be runnable via heroku local web.

Let’s create an application in your account and deploy that repository to it:

heroku create
git push heroku master
heroku open

The application will have a generated name and the terminal should output that. heroku open opens your default browser to access your new application.

To access the REST endpoint via curl, run:

APP_NAME=`heroku info | grep  "=== .*" |sed "s/=== //"`
curl $APP_NAME.herokuapp.com/hello

É claro que você também pode usar a CLI do Heroku para conectar esse repositório à sua conta do GitHub, mas isso está fora do escopo deste guia.

Publicar como container

A vantagem de enviar um container inteiro é que temos controle total sobre seu conteúdo e talvez até mesmo optar por publicar um container com um executável nativo em execução no GraalVM.

Primeiro, faça login no registro de containers do Heroku:

heroku container:login

We need to add an extension to our project to build container images via the Quarkus Maven plugin:

mvn quarkus:add-extension -Dextensions="container-image-docker"
git add pom.xml
git commit -am "Add container-image-docker extension."

A imagem que vamos construir precisa ser nomeada adequadamente para funcionar com o registro e a publicação do Heroku. Obtemos o nome gerado por meio do site heroku info e o passamos para a compilação (local):

APP_NAME=`heroku info | grep  "=== .*" |sed "s/=== //"`
mvn clean package\
  -Dquarkus.container-image.build=true\
  -Dquarkus.container-image.group=registry.heroku.com/$APP_NAME\
  -Dquarkus.container-image.name=web\
  -Dquarkus.container-image.tag=latest

Fazer o push e o release da imagem

Agora você pode fazer o push da imagem e o realease.

O push inicial é bastante grande, pois todas as camadas da imagem precisam ser transferidas. Os próximos envios serão menores.

Fazendo push pelo Docker

Com o Docker instalado, essas etapas são simples:

docker push registry.heroku.com/$APP_NAME/web
heroku container:release web --app $APP_NAME

Fazendo push através do Podman

Quando você quiser usar o Podman como substituto do Docker, terá alguns problemas porque a CLI do Heroku depende do Docker e não é compatível com o formato OCI. Mas há possíveis soluções para esses problemas.

Não é possível encontrar o docker, verifique se o docker está instalado.

Obviamente, o problema é que o heroku-cli não consegue encontrar o docker. Isso é muito fácil de resolver, pois a cli do podman é compatível com o docker. Só precisamos criar um link simbólico do podman para o docker:

sudo ln -s $(which podman) /usr/local/bin/docker
Erro ao escrever o manifesto: Error uploading manifest latest to registry.heroku.com/$APP_NAME/web: unsupported

Em vez de fazer um podman push normal (formato OCI), precisamos usar uma solução alternativa para fazer push e fazer release do nosso aplicativo por meio do Podman e da CLI do Heroku no formato desejado (v2s2 - Docker Image Manifest Version 2, Schema 2). O skopeo também é necessário.

CONTAINER_DIR="target/container-dir"
mkdir $CONTAINER_DIR
podman push --format=v2s2 "registry.heroku.com/$APP_NAME/web" dir:$CONTAINER_DIR
skopeo --debug copy dir:$CONTAINER_DIR "docker://registry.heroku.com/$APP_NAME/web:latest"
heroku container:release web --app "$APP_NAME"
rm -rf $CONTAINER_DIR

Verifique os logs

Você pode e deve verificar os logs para ver se o aplicativo está realmente sendo executado a partir do contêiner:

heroku logs --app $APP_NAME --tail

Publicar como aplicação nativa dentro de um container

A maior vantagem que temos ao publicar nosso aplicativo como um container é implantar um container com uma aplicação compilada nativamente. Por quê? Porque o Heroku interromperá ou colocará a aplicação em sleep quando não houver tráfego de entrada. Uma aplicação nativa iniciará muito mais rapidamente de sua suspensão.

O processo é praticamente o mesmo. Optamos por compilar uma imagem nativa dentro de um container local, para que não tenhamos que lidar com a instalação do GraalVM localmente:

APP_NAME=`heroku info | grep  "=== .*" |sed "s/=== //"`
mvn clean package\
  -Dquarkus.container-image.build=true\
  -Dquarkus.container-image.group=registry.heroku.com/$APP_NAME\
  -Dquarkus.container-image.name=web\
  -Dquarkus.container-image.tag=latest\
  -Dnative\
  -Dquarkus.native.container-build=true

Depois disso, faça push e release novamente usando o Docker ou o Podman (veja acima) e verifique os registros.

Related content