Come distribuire un’applicazione Express.js?

How to Deploy a ExpressJS Application_
How to Deploy a ExpressJS Application_

La scelta della giusta opzione di distribuzione è essenziale per garantire che l’applicazione possa scalare facilmente in base alla sua crescita. Questo articolo esplora le diverse opzioni di distribuzione disponibili per le applicazioni Express.js. In particolare, si concentra su come distribuire le applicazioni Express.js in un container Back4app.

Che cos’è Express.js?

Express è un framework leggero e inopinabile costruito sopra Node.js che semplifica il processo di costruzione di API complesse per il web e il mobile.

Offre un semplice sistema di routing che consente di definire facilmente gli endpoint per le rotte API e di mapparli alle funzioni di gestione.

Dispone inoltre di un supporto middleware che consente di aggiungere funzionalità come la registrazione, l’autenticazione e la gestione degli errori nel ciclo richiesta-risposta.

Vantaggi dell’utilizzo di Express.js

Alcuni dei vantaggi dell’utilizzo di Express sono:

  • Minimalista e semplice da usare: Express.js astrae la complessità di alcune funzioni di Node.js, come il routing. Fornisce un modo semplice di gestire le richieste e le risposte delle API.
  • Altamente estensibile: Express.js ha un’ampia comunità che si traduce in un vasto ecosistema di pacchetti NPM ed estensioni che si possono facilmente integrare nelle applicazioni.
  • Altamente performante: grazie al suo design minimale e allo sfruttamento dell’architettura non bloccante e guidata dagli eventi di Node, Express è altamente performante.
  • Forte supporto della comunità: Express.js esiste dal 2010. In questo lasso di tempo, molti sviluppatori lo hanno adottato. C’è quindi una grande comunità che si sta formando con Express e che può aiutarvi se vi bloccate. Inoltre, ci sono molti articoli, tutorial e documenti ben scritti che spiegano il funzionamento di Express.

Svantaggi di Express.js

Di seguito sono elencati alcuni degli svantaggi di Express.js:

  • Inopinabile: Rispetto a framework come Nest.js, Express.js è molto libero da opinioni. Questa mancanza di opinioni significa che è necessario prendere decisioni sulla struttura e sull’organizzazione del progetto, il che può essere noioso, soprattutto quando si hanno più modi di fare le cose.
  • Mancano le funzioni integrate: Express.js non è preconfigurato e per le funzioni più avanzate, come il logging, è necessario installare dipendenze aggiuntive.

Opzioni di distribuzione di Express.js

Infrastruttura come servizio (IaaS)

L’Infrastructure as a Service è un servizio di cloud computing che offre risorse di calcolo, rete e archiviazione su Internet su richiesta.

Con lo IaaS, l’utente è responsabile del provisioning e della configurazione delle risorse per l’applicazione, mentre il provider IaaS gestisce l’infrastruttura fisica sottostante. Ad esempio, se si desidera distribuire un’applicazione Express, è possibile creare e configurare una macchina virtuale sul provider IaaS di propria scelta.

Sulla macchina virtuale è necessario installare le dipendenze necessarie, come Node e npm, quindi aggiungere il codice Express alla macchina virtuale. È quindi possibile avviare l’applicazione Express sulla macchina virtuale e sarà accessibile via Internet.

Uno dei principali vantaggi dell’IaaS è il livello di controllo che offre. È possibile personalizzare la CPU, la memoria e le risorse di storage della macchina virtuale in base alle esigenze della propria applicazione.

Tuttavia, è importante considerare alcuni aspetti negativi di questo approccio.

La gestione dell’infrastruttura e delle risorse in funzione della scalabilità delle applicazioni e delle variazioni della domanda può essere complessa e richiedere molto tempo.

Alcuni dei più noti fornitori di IaaS includono:

  • Microsoft Azure
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)

Contenitore come servizio (CaaS)

Container as a Service (CaaS) è un modulo di servizio cloud che astrae dall’infrastruttura sottostante consentendo di distribuire ed eseguire rapidamente applicazioni containerizzate.

Per distribuire l’applicazione Express a un provider CaaS, si impacchettano il codice, le dipendenze e il runtime necessari per eseguire l’applicazione in un contenitore utilizzando uno strumento di containerizzazione come Docker. Una volta creato il contenitore, lo si distribuisce. Il provider CaaS fornisce e gestisce l’infrastruttura necessaria per l’esecuzione del contenitore.

Il vantaggio principale dell’utilizzo di CaaS è che l’alto livello di astrazione semplifica l’implementazione, poiché non ci si deve preoccupare di configurare l’infrastruttura di basso livello. Ci si può invece concentrare sulla creazione della logica dell’applicazione. Inoltre, la containerizzazione assicura che l’applicazione venga eseguita in modo coerente in più ambienti.

Alcuni dei più noti fornitori di CaaS includono:

  • Back4app Containers
  • Amazon Elastic Container Service (ECS)
  • Google Kubernetes Engine (GKE)

Come distribuire un’applicazione Express in un contenitore Back4app

Prerequisiti

Per seguire questa esercitazione, assicuratevi di disporre di quanto segue:

  • Node.js è installato sul computer.
  • Un account GitHub.
  • Docker installato sul computer. In caso contrario, visitare il sito di Docker e installare Docker desktop.
  • Conoscenza operativa di Express.js.

Panoramica dei contenitori Back4app

Back4app containers è una piattaforma che automatizza la distribuzione gestendo per voi l’infrastruttura lato server.

Alcune delle caratteristiche dei contenitori Back4app sono le seguenti:

  • Integrazione con GitHub: È possibile collegare i repository GitHub a Back4app, consentendo il deploy automatico dell’applicazione quando la base di codice viene modificata.
  • Distribuzione Docker: È possibile utilizzare Docker, un popolare strumento di containerizzazione, per impacchettare il codice dell’applicazione in un contenitore. Questo assicura che l’applicazione funzioni in modo prevedibile in tutti gli ambienti.
  • Distribuzioni automatiche: Una volta collegato il repository GitHub a Back4app, ogni push di codice al ramo predefinito attiverà la distribuzione.
  • Tracciamento dell’implementazione in tempo reale: È possibile visualizzare lo stato e l’avanzamento delle implementazioni.
  • Monitoraggio delle applicazioni in tempo reale
  • Aggiornamenti senza tempi morti

Introduzione al progetto

In questa guida, illustreremo il processo di distribuzione di un’applicazione Express su Back4app. Per prima cosa, creeremo una semplice API REST Express con un singolo endpoint, la dockerizzeremo con Docker e la invieremo a GitHub. Quindi la distribuiremo in un contenitore Back4app.

Creare una semplice API Express

Per creare un’applicazione Express, procedere come segue:

  1. Eseguire il seguente comando nel terminale per inizializzare un nuovo progetto Node.js.
npm init

Questo comando chiederà di inserire i dettagli dell’applicazione, come il nome del pacchetto, la versione, la descrizione, il punto di ingresso, l’autore e la licenza. Una volta risposto, verrà creato un file package.json con queste configurazioni.

Per utilizzare le configurazioni predefinite, utilizzare il flag -y come mostrato di seguito:

npm init -y
  • Installare Express come dipendenza eseguendo questo comando.
npm install express
  • Nella radice della cartella del progetto, creare un file index.js. Se si è specificato un altro nome per il file di ingresso, usarlo.
  • Aprire il file index.js e creare un’istanza dell’applicazione Express.
const express = require('express');
const app = express();
  • Aggiungere un gestore di rotte per gestire le richieste GET all’endpoint “/”.
app.get("/", (req, res) => {
  res.json({
    message: "Success",
  });
});

Questo endpoint invia un messaggio JSON come risposta.

  • Definire il numero di porta e ascoltare le richieste in arrivo sulla porta specificata.
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`App listening at <http://localhost>:${port}`);
});

Si noti che process.env.PORT si riferisce a una variabile d’ambiente denominata PORT. Se questo valore non è definito nel file .env, l’applicazione utilizzerà il valore 3000.

  • Eseguire il seguente comando per avviare il server Express.
node index.js

Se visitate http://localhost:3000/api sul vostro browser, dovreste ricevere la seguente risposta.

{
  "message": "Success!"
}

Questo è un esempio molto elementare di API Express; un’applicazione reale sarebbe più complessa con più endpoint, dati esterni, middleware, ecc.

Per gli scopi di questo articolo, questo è sufficiente per dimostrare come si può distribuire un’applicazione Express dockerizzata.

Dockerizzazione dell’applicazione Express

La dockerizzazione di un’applicazione Express.js si riferisce alla creazione di un contenitore Docker per facilitare l’esecuzione dell’applicazione in ambienti diversi.

Che cos’è Docker?

Docker è uno strumento open-source che consente di impacchettare l’applicazione, il suo runtime, le librerie e le dipendenze in un ambiente container isolato e portatile.

Incapsulando l’applicazione all’interno di questo contenitore, Docker fornisce un ambiente coerente per l’esecuzione dell’applicazione, indipendentemente dal sistema host sottostante.

In questo modo si elimina il problema “funziona sulla mia macchina”. È possibile lavorare sull’applicazione Express nell’ambiente locale, containerizzarla e distribuirla in più ambienti senza preoccuparsi dei problemi di compatibilità.

Installare Docker

Docker può essere eseguito su diverse piattaforme, tra cui macOS, Windows e Linux. È possibile scaricare e installare Docker per il proprio sistema operativo dal sito web ufficiale.

Come eseguire la dockerizzazione di un’applicazione Express.js

Una volta installato Docker, è necessario dockerizzare l’applicazione, cioè impacchettarla in un contenitore Docker.

Seguire i passaggi indicati di seguito:

  • Nella radice del progetto, creare un file chiamato Dockerfile. Questo file contiene le istruzioni per costruire l’immagine Docker dell’applicazione Express.
  • Di solito, quando si crea un file Docker, la prima cosa da fare è specificare un’immagine di base. Un’immagine di base è un’immagine precostituita che funge da punto di partenza per l’immagine dell’applicazione e di solito contiene istruzioni minime per l’esecuzione dell’applicazione.
  • Nel file Docker, è possibile fornire istruzioni e configurazioni che verranno eseguite su questa immagine. È possibile creare un’immagine di base personalizzata, ma Docker dispone di immagini ufficiali che sono sufficienti nella maggior parte dei casi.
  • In questa guida, utilizzeremo l’immagine di base del nodo, in particolare la variante Alpine, di dimensioni ridotte. Specifichiamo questa immagine di base nel file Docker aggiungendo quanto segue.
FROM node:20-alpine

Qui, node:20-alpine è preinstallato con la versione 20 di Node.js.

  • Aggiungere la riga seguente per impostare la cartella di lavoro all’interno del contenitore.
WORKDIR /usr/src/app
  • Copiare package.json e package-lock.json nella cartella di lavoro. Questi elencano tutte le dipendenze che Docker deve installare.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Aggiungere il comando per l’installazione delle dipendenze.
RUN npm install
  • Copiare il resto del codice nella cartella di lavoro del contenitore.
COPY . .
  • Esporre il numero di porta a cui l’applicazione Express si rivolge. In questo caso, la porta 3000.
expose 3000
  • Aggiungere il comando per l’avvio dell’applicazione.
CMD["node", "index.js"]

Complessivamente, il file Docker dovrebbe avere questo aspetto:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "node", "index.js" ]

Aggiungere un file .dockerignore

Un file .dockerignore specifica i file che Docker deve ignorare. Aiuta a ridurre le dimensioni dell’immagine Docker consentendo di ignorare i file non necessari. Consente inoltre di nascondere i file sensibili dall’immagine.

Per aggiungerlo al progetto, creare un file alla base del progetto e chiamarlo.dockerignore. Aggiungervi i seguenti contenuti.

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

Il file di cui sopra impedisce che i file git, i moduli node, i log e le variabili env vengano copiati nell’immagine Docker.

Creare l’immagine Docker in locale

Nella cartella del progetto, eseguire il seguente comando per creare l’immagine Docker.

docker build -t docker-express-api .

Il flag -t sta per tag e consente di dare all’immagine docker un nome significativo. Il punto (.) alla fine indica a Docker di cercare il file Docker nella directory corrente e di eseguire le istruzioni al suo interno.

Eseguire l’immagine Docker in locale

Una volta creata l’immagine Docker, utilizzatela per eseguire l’applicazione Express con il seguente comando:

docker run -p 3000:3000 docker-express-api

Qui -p 3000:3000 mappa la porta 3000 del localhost alla porta 3000 del contenitore. Si dovrebbe essere in grado di accedere all’applicazione visitando http://localhost:3000 nel browser.

Per visualizzare l’istanza Docker in esecuzione, utilizzare il seguente comando:

docker ps

Per arrestare l’istanza, eseguire:

docker stop docker-express-api

Distribuzione di un’applicazione Express Dockerizzata nel contenitore Back4app

Ora che ci siamo assicurati che l’immagine Docker venga eseguita localmente, dobbiamo distribuirla su Back4app.

Spingere l’applicazione Express su GitHub

Backapp distribuisce l’applicazione da GitHub. Pertanto, è necessario spingere il repository dell’applicazione su GitHub seguendo i passaggi seguenti:

  • Collegatevi al sito GitHub e accedete al vostro account.
  • Dopo aver effettuato l’accesso, individuare l’icona “+” nell’angolo superiore destro della pagina e fare clic su di essa. Dal menu a discesa, selezionare “Nuovo repository”.
  • Nella pagina “Crea un nuovo repository”, assegnare un nome al repository. Per questa guida, useremo “express-api”. Fare clic sul pulsante “Crea nome repository”. Ricordare l’URL del repository nella pagina successiva, in quanto sarà necessario per il push del repository locale su GitHub.

Sul computer locale, navigare nella cartella del progetto ed eseguire il seguente comando per inviare l’applicazione al repository remoto su GitHub.

git remote add origin <https://github.com/remigathoni/express-api.git>
git branch -M main
git push -u origin main

Dovreste essere in grado di visualizzare i file della vostra applicazione nel repository GitHub.

Distribuzione dell’applicazione Express

Seguite i passaggi seguenti per distribuire l’applicazione su Back4app:

  • Andate su Back4app e registrate un account. Se avete già un account, accedete. Back4app vi reindirizzerà alla dashboard dopo l’autenticazione.
  • Nella dashboard, fare clic sul pulsante Costruisci una nuova applicazione. Verranno presentate due opzioni: Backend as a Service e Container as a Service. BaaS si occupa del backend per conto dell’utente, mentre CaaS consente di distribuire l’applicazione in un ambiente containerizzato. Dato che vogliamo distribuire solo l’applicazione, facciamo clic su Containers as a Service.
Creare un nuovo contenitore come applicazione di servizio
  • Alla richiesta, concedete a Back4app l’accesso al vostro account GitHub e selezionate il repository Express.
Selezionare l'applicazione Express dockerizzata
  • Assegnare un nome all’applicazione distribuita. In questa guida, utilizzeremo “Deployed Express API”. È inoltre possibile impostare ulteriori opzioni di distribuzione, come il ramo predefinito, la directory principale, lo stato di distribuzione automatica, sì o no, e le variabili d’ambiente.
Distribuire l'applicazione Express.js su
  • Fare clic sul pulsante Crea app per finalizzare il processo di distribuzione.

Ora avete distribuito gratuitamente la vostra applicazione Express su Back4app.

Come ottimizzare l’immagine Docker

È fondamentale ottimizzare le dimensioni dell’immagine docker per i seguenti motivi:

  • Prestazioni migliorate: Un’immagine piccola non include livelli non necessari che devono essere eseguiti. Ciò si traduce in tempi di avvio più rapidi.
  • Distribuzione più rapida: Le immagini più piccole si distribuiscono più velocemente.
  • Minor consumo di risorse: Le immagini più piccole consumano meno spazio su disco e memoria durante l’esecuzione.
  • Maggiore sicurezza: Escludendo librerie e dipendenze non necessarie, le immagini più piccole riducono la superficie di attacco dell’applicazione.

Per ottimizzare l’immagine Docker di Express.js, possiamo usare una compilazione in più fasi.

Le compilazioni in più fasi consentono di separare l’ambiente di compilazione dall’ambiente di runtime. È possibile creare l’applicazione nella fase di compilazione e poi copiare solo i file necessari nella fase di produzione finale.

Tornando all’applicazione Express, possiamo definire due fasi: la fase di compilazione, dove installeremo le dipendenze, e la pagina di produzione, dove creeremo l’immagine di runtime.

Creazione della fase di costruzione

Seguire le istruzioni seguenti per definire la fase di costruzione:

  • Cancellare tutto il contenuto del file Docker e definire lo stadio di compilazione dall’immagine di base.
FROM node:20-alpine AS build

Il nome di una tappa viene aggiunto all’istruzione FROM con la dicitura AS name-of-stage. Si noti inoltre che le immagini della base alpina sono molto più piccole delle immagini del nodo:.

  • Definire la directory di lavoro.
WORKDIR /usr/src/app
  • Copiare i file package.json e package-lock.json nel contenitore.
COPY package*.json ./
  • Installare le dipendenze di sviluppo.
RUN npm install --only=development
  • Copiare il codice dell’applicazione nella fase di compilazione.
COPY . .
  • Eseguire l’applicazione.
CMD ["node", "index.js"]

Il comando da eseguire dipende dal progetto. Ad esempio, se si è utilizzato TypeScript per costruire l’applicazione, potrebbe essere necessario eseguire la transpilazione dell’applicazione.

Creazione della fase di produzione

Nella seconda fase, si copieranno solo i file dell’applicazione costruita dalla fase di compilazione. Seguire i passaggi seguenti:

  • Aggiungere l’immagine di base di Node.js e denominarla production.
# Production Stage
FROM node:20-alpine AS production
  • Impostare la directory di lavoro.
WORKDIR /usr/src/app
  • Copiare i file necessari dal “Build Stage” specificando --from=build nell’istruzione COPY. Poiché non esiste un comando di compilazione, copiamo tutto direttamente.
COPY --from=build /usr/src/app .
  • Esporre la porta su cui l’applicazione Express è in ascolto.
EXPOSE 3000
  • Avviare l’applicazione Express.
CMD ["node", "index.js"]

Dopo aver creato il file Docker, inviate le vostre modifiche a GitHub e Back4app provvederà a distribuire automaticamente l’applicazione.

Se si desidera visualizzare il codice di questo articolo, consultare il repository GitHub dell’applicazione.

Conclusione

Express.js è un framework Node.js leggero e inopinabile. Aiuta gli sviluppatori a creare API veloci e minimali per applicazioni web e mobili.

Quando si tratta di distribuire applicazioni Express, avete a disposizione diverse opzioni, tra cui le piattaforme Infrastructure as a Service (IaaS) e Container as a Service (CaaS).

Le piattaforme IaaS sono più adatte quando si desidera il massimo controllo sull’infrastruttura server sottostante, mentre CaaS è una buona scelta quando si vuole passare rapidamente dallo sviluppo alla produzione senza dover gestire manualmente l’infrastruttura.

Uno dei migliori fornitori di CaaS è Back4app containers. Back4app gestisce e monitora la distribuzione dell’applicazione per conto del cliente, lasciandolo libero di concentrarsi sulla realizzazione delle funzionalità dell’applicazione.

In questa guida abbiamo imparato a dockerizzare un’applicazione Express.js e a distribuirla in un container Back4app. Per saperne di più, visitate la documentazione sui contenitori Back4app.

FAQ

Che cos’è Express.js?

Express è un framework leggero e senza opinioni basato su Node.js che semplifica il processo di creazione di API web e mobili complesse.

Quali sono le opzioni di distribuzione per le applicazioni Express.js?

– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))

Come distribuire un’applicazione Express.js in un contenitore Back4app?

Crea un’applicazione Express.js.
Dockerizza l’applicazione Express.js.
Carica l’applicazione dockerizzata su GitHub.
Crea un account Back4app.
Crea un contenitore Back4app.
Concedi a Back4app l’accesso al tuo GitHub.
Seleziona il repository Express.js e distribuisci la tua applicazione.


Leave a reply

Your email address will not be published.