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_HOMEconfigurado 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.
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:
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:
-
Mude para o diretório da aplicação:
cd getting-started-with-heroku. -
Inicialize um novo repositório Git:
git init -b main. -
Adicione todos os arquivos ao repositório:
git add .. -
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.propertiespara configurar a versão do Java -
Procfilepara 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:
quarkus extension add container-image-docker
./mvnw quarkus:add-extension -Dextensions='container-image-docker'
./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:
|
|
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.
|
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.