Come distribuire un’applicazione Nest.js?
La scelta della giusta strategia di distribuzione è importante per garantire che l’applicazione funzioni senza problemi e sia in grado di scalare come richiesto. Questo articolo esplora le diverse opzioni di distribuzione disponibili per le applicazioni Nest.js. In particolare, si concentra su come distribuire le applicazioni Nest.js in un container Back4app.
Contents
- 1 Punti di forza
- 2 Che cos’è Nest.js?
- 3 Vantaggi dell’utilizzo di Nest.js
- 4 Svantaggi dell’utilizzo di Nest.js
- 5 Opzioni di distribuzione di Nest.js
- 6 Come distribuire le applicazioni Nest.js in un contenitore Back4app
- 7 Creare un’applicazione Nest.js
- 8 Dockerizzazione dell’applicazione Nest.js
- 9 Distribuzione di un’applicazione Nest.js in un contenitore Back4app
- 10 Ottimizzazione dell’implementazione con una creazione in più fasi
- 11 Conclusione
- 12 FAQ
- 13 Che cos’è Nest.js?
- 14 Quali sono le opzioni di deployment per Docker?
- 15 Come distribuire un’applicazione Nest.js?
Punti di forza
- La scelta della giusta strategia di distribuzione per un’applicazione Nest.js è fondamentale per la scalabilità e il buon funzionamento.
- Le opzioni di distribuzione includono Infrastructure as a Service (IaaS) e Container as a Service (CaaS).
- Back4app Containers è un popolare fornitore di CaaS per la distribuzione di applicazioni Nest.js, che offre una maggiore astrazione e una gestione semplificata.
Che cos’è Nest.js?
Nest.js è un framework Node.js per la creazione di applicazioni scalabili lato server. Risolve il problema dell’architettura che la maggior parte dei framework e delle librerie moderne non affrontano, utilizzando un’architettura modulare. Questa architettura consente agli sviluppatori di creare codebase ben organizzate, scalabili e manutenibili.
Vantaggi dell’utilizzo di Nest.js
Ecco alcuni dei vantaggi dell’utilizzo di Nest.js:
- Next.js ha una forte opinione su come dovrebbe essere strutturato il codice. Pertanto, elimina l’onere di capire come organizzare il codice da soli.
- Supporta TypeScript per impostazione predefinita, ma consente anche di scrivere codice JavaScript puro.
- Per impostazione predefinita utilizza il framework Express, ma può essere configurato per utilizzare Fastify, che è più veloce.
- Nest.js si integra perfettamente con librerie di frontend come React e Angular.
- Dispone di uno strumento di utilità a riga di comando chiamato NestCLI. Genera automaticamente codice pre-scritto per parti importanti dell’applicazione, come controllori, moduli e middleware, contribuendo a migliorare l’esperienza dello sviluppatore.
- Nest.js ha un supporto integrato per i microservizi. Offre vari trasportatori per lo scambio di messaggi tra microservizi diversi.
- Nest.js supporta l’integrazione con qualsiasi database SQL o NoSQL.
- Fornisce integrazioni con librerie di test popolari come Supertest e Jest. Ciò rende più semplice la scrittura di test unitari, test di integrazione e test end-to-end.
- Nest.js offre una documentazione completa e organizzata, corredata da esempi di codice.
Svantaggi dell’utilizzo di Nest.js
Di seguito sono riportati alcuni degli svantaggi dell’utilizzo di Nest.js:
- Il modello di progettazione delle applicazioni Nest.js potrebbe non corrispondere alle preferenze o ai requisiti del progetto di ciascuno.
- Nest.js astrae la complessità dei vari processi e del loro funzionamento interno. Questa astrazione consente agli sviluppatori di concentrarsi sulla logica dell’applicazione principale, senza preoccuparsi dei dettagli più complessi. Tuttavia, questo livello di astrazione può portare a un senso di dipendenza, poiché gli sviluppatori hanno una visibilità limitata sui dettagli specifici dell’implementazione.
- Nest.js viene fornito con molte funzionalità e capacità. C’è il rischio potenziale che gli sviluppatori vadano a creare soluzioni troppo complesse, con un conseguente impatto sulle tempistiche del progetto.
- Nest.js ha una curva di apprendimento più ripida a causa della sua architettura complessa e dell’uso di TypeScript,
La scelta di utilizzare Nest.js per il proprio progetto dipende in ultima analisi dai requisiti del progetto, dalle competenze del team e dalle preferenze personali.
Prima di prendere una decisione, considerate i vantaggi di Nest.js, le sue caratteristiche, i suoi svantaggi e la portata del vostro progetto.
Opzioni di distribuzione di Nest.js
Quando si distribuiscono applicazioni Nest.js, si hanno a disposizione varie opzioni, tra cui Infrastructure as a Service (IaaS) e Container as a Service (CaaS). Discutiamo questi due approcci.
Infrastruttura come servizio
L’infrastruttura come servizio (IaaS) è una forma di cloud computing che fornisce un’infrastruttura server su Internet. Questa infrastruttura comprende risorse di storage, di rete e di calcolo che sono disponibili su richiesta, consentendo di scalare l’infrastruttura in base alle esigenze.
Uno dei principali vantaggi dell’IaaS è il livello di controllo che offre. Quando distribuite la vostra applicazione, avete la libertà di configurare le macchine virtuali (calcolo), gestire la rete e garantire la scalabilità e la disponibilità dell’applicazione. Questa flessibilità consente di personalizzare l’infrastruttura in base ai requisiti dell’applicazione.
Lo svantaggio di avere tutto questo controllo è che il vostro team deve gestire tutto. Questo può essere costoso.
Alcuni dei più noti fornitori di IaaS includono:
- Microsoft Azure
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
Contenitori come servizio
Container as a Service (CaaS) è un servizio cloud per la gestione dei container. Offre un livello di astrazione superiore sulle risorse di calcolo, rete e archiviazione rispetto a IaaS.
Con CaaS, si impacchetta il codice dell’applicazione Nest.js, le sue dipendenze, il runtime e la configurazione necessaria per eseguire l’applicazione in un contenitore.
Questo contenitore viene creato utilizzando strumenti di containerizzazione come Docker. Una volta che il contenitore è pronto, è possibile distribuirlo a un provider CaaS. Il provider CaaS si occupa di gestire e monitorare l’applicazione distribuita per conto dell’utente.
Poiché il contenitore è isolato, può essere distribuito in ambienti diversi senza problemi di compatibilità. Inoltre, poiché l’ambiente di esecuzione di Nest.js è standardizzato, l’applicazione si comporta in modo coerente in ambienti diversi, indipendentemente dall’infrastruttura sottostante.
L’elevato livello di astrazione elimina la necessità per gli sviluppatori di gestire dettagli infrastrutturali di basso livello, consentendo loro di concentrarsi sulla logica dell’applicazione. Questo migliora la produttività e consente iterazioni più rapide.
Alcuni dei più noti fornitori di CaaS includono:
- Back4app Containers
- Amazon Elastic Container Service (ECS)
- Google Kubernetes Engine (GKE)
Come distribuire le applicazioni Nest.js in un contenitore Back4app
Prerequisiti
Per seguire questa esercitazione, assicuratevi di disporre di quanto segue:
- Node.js (versione >= 16) installato sul sistema operativo.
- Un account GitHub con Git configurato sul sistema operativo.
- Docker installato sul computer. È possibile installare Docker desktop dal sito ufficiale di Docker.
- Conoscenza di Nest.js.
Panoramica dei contenitori Back4app
Back4app Containers è un fornitore CaaS che gestisce il processo di distribuzione per voi. Gestisce l’infrastruttura del server, eliminando la necessità di configurazione manuale.
Back4app si integra con GitHub e consente di aggiungere repository dockerizzati alla propria applicazione. Questa integrazione rende più facile mantenere aggiornata la vostra applicazione.
Con la funzione di distribuzione automatica, Back4app ascolta in tempo reale il vostro repository e reimposta l’applicazione ogni volta che si uniscono i commit al ramo distribuito.
È inoltre possibile monitorare l’implementazione dal dashboard e risolvere eventuali problemi.
Introduzione al progetto
In questa guida illustreremo il processo di distribuzione di un’applicazione Nest.js su Back4app. Per iniziare, creeremo un’applicazione Nest.js di base, che verrà dockerizzata e poi spinta su GitHub. Infine, distribuiremo l’applicazione in un contenitore Back4app.
Creare un’applicazione Nest.js
Seguite i passaggi seguenti per creare un’applicazione Nest.js:
- Eseguire il comando seguente nel terminale per installare globalmente la Nest.js CLI.
npm install -g @nestjs/cli
- Eseguire il seguente comando per generare una nuova applicazione Nest.js.
nest new project-name
Si senta libero di sostituire “nome-progetto” con il nome della sua applicazione. Questo tutorial utilizza nestjs-deploy-back4app.
nest new nestjs-deploy-back4app
Questo comando creerà tutti i file e le cartelle necessarie per iniziare.
- Navigare nella directory del progetto creato ed eseguire il seguente comando per avviare il server di sviluppo.
npm run start:dev
In questo modo, si verificheranno eventuali modifiche al codice e si riavvierà automaticamente il server quando si salverà un file.
Dockerizzazione dell’applicazione Nest.js
Per distribuire l’applicazione Nest.js in un contenitore Back4app, è necessario dockerizzare l’applicazione con Docker.
Dockerizzare un’applicazione significa creare un’immagine contenitore per un’applicazione. L’immagine del contenitore è un pacchetto software isolato ed eseguibile che include tutto ciò che serve per eseguire l’applicazione.
Per creare un’immagine del contenitore è necessario aggiungere un Dockerfile
al progetto.
Un Dockerfile è un file di testo che fornisce istruzioni su come costruire l’immagine Docker. Specifica l’immagine di base da cui costruire l’immagine.
Contiene anche le istruzioni per impostare la directory di lavoro, installare le dipendenze e definire il comando per l’esecuzione dell’applicazione.
Seguite le istruzioni seguenti per dockerizzare un progetto Nest.js:
- Assicurarsi che Docker sia installato sul computer. Seguite la guida ufficiale all’installazione di Docker per installarlo se non lo avete.
- Passare alla radice della cartella del progetto Nest.js e creare un file chiamato
Dockerfile
.
touch Dockerfile
- Con l’editor di codice preferito, aprire Dockerfile e definire l’immagine di base. Questa è l’immagine da cui si costruirà l’immagine di produzione. Questo tutorial utilizza l’immagine Node 20. Viene fornita con Node e npm installati. Viene fornita con Node e npm installati.
FROM node:18-alpine
- Quindi, creare la directory di lavoro all’interno dell’immagine. È qui che verrà memorizzato il codice dell’applicazione.
WORKDIR /usr/src/app
- Copiare i file package.json e package-lock.json nel contenitore. Quindi eseguire il comando npm install per installare le dipendenze del progetto.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
# Install project dependencies
RUN npm install
- Copiare il resto del codice dell’applicazione nel contenitore.
COPY ..
- Eseguire il comando build per creare il bundle dell’applicazione. Questo comando compila il codice TypeScript in JavaScript e lo memorizza nella cartella dist.
RUN npm run build
- Esporre la porta 3000. Specifica la porta che le altre applicazioni devono usare per comunicare con questa applicazione containerizzata.
EXPOSE 3000/tcp
- Eseguire l’applicazione. Qui useremo
node dist/main.js
. La cartella dist contiene il codice compilato, mentre main.js è il punto di ingresso dell’applicazione.
CMD [ "node", "dist/main.js" ]
Complessivamente, il file Docker dovrebbe avere questo aspetto:
FROM node:20-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000/tcp
CMD [ "node", "dist/main.js" ]
Aggiungere un file .dockerignore
Un file .dockerignore funziona come un file .gitignore. Specifica quali file Docker deve ignorare. Impedisce di aggiungere all’immagine file grandi e non necessari o dati sensibili.
Per crearlo, aggiungere un nuovo file chiamato .dockerignore alla base della cartella del progetto Nest.js e aggiungere quanto segue.
.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*
Ora, i moduli di node, i file markdown, le variabili env e i log di debug non saranno copiati nell’immagine Docker.
Creare l’immagine Docker in locale
Eseguite il comando seguente sul vostro terminale per verificare che il file Docker funzioni.
docker build -t nestjs-back4app .
Il flag -t
consente di etichettare l’immagine con un nome. In questo caso, nestjs-back4app.
Se si esegue docker images
sul terminale, si dovrebbe vedere l’immagine creata.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app latest afcba89613fc 39 seconds ago 333MB
Per eseguire l’applicazione in locale, utilizzare il seguente comando.
docker run -p 49160:3000 -d nestjs-back4app
Questo reindirizza la porta 49160 alla porta 3000, specificata nel file Docker. Se si visita localhost:49160, si dovrebbe essere in grado di accedere alla home page dell’applicazione.
Distribuzione di un’applicazione Nest.js in un contenitore Back4app
Una volta che ci si è assicurati che il file Docker funzioni, si è pronti a distribuire l’applicazione su Back4app.
Spingere l’applicazione su GitHub
Back4app accede all’applicazione tramite GitHub. Creare un nuovo repository contenente l’applicazione Nest.js seguendo i passaggi seguenti:
- Visitate GitHub e accedete al vostro account.
- Una volta effettuato l’accesso, fare clic sull’icona “+” nell’angolo in alto a destra della pagina e selezionare “Nuovo repository” dal menu a discesa.
- Nella pagina “Crea un nuovo repository”, assegnare un nome al repository. Quindi, fare clic su “Crea nome repository”. Nella pagina successiva, si può notare l’URL del repository.
Nella cartella del progetto sul computer locale, eseguire il seguente comando per inviare il codice al repository appena creato.
git remote add origin <https://github.com/remigathoni/nestjs-deploy-back4app.git>
git branch -M main
git push -u origin main
Dopo aver eseguito questi comandi, i file dell’applicazione saranno aggiunti al repository GitHub.
Distribuire l’applicazione Nest.js
Ora è possibile distribuire l’applicazione su Back4app seguendo i passaggi indicati di seguito:
Registrate un account su Back4App se non lo avete già fatto, altrimenti accedete al vostro account. Verrete reindirizzati alla dashboard.
Nella dashboard, fare clic su Costruisci una nuova app.
Back4app offre due opzioni per la creazione di un’applicazione. È possibile utilizzare il Backend as a Service (BaaS) o il Container as a Service (CaaS).
BaaS gestisce l’intero backend, mentre CaaS consente di distribuire un’applicazione dockerizzata. Vogliamo distribuire solo l’applicazione Nest.js dockerizzata, quindi selezioniamo Containers as a Service.
Back4app vi chiederà di collegare il vostro account a GitHub e di concedergli il permesso di accedere ai vostri repository.
Selezionare il repository Nest.js.
Nelle opzioni di distribuzione, aggiungere un nome per l’applicazione. È anche possibile impostare il ramo predefinito, la directory principale, abilitare o disabilitare il deploy automatico e impostare le variabili d’ambiente. In questo caso, è sufficiente impostare il nome.
Fare clic sul pulsante Crea app per distribuire l’applicazione. Questo processo potrebbe richiedere alcuni minuti.
In pratica è tutto! Siete riusciti a distribuire gratuitamente un’applicazione Nest.js su Back4app.
Ottimizzazione dell’implementazione con una creazione in più fasi
Al momento la dimensione dell’immagine docker è piuttosto grande, 333 MB.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app latest afcba89613fc 39 seconds ago 333MB
Per velocizzare i tempi di distribuzione, è essenziale ridurre le dimensioni dell’immagine. Un’immagine più piccola riduce anche i costi di archiviazione nel cloud e consente di ottimizzare le risorse. Inoltre, ridurrà le vulnerabilità di sicurezza riducendo la superficie di attacco.
Per ridurre le dimensioni della nostra immagine, possiamo sfruttare le costruzioni in più fasi.
Le compilazioni in più fasi consentono di separare l’ambiente di compilazione dall’ambiente di runtime. Ciò consente di installare le dipendenze e compilare l’applicazione in un contenitore separato. In seguito, è possibile copiare solo i file necessari nell’immagine di produzione finale.
Per iniziare, aprire il file Docker dell’applicazione Nest.js con il proprio editor di codice e cancellarne il contenuto.
Nel file Docker, avremo due fasi:
- La fase di compilazione responsabile della costruzione dell’applicazione. Include l’installazione delle dipendenze e la compilazione di TypeScript in JavaScript.
- La pagina di produzione che crea l’immagine di runtime. Contiene tutti i file necessari per l’esecuzione dell’applicazione.
Il nome di uno stadio si ottiene aggiungendo AS *nome dello stadio*
all’istruzione FROM
.
Definizione della fase di costruzione
Seguire le istruzioni riportate di seguito per utilizzare la costruzione in più fasi:
- Nel file Docker, definire uno stage dall’immagine base di Node e chiamarlo
build
.
FROM node:20-alpine as build
Si noti che le immagini del nodo: – base alpina sono molto più sottili di quelle del nodo:.
- Definire la directory di lavoro.
WORKDIR /usr/src/app
- Copiare i file package.json e package-lock.json nel contenitore.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
- Installare le dipendenze
RUN npm ci
Al posto di npm install
usiamo npm ci
. Questi due comandi sono uguali, ma npm ci assicura un’installazione pulita delle dipendenze ogni volta che viene eseguito.
- Copiare il codice dell’applicazione nella fase di compilazione.
COPY . .
- Costruire l’applicazione eseguendo il comando npm build.
npm run build
Definizione della fase di produzione
Una volta costruita l’applicazione, si definisce la fase di produzione.
- Aggiungere l’immagine di base di Node.js e denominarla production.
FROM node:20-alpine AS build
- Definire la directory di lavoro come nella fase di creazione.
WORKDIR /usr/src/app
- Usare l’etichetta
from=build
per copiare la cartelladist
e i moduli dei nodi dall’immagine di build all’immagine di produzione corrente.
COPY --from=build usr/src/app/dist ./dist
COPY --from=build usr/src/app/node_modules ./node_modules
- Esporre la porta 3000
EXPOSE 3000/tcp
- Avviare l’applicazione con il comando
CMD
.
CMD ["node", "dist/main.js"]
Complessivamente, il file Docker dovrebbe avere questo aspetto:
# Build
FROM node:20-alpine AS build
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --production
# Production
FROM node:20-alpine AS production
WORKDIR /usr/src/app
COPY --from=build usr/src/app/dist ./dist
COPY --from=build usr/src/app/node_modules ./node_modules
EXPOSE 3000/tcp
CMD [ "node", "dist/main.js" ]
Se si costruisce ora l’immagine docker, si noterà che le sue dimensioni si sono notevolmente ridotte.
REPOSITORY TAG IMAGE ID CREATED SIZE
nestjs-back4app-opt latest d29aedae9bef 5 seconds ago 186MB
Riducendo le dimensioni, si aumentano i tempi di distribuzione e si riduce la quantità di spazio di archiviazione necessario.
Conclusione
Nest.js è un framework Node.js dotato di un’architettura modulare e orientata. Consente agli sviluppatori di costruire codebase scalabili e manutenibili.
Per distribuire un’applicazione Nest.js sono disponibili varie opzioni, tra cui le piattaforme Infrastructure as a Service (IaaS) e Container as a Service (CaaS).
Uno dei migliori fornitori di CaaS è Back4app Containers. I container di Back4app gestiscono e monitorano la distribuzione, rendendo il passaggio dallo sviluppo alla produzione senza problemi.
In questa guida abbiamo imparato a distribuire un’applicazione Nest.js in un container Back4app utilizzando Docker. Inoltre, avete esplorato i vantaggi dell’ottimizzazione del deployment utilizzando build multi-stage.
Ora dovreste essere in grado di creare un’applicazione Nest.js, dockerizzarla e distribuirla su Back4app. Il codice sorgente è disponibile su questo repo GitHub e per saperne di più, visitate la documentazione sui container di Back4app.
FAQ
Che cos’è Nest.js?
Nest.js è un framework Node.js opinato costruito con TypeScript. Segue un approccio di design modulare, permettendo agli sviluppatori di creare basi di codice ben organizzate, scalabili e facilmente manutenibili.
Quali sono le opzioni di deployment per Docker?
– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))
Come distribuire un’applicazione Nest.js?
– Crea un’applicazione Nest.js.
– Dockerizza l’applicazione Nest.js.
– Carica l’applicazione dockerizzata su GitHub.
– Crea un account Back4app.
– Crea un container su Back4app.
– Concedi a Back4app l’accesso al tuo GitHub.
– Seleziona il repository Nest.js e distribuisci la tua applicazione.