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

Despliegue en Heroku

En esta guía aprenderás a desplegar una aplicación web basada en Quarkus como web-dyno en Heroku.

Esta guía abarca:

  • Actualizar el puerto HTTP de Quarkus

  • Instalar la CLI de Heroku

  • Despliegue de la aplicación en Heroku

  • Desplegar la aplicación como imagen Docker en Heroku

  • Desplegar la aplicación nativa como imagen Docker en Heroku

Requisitos previos

To complete this guide, you need:

Introducción

Heroku is a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud. It supports several languages like Java, Ruby, Node.js, Scala, Clojure, Python, PHP, and Go. In addition, it offers a container registry that can be used to deploy prebuilt container images.

Heroku se puede utilizar de diferentes maneras para ejecutar una aplicación Quarkus:

  • Como un programa Java simple que se ejecuta en un contenedor definido por el entorno de Heroku

  • Como un programa Java en contenedor que se ejecuta en un contenedor definido por el proceso de construcción de Quarkus

  • Como un programa nativo en contenedor que se ejecuta en un contenedor definido por el proceso de construcción de Quarkus

Los tres enfoques necesitan conocer el puerto que Heroku le asigna para manejar el tráfico. Por suerte, hay una propiedad de configuración dinámica para ello.

La guía asume que tienes la CLI de Heroku instalada.

Configuración del proyecto común

Esta guía tomará como entrada una aplicación desarrollada en la guía de inicio.

Asegúrate de tener a mano la aplicación de inicio, o clona el repositorio Git: git clone https://github.com/quarkusio/quarkus-quickstarts.git o descargue un archivo. La solución se encuentra en el directorio getting-started.

Heroku can react on changes in your repository, run CI and redeploy your application when your code changes. Therefore, we start with a valid repository already.

Además, asegúrate de que tu CLI de Heroku está funcionando:

heroku --version
heroku login

Preparar el puerto HTTP de Quarkus

Heroku escoge un puerto al azar y lo asigna al contenedor que eventualmente ejecuta tu aplicación Quarkus. Ese puerto está disponible como una variable de entorno en $PORT. La forma más fácil de hacer que Quarkus en todos los escenarios de despliegue lo conozca es utilizando la siguiente configuración:

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

Esto se lee como: "Escuchar en $PORT si esta es una variable definida, de lo contrario escuchar en 8080 como de costumbre". Ejecute lo siguiente para añadir esto a su application.properties:

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

Desplegar el repositorio y construir en Heroku

La primera variante utiliza la construcción de Quarkus Maven para crear la estructura de la aplicación quarkus-app que contiene el "fast-jar" ejecutable, así como todas las bibliotecas necesarias dentro de la infraestructura de construcción de Heroku y luego desplegar ese resultado, el otro utiliza un proceso de construcción local para crear un contenedor optimizado.

Se necesitan dos archivos adicionales en el directorio raíz de su aplicación:

  • system.properties para configurar la versión de Java

  • Procfile para configurar cómo Heroku inicia su aplicación

Quarkus necesita JDK 11, así que lo especificamos primero:

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

Vamos a desplegar una aplicación web por lo que necesitamos configurar el tipo web en el Heroku Procfile así:

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

Su aplicación ya debería poder ejecutarse a través de heroku local web.

Vamos a crear una aplicación en tu cuenta y a desplegar ese repositorio en ella:

heroku create
git push heroku master
heroku open

La aplicación tendrá un nombre generado y el terminal debería mostrarlo. heroku open abre su navegador por defecto para acceder a su nueva aplicación.

Para acceder al endpoint REST mediante curl, ejecute:

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

Por supuesto, también puedes utilizar la CLI de Heroku para conectar este repositorio a tu cuenta de GitHub, pero esto está fuera del alcance de esta guía.

Desplegar como contenedor

La ventaja de subir un contenedor completo es que tenemos un control total sobre su contenido y podemos incluso elegir desplegar un contenedor con un ejecutable nativo que se ejecute en GraalVM.

En primer lugar, inicie sesión en el registro de contenedores de Heroku:

heroku container:login

Necesitamos añadir una extensión a nuestro proyecto para construir imágenes de contenedores a través del plugin de Quarkus Maven:

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

La imagen que vamos a construir necesita ser nombrada en consecuencia para trabajar con el registro y el despliegue de Heroku. Obtenemos el nombre generado a través de heroku info y lo pasamos a la construcción (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

Con Docker instalado, ahora puedes empujar la imagen y liberarla:

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

Puede y debe comprobar los registros para ver si su aplicación se está ejecutando desde el contenedor:

heroku logs --app $APP_NAME --tail

La subida inicial es bastante grande, ya que hay que transferir todas las capas de la imagen. Los siguientes subidas serán más pequeños.

La mayor ventaja que obtenemos al desplegar nuestra aplicación como contenedor es desplegar un contenedor con la aplicación compilada de forma nativa. ¿Por qué? Porque Heroku detendrá o dormirá la aplicación cuando no haya tráfico entrante. Una aplicación nativa se despertará mucho más rápido de su reposo.

El proceso es prácticamente el mismo. Optamos por compilar una imagen nativa dentro de un contenedor local, para no tener que lidiar con la instalación de 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\
  -Pnative\
  -Dquarkus.native.container-build=true

Después, suba y publique de nuevo:

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