{"id":31479,"date":"2025-02-14T11:30:00","date_gmt":"2025-02-14T10:30:00","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=31479"},"modified":"2025-02-17T14:12:29","modified_gmt":"2025-02-17T13:12:29","slug":"quarkus-guida-avanzata-per-il-deploy-su-openshift","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/","title":{"rendered":"Quarkus: guida avanzata per il deploy su OpenShift"},"content":{"rendered":"\n<p>Se sei qui, <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-del-software\/quarkus-cosa-sono-le-estensioni-e-come-funzionano\/\">probabilmente hai gi\u00e0 un\u2019idea di cosa sia Quarkus<\/a>. Ma, in poche parole, immagina Java in modalit\u00e0 turbo: leggero, veloce, e pronto per i container! Ora, uniscilo a OpenShift, che \u00e8 praticamente un parco giochi per applicazioni containerizzate, ed eccoti una combo che spacca.<\/p>\n\n\n\n<p>In questa guida ti mostrer\u00f2 non solo come fare il deploy  su OpenShift della tua applicazione Quarkus (lo sappiamo, suona figo, vero?), ma si concentra su tecniche avanzate per ottimizzarla per l&#8217;ambiente OpenShift, garantendo performance, affidabilit\u00e0 e gestione efficiente. Non servono magie, ma solo un po\u2019 di preparazione e voglia di sperimentare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-prima-di-iniziare-i-superpoteri-necessari-nbsp\"><strong>Prima di iniziare: i \u201csuperpoteri\u201d necessari&nbsp;<\/strong><\/h2>\n\n\n\n<p>Per seguire questa guida senza intoppi, assicurati di avere:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>una base su Quarkus e OpenShift. Non ti preoccupare, non serve essere un guru;<\/li>\n\n\n\n<li>un cluster OpenShift pronto all\u2019uso (va benissimo anche la <a href=\"https:\/\/developers.redhat.com\/developer-sandbox\">Developer Sandbox di Red Hat<\/a>, gratuita e super easy).<\/li>\n\n\n\n<li>accesso alla CLI di OpenShift (oc), una JDK 21+, GraalVM 21+ (per la build nativa). Ah, e ovviamente un tool per i container come Docker o Podman;<\/li>\n\n\n\n<li>Apache Maven 3.9.9 (opzionale nel caso di uso del wrapper Maven integrato con il progetto di esempio);<\/li>\n\n\n\n<li>Quarkus CLI 3.17.<\/li>\n<\/ul>\n\n\n\n<p>Riguardo il cluster OpenShift, faremo uso della <a href=\"https:\/\/developers.redhat.com\/developer-sandbox\">Developer Sandbox di Red Hat<\/a>. \u00c8 un ambiente cloud preconfigurato e pronto all\u2019uso che fornisce agli sviluppatori un\u2019opportunit\u00e0 per esplorare, sperimentare e testare le tecnologie Red Hat senza dover configurare un\u2019infrastruttura complessa, di conseguenza senza la necessit\u00e0 di installare o configurare nulla localmente sulle proprie macchine.<\/p>\n\n\n\n<p>Per iniziare a utilizzare la Developer Sandbox di Red Hat, \u00e8 sufficiente registrarsi gratuitamente al seguente&nbsp;<a href=\"https:\/\/developers.redhat.com\/developer-sandbox\">link<\/a>&nbsp;e installare la&nbsp;<a href=\"https:\/\/docs.openshift.com\/container-platform\/4.9\/cli_reference\/openshift_cli\/getting-started-cli.html\">CLI di OpenShift<\/a>&nbsp;necessaria per eseguire il login sul cluster OpenShift fornito dalla Developer Sandbox di Red Hat e opzionalmente per eseguire operazioni sul cluster.<\/p>\n\n\n\n<p>Quelle poche operazioni necessarie sul cluster OpenShift le faremo usando esclusivamente la CLI di OpenShift e in particolare il comando&nbsp;<code>oc<\/code>. Ovviamente, per chi volesse utilizzare l\u2019interfaccia grafica di OpenShift pu\u00f2 farlo accedendo alla Developer Sandbox di Red Hat utilizzando il browser.<\/p>\n\n\n\n<p>Per mettere in pratica ci\u00f2 che sar\u00e0 affrontato nel corso dell&#8217;articolo, faremo riferimento al progetto di esempio <a href=\"https:\/\/github.com\/amusarra\/quarkus-graphql-quickstart\">quarkus-graphql-quickstart<\/a> pubblicato su GitHub; \u00e8 pertanto necessario (o meglio preferibile) il tool <code>git<\/code> per eseguire il clone e un semplice editor di testo a vostro piacimento per le modifiche che apporteremo al progetto nel corso dell&#8217;articolo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-l-estensione-openshift-il-vostro-migliore-amico\">L&#8217;estensione OpenShift: <strong>Il Vostro Migliore Amico<\/strong><\/h2>\n\n\n\n<p>L&#8217;estensione OpenShift di Quarkus \u00e8 come un supereroe che semplifica la vita! Funziona come un &#8220;wrapper&#8221; dell&#8217;estensione Kubernetes, ma con impostazioni predefinite per OpenShift. Questa estensione \u00e8 come il tuo compagno di squadra che fa il lavoro pesante: configura Kubernetes per te e crea tutto ci\u00f2 che ti serve per far partire la tua app. Cosa fa di bello?<\/p>\n\n\n\n<p><strong>Costruzione di immagini container:<\/strong> il plugin OpenShift utilizza build binarie di OpenShift per creare immagini container all&#8217;interno del cluster OpenShift. Invece di usare Docker o Podman, l&#8217;artefatto e le sue dipendenze vengono caricati nel cluster e uniti a un&#8217;immagine builder (di default fabric8\/s2i-java). Questo approccio permette di costruire immagini senza la necessit\u00e0 di un client Docker o di un daemon Docker in esecuzione.<\/p>\n\n\n\n<p><strong>Configurazione:<\/strong> l&#8217;estensione OpenShift aggiunge diverse opzioni di <a href=\"https:\/\/quarkus.io\/guides\/container-image#openshift-options\">configurazione specifiche<\/a>, come la strategia di build (<code>quarkus.openshift.build-strategy<\/code>), l&#8217;immagine base per le build JVM (<code>quarkus.openshift.base-jvm-image<\/code>) e native (<code>quarkus.openshift.base-native-image<\/code>), e la possibilit\u00e0 di specificare Dockerfile personalizzati (<code>quarkus.openshift.jvm-dockerfile<\/code> e <code>quarkus.openshift.native-dockerfile<\/code>).<\/p>\n\n\n\n<p><strong>Risorse OpenShift:<\/strong> l&#8217;estensione si occupa della creazione di oggetti BuildConfig e ImageStream necessari per le build OpenShift. Di default, la build \u00e8 di tipo <strong>s2i binary<\/strong>, prendendo come input il jar creato localmente e producendo un ImageStream che avvia automaticamente un deployment<\/p>\n\n\n\n<p><strong>Deployment automatico:<\/strong> \u00e8 possibile attivare build e deployment in un unico passaggio usando la propriet\u00e0 <code>quarkus.openshift.deploy=true<\/code>. Per esporre automaticamente il servizio, \u00e8 possibile impostare anche <code>quarkus.openshift.route.expose a true<\/code>.<\/p>\n\n\n\n<p><strong>Alternative non-S2I:<\/strong> \u00e8 possibile usare anche altre estensioni per le immagini container come <a href=\"https:\/\/quarkus.io\/guides\/container-image#docker\">container-image-docker<\/a> o <a href=\"https:\/\/quarkus.io\/guides\/container-image#jib\">container-image-jib<\/a>. In questo caso, viene creato un ImageStream che punta a un dockerImageRepository esterno.<\/p>\n\n\n\n<p><strong>Customizzazione:<\/strong> oltre al deployment, \u00e8 possibile personalizzare la creazione di risorse come Deployment, StatefulSet, Job o CronJob attraverso la propriet\u00e0 <code>quarkus.openshift.deployment-kind<\/code>. Si pu\u00f2 anche configurare l&#8217;esposizione di Route, variabili d&#8217;ambiente, volumi persistenti e altro.<\/p>\n\n\n\n<p><strong>Knative (OpenShift Serverless):<\/strong> per usare Knative, \u00e8 necessario impostare <code>quarkus.kubernetes.deployment-target=knative<\/code>. L&#8217;estensione Quarkus pu\u00f2 generare risorse <a href=\"https:\/\/quarkus.io\/guides\/deploying-to-openshift#knative-openshift-serverless\">Knative<\/a>, e usare S2I per costruire l&#8217;immagine container nel cluster.<\/p>\n\n\n\n<p><strong>Client OpenShift:<\/strong> Quarkus fornisce anche le estensioni <a href=\"https:\/\/quarkus.io\/guides\/kubernetes-client\">quarkus-kubernetes-client<\/a> e <a href=\"https:\/\/quarkus.io\/extensions\/io.quarkus\/quarkus-openshift-client\/\">quarkus-openshift-client<\/a> che integrano il <a href=\"https:\/\/developers.redhat.com\/articles\/2023\/01\/04\/how-use-fabric8-java-client-kubernetes\">client Fabric8<\/a> per un accesso programmatico alle API di Kubernetes e OpenShift.<\/p>\n\n\n\n<p>Da questa sintetica overview, \u00e8 abbastanza chiara l&#8217;integrazione profonda con OpenShift di cui vedremo alcuni aspetti nel corso di questo articolo di approfondimento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-il-progetto-di-esempio-quarkus-graphql\">Il Progetto di Esempio: Quarkus GraphQL<\/h2>\n\n\n\n<p>Questo progetto \u00e8 una dimostrazione di un&#8217;applicazione Quarkus che espone dati attraverso una API RESTful tradizionale e una API GraphQL. Il progetto utilizza Hibernate ORM con Panache per la persistenza dei dati e include configurazioni per database H2 (per sviluppo), PostgreSQL (per profili di produzione) e MinIO come Object Store S3.<\/p>\n\n\n\n<p>Lo scopo di questo progetto \u00e8 dimostrare:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integrazione di Quarkus con GraphQL:<\/strong>&nbsp;come esporre un&#8217;API GraphQL per interrogare e manipolare dati.<\/li>\n\n\n\n<li><strong>Integrazione di Quarkus con JPA\/Hibernate:<\/strong>&nbsp;come utilizzare Hibernate ORM con Panache per la persistenza dei dati.<\/li>\n\n\n\n<li><strong>Esposizione di API RESTful:<\/strong>&nbsp;come creare API REST tradizionali per gli stessi dati.<\/li>\n\n\n\n<li><strong>Utilizzo dell&#8217;estensione OpenShift:<\/strong>&nbsp;deploy su OpenShift dell&#8217;applicazione in ambiente K8s.<\/li>\n\n\n\n<li><strong>Gestione di configurazioni multiple:<\/strong>&nbsp;come configurare diverse impostazioni per ambienti di sviluppo e produzione.<\/li>\n<\/ul>\n\n\n\n<p>Il progetto segue la classica architettura a tre strati:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Strato di Persistenza (ORM\/Panache):<\/strong>&nbsp;utilizza Hibernate ORM con Panache per la gestione e la persistenza dei dati nel database.<\/li>\n\n\n\n<li><strong>Strato di Servizio\/API (GraphQL e REST):<\/strong>&nbsp;espone i dati attraverso API GraphQL e API REST, fornendo un&#8217;interfaccia per le interazioni.<\/li>\n\n\n\n<li><strong>Strato di Presentazione (Opzionale):<\/strong>&nbsp;il progetto non include un livello di interfaccia utente dedicato.<\/li>\n<\/ol>\n\n\n\n<p>Il diagramma mostrato a seguire evidenzia la stratificazione dell&#8217;applicazione. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"727\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/Immagine-2025-02-06-122748.png\" alt=\"\" class=\"wp-image-31970\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/Immagine-2025-02-06-122748.png 575w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/Immagine-2025-02-06-122748-237x300.png 237w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/figure>\n<\/div>\n\n\n<p>Per ogni livello dell&#8217;applicazione, vediamo quali sono i componenti principali partendo dalle entit\u00e0 JPA\/Panache che sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Author<\/strong>: rappresenta un autore di libri.<\/li>\n\n\n\n<li><strong>Book<\/strong>: rappresenta un libro, con relazioni Many-to-Many con autori e Many-to-One con editori.<\/li>\n\n\n\n<li><strong>Editor<\/strong>: rappresenta una casa editrice, in relazione One-to-Many con i libri.<\/li>\n<\/ul>\n\n\n\n<p>Il diagramma mostrato a seguire evidenzia le entit\u00e0 sopra descritte e le relazioni. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"427\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-1024x427.png\" alt=\"\" class=\"wp-image-31972\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-1024x427.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-300x125.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-768x320.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-1536x640.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/AAdiagramma-er-entita-1-2048x853.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Per il livello di Servizio\/API, vediamo quali sono i componenti che implementano specificatamente le GraphQL API e REST API.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>BookGraphQL<\/strong>: classe che implementa le query e le mutation GraphQL per i libri e gli autori.\n<ul class=\"wp-block-list\">\n<li>allBooks: Query per recuperare tutti i libri.<\/li>\n\n\n\n<li>getBook: Query per recuperare un singolo libro per ID.<\/li>\n\n\n\n<li>createBook: Mutation per creare un nuovo libro.<\/li>\n\n\n\n<li>addAuthorsToBook: Mutation per aggiungere autori a un libro.<\/li>\n\n\n\n<li>allAuthors: Query per recuperare tutti gli autori.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>BookResource<\/strong>: endpoint REST per la gestione di risorse di libri.\n<ul class=\"wp-block-list\">\n<li>getAll: Recupera tutti i libri.<\/li>\n\n\n\n<li>create: Crea un nuovo libro.<\/li>\n\n\n\n<li>update: Aggiorna un libro esistente.<\/li>\n\n\n\n<li>delete: Elimina un libro.<\/li>\n\n\n\n<li>addAuthors: Aggiunge autori ad un libro.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>FileResources<\/strong>: endpoint REST per la gestione di risorse da memorizzare sull&#8217;Object Store S3. Le risorse potrebbero essere per esempio i file immagine che rappresentano le cover (front e back) dei libri.<\/li>\n<\/ul>\n\n\n\n<p>A seguire \u00e8 mostrato un macro deployment\/component diagram dell&#8217;applicazione Quarkus quarkus-graphql-quickstart.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-1024x683.jpg\" alt=\"\" class=\"wp-image-31976\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-1024x683.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-300x200.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-768x512.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-1536x1025.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-2048x1367.jpg 2048w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/EEEdeployment-diagram-applicazione-quarkus-1-3-600x400.jpg 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Se vuoi saperne di pi\u00f9 sull\u2019app della quale andremo a fare il deploy su OpenShift, dai un\u2019occhiata al progetto su GitHub: <a href=\"https:\/\/github.com\/amusarra\/quarkus-graphql-quickstart\">quarkus-graphql-quickstart<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-come-adeguare-il-progetto-per-openshift\">Come adeguare il progetto per OpenShift<\/h2>\n\n\n\n<p>Quarkus offre la possibilit\u00e0 di generare automaticamente risorse OpenShift in base a valori predefiniti e alla configurazione fornita dall\u2019utente; per ottenere ci\u00f2, \u00e8 necessario apportare alcune modifiche alla configurazione del progetto e in particolare:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>aggiungere la dipendenza&nbsp;<code>quarkus-openshift<\/code>&nbsp;al progetto;<\/li>\n\n\n\n<li>aggiungere la dipendenza per le specifiche&nbsp;<a href=\"https:\/\/github.com\/eclipse\/microprofile-health\/\">MicroProfile Health<\/a>;<\/li>\n\n\n\n<li>configurare il plugin&nbsp;<code>quarkus-openshift<\/code>&nbsp;per generare le risorse OpenShift in modo adeguato.<\/li>\n<\/ol>\n\n\n\n<p>L\u2019estensione OpenShift \u00e8 in realt\u00e0 un\u2019estensione wrapper che configura l\u2019estensione&nbsp;<a href=\"https:\/\/quarkus.io\/guides\/deploying-to-kubernetes\">Kubernetes<\/a>&nbsp;con impostazioni predefinite in modo che sia pi\u00f9 semplice per l\u2019utente iniziare con Quarkus su OpenShift. Le impostazioni predefinite includono la generazione di risorse OpenShift come:&nbsp;<strong>Deployment<\/strong>,&nbsp;<strong>Service<\/strong>,&nbsp;<strong>Route<\/strong>,&nbsp;<strong>ConfigMap<\/strong>,&nbsp;<strong>Secret<\/strong>,&nbsp;<strong>PersistentVolumeClaim<\/strong>&nbsp;e&nbsp;<strong>BuildConfig<\/strong>.<\/p>\n\n\n\n<p>Per aggiungere la dipendenza <code>quarkus-openshift<\/code> al progetto, puoi usare la CLI di Quarkus o Maven. Ecco i comandi per farlo con entrambi.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Aggiungere la dipendenza per il deploy su OpenShift<\/span>\n<span class=\"hljs-comment\"># tramite la CLI di Quarkus<\/span>\nquarkus extension add quarkus-openshift\n\n<span class=\"hljs-comment\"># Aggiungere la dipendenza per il deploy su OpenShift<\/span>\n<span class=\"hljs-comment\"># tramite il comando Maven<\/span>\nmvn quarkus:add-extension -Dextensions=<span class=\"hljs-string\">'quarkus-openshift'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>La nostra <a href=\"https:\/\/quarkus.io\/guides\/deploying-to-openshift#exposing_routes\">applicazione deve essere accessibile fuori dal cluster OpenShift<\/a> e per ottenere ci\u00f2, dobbiamo aggiungere la configurazione mostrata a seguire sul file di configurazione&nbsp;<code>application.properties<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Properties\" data-shcb-language-slug=\"properties\"><span><code class=\"hljs language-properties shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># If true, the service will be exposed outside of the cluster<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># and will be assigned a route.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># If false, the service will only be accessible within the cluster (default)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Environment variable: QUARKUS_OPENSHIFT_ROUTE_EXPOSE<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.route.expose<\/span>=<span class=\"hljs-string\">true<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Properties<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">properties<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Di default, l\u2019applicazione \u00e8 esposta all\u2019esterno via HTTP. Per usare HTTPS, basta configurare l\u2019estensione quarkus-openshift con i dati del certificato e della chiave privata.<\/p>\n\n\n\n<p>\u00c8 utile avere un\u2019idea chiara delle risorse OpenShift\/Kubernetes coinvolte nel deploy. L\u2019estensione quarkus-openshift generer\u00e0 i file YAML relativi all\u2019app. Ecco un diagramma che mostra tutte le risorse usate nel deploy su OpenShift.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/deployment-diagram-k8s-applicazione-quarkus-1024x890.webp\" alt=\"\"\/><\/figure>\n<\/div>\n\n\n<p>Il diagramma mostra un Deployment con il <strong>Pod<\/strong> (o i Pod) dell\u2019applicazione Quarkus, un <strong>Service<\/strong> per esporlo all\u2019interno del cluster e una <strong>Route<\/strong> per renderlo accessibile all\u2019esterno. Sono inclusi anche i servizi esterni come il database PostgreSQL e MinIO Object Store, ma qui ci concentreremo solo sul deploy dell\u2019applicazione.<\/p>\n\n\n\n<p>In un cluster Kubernetes, i pod di ogni deployment comunicano tra loro tramite il Service. Questo \u00e8 importante quando si configura un\u2019applicazione Quarkus, soprattutto per le connessioni ai servizi esterni, come il database PostgreSQL e il servizio di Object Store (MinIO).<\/p>\n\n\n\n<p>L&#8217;estensione&nbsp;<code>quarkus-openshift<\/code>&nbsp;generer\u00e0 automaticamente le risorse OpenShift\/Kubernetes in base alla configurazione fornita dall\u2019utente e alle impostazioni predefinite.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-perche-aggiungere-il-supporto-per-le-specifiche-nbsp-microprofile-health\">Perch\u00e9 aggiungere il supporto per le specifiche&nbsp;MicroProfile Health?<\/h3>\n\n\n\n<p>L\u2019estensione OpenShift di Quarkus usa <a href=\"https:\/\/github.com\/smallrye\/smallrye-health\/\">MicroProfile Health<\/a> per controllare lo stato dell\u2019applicazione e verificare se \u00e8 pronta a ricevere traffico. Questa estensione, fornita da SmallRye Health, \u00e8 fondamentale per le probe di Liveness, Readiness e Startup Probe, concetti chiave per le applicazioni cloud native, soprattutto per l\u2019orchestrazione e gestione dei container in Kubernetes. Ecco un\u2019analisi dell\u2019importanza di ciascuna probe.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Liveness Probe<\/strong>: \u00e8 un meccanismo per determinare se un\u2019applicazione \u00e8 in esecuzione e funzionante. Se l\u2019applicazione non \u00e8 in esecuzione, Kubernetes la riavvier\u00e0. Questo \u00e8 utile per evitare che un\u2019applicazione non funzionante riceva traffico.<\/li>\n\n\n\n<li><strong>Readiness Probe<\/strong>: \u00e8 un meccanismo per determinare se un\u2019applicazione \u00e8 pronta per ricevere il traffico. Se l\u2019applicazione non \u00e8 pronta, Kubernetes non invier\u00e0 traffico all\u2019applicazione. Questo \u00e8 utile per evitare che un\u2019applicazione non pronta riceva traffico.<\/li>\n\n\n\n<li><strong>Startup Probe<\/strong>: \u00e8 un meccanismo per determinare se un\u2019applicazione \u00e8 stata avviata correttamente. Se l\u2019applicazione non \u00e8 stata avviata correttamente, Kubernetes la riavvier\u00e0. Questo \u00e8 utile per evitare che un\u2019applicazione non avviata correttamente riceva traffico.<\/li>\n<\/ol>\n\n\n\n<p>Per aggiungere la dipendenza MicroProfile Health al progetto, puoi usare la CLI di Quarkus o Maven. Ecco i comandi per farlo.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Aggiungere la dipendenza per le specifiche MicroProfile Health<\/span>\n<span class=\"hljs-comment\"># tramite la CLI di Quarkus<\/span>\nquarkus extension add smallrye-health\n\n<span class=\"hljs-comment\"># Aggiungere la dipendenza per le specifiche MicroProfile Health<\/span>\n<span class=\"hljs-comment\"># tramite il comando Maven<\/span>\nmvn quarkus:add-extension -Dextensions=<span class=\"hljs-string\">'smallrye-health'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Importando l\u2019estensione smallrye-health, Quarkus crea automaticamente le probe di Liveness, Readiness e Started per l\u2019applicazione. Queste probe servono al cluster OpenShift (o K8s) per verificare se l\u2019applicazione \u00e8 pronta a ricevere traffico. Al lancio dell\u2019applicazione, saranno disponibili queste probe.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Liveness<\/strong>:&nbsp;<code>\/q\/health\/live<\/code>&nbsp;&#8211; questa probe \u00e8 utilizzata per determinare se l\u2019applicazione \u00e8 in esecuzione e funzionante.<\/li>\n\n\n\n<li><strong>Readiness<\/strong>:&nbsp;<code>\/q\/health\/ready<\/code>&nbsp;&#8211; questa probe \u00e8 utilizzata per determinare se l\u2019applicazione \u00e8 pronta per ricevere il traffico e di conseguenza servire le richieste.<\/li>\n\n\n\n<li><strong>Started<\/strong>:&nbsp;<code>\/q\/health\/started<\/code>&nbsp;&#8211; questa probe \u00e8 utilizzata per determinare se l\u2019applicazione \u00e8 stata avviata correttamente.<\/li>\n\n\n\n<li><strong>Health<\/strong>:&nbsp;<code>\/q\/health<\/code>&nbsp;&#8211; questa probe \u00e8 utilizzata per determinare lo stato generale dell\u2019applicazione.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-aggiungere-il-supporto-per-il-protocollo-https\">Aggiungere il supporto per il protocollo HTTPS<\/h3>\n\n\n\n<p>In questo scenario, garantiamo la sicurezza end-to-end tra il client e l\u2019applicazione, senza affidarsi a dispositivi intermedi. In ambienti distribuiti, come nei microservizi, ci\u00f2 assicura che le <strong>connessioni siano protette fino all\u2019applicazione<\/strong>, non solo fino al gateway.<\/p>\n\n\n\n<p>Ottenere il risultato sopra descritto, significa apportare alcune configurazioni al livello dell&#8217;applicazione e istruire l&#8217;estensione di OpenShift affinch\u00e9 crei le risorse per il cluster in modo adeguato.<\/p>\n\n\n\n<p>Per l&#8217;applicazione e sufficiente indicare il keystore che conterr\u00e0 la coppia di chiavi (privata e pubblica), il tipo, la password di accesso e la posizione.<\/p>\n\n\n\n<p>Per le risorse del cluster OpenShift:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>esposizione dei servizi dell&#8217;applicazione fuori dal cluster attraverso una route;<\/li>\n\n\n\n<li>la target port della route, in questo caso https;<\/li>\n\n\n\n<li>il tipo di terminazione TLS per la route, in questo caso passthrough. Questa configurazione garantisce che la crittografia TLS\/SSL sia gestita internamente dall&#8217;applicazione e che il proxy di OpenShift non tenti di decriptare o criptare il traffico;<\/li>\n\n\n\n<li>la policy da applicare per le connessioni non sicure alla route, in questo caso la policy che imposteremo sar\u00e0 <strong>None<\/strong>. Questo valore indica che le connessioni non sicure sono consentite, e quindi qualsiasi richiesta HTTP che tenta di accedere alla route senza utilizzare HTTPS sar\u00e0 rifiutata;<\/li>\n\n\n\n<li>configurazione del Secret Volume dedicato alla gestione del keystore dell&#8217;applicazione;<\/li>\n\n\n\n<li>configurazione dei nomi delle Secret che contengono le informazioni di accesso al database, all&#8217;object store e al keystore.<\/li>\n<\/ul>\n\n\n\n<p>A seguire la configurazione del keystore da inserire sul file di configurazione dell&#8217;applicazione (<code>application.properties)<\/code> e che riguardano esclusivamente l&#8217;applicazione per gestire correttamente il protocollo HTTPS.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Properties\" data-shcb-language-slug=\"properties\"><span><code class=\"hljs language-properties shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># Setting the key store file<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># For default environment, the key store file is located in the resources folder<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># For prod environment, the key store file is located in the \/security\/keystore folder<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># mounted as a secret volume<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.http.ssl.certificate.key-store-file<\/span>=<span class=\"hljs-string\">app-keystore.p12<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.http.ssl.certificate.key-store-file<\/span>=<span class=\"hljs-string\">\/security\/keystore\/app-keystore.p12<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Setting the key store password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># For default environment, the password is hardcoded<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># For prod environment, the password is managed through a secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># See the file src\/main\/kubernetes\/common.yml where the secret is defined<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.http.ssl.certificate.key-store-password<\/span>=<span class=\"hljs-string\">YXBwLWtleXN0b3JlLnAxMg==<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.http.ssl.certificate.key-store-password<\/span>=<span class=\"hljs-string\">${APP_KEYSTORE_PASSWORD}<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Setting the key store type (PKCS12)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.http.ssl.certificate.key-store-file-type<\/span>=<span class=\"hljs-string\">PKCS12<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Properties<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">properties<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Il keystore si chiama <code>app-keystore.p12<\/code> ed \u00e8 in formato PKCS12. Sono stati usati profili per differenziare le configurazioni tra sviluppo e produzione. Di default, il file <code>app-keystore.p12<\/code> \u00e8 incluso nell\u2019artefatto dell\u2019applicazione e la password \u00e8 predefinita. In produzione (profilo <code>prod<\/code>), il keystore \u00e8 su un volume montato in <code>\/security\/keystore\/<\/code> e la password viene iniettata tramite un Secret.<\/p>\n\n\n\n<p>A seguire la configurazione del keystore dal punto di vista delle risorse OpenShift che sono specifiche dell&#8217;estensione OpenShift.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Properties\" data-shcb-language-slug=\"properties\"><span><code class=\"hljs language-properties shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># If true, the service will be exposed outside the cluster<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># and will be assigned a route.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># If false, the service will only be accessible within the cluster (default)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.route.expose<\/span>=<span class=\"hljs-string\">true<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The target named port. If not provided, it will be deducted<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># from the Service resource ports. Options are: \"http\" and \"https\".<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.route.target-port<\/span>=<span class=\"hljs-string\">https<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">## Route TLS configuration:<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The termination type of the route. Options are: \"edge\",<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># \"reencrypt\", and \"passthrough\".<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.route.tls.termination<\/span>=<span class=\"hljs-string\">passthrough<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The desired behavior for insecure connections to a route.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.route.tls.insecure-edge-termination-policy<\/span>=<span class=\"hljs-string\">None<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Configure the secret volume for the application keystore<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.secret-volumes.\"app-keystore-secret-volume\".secret-name<\/span>=<span class=\"hljs-string\">app-keystore-secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.secret-volumes.\"app-keystore-secret-volume\".items.\"app-keystore.p12\".path<\/span>=<span class=\"hljs-string\">app-keystore.p12<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.secret-volumes.\"app-keystore-secret-volume\".default-mode<\/span>=<span class=\"hljs-string\">0600<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.mounts.\"app-keystore-secret-volume\".path<\/span>=<span class=\"hljs-string\">\/security\/keystore<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.mounts.\"app-keystore-secret-volume\".read-only<\/span>=<span class=\"hljs-string\">true<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The name of the Secret that contains the database URL (that will be contained the username and password)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># and the application keystore password.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.env.secrets<\/span>=<span class=\"hljs-string\">db-username-password,db-url,minio-access-key,app-keystore-password<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Properties<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">properties<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Le configurazioni descritte permettono all\u2019applicazione, eseguita in locale, di esporre gli endpoint HTTPS e fanno s\u00ec che l\u2019estensione OpenShift generi correttamente i file yaml per il deploy delle risorse K8s, garantendo un deploy su OpenShift senza problemi sul cluster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-configurazione-dei-secret\">Configurazione dei Secret<\/h3>\n\n\n\n<p>Nel diagramma di deployment dell\u2019applicazione Quarkus, quest\u2019ultima necessita di accesso a risorse esterne gi\u00e0 disponibili (ad esempio, nel cluster o altrove), e dobbiamo configurare i dati di accesso. Per farlo, useremo i Secret.<\/p>\n\n\n\n<p>I Secret permettono di separare e gestire centralmente le informazioni di configurazione dell\u2019applicazione, in particolare per gestire in modo sicuro dati sensibili come username e password.<\/p>\n\n\n\n<p>Dobbiamo scrivere noi i descrittori YAML dei Secret, poich\u00e9 l\u2019estensione quarkus-openshift non li gestisce. Tuttavia, l\u2019estensione li aggiunger\u00e0 al file YAML finale di deploy dell\u2019applicazione Quarkus, che si trova in <code>target\/kubernetes\/openshift.yml<\/code>.<\/p>\n\n\n\n<p>Metteremo il file <code>common.yml<\/code> nella cartella <code>src\/main\/kubernetes<\/code>. Di seguito, il descrittore YAML dei Secret necessari per il corretto funzionamento dell\u2019applicazione sul cluster OpenShift.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"YAML\" data-shcb-language-slug=\"yaml\"><span><code class=\"hljs language-yaml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-meta\">---<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Secret for the database username and password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">kind:<\/span> <span class=\"hljs-string\">Secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">apiVersion:<\/span> <span class=\"hljs-string\">v1<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">metadata:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">db-username-password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">data:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">db-password:<\/span> <span class=\"hljs-string\">cXVhcmt1cw==<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">db-username:<\/span> <span class=\"hljs-string\">cXVhcmt1cw==<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">type:<\/span> <span class=\"hljs-string\">Opaque<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">---<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Secret for the database URL<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">kind:<\/span> <span class=\"hljs-string\">Secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">apiVersion:<\/span> <span class=\"hljs-string\">v1<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">metadata:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">db-url<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">data:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">db-url:<\/span> <span class=\"hljs-string\">amRiYzpwb3N0Z3Jlc3FsOi8vcG9zdGdyZXNxbDo1NDMyL3F1YXJrdXNfZ3JhcGhxbA==<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">type:<\/span> <span class=\"hljs-string\">Opaque<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">---<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Secret for the keystore password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">kind:<\/span> <span class=\"hljs-string\">Secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">apiVersion:<\/span> <span class=\"hljs-string\">v1<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">metadata:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">app-keystore-password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">data:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">app-keystore-password:<\/span> <span class=\"hljs-string\">WVhCd0xXdGxlWE4wYjNKbExuQXhNZz09<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">type:<\/span> <span class=\"hljs-string\">Opaque<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">---<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Secret for the keystore password<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">kind:<\/span> <span class=\"hljs-string\">Secret<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">apiVersion:<\/span> <span class=\"hljs-string\">v1<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">metadata:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-string\">minio-access-key<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">data:<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">minio-user-access-key:<\/span> <span class=\"hljs-string\">bWluaW8tYWRtaW4=<\/span>\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">minio-user-secret-key:<\/span> <span class=\"hljs-string\">bWluaW8tYWRtaW4=<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-attr\">type:<\/span> <span class=\"hljs-string\">Opaque<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">YAML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">yaml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Al momento del deploy su OpenShift dell&#8217;applicazione sul cluster attraverso il plugin di Quarkus, le Secret sopra indicate saranno create all&#8217;interno del cluster.<\/p>\n\n\n\n<p>Ecco le configurazioni per le due risorse esterne, database e S3 Object Store. I dati di accesso sono protetti dai Secret e saranno resi disponibili al container come variabili di ambiente durante l\u2019esecuzione dell\u2019applicazione.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Properties\" data-shcb-language-slug=\"properties\"><span><code class=\"hljs language-properties shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># PostgreSQL configuration (production)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.datasource.db-kind<\/span>=<span class=\"hljs-string\">postgresql<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.datasource.jdbc.url<\/span>=<span class=\"hljs-string\">${DB_URL}<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.datasource.jdbc.max-size<\/span>=<span class=\"hljs-string\">20<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.datasource.username<\/span>=<span class=\"hljs-string\">${DB_USERNAME}<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.datasource.password<\/span>=<span class=\"hljs-string\">${DB_PASSWORD}<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># ORM configuration (production)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.hibernate-orm.log.sql<\/span>=<span class=\"hljs-string\">false<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># MinIO configuration<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.minio.url<\/span>=<span class=\"hljs-string\">http:\/\/minio<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.minio.port<\/span>=<span class=\"hljs-string\">9000<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.minio.secure<\/span>=<span class=\"hljs-string\">false<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.minio.access-key<\/span>=<span class=\"hljs-string\">${MINIO_USER_ACCESS_KEY}<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">%prod.quarkus.minio.secret-key<\/span>=<span class=\"hljs-string\">${MINIO_USER_SECRET_KEY}<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Properties<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">properties<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Queste configurazioni sono valide solo per il profilo prod. In ambiente di sviluppo (profilo dev), l\u2019applicazione user\u00e0 un database H2 in memoria e il <a href=\"https:\/\/docs.quarkiverse.io\/quarkus-minio\/dev\/dev-services.html\">DevServices di MinIO <\/a>per l\u2019Object Storage S3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-configurazione-delle-base-image\">Configurazione delle base image<\/h3>\n\n\n\n<p>Per il deploy su un cluster OpenShift, useremo la strategia <strong>s2i binary<\/strong> per costruire le immagini container, scegliendo le immagini base per la build JAR (JVM) o per la build nativa.<\/p>\n\n\n\n<p>Le due propriet\u00e0 sono rispettivamente: <code>quarkus.openshift.base-jvm-image<\/code> e <code>quarkus.openshift.base-native-image<\/code>.<\/p>\n\n\n\n<p>Per il progetto di esempio, \u00e8 stata impostata solo la versione pi\u00f9 recente della base image JVM, mentre la versione della base image nativa rimane quella di default.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Properties\" data-shcb-language-slug=\"properties\"><span><code class=\"hljs language-properties shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\"># The base image to be used when a container image is being produced for the jar build.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The value of this property is used to create an ImageStream for the builder image used in<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># the Openshift build. When it references images already available in the internal Openshift<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># registry, the corresponding streams are used instead. When the application is built against<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># Java 21 or higher.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-meta\">quarkus.openshift.base-jvm-image<\/span>=<span class=\"hljs-string\">registry.redhat.io\/ubi9\/openjdk-21:1.21-3.1736923862<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"># The base image to be used when a container image is being produced for the native build.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">#quarkus.openshift.base-native-image=quay.io\/quarkus\/ubi-quarkus-native-binary-s2i:2.0<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Properties<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">properties<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Le immagini base possono essere anche esterne ai registry Red Hat ma devono comunque essere compatibili con il formato S2i.<\/p>\n\n\n\n<p>Le immagini base vengono usate nel processo di build, che non solo crea l\u2019immagine container, ma genera anche un BuildConfig in OpenShift, definendo il processo di build, e un ImageStream che punta alla nuova immagine.<\/p>\n\n\n\n<p>Ecco alcuni estratti dall\u2019output del processo di build, evidenziando i punti salienti.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">...\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Starting (<span class=\"hljs-keyword\">in<\/span>-cluster) container image build <span class=\"hljs-keyword\">for<\/span> jar using: BINARY on server: https:<span class=\"hljs-comment\">\/\/api.rm2.thpm.p1.openshiftapps.com:6443\/ in namespace:antonio-musarra-dev.<\/span>\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: Secret db-username-password\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: Secret db-url\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: Secret app-keystore-password\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: Secret minio-access-key\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: ImageStream openjdk<span class=\"hljs-number\">-21<\/span>\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: ImageStream quarkus-graphql-quickstart\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: BuildConfig quarkus-graphql-quickstart\n...\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Trying to pull registry.redhat.io\/ubi9\/openjdk<span class=\"hljs-number\">-21<\/span>@sha256:<span class=\"hljs-number\">84<\/span>cf3593e0d9f180eab856f24456f2b76dbb05ab072cccec4fd0505862801d40...\n....\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Pushing image image-registry.openshift-image-registry.svc:<span class=\"hljs-number\">5000<\/span>\/antonio-musarra-dev\/quarkus-graphql-quickstart:<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>-SNAPSHOT ...\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Writing manifest to image destination\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Successfully pushed image-registry.openshift-image-registry.svc:<span class=\"hljs-number\">5000<\/span>\/antonio-musarra-dev\/quarkus-graphql-quickstart@sha256:<span class=\"hljs-number\">9<\/span>ac064d89418567e5f80793826f72c51c118838aa72bb3d8d2d229cc254bfded\n&#91;INFO] &#91;io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Push successful\n&#91;INFO] &#91;io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">172792<\/span>ms\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] BUILD SUCCESS\n&#91;INFO] ------------------------------------------------------------------------\n&#91;INFO] Total time:  <span class=\"hljs-number\">03<\/span>:<span class=\"hljs-number\">04<\/span> min\n&#91;INFO] Finished at: <span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-25<\/span>T15:<span class=\"hljs-number\">18<\/span>:<span class=\"hljs-number\">46<\/span>+<span class=\"hljs-number\">01<\/span>:<span class=\"hljs-number\">00<\/span>\n&#91;INFO] ------------------------------------------------------------------------\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ora che abbiamo trattato questo aspetto, possiamo procedere con il deploy su OpenShift della nostra applicazione Quarkus sul cluster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-primo-deploy-su-openshift\">Primo deploy su OpenShift<\/h2>\n\n\n\n<p>Il nostro cluster di riferimento \u00e8 quello della Developer Sandbox di Red Hat. Per il primo deploy su OpenShift, dobbiamo effettuare il login sul cluster usando il comando <code>oc login<\/code>, con la sintassi mostrata di seguito.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Login tramite username e password (richiesta dopo l'esecuzione del comando)<\/span>\noc login -u myusername\n\n<span class=\"hljs-comment\"># Login tramite token (via preferenziale)<\/span>\noc login --token=&lt;tuo-token&gt; --server=&lt;tuo-cluster&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Per ottenere il token di accesso al cluster OpenShift della Developer Sandbox di Red Hat, devi accedere alla Developer Sandbox e cliccare su \u201cCopy Login Command\u201d per copiare il comando di login con il token. Ecco un esempio di comando di login con token.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-1.jpg\" alt=\"\"\/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"278\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1-1024x278.jpg\" alt=\"\" class=\"wp-image-32075\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1-1024x278.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1-300x81.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1-768x208.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1-1536x417.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-2-1.jpg 1540w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Se il login \u00e8 riuscito, vedrete un messaggio simile a quello mostrato di seguito, che indica il nome del cluster OpenShift, l\u2019utente con cui avete effettuato il login e il progetto di default in cui siete loggati.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"231\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-3-1-1024x231.jpg\" alt=\"\" class=\"wp-image-32077\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-3-1-1024x231.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-3-1-300x68.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-3-1-768x173.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/come-ottenere-login-url-3-1.jpg 1310w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Prima di eseguire il deploy su OpenShift dell\u2019applicazione, \u00e8 importante assicurarsi che le risorse esterne, come il database PostgreSQL e MinIO (l\u2019Object Store S3), siano disponibili e accessibili dalla nostra applicazione nel cluster OpenShift.<\/p>\n\n\n\n<p>Per i nostri scopi da sviluppatori, possiamo creare in modo semplice, all&#8217;interno del cluster  OpenShift, tutte le risorse in mancanti.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Database PostgreSQL<\/li>\n\n\n\n<li>Object Store S3 utilizzando l&#8217;implementazione di MinIO<\/li>\n\n\n\n<li>Secret del keystore dell&#8217;applicazione<\/li>\n<\/ul>\n\n\n\n<p>Il comando per creare il servizio del database PostgreSQL \u00e8 mostrato a seguire e fa uso del comando <code>oc new-app<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>oc new-app -e POSTGRESQL_USER=quarkus -e POSTGRESQL_PASSWORD=quarkus \\\n<\/span><\/span><span class='shcb-loc'><span>\t-e POSTGRESQL_DATABASE=quarkus_graphql \\\n<\/span><\/span><span class='shcb-loc'><span>\t--name=postgresql registry.redhat.io\/rhel8\/postgresql-16:1-16.1716485357\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Se l&#8217;esecuzione del comando \u00e8 andata a buon fine, in output dovremmo vedere qualcosa simile a quanto indicato a seguire.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">--&gt; Found container image <span class=\"hljs-number\">2428e44<\/span> (<span class=\"hljs-number\">8<\/span> months old) from registry.redhat.io <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-string\">\"registry.redhat.io\/rhel8\/postgresql-16:1-16.1716485357\"<\/span>\n\n    PostgreSQL <span class=\"hljs-number\">16<\/span>\n    -------------\n    PostgreSQL is an advanced Object-Relational database management system (DBMS). The image contains the client <span class=\"hljs-keyword\">and<\/span> server programs that you<span class=\"hljs-string\">'ll need to create, run, maintain and access a PostgreSQL DBMS server.\n\n    Tags: database, postgresql, postgresql16, postgresql-16\n\n    * An image stream tag will be created as \"postgresql:1-16.1716485357\" that will track this image\n\n--&gt; Creating resources ...\n    deployment.apps \"postgresql\" created\n    service \"postgresql\" created\n--&gt; Success\n    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:\n     '<\/span>oc expose service\/postgresql<span class=\"hljs-string\">'\n    Run '<\/span>oc status<span class=\"hljs-string\">' to view your app.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Per verificare che il pod sia del database PostgreSQL sia in running, \u00e8 sufficiente eseguire il comando <code>oc get<\/code> pods per ottenere un output simile a quello seguente.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME                                  READY   STATUS      RESTARTS   AGE\npostgresql-554cbb58fc-hlfs2           1\/1     Running     0          2m5s<\/code><\/span><\/pre>\n\n\n<p>Il Pod del database \u00e8 in running e cos\u00ec come anche il servizio postgresql in listen sulla porta standard 5432 e che potresti verificare usando il comando <code>oc get svc\/postgresql<\/code> il cui output atteso dovrebbe essere come quello indicato subito a seguire.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE\npostgresql   ClusterIP   172.30.10.240   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">none<\/span>&gt;<\/span>        5432\/TCP   6m10s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Perfetto! Con il servizio del database PostgreSQL abbiamo finito, ora possiamo passare al servizio dell\u2019Object Store S3.<\/p>\n\n\n\n<p>Per creare ci\u00f2 che serve per ottenere un servizio di Object Storage S3 usando l&#8217;implementazione di MinIO, dobbiamo creare le seguenti risorse sul cluster OpenShift.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un Persistent Volume Claim (o PVC) che per gli scopi didattici di questo articolo, \u00e8 sufficiente che sia anche di 50Mi come request storage.<\/li>\n\n\n\n<li>Un Deployment per la configurazione di MinIO in termini di container con risorse pi\u00f9 che sufficienti per un ambiente di sviluppo.<\/li>\n\n\n\n<li>Un Service di nome minio che espone la porta TCP\/IP 9000 per il servizio di Object Storage e la porta TCP\/IP 9090 per la console di amministrazione.<\/li>\n\n\n\n<li> Due Route per esporre all&#8217;esterno del cluster i servizi di MinIO.<\/li>\n<\/ul>\n\n\n\n<p>All&#8217;interno del progetto della nostra applicazione Quarkus di esempio, in <code>src\/main\/kubernetes<\/code>, \u00e8 presente il file <code>minio.yml<\/code>, dove all&#8217;interno sono presenti le descrizioni degli descritti in precedenza.<\/p>\n\n\n\n<p>Eseguendo il comando <code>oc apply -f src\/main\/kubernetes\/minio.yml<\/code>, creeremo all&#8217;interno del cluster OpenShift tutte le risorse necessarie affinch\u00e9 l&#8217;applicazione Quarkus possa usare il servizio dell&#8217;Object Storage S3.<\/p>\n\n\n\n<p> Il lancio del comando precedente, qualora tutto sia eseguito senza errori, dovrebbe riportare in console quanto mostrato a seguire.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">persistentvolumeclaim\/minio-pvc created\ndeployment.apps\/minio created\nservice\/minio created\nroute.route.openshift.io\/minio created\nroute.route.openshift.io\/minio-<span class=\"hljs-built_in\">console<\/span> created<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Eseguendo il comando <code>oc status<\/code>, dovremmo anche vedere se tutto effettivamente sia andato per il verso giusto, vedendo un output simile a quello mostrato di seguito.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">In project antonio-musarra-dev on server https:<span class=\"hljs-comment\">\/\/api.rm2.thpm.p1.openshiftapps.com:6443<\/span>\n\nhttps:<span class=\"hljs-comment\">\/\/minio-antonio-musarra-dev.apps.rm2.thpm.p1.openshiftapps.com to pod port 9000 (svc\/minio)<\/span>\nhttps:<span class=\"hljs-comment\">\/\/minio-console-antonio-musarra-dev.apps.rm2.thpm.p1.openshiftapps.com to pod port 9090<\/span>\n  deployment\/minio deploys quay.io\/minio\/minio:latest\n    deployment <span class=\"hljs-comment\">#1 running for 4 minutes - 1 pod<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ottimo! Tutto \u00e8 andato bene. Anche il servizio dell&#8217;Object Storage S3 \u00e8 operativo.<\/p>\n\n\n\n<p>Un ultimo prerequisito prima del deploy su OpenShift dell\u2019applicazione Quarkus: dobbiamo creare il Secret che conterr\u00e0 il keystore, essenziale per abilitare i servizi esposti tramite il protocollo HTTPS.<\/p>\n\n\n\n<p>Questo tipo di operazione \u00e8 perseguibile, usando il comando: <code>oc create secret generic app-keystore-secret --from-file=app-keystore.p12=src\/main\/resources\/app-keystore.p12<\/code><\/p>\n\n\n\n<p>L&#8217;esecuzione del comando dovrebbe andare a buon fine mostrando il risultato positivo dell&#8217;operazione tramite il messaggio: <code>secret\/app-keystore-secret created<\/code>.<\/p>\n\n\n\n<p>Ci siamo! Non resta altro che eseguire il deploy su OpenShift della nostra applicazione Quarkus di esempio sul cluster OpenShift.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Comando per eseguire il deploy dell'applicazione Quarkus sul<\/span>\n<span class=\"hljs-comment\"># cluster OpenShift usando il maven o la CLI di Quarkus<\/span>\nmvn clean package -Dquarkus.openshift.deploy=<span class=\"hljs-literal\">true<\/span>\nquarkus build -Dquarkus.openshift.deploy=<span class=\"hljs-literal\">true<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Se il processo di build e deploy \u00e8 andato a buon fine, andando su Topology nella console di amministrazione del cluster OpenShift, dovremmo vedere un diagramma simile a quello mostrato nella figura seguente.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"521\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1-1024x521.jpg\" alt=\"\" class=\"wp-image-32079\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1-1024x521.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1-300x153.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1-768x391.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1-1536x782.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/ocp-application-topology-1-1.jpg 1801w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Molto bene! L&#8217;applicazione \u00e8 stata installata correttamente con due Pod attivi (vedi configurazione <code>quarkus.openshift.replicas=2<\/code>). L&#8217;immagine a seguire mostra i due Pod dell&#8217;applicazione con evidenziati le risorse in termini di memoria.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"253\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-1024x253.jpg\" alt=\"\" class=\"wp-image-32082\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-1024x253.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-300x74.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-768x190.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-1536x380.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-jvm-mode-1-2-2048x507.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Ecco il tempo di start-up dell\u2019applicazione in modalit\u00e0 JVM, che \u00e8 di 6.219s. Successivamente, confronteremo questi valori, insieme alla quantit\u00e0 di memoria utilizzata, con la versione nativa dell\u2019applicazione.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">16<\/span>:<span class=\"hljs-number\">53<\/span>,<span class=\"hljs-number\">998<\/span> INFO  &#91;io.quarkus] (main) quarkus-graphql-quickstart <span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>-SNAPSHOT on JVM (powered by Quarkus <span class=\"hljs-number\">3.17<\/span><span class=\"hljs-number\">.7<\/span>) started <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">6.219<\/span>s. Listening on: http:<span class=\"hljs-comment\">\/\/0.0.0.0:8080 and https:\/\/0.0.0.0:8443<\/span>\n<span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">16<\/span>:<span class=\"hljs-number\">53<\/span>,<span class=\"hljs-number\">999<\/span> INFO  &#91;io.quarkus] (main) Profile prod activated.\n<span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">14<\/span>:<span class=\"hljs-number\">16<\/span>:<span class=\"hljs-number\">53<\/span>,<span class=\"hljs-number\">999<\/span> INFO  &#91;io.quarkus] (main) Installed features: &#91;agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-h2, jdbc-postgresql, kubernetes, minio-client, narayana-jta, rest, rest-jackson, smallrye-context-propagation, smallrye-graphql, smallrye-health, vertx]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Anche se non \u00e8 lo scopo di questo articolo, se volessimo testare uno dei servizi dell\u2019applicazione, come le API GraphQL, potremmo eseguire una richiesta utilizzando la cURL seguente.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\">curl -k -X POST https:\/\/&lt;indirizzo-vostra-applicazione&gt;\/api\/graphql \\\n  -H <span class=\"hljs-string\">\"Content-Type: application\/json\"<\/span> \\\n  -d <span class=\"hljs-string\">'{\n    \"query\": \"query { allBooks {\n          title\n          subTitle\n          isbn\n          publication\n          genre\n          pages\n          summary\n          languages\n          formats\n          authors {\n            firstName\n            lastName\n            sex\n            birthDate\n          }\n          editor {\n            name\n          }\n        }\n      }\"\n  }'<\/span> | jq<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L&#8217;output atteso per questa query GraphQL, \u00e8 la lista dei libri che sono presenti attualmente sul database dell&#8217;applicazione. A seguire un estratto.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>{\n<\/span><\/span><span class='shcb-loc'><span>  <span class=\"hljs-attr\">\"data\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"allBooks\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>      {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"title\"<\/span>: <span class=\"hljs-string\">\"Networked neural strategy\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"subTitle\"<\/span>: <span class=\"hljs-string\">\"synthesize customized metrics\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"isbn\"<\/span>: <span class=\"hljs-string\">\"9780785316371\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"publication\"<\/span>: <span class=\"hljs-string\">\"2022-11-05\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"genre\"<\/span>: <span class=\"hljs-string\">\"AI\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"pages\"<\/span>: <span class=\"hljs-number\">412<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"summary\"<\/span>: <span class=\"hljs-string\">\"Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"languages\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>          <span class=\"hljs-string\">\"eng\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>          <span class=\"hljs-string\">\"deu\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        ],\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"formats\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>          <span class=\"hljs-string\">\"EPUB\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>          <span class=\"hljs-string\">\"MOBI\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        ],\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"authors\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>          {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"firstName\"<\/span>: <span class=\"hljs-string\">\"Bob\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"lastName\"<\/span>: <span class=\"hljs-string\">\"Williams\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"sex\"<\/span>: <span class=\"hljs-string\">\"M\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"birthDate\"<\/span>: <span class=\"hljs-string\">\"1968-11-01\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>          },\n<\/span><\/span><span class='shcb-loc'><span>          {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"firstName\"<\/span>: <span class=\"hljs-string\">\"Bob\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"lastName\"<\/span>: <span class=\"hljs-string\">\"Williams\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"sex\"<\/span>: <span class=\"hljs-string\">\"M\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"birthDate\"<\/span>: <span class=\"hljs-string\">\"1968-11-01\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>          },\n<\/span><\/span><span class='shcb-loc'><span>          {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"firstName\"<\/span>: <span class=\"hljs-string\">\"Emily\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"lastName\"<\/span>: <span class=\"hljs-string\">\"Brown\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"sex\"<\/span>: <span class=\"hljs-string\">\"F\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"birthDate\"<\/span>: <span class=\"hljs-string\">\"1990-02-14\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>          },\n<\/span><\/span><span class='shcb-loc'><span>          {\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"firstName\"<\/span>: <span class=\"hljs-string\">\"Emily\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"lastName\"<\/span>: <span class=\"hljs-string\">\"Brown\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"sex\"<\/span>: <span class=\"hljs-string\">\"F\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-attr\">\"birthDate\"<\/span>: <span class=\"hljs-string\">\"1990-02-14\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>          }\n<\/span><\/span><span class='shcb-loc'><span>        ],\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"editor\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>          <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"Global Tech Publications\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        }\n<\/span><\/span><span class='shcb-loc'><span>      }\n<\/span><\/span><span class='shcb-loc'><span>    ]\n<\/span><\/span><span class='shcb-loc'><span>  }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dopo aver testato con successo uno dei servizi della nostra applicazione appena installata sul cluster OpenShift, possiamo sicuramente ritenerci soddisfatti del risultato ottenuto!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-build-e-deploy-della-versione-nativa\">Build e deploy della versione nativa<\/h2>\n\n\n\n<p>La compilazione di un&#8217;immagine nativa con Quarkus pu\u00f2 avvenire in due modi principali: <strong>localmente<\/strong> o <strong>tramite container<\/strong>. La differenza fondamentale tra questi due approcci risiede nell&#8217;ambiente in cui avviene la compilazione e, di conseguenza, nel tipo di eseguibile prodotto.<\/p>\n\n\n\n<p>Quando si esegue una build <strong>localmente<\/strong>, si sfrutta un ambiente di sviluppo che ha installato <strong>GraalVM o Mandrel<\/strong>, strumenti necessari per la compilazione <strong>ahead-of-time (AOT)<\/strong> in codice nativo. In questo caso, il comando di build invoca il compilatore native-image che genera un eseguibile specifico per il sistema operativo su cui si sta lavorando (ad esempio, un eseguibile per Windows, macOS o Linux). Questo approccio richiede una configurazione preliminare dell&#8217;ambiente di sviluppo, con l&#8217;installazione e la configurazione corretta di GraalVM o Mandrel.<\/p>\n\n\n\n<p>D&#8217;altra parte, la compilazione <strong>tramite container<\/strong> non richiede l&#8217;installazione locale di GraalVM o Mandrel. In questo scenario, Quarkus utilizza <strong>Docker o Podman<\/strong> per creare un container in cui avviene la compilazione. Questo container include tutto il necessario, inclusi gli strumenti di compilazione e le dipendenze. La build in container \u00e8 utile per evitare di dover installare GraalVM localmente o per garantire che l\u2019immagine nativa sia compatibile con ambienti Linux, tipici della produzione.<\/p>\n\n\n\n<p>La scelta tra build locale e build tramite container dipende da diversi fattori. La build locale \u00e8 ideale se si vuole un eseguibile nativo compatibile con il sistema operativo di sviluppo e si desidera avere il controllo completo sull\u2019ambiente di compilazione. <\/p>\n\n\n\n<p>La build tramite container \u00e8 pi\u00f9 flessibile, non richiede installazioni locali, particolarmente utile per creare immagini native compatibili con ambienti Linux, comuni nei sistemi di produzione e nelle piattaforme cloud. In entrambi i casi, Quarkus permette di personalizzare il processo di compilazione tramite propriet\u00e0 di configurazione specifiche.<\/p>\n\n\n\n<p>Indipendentemente dal tipo di build, la propriet\u00e0 <code>quarkus.native.enabled<\/code> deve essere impostata a <code>true<\/code> per attivare la compilazione nativa. Inoltre, se si intende eseguire il deploy in OpenShift, \u00e8 necessario includere l&#8217;estensione <code>quarkus-container-image-openshift<\/code>, la quale si occuper\u00e0 di generare le risorse OpenShift necessarie per la build e il deployment, incluso un BuildConfig e un ImageStream.<\/p>\n\n\n\n<p>Per eseguire la build nativa in locale, assicuratevi di aver impostato correttamente le variabili di ambiente <code>GRAALVM_HOME<\/code> e <code>JAVA_HOME<\/code>, in modo che puntino alla directory di installazione.<\/p>\n\n\n\n<p>Una volta configurato l&#8217;ambiente, si pu\u00f2 procedere con la compilazione nativa. Per farlo, \u00e8 necessario attivare il profilo native di Maven. Il comando di build varia a seconda dello strumento di build.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Build nativa locale usando Maven<\/span>\nmvn package -Pnative\n\n<span class=\"hljs-comment\"># Build nativa locale usando Quarkus CLI<\/span>\nquarkus build --native<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Questi comandi avviano il processo di compilazione nativa, che pu\u00f2 richiedere diversi minuti e un&#8217;elevata quantit\u00e0 di memoria. Il risultato della compilazione sar\u00e0 un eseguibile nativo specifico per l&#8217;architettura della macchina di build, che si trover\u00e0 nella directory target (Maven).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Verifica del binario prodotto<\/span>\nfile target\/quarkus-graphql-quickstart-1.0.0-SNAPSHOT-runner\n\n<span class=\"hljs-comment\"># Output del comando file<\/span>\ntarget\/quarkus-graphql-quickstart-1.0.0-SNAPSHOT-runner: Mach-O 64-bit executable arm64<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Perch\u00e9 questo eseguibile non funzionerebbe direttamente su OpenShift?<\/strong> La ragione principale \u00e8 che <strong>OpenShift, come molti ambienti di produzione, gira tipicamente su Linux<\/strong>. Un eseguibile compilato per macOS non \u00e8 compatibile con un sistema operativo Linux e non pu\u00f2 quindi essere eseguito direttamente in un container o in un pod di OpenShift. L&#8217;immagine a seguire mostra infatti che build sta avvenendo per un macchina con architettura armv8-a (arm64). <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"161\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/build-nativa-locale-graalvm-1-1-1024x161.jpg\" alt=\"\" class=\"wp-image-32084\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/build-nativa-locale-graalvm-1-1-1024x161.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/build-nativa-locale-graalvm-1-1-300x47.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/build-nativa-locale-graalvm-1-1-768x120.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/build-nativa-locale-graalvm-1-1.jpg 1517w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p><strong>Per il deployment su OpenShift \u00e8 necessario creare una immagine container<\/strong> che contenga l&#8217;eseguibile nativo e le sue dipendenze. Questo processo si svolge in modo diverso a seconda che si usi o meno l&#8217;estensione quarkus-container-image-openshift. L&#8217;estensione genera un BuildConfig, ImageStream e un Deployment.<\/p>\n\n\n\n<p>Nel caso di build locale su macOS, \u00e8 possibile comunque utilizzare l&#8217;eseguibile prodotto all&#8217;interno di un Dockerfile per creare l&#8217;immagine container da distribuire su OpenShift, ma \u00e8 importante che l&#8217;immagine che verr\u00e0 utilizzata come base per il container sia per Linux. Invece, quando si utilizza <code>quarkus-container-image-openshift<\/code>, la build dell&#8217;immagine container avviene direttamente nel cluster OpenShift tramite s2i (source-to-image). In questo processo, il JAR (o il binario nativo nel caso di build nativa) viene trasferito al cluster OpenShift, dove viene costruita l&#8217;immagine container usando le immagini base specificate in quarkus.openshift.base-jvm-image o quarkus.openshift.base-native-image. Quindi <strong>l&#8217;immagine creata con s2i sar\u00e0 gi\u00e0 compatibile con l&#8217;ambiente Linux di OpenShift<\/strong>.<\/p>\n\n\n\n<p>Per riassumere, sebbene sia possibile creare un eseguibile nativo su macOS, questo non sar\u00e0 direttamente utilizzabile su OpenShift. Per il deploy, \u00e8 necessario creare un&#8217;immagine container usando un Dockerfile o sfruttare l&#8217;estensione quarkus-container-image-openshift, la quale offre un processo di build specifico per OpenShift tramite S2I che crea un&#8217;immagine nativa compatibile con Linux.<\/p>\n\n\n\n<p>Utilizzando quindi l&#8217;opzione <code>-Dquarkus.native.container-build=true <\/code>e <code>-Dquarkus.openshift.deploy=true<\/code> la build sar\u00e0 eseguita in modalit\u00e0 container e l&#8217;immagine container finale costruita direttamente sul cluster OpenShift.<\/p>\n\n\n\n<p>Adesso, il file nativo dell&#8217;applicazione generato \u00e8 per il target corretto: architettura x86-64 Linux.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Bash\" data-shcb-language-slug=\"bash\"><span><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Verifica del binario prodotto<\/span>\nfile target\/quarkus-graphql-quickstart-1.0.0-SNAPSHOT-runner\n\n<span class=\"hljs-comment\"># Output del comando file<\/span>\ntarget\/quarkus-graphql-quickstart-1.0.0-SNAPSHOT-runner: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter \/lib64\/ld-linux-x86-64.so.2, <span class=\"hljs-keyword\">for<\/span> GNU\/Linux 3.2.0, BuildID&#91;sha1]=07b4e3eb12f41264be402bc344fb5e80c1a7bbd8, not stripped<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Bash<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">bash<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Come mostrato nell\u2019immagine seguente, la build dell\u2019immagine nativa finale \u00e8 stata eseguita sul cluster OpenShift grazie al BuildConfig <code>quarkus-graphql-quickstart<\/code>, con il risultato finale dell\u2019immagine nativa <code>quarkus-graphql-quickstart:1.0.0-SNAPSHOT<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"506\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-1024x506.jpg\" alt=\"\" class=\"wp-image-32087\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-1024x506.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-300x148.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-768x380.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-1536x759.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/dettagli-build-on-openshift-1-2-2048x1012.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>L\u2019immagine container della nostra applicazione Quarkus \u00e8 disponibile nell\u2019image repository del cluster OpenShift. Per vedere tutti i dettagli, \u00e8 possibile eseguire il comando <code>oc describe ImageStream\/quarkus-graphql-quickstart<\/code>, il cui output dovrebbe essere simile a quello mostrato di seguito.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Name:\t\t\tquarkus-graphql-quickstart\n<span class=\"hljs-attr\">Namespace<\/span>:\t\tantonio-musarra-dev\n<span class=\"hljs-attr\">Created<\/span>:\t\t<span class=\"hljs-number\">47<\/span> minutes ago\n<span class=\"hljs-attr\">Labels<\/span>:\t\t\tapp.kubernetes.io\/managed-by=quarkus\n\t\t\tapp.kubernetes.io\/name=quarkus-graphql-quickstart\n\t\t\tapp.kubernetes.io\/version=<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>-SNAPSHOT\n\t\t\tapp.openshift.io\/runtime=quarkus\n<span class=\"hljs-attr\">Annotations<\/span>:\t\tapp.openshift.io\/vcs-uri=&lt;&lt;unknown&gt;&gt;\n\t\t\tapp.quarkus.io\/build-timestamp=<span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> - <span class=\"hljs-number\">13<\/span>:<span class=\"hljs-number\">17<\/span>:<span class=\"hljs-number\">17<\/span> +<span class=\"hljs-number\">0000<\/span>\n\t\t\tapp.quarkus.io\/quarkus-version=<span class=\"hljs-number\">3.17<\/span><span class=\"hljs-number\">.7<\/span>\nImage Repository:\t<span class=\"hljs-keyword\">default<\/span>-route-openshift-image-registry.apps.rm2.thpm.p1.openshiftapps.com\/antonio-musarra-dev\/quarkus-graphql-quickstart\nImage Lookup:\t\tlocal=<span class=\"hljs-literal\">true<\/span>\nUnique Images:\t\t<span class=\"hljs-number\">2<\/span>\n<span class=\"hljs-attr\">Tags<\/span>:\t\t\t<span class=\"hljs-number\">1<\/span>\n\n<span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>-SNAPSHOT\n  no spec tag\n\n  * image-registry.openshift-image-registry.svc:<span class=\"hljs-number\">5000<\/span>\/antonio-musarra-dev\/quarkus-graphql-quickstart@sha256:c88d5414a1c4b64c11763dafab2796a690ad1d11c8965c1dfa99bc15f15cb037\n      <span class=\"hljs-number\">23<\/span> minutes ago\n    image-registry.openshift-image-registry.svc:<span class=\"hljs-number\">5000<\/span>\/antonio-musarra-dev\/quarkus-graphql-quickstart@sha256:<span class=\"hljs-number\">391<\/span>f4e5de02197b10fed63ed0df9211297660bf83378a984aa4998102e26fea4\n      <span class=\"hljs-number\">43<\/span> minutes ago<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L\u2019immagine seguente mostra il Pod dell\u2019applicazione Quarkus in modalit\u00e0 nativa in esecuzione. Come si pu\u00f2 notare, l\u2019uso della memoria \u00e8 significativamente inferiore rispetto alla versione in modalit\u00e0 JVM, e anche i tempi di start-up sono decisamente pi\u00f9 rapidi.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"268\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1-1024x268.jpg\" alt=\"\" class=\"wp-image-32089\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1-1024x268.jpg 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1-300x78.jpg 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1-768x201.jpg 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1-1536x401.jpg 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/02\/lista-pod-applicazione-memoria-native-mode-1-1.jpg 1573w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n<\/div>\n\n\n<p>A seguire \u00e8 mostrato il tempo di start-up dell&#8217;applicazione in modalit\u00e0 nativa che \u00e8 di 0.320s. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">13<\/span>:<span class=\"hljs-number\">21<\/span>:<span class=\"hljs-number\">26<\/span>,<span class=\"hljs-number\">143<\/span> INFO  &#91;io.quarkus] (main) quarkus-graphql-quickstart <span class=\"hljs-number\">1.0<\/span><span class=\"hljs-number\">.0<\/span>-SNAPSHOT native (powered by Quarkus <span class=\"hljs-number\">3.17<\/span><span class=\"hljs-number\">.7<\/span>) started <span class=\"hljs-keyword\">in<\/span> <span class=\"hljs-number\">0.320<\/span>s. Listening on: http:<span class=\"hljs-comment\">\/\/0.0.0.0:8080 and https:\/\/0.0.0.0:8443<\/span>\n<span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">13<\/span>:<span class=\"hljs-number\">21<\/span>:<span class=\"hljs-number\">26<\/span>,<span class=\"hljs-number\">143<\/span> INFO  &#91;io.quarkus] (main) Profile prod activated.\n<span class=\"hljs-number\">2025<\/span><span class=\"hljs-number\">-01<\/span><span class=\"hljs-number\">-26<\/span> <span class=\"hljs-number\">13<\/span>:<span class=\"hljs-number\">21<\/span>:<span class=\"hljs-number\">26<\/span>,<span class=\"hljs-number\">143<\/span> INFO  &#91;io.quarkus] (main) Installed features: &#91;agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-h2, jdbc-postgresql, kubernetes, minio-client, narayana-jta, rest, rest-jackson, smallrye-context-propagation, smallrye-graphql, smallrye-health, vertx]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>La compilazione in <strong>immagine nativa con GraalVM<\/strong>, sebbene offra notevoli vantaggi in termini di <strong>tempo di avvio e consumo di memoria<\/strong>, potrebbe non essere la soluzione ideale per tutte le applicazioni Quarkus. Ci sono diverse ragioni per cui la build nativa potrebbe non essere appropriata o potrebbe non funzionare correttamente in determinati scenari. <\/p>\n\n\n\n<p>Per questa applicazione Quarkus di esempio, sono state adottate specifiche configurazioni per garantire che la versione nativa funzioni correttamente. Per approfondire le diverse strategie per migrare da JVM mode (JIT) a AOT, consiglio di esplorare il progetto <a href=\"https:\/\/graalkus.fugerit.org\/book\/\">Graalkus: <em>A Quarkus MicroProfile Demo Migrating from JIT to AOT with GraalVM<\/em>.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-risorse-utili\">Risorse Utili<\/h2>\n\n\n\n<p>Per approfondire ulteriormente gli argomenti trattati in questo articolo e per avere una visione pi\u00f9 completa su Quarkus, OpenShift e le tecnologie correlate, ecco una lista di risorse utili.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Documentazione Ufficiale di Quarkus<\/strong>: <a href=\"https:\/\/quarkus.io\/guides\/\">la guida ufficiale di Quarkus<\/a> \u00e8 una risorsa fondamentale per comprendere appieno il framework. In particolare, le sezioni relative a <strong>container images<\/strong>, <strong>Kubernetes<\/strong> e <strong>OpenShift<\/strong> sono particolarmente rilevanti per gli argomenti trattati. Si possono trovare guide specifiche per la configurazione di OpenShift, per le opzioni delle immagini container e per l&#8217;utilizzo di Knative.<\/li>\n\n\n\n<li><strong>Estensione Quarkus OpenShift<\/strong>: l&#8217;estensione <a href=\"https:\/\/quarkus.io\/guides\/deploying-to-openshift\">quarkus-openshift <\/a>facilita la creazione e la distribuzione di applicazioni Quarkus su OpenShift. Questa estensione agisce come un wrapper configurando l&#8217;estensione Kubernetes con impostazioni predefinite per semplificare l&#8217;avvio dell&#8217;applicazione su OpenShift.<\/li>\n\n\n\n<li><strong>MicroProfile Health<\/strong>: per approfondire le specifiche <a href=\"https:\/\/quarkus.io\/guides\/smallrye-health\">MicroProfile Health<\/a>, si pu\u00f2 fare riferimento alla documentazione di <strong>SmallRye Health<\/strong>. Questa estensione fornisce le probe di Liveness, Readiness e Startup, essenziali per le applicazioni cloud-native.<\/li>\n\n\n\n<li><strong>Client Kubernetes e OpenShift<\/strong>: Quarkus fornisce le estensioni <a href=\"https:\/\/quarkus.io\/guides\/kubernetes-client\">quarkus-kubernetes-client<\/a> e <a href=\"https:\/\/quarkus.io\/extensions\/io.quarkus\/quarkus-openshift-client\/\">quarkus-openshift-client<\/a> che integrano il client Fabric8 per un accesso programmatico alle API di Kubernetes e OpenShift. L&#8217;articolo cita anche un articolo su come utilizzare il client Fabric8.<\/li>\n\n\n\n<li><strong>Red Hat Developer Sandbox<\/strong>: per sperimentare con OpenShift senza dover configurare un&#8217;infrastruttura complessa, si pu\u00f2 utilizzare la <strong><a href=\"https:\/\/developers.redhat.com\/developer-sandbox\">Developer Sandbox di Red Hat<\/a><\/strong>, un ambiente cloud preconfigurato e pronto all&#8217;uso. \u00c8 disponibile un link per registrarsi gratuitamente e per installare la CLI di OpenShift.<\/li>\n\n\n\n<li><strong>Progetto di Esempio<\/strong>: il progetto di esempio <strong><a href=\"https:\/\/github.com\/amusarra\/quarkus-graphql-quickstart\">quarkus-graphql-quickstart<\/a><\/strong> su GitHub \u00e8 una risorsa pratica per vedere in azione i concetti discussi nell&#8217;articolo. Questo progetto include l&#8217;integrazione di Quarkus con GraphQL, JPA\/Hibernate, API RESTful, l&#8217;estensione OpenShift e la gestione di configurazioni multiple.<\/li>\n\n\n\n<li><strong>Repository GitHub quarkus-graphql-quickstart<\/strong>: per maggiori informazioni sull&#8217;applicazione che sar\u00e0 oggetto del deploy su OpenShift, si pu\u00f2 consultare il progetto pubblicato su questo repository https:\/\/github.com\/amusarra\/quarkus-graphql-quickstart GitHub.<\/li>\n\n\n\n<li><strong>Graalkus: A Quarkus MicroProfile Demo Migrating from JIT to AOT with GraalVM<\/strong>: per approfondire le <a href=\"https:\/\/graalkus.fugerit.org\/book\/\">strategie per la migrazione da JVM mode a AOT<\/a>, questo progetto pu\u00f2 essere utile.<\/li>\n<\/ul>\n\n\n\n<p>Queste risorse forniscono una base solida per approfondire la conoscenza di Quarkus e OpenShift, e per affrontare con successo il deployment di applicazioni in ambienti cloud-native.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusioni-missione-deploy-su-openshift-compiuta\">Conclusioni: Missione Deploy su OpenShift Compiuta!<\/h2>\n\n\n\n<p>Siamo arrivati alla fine di questo viaggio nel mondo di Quarkus e OpenShift! Abbiamo fatto un bel po&#8217; di strada insieme, partendo dalle basi fino ad arrivare al deploy della nostra applicazione di esempio. Ma cosa abbiamo imparato di preciso? E soprattutto, <strong>abbiamo raggiunto il nostro obiettivo di far girare la nostra applicazione Quarkus su OpenShift in modo ottimale? La risposta \u00e8 un sonoro s\u00ec!<\/strong><\/p>\n\n\n\n<p>In questo articolo, abbiamo visto passo dopo passo come<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Configurare l&#8217;ambiente:<\/strong> abbiamo preparato il terreno, assicurandoci di avere tutti gli strumenti necessari a portata di mano, dal cluster OpenShift alla CLI, passando per JDK, Maven e gli altri tool indispensabili.<\/li>\n\n\n\n<li><strong>Sfruttare l&#8217;estensione OpenShift:<\/strong> abbiamo scoperto che questa estensione \u00e8 un vero e proprio asso nella manica, semplificando di molto la creazione di immagini container, la configurazione delle risorse OpenShift e il deployment automatico.<\/li>\n\n\n\n<li><strong>Adattare il nostro progetto<\/strong>: abbiamo aggiunto le dipendenze necessarie, in particolare <code>quarkus-openshift<\/code> e <code>smallrye-health<\/code>, e configurato l&#8217;esposizione esterna dell&#8217;applicazione e il supporto per HTTPS.<\/li>\n\n\n\n<li><strong>Gestire la sicurezza:<\/strong> abbiamo imparato a proteggere le informazioni sensibili attraverso l&#8217;uso dei Secret, un aspetto fondamentale per qualsiasi applicazione che vada in produzione.<\/li>\n\n\n\n<li><strong>Configurare le risorse esterne:<\/strong> abbiamo creato le risorse per PostgreSQL e MinIO all&#8217;interno del cluster, indispensabili per il funzionamento della nostra applicazione.<\/li>\n\n\n\n<li><strong>Eseguire il deploy<\/strong>: abbiamo portato a termine il deploy della nostra applicazione, verificando che tutto funzionasse a dovere.<\/li>\n\n\n\n<li><strong>Build e deploy nativo<\/strong>: abbiamo anche esplorato il mondo della build nativa con GraalVM, vedendo come questa possa portare a performance eccezionali, riducendo drasticamente i tempi di startup e l&#8217;uso di memoria.<\/li>\n<\/ul>\n\n\n\n<p>Grazie all&#8217;estensione <code>quarkus-openshift<\/code>, abbiamo automatizzato gran parte del processo di deployment, ottenendo un&#8217;applicazione funzionante su OpenShift in tempi rapidi. <strong>Abbiamo dimostrato che \u00e8 possibile creare applicazioni Quarkus altamente performanti e facilmente gestibili in un ambiente cloud come OpenShift<\/strong>.<\/p>\n\n\n\n<p>Non solo, ma <strong>abbiamo anche appreso come ottimizzare l&#8217;applicazione per il cloud,<\/strong> implementando le <em>probe<\/em> di MicroProfile Health, che sono fondamentali per garantire la stabilit\u00e0 e la resilienza delle nostre applicazioni in ambienti containerizzati. Abbiamo inoltre visto come configurare i <em>Secret<\/em> in modo da proteggere le nostre informazioni sensibili e come configurare la build delle immagini container tramite la strategia s2i.<\/p>\n\n\n\n<p>In definitiva, abbiamo visto che <strong>Quarkus e OpenShift sono un connubio perfetto<\/strong>, capace di semplificare notevolmente il processo di sviluppo e deployment delle applicazioni cloud-native. Quindi, se avevate dubbi, speriamo che questo articolo li abbia spazzati via!<\/p>\n\n\n\n<p>Ora che avete tutte le carte in regola, non vi resta che mettere in pratica quanto appreso e far volare le vostre applicazioni su OpenShift. Buon deploy a tutti!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se sei qui, probabilmente hai gi\u00e0 un\u2019idea di cosa sia Quarkus. Ma, in poche parole, immagina Java in modalit\u00e0 turbo: leggero, veloce, e pronto per i container! Ora, uniscilo a OpenShift, che \u00e8 praticamente un parco giochi per applicazioni containerizzate, ed eccoti una combo che spacca. In questa guida ti mostrer\u00f2 non solo come fare&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/\">Read more<\/a><\/p>\n","protected":false},"author":299,"featured_media":31965,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10269,10263],"tags":[10329,10438],"collections":[11708],"class_list":{"0":"post-31479","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-architettura-del-software","8":"category-backend-it","9":"tag-framework","10":"tag-sviluppo-software-it","11":"collections-dalla-community","12":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Quarkus: guida avanzata per il deploy su OpenShift<\/title>\n<meta name=\"description\" content=\"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quarkus: guida avanzata per il deploy su OpenShift\" \/>\n<meta property=\"og:description\" content=\"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-14T10:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-17T13:12:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Antonio Musarra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Musarra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/\"},\"author\":{\"name\":\"Antonio Musarra\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/8649554e10cf6f48891694be1891475b\"},\"headline\":\"Quarkus: guida avanzata per il deploy su OpenShift\",\"datePublished\":\"2025-02-14T10:30:00+00:00\",\"dateModified\":\"2025-02-17T13:12:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/\"},\"wordCount\":5071,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp\",\"keywords\":[\"Framework\",\"sviluppo software\"],\"articleSection\":[\"Architettura del software\",\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/\",\"name\":\"Quarkus: guida avanzata per il deploy su OpenShift\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp\",\"datePublished\":\"2025-02-14T10:30:00+00:00\",\"dateModified\":\"2025-02-17T13:12:29+00:00\",\"description\":\"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/quarkus-guida-avanzata-per-il-deploy-su-openshift\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/it\\\/backend-it\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Quarkus: guida avanzata per il deploy su OpenShift\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/8649554e10cf6f48891694be1891475b\",\"name\":\"Antonio Musarra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g\",\"caption\":\"Antonio Musarra\"},\"description\":\"Ho iniziato il mio viaggio nel mondo dell'informatica da un Olivetti M24 dotato di un processore Intel 8086 acquistato da mio padre esclusivamente per il suo lavoro. Non ho mai posseduto console di nessun genere (Commodore, Amiga, etc\u2026) e inizialmente quell'enorme scatola mi terrorizzava, terrore durato poco; giorno dopo giorno prendevo rapidamente il controllo fino a quando\u2026. Ho sempre creduto che la condivisione della conoscenza sia un ottimo mezzo per la crescita personale; mi piace condividere le mie competenze attraverso articoli tecnici, progetti open source e pubblicazioni su piattaforme come il mio blog personale https:\\\/\\\/www.dontesta.it.\",\"sameAs\":[\"https:\\\/\\\/www.dontesta.it\"],\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/amusarra\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Quarkus: guida avanzata per il deploy su OpenShift","description":"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/","og_locale":"en_US","og_type":"article","og_title":"Quarkus: guida avanzata per il deploy su OpenShift","og_description":"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2025-02-14T10:30:00+00:00","article_modified_time":"2025-02-17T13:12:29+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp","type":"image\/webp"}],"author":"Antonio Musarra","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Antonio Musarra","Est. reading time":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/"},"author":{"name":"Antonio Musarra","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b"},"headline":"Quarkus: guida avanzata per il deploy su OpenShift","datePublished":"2025-02-14T10:30:00+00:00","dateModified":"2025-02-17T13:12:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/"},"wordCount":5071,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp","keywords":["Framework","sviluppo software"],"articleSection":["Architettura del software","Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/","name":"Quarkus: guida avanzata per il deploy su OpenShift","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp","datePublished":"2025-02-14T10:30:00+00:00","dateModified":"2025-02-17T13:12:29+00:00","description":"Scopri come eseguire il deploy di applicazioni Quarkus su OpenShift con questa guida avanzata, sfruttare al meglio le potenzialit\u00e0 disponibili","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/quarkus-guida-avanzata-per-il-deploy-su-openshift\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"Quarkus: guida avanzata per il deploy su OpenShift"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/8649554e10cf6f48891694be1891475b","name":"Antonio Musarra","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68ceae8da379c8b4cdbe4d25ad5d94f7678e91e07cee64593261baec2ec44a12?s=96&d=mm&r=g","caption":"Antonio Musarra"},"description":"Ho iniziato il mio viaggio nel mondo dell'informatica da un Olivetti M24 dotato di un processore Intel 8086 acquistato da mio padre esclusivamente per il suo lavoro. Non ho mai posseduto console di nessun genere (Commodore, Amiga, etc\u2026) e inizialmente quell'enorme scatola mi terrorizzava, terrore durato poco; giorno dopo giorno prendevo rapidamente il controllo fino a quando\u2026. Ho sempre creduto che la condivisione della conoscenza sia un ottimo mezzo per la crescita personale; mi piace condividere le mie competenze attraverso articoli tecnici, progetti open source e pubblicazioni su piattaforme come il mio blog personale https:\/\/www.dontesta.it.","sameAs":["https:\/\/www.dontesta.it"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-600x600.webp","author_info":{"display_name":"Antonio Musarra","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2025\/01\/DALL\u00b7E-2025-02-06-12.23.27-A-futuristic-server-room-with-glowing-blue-and-red-lights-representing-cloud-computing-and-deployment.-In-the-foreground-a-digital-interface-shows-Q-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Antonio Musarra","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/amusarra\/"},"uagb_comment_info":0,"uagb_excerpt":"Se sei qui, probabilmente hai gi\u00e0 un\u2019idea di cosa sia Quarkus. Ma, in poche parole, immagina Java in modalit\u00e0 turbo: leggero, veloce, e pronto per i container! Ora, uniscilo a OpenShift, che \u00e8 praticamente un parco giochi per applicazioni containerizzate, ed eccoti una combo che spacca. In questa guida ti mostrer\u00f2 non solo come fare&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/299"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=31479"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31479\/revisions"}],"predecessor-version":[{"id":32136,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/31479\/revisions\/32136"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/31965"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=31479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=31479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=31479"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=31479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}