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

Publicando 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:

  • Mais ou menos 1 hour for all modalities

  • Um IDE

  • JDK 17+ instalado com JAVA_HOME configurado corretamente

  • Apache Maven 3.9.12

  • Opcionalmente, o Quarkus CLI se você quiser usá-lo

  • Uma conta do Heroku . Você precisa de pelo menos uma conta Eco para implantar uma aplicação.

  • CLI do Heroku instalada

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

Este guia utilizará como entrada uma aplicação simples criada com as ferramentas do Quarkus:

CLI
quarkus create app org.acme:getting-started-with-heroku
cd getting-started-with-heroku

Para criar um projeto Gradle, adicione a opção --gradle ou --gradle-kotlin-dsl.

Para obter mais informações sobre como instalar e usar a CLI do Quarkus, consulte o guia Quarkus CLI.

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.34.3:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started-with-heroku
cd getting-started-with-heroku

Para criar um projeto Gradle, adicione a opção '-DbuildTool=gradle' ou '-DbuildTool=gradle-kotlin-dsl'.

Para usuários do Windows:

  • Se estiver usando cmd, (não use barra invertida '\' e coloque tudo na mesma linha)

  • Se estiver usando o Powershell, envolva os parâmetros '-D' entre aspas duplas, por exemplo, '"-DprojectArtifactId=getting-started-with-heroku"'

Esse comando criará uma nova aplicação REST no diretório getting-started-with-heroku .

Vamos transformar essa aplicação em um repositório Git:

  1. Mude para o diretório da aplicação: cd getting-started-with-heroku .

  2. Inicialize um novo repositório Git: git init -b main .

  3. Adicione todos os arquivos ao repositório: git add . .

  4. Faça o commit dos arquivos: git commit -a -m 'Initial copy of getting-started' .

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."

Sua aplicação já deve ser executável via heroku local web a partir do diretório raiz do repositório. Você precisa ter executado o mvn package antes para criar o jar executável para que isso seja bem-sucedido.

Agora, vamos criar uma aplicação em sua conta e publicar esse repositório nele:

heroku create

Isso criará um repositório remoto na sua conta do Heroku e também deverá ter adicionado uma url remota do heroku ao seu repositório local, que poderá ser visualizado usando git remote -v :

starksm@Scotts-Mac-Studio getting-started % git remote -v
heroku	https://git.heroku.com/young-shelf-58876.git (fetch)
heroku	https://git.heroku.com/young-shelf-58876.git (push)

Agora, você pode publicar seu aplicativo para o Heroku e abri-lo no navegador.

git push heroku main
heroku open hello

O aplicativo terá um URL gerado e o terminal deverá exibi-lo. O site heroku open hello abre o navegador padrão para acessar o novo aplicativo usando o contexto '/hello'. Essa página deve exibir o texto "hello".

Para acessar o endpoint REST via curl, obtenha o URL do aplicativo no comando heroku info:

heroku info | grep  "Web URL:"
APP_NAME=<https url info>
curl $APP_NAME/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

Precisamos adicionar uma extensão ao nosso projeto para adicionar a capacidade de criar imagens de contêineres:

CLI
quarkus extension add container-image-docker
Maven
./mvnw quarkus:add-extension -Dextensions='container-image-docker'
Gradle
./gradlew addExtension --extensions='container-image-docker'

Em seguida, vamos confirmar essa alteração:

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/=== //"`
./mvnw 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 stack:set container
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/=== //"`
./mvnw 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.

Conteúdo Relacionado