I server di produzione di Instant Developer Cloud sono server integrati nella piattaforma e gestiti completamente tramite la console.
Per creare un nuovo server di produzione, è possibile accedere alla pagina server della propria organizzazione e poi utilizzare il pulsante Aggiungi server di produzione.
A questo punto si apre una schermata per la selezione della taglia del server, in cui è possibile selezionarne una tra le seguenti:
- Taglia S: 1 CPU condivisa, 1,7 GB di RAM, 10 GB disco SSD, 50 GB Egress mensile, fino a tre applicazioni installabili.
- Taglia M: 1 CPU dedicata, 3,75 GB di RAM, 20 GB disco SSD, 100 GB Egress mensile, fino a sei applicazioni installabili.
- Taglia L: 2 CPU dedicate, 7,5 GB di RAM, 40 GB disco SSD, 200 GB Egress mensile, fino a dieci applicazioni installabili.
- Taglia XL: 4 CPU dedicate, 15 GB di RAM, 80 GB disco SSD, 400 GB Egress mensile, fino a venti applicazioni installabili.
- Taglia XXL: 8 CPU dedicate, 30 GB di RAM, 160 GB disco SSD, 800 GB Egress mensile, fino a quaranta applicazioni installabili.
- Taglia XXXL: 16 CPU dedicate, 60 GB di RAM, 320 GB disco SSD, 1600 GB Egress mensile, fino a ottanta applicazioni installabili.
Per proseguire è necessario anche indicare la carta di credito su cui effettuare gli addebiti mensili. Se non è possibile selezionarla, occorre prima definire un profilo di fatturazione nella console.
Dopo aver selezionato la taglia è possibile cliccare il pulsante Continua in fondo alla pagina per accedere alla pagina dei servizi aggiuntivi. Sono presenti i seguenti servizi:
- Sincronizzazione: permette al server di funzionare come sistema di sincronizzazione per i database locali delle applicazioni mobile.
- Cloud Connector: permette al server di integrare dati e servizi provenienti da risorse on premise.
- Analytics & Feedback: permette di installare sul server i servizi di raccolta dati analitici e di feedback dei clienti.
- Backup Giornaliero / Backup orario: permette di mantenere automaticamente uno snapshot dellâintero server per ogni giorno o ogni ora degli ultimi 30 giorni.
Dopo aver selezionato gli eventuali servizi aggiuntivi, è possibile cliccare il pulsante Verifica il tuo ordine in fondo alla pagina per accedere al riepilogo e poi concludere lâacquisto.
Struttura di un server di produzione di Instant Developer Cloud #
Un server di produzione è basato su unâistanza di macchina virtuale del servizio Compute Engine di Google Cloud Platform, in un datacenter situato nellâUnione Europea.
Il sistema operativo è di tipo linux gestito direttamente da Google e ottimizzato per lâutilizzo di container. In ogni istanza viene caricata unâimmagine container che dipende dalla versione di Instant Developer Cloud in uso.
Nella versione 22.0, ad esempio, lâimmagine contiene un sistema operativo Linux Alpine 3.13 in configurazione minima, Node.js 16.4, Postgres 13.3, Letâs encrypt, ImageMagick, e Puppettier.
Le uniche porte aperte sono la 80 (http) e la 443 (https). La porta 80 serve solo per la redirezione http/https.
Tutti i server di Instant Developer Cloud sono dotati di due dischi. Il primo è il disco del sistema operativo, che contiene anche lâimmagine container. Il secondo, di dimensione variabile in base alla taglia e di tipo SSD, contiene i dati, cioè:
- I database Postgres.
- Le applicazioni installate.
- Il file system di ogni applicazione installata.
I dischi presenti sui server sono nativamente crittografati tramite Google Cloud Platform.
Il database Postgres presente nel container accetta solo connessioni locali e lâelenco degli account è gestito automaticamente dal sistema. Non è quindi possibile conoscere le password degli utenti.
Installazione di unâapplicazione #
Vediamo ora come funziona il processo di installazione delle applicazioni su un server di produzione di Instant Developer Cloud.
Per installare una nuova applicazione su un server di produzione è necessario cliccare il pulsante +Installa nella pagina Installazioni del menu di progetto.
Dopo aver iniziato il processo di installazione apparirĂ una serie di tre popup. Nel primo occorre selezionare lâapplicazione da installare; in un progetto, infatti, possono essere presenti piĂš applicazioni. Prima di continuare si potrĂ scegliere se pubblicare in un server o in un launcher. In questo caso occorre selezionare lâopzione Server.
Nel popup successivo sarĂ possibile dare un nome alla nuova build che verrĂ compilata al volo in base allo stato attuale dellâapplicazione nel progetto, oppure selezionare una build esistente.
Nel caso di nuova build, il popup presenta anche le seguenti opzioni:
- Compila la build senza installarla: la build verrĂ solo compilata ma non verrĂ installata.
- Abilita il debug a runtime: la build verrĂ compilata aggiungendo il supporto al debug a runtime dellâapplicazione nel server.
- Salta il controllo delle traduzioni: in caso di build di test, non verrĂ effettuato il controllo della traduzione completa dellâapplicazione nelle lingue dichiarate. Questa opzione è disabilitata se il server non è stato marcato come server di test.
Infine nellâultimo popup sarĂ possibile dare un nome allâapplicazione installata e selezionare uno o piĂš server in cui installarla. Cliccando infine il pulsante Installa nel terzo popup verrĂ iniziato il processo di installazione vero e proprio.
Aggiornamento di un’installazione #
Se si desidera allineare unâinstallazione esistente allo stato attuale dellâapplicazione nel progetto, è possibile cliccare il pulsante refresh evidenziato nellâimmagine precedente che appare quando si visualizzano i dettagli di unâinstallazione della lista. In questo modo apparirĂ solo un popup di conferma in cui è possibile solamente cambiare il nome della build e modificare le opzioni di compilazione viste in precedenza.
Si noti, tuttavia, che in questo caso è presente un’ulteriore opzione attiva per default: Sovrascrivi build esistente. Lâaggiornamento dellâinstallazione, infatti, per default sovrascrive la build precedente, che in questo modo viene persa. Se si desidera mantenere anche la build precedente, è possibile deselezionare lâopzione.
Processo di installazione #
Il processo di installazione inizia con la compilazione dellâapplicazione e la creazione di una nuova build. La nuova build viene poi caricata in un bucket di Google Cloud cosĂŹ da poterla mantenere come backup e passarla al server per lâinstallazione.
Quando la build è stata creata senza errori e caricata nel bucket, inizia lâoperazione di installazione vera e propria che è fatta dai seguenti passaggi:
- Lâapplicazione corrente viene messa in modalitĂ manutenzione, cioè non si accettano piĂš nuove sessioni e in quelle attuali viene visualizzato un messaggio che comunica allâutente di concludere il lavoro prima possibile.
- Nel frattempo viene scaricata dal bucket la build da installare.
- Dopo un tempo pari a 15 secondi le sessioni attuali vengono interrotte e lâapplicazione viene messa in pausa.
- Prima di iniziare le operazioni di modifica del server, viene effettuato uno snapshot dellâintero server in modo da poter ripristinare la situazione precedente allâinstallazione stessa.
- Il sistema di installazione estrae i file della nuova build in una cartella temporanea. La build viene validata come applicazione Node.js.
- Se richiesto, vengono aggiornati gli schemi dei database utilizzati dallâapplicazione.
- In caso di aggiornamento, il file system dellâapplicazione attuale viene spostato nella nuova directory. La vecchia copia viene rinominata e alla nuova viene dato il nome giusto.
- Se tutto ha funzionato come previsto, le modifiche agli schemi dei database vengono confermate e tutti i file temporanei vengono cancellati.
- Se ci sono stati problemi in anche solo uno dei passaggi precedenti, tutte le modifiche al file system e ai database del server vengono annullate, ovvero tutto torna come prima.
- Lâapplicazione viene riavviata e gli utenti ancora collegati possono rientrare automaticamente.
A parte i tempi di compilazione e di gestione delle sessioni esistenti, tutto il processo di installazione richiede solamente qualche secondo o al massimo qualche decina di secondi. In questo modo gli utenti dellâapplicazione non avranno la percezione di un servizio interrotto, ma solo di una pausa momentanea.
Aggiornamento del database #
Quando una build viene compilata, essa contiene anche le informazioni per la creazione e lâaggiornamento degli schemi dei database Postgres da essa utilizzati. Nel momento in cui la build è in fase di installazione, la console verifica se i database presenti nel server devono essere aggiornati o meno. Nel caso in cui sia richiesto un aggiornamento, nel popup di selezione del server sarĂ presente anche lâopzione Aggiorna database, come mostrato nellâimmagine seguente:
Lâopzione può apparire pre-selezionata se su quel server il database è effettivamente da aggiornare e se lâapplicazione che ha aggiornato il database lâultima volta è la stessa. Un database, infatti, può essere utilizzato da piĂš di unâapplicazione, ma normalmente solo una di esse ne mantiene aggiornato lo schema.
Se si seleziona lâopzione, lâaggiornamento dello schema dei database è parte del processo di installazione. Per ogni database le istruzioni di modifica vengono eseguite tutte in una stessa transazione in modo da poter essere completamente annullate se anche solo una di esse non ha successo.
Se lâaggiornamento del database del server non ha successo, si consiglia di effettuare un backup e un restore del medesimo nellâambiente IDE e poi testare lâaggiornamento in tale ambiente.
Gestione delle build #
Lâelenco delle build di una determinata applicazione è disponibile dal sotto-menu di progetto App e dati, come si vede nellâimmagine seguente.
Per ogni build viene riportato su quali server è installata. Inoltre è possibile installarla su altri server, eliminarla oppure scaricarla per lâinstallazione su un proprio server in modalitĂ self managed.
Il pulsante Rimuovi vecchie build è in grado di cancellare automaticamente tutte le build piÚ vecchie di 30 giorni che non sono installate da nessuna parte. Si consiglia di utilizzarlo di tanto in tanto per eliminare lo spazio occupato dalle build, sia nel server IDE che nei bucket di backup della propria organizzazione.
Configurazione dellâapplicazione #
Dopo aver installato un’applicazione, essa diventa disponibile per la configurazione dal menu Installazioni nella sezione relativa al server in cui è stata installata.
Il menu relativo alla singola installazione presenta le seguenti voci:
- Parametri runtime: apre la videata per la configurazione dei parametri di runtime dellâapplicazione, descritta in seguito.
- Configurazione worker: apre la videata per la configurazione dei processi worker dellâapplicazione, descritta in seguito.
- Naviga tra i file: apre la videata per la gestione del file system dellâapplicazione. Ă equivalente al pulsante Sfoglia nella riga Spazio usato sottostante.
- Condividi: permette di condividere unâinstallazione disponibile su un launcher con altri utenti.
- Installa su un launcher: rende lâapplicazione disponibile allâinterno di un launcher anche se essa è di tipo online, cioè installata sul server.
- Allinea database: forza lâallineamento dei database del server usati dalla build. Attenzione: prima di usare questo comando si consiglia di eseguire uno snapshot del server per poter annullare il comando in caso di bisogno.
- Disinstalla: rimuove lâapplicazione installata.
Espandendo la riga relativa ad unâinstallazione è possibile accedere a diverse opzioni di configurazione.
Tramite il pulsante con lâicona ad impulso è possibile accedere alla pagina del log strutturato che verrĂ descritta in seguito. Il pulsante con lâicona pausa, infine, mette in pausa lâapplicazione e impedisce lâaccesso da parte di browser, client API, o dispositivi mobile. Le sessioni esistenti non vengono interrotte.
Attivando il flag Server session, viene lanciata una ulteriore sessione dellâapplicazione senza interfaccia utente. Questa sessione può eseguire processi batch, rimanere in ascolto di eventi o di modifiche al database, o altri task di backend. Attivando il flag viene garantito che ci sarĂ sempre una sessione batch in esecuzione. Il codice dellâapplicazione può distinguere se lâapplicazione è in esecuzione in una sessione browser o in una sessione server (batch) utilizzando la funzione app.isServerSession() che restituisce true in questo caso.
Il flag ModalitĂ offline permette di eseguire lâapplicazione come PWA. Per una trattazione piĂš estesa di questo argomento, è possibile leggere il relativo libro nella documentazione.
Si noti infine il pulsante Riavvia Node.js in alto nella lista delle installazioni, che permette di riavviare lâintero sistema applicativo nel server selezionato. Tutte le sessioni di tutte le applicazioni verranno interrotte.
Parametri di runtime #
La videata dei parametri di runtime permette di definire delle coppie chiave-valore che lâapplicazione è in grado di leggere o scrivere tramite i metodi app.getParameter e app.setParameter.
Il vantaggio di poter inserire tramite la console dei parametri che lâapplicazione può leggere consiste nel poter comunicare chiavi segrete senza doverle inserire nel codice del progetto, o dati che possono variare senza dover aggiornare lâapplicazione.
I parametri di runtime sono relativi alla singola installazione, tuttavia è possibile definire parametri di runtime anche a livello di server, tramite il menu Parametri runtime della pagina server. Se un parametro viene definito a livello di applicazione esso prevale su quelli definiti a livello di server, altrimenti viene usato quello di server come default per tutte le installazioni.
Quando lâapplicazione scrive il valore di un parametro, esso sarĂ sempre definito a livello di applicazione. I parametri di runtime definiti a livello di server, quindi, sono scrivibili solamente tramite la console.
Si noti che a livello di applicazione è possibile gestire lâevento app.onParameterChange che comunica la variazione dei parametri anche alle sessioni giĂ avviate.
Esistono alcuni parametri che vengono gestiti direttamente dal framework:
- trackCodeLine: valore booleano (true/false), con default false. Abilita un tracciamento piĂš preciso delle righe di codice che generano eccezione; viene utilizzato in Analytics per aprire il progetto direttamente al punto che ha generato il problema; in alternativa viene riportato solo il numero di riga del file JavaScript. Impostandolo a true ci sarĂ una piccola penalizzazione nelle performance di esecuzione del codice applicazione.
- allowOffline: valore booleano (true/false), con default false. Deve essere impostato a true per consentire ad unâapplicazione di essere eseguita anche in modalitĂ PWA.
- sendGridKey: valore della chiave da utilizzare per inviare mail tramite lâoggetto App.Mailer del framework di Instant Developer Cloud. Esso utilizza a sua volta il servizio SendGrid a cui ci si deve registrare per ottenere le chiavi di invio mail.
- stripeKey: valore della chiave da utilizzare per la libreria per la gestione dei pagamenti elettronici App.Stripe del framework di Instant Developer Cloud.
- gcmKey: valore del parametro gcmKey per lâinvio delle notifiche a dispositivi Android.
- apnKey: contenuto del file del certificato per lâinvio delle notifica a dispositivi Apple.
- apnKeyId, apnTeamId: valori dei parametri per lâinvio delle notifica a dispositivi Apple.
- gmapKey: valore della chiave per lâutilizzo del componente Google Maps. Non deve cominciare per âkey=â e deve contenere solo il valore della chiave cosĂŹ come configurato nella console di Google Cloud.
Configurazione dei processi worker #
Ogni applicazione installata su un server utilizza uno o piĂš processi worker per gestire le sessioni. La pagina di configurazione dei worker serve per definire le politiche di gestione dei processi dellâapplicazione. La configurazione standard è definita a livello di server ed è accessibile dal menu Configurazione worker della pagina del server.
La pagina Configurazione worker di unâinstallazione è accessibile dal menu corrispondente nella lista delle installazioni dellâapplicazione da configurare.
Per aggiungere una nuova configurazione, cliccare il pulsante +Aggiungi configurazione nella testata della videata.
Una configurazione è definita dai seguenti parametri:
- Nome: identifica la configurazione.
- Tipo di sessione: indica per quali tipi di sessione è valida questa configurazione. I possibili valori sono: web, sync, rest, server, all.
- Query string: indica se questa configurazione entra in gioco solamente se sono presenti alcuni parametri sulla query string del browser che attiva la sessione.
- Priorità : priorità di esecuzione del processo worker. Anche se è possibile indicare qualunque valore ammesso (max, high, normal, low, min) si consiglia di utilizzare solo normal e low. Un processo con priorità min funzionerà solo quando tutti gli altri non sono impegnati; un processo con priorità high può interferire con il comportamento del server; un processo con priorità max può addirittura bloccare il server se esso non si comporta correttamente.
- Timeout inattivitĂ : indica dopo quanto tempo un worker che non ospita piĂš alcuna sessione deve essere eliminato.
- Numero totale utenti complessivi: è il numero massimo di sessioni contemporanee ammesse per il tipo selezionato. Se, ad esempio, viene impostato a 100 ed il tipo è rest, significa che il server può gestire al massimo 100 richieste API contemporanee. Alle ulteriori richieste verrà restituito un codice di errore.
- Numero massimo di processi: è il numero massimo di processi worker che verranno generati per gestire le sessioni. Il sistema bilancia il numero di sessioni in modo che tutti i processi ne contengano un numero simile.
- Numero minimo di utenti per processo: è il numero minimo di sessioni che un processo worker deve contenere prima di aggiungere un nuovo processo worker. Se, ad esempio, lo si imposta a 20 ed il tipo è web, le prime 20 sessioni browser contemporanee verranno gestite da un solo processo worker. Se viene attivata unâulteriore sessione, essa verrĂ gestita da un nuovo worker, se non si è ancora arrivati al numero massimo di processi worker.
Si consiglia di aggiungere una sola configurazione per tipo di sessione / query string.
Per decidere quanti processi worker dedicare ad ogni tipo di sessione, occorre tenere presente i seguenti parametri:
- Definire una politica per un determinato tipo di sessione determina la generazione di almeno un processo worker dedicato a quel tipo di sessione. Se, ad esempio, si aggiunge una configurazione per le sessioni sync, tutte le sessioni di sincronizzazione verranno gestite con processi diversi da quelli delle sessioni web.
- Nel caso di applicazioni che necessitano di una server session, mantenerla su un worker separato può avere il vantaggio di tenere i processi batch indipendenti dal carico di lavoro delle funzioni interattive.
- A parte il caso di applicazioni con calcoli intensivi, il collo di bottiglia delle applicazioni è sempre lâaccesso al database. Non è quindi utile aumentare il numero di processi worker a piĂš del numero di processori del server. La miglior strategia per gestire la scalabilità è quella di ottimizzare il numero e la qualitĂ delle query.
- Ogni worker può indirizzare al massimo 1,7 GB di memoria. Allâaumentare del numero di sessioni contemporanee può essere utile suddividere il carico su piĂš worker anche per poter utilizzare piĂš memoria.
- Occorre tenere presente la natura di Node.js come processo single threaded dotato di event loop. Se un thread di codice JavaScript non utilizza funzioni asincrone ma, ad esempio, esegue calcoli intensivi di durata maggiore ai 100 ms, il processo worker che li esegue potrebbe non riuscire a gestire tutte le altre sessioni in maniera puntuale. In questi casi si consiglia di spezzare i calcoli complessi introducendo funzioni asincrone, oppure di isolarli in processi worker dedicati.
Log strutturato #
Il log strutturato è un potente sistema di debug e controllo delle applicazioni in produzione. Attivando il log strutturato per unâinstallazione, tutte le sessioni applicative verranno loggate in maniera separata e sarĂ possibile identificare errori, warning o log di console specifici.
A richiesta ogni sessione può eseguire il log di tutte le query effettuate sul database e, se lâapplicazione è stata compilata con il flag di debug a runtime attivo, per ogni sessione online sarĂ possibile attivare la modalitĂ di debug interattivo.
Per utilizzare il log strutturato, è necessario far sĂŹ che il codice dellâapplicazione imposti la proprietĂ app.sessionName per ogni sessione di cui interessa effettuare il log. Il nome della sessione può contenere qualunque stringa. Nella pratica è comodo inserire il tipo di sessione, ad esempio (W) per le sessioni web, (S) per quelle sync e (R) per le sessioni rest. Nel rispetto delle regole sulla privacy è anche possibile indicare il nome dellâutente collegato alla sessione, in modo da avere immediatamente un legame fra gli eventuali feedback riportati e lâanalisi âdietro le quinteâ di quanto è successo. Se una sessione non imposta app.sessionName, non verrĂ loggata nel log strutturato.
Lâattivazione del log strutturato avviene dalla pagina che si apre cliccando il pulsante con lâicona ad impulso presente nella sezione relativa ad unâinstallazione. Cliccando il pulsante Configura nella testata della videata, sarĂ possibile attivare il log strutturato, attivare anche i log del database, cancellare le sessioni di log salvate ed infine selezionare un filtro per salvare solo le sessioni che hanno un determinato nome o parte di esso.
Cliccando il pulsante Aggiorna, sempre nella parte alta della videata, è possibile reperire immediatamente le ultime informazioni sulle sessioni, che, altrimenti, vengono estratte solo ogni 15-30 minuti.
Per ogni sessione in cui è presente un log, esso può essere visualizzato cliccando sulla riga della sessione stessa. Il pulsante sulla destra, invece, apre il progetto. Se lâapplicazione è stata compilata con il debug a runtime attivo, il progetto sarĂ proprio quello che ha dato origine alla build, che in questo caso viene mantenuto in un backup apposito. Se la sessione è online, sarĂ possibile interagire con la sessione utilizzando il debugger dellâIDE.
Per ogni sessione viene loggata ogni chiamata alle funzioni console.log, console.warn e console.error, sia da parte del codice dellâapplicazione che a livello di framework. I warning e gli errori vengono anche comunicati alla console, cosĂŹ da poterne visualizzare il numero nella lista prima ancora di aprire il log della sessione. Si tenga presente, infatti, che la console conosce i dati della sessione, ma il log rimane presente nel file system dellâapplicazione sul server di produzione.
Tramite il pulsante con lâicona filtro in alto nella pagina ed il relativo campo di ricerca dal lato opposto sarĂ possibile filtrare la lista per visualizzare subito le sessioni che hanno generato errori o warning, oppure modificare il periodo di visualizzazione che, per default, riguarda le ultime 24 ore.
Gestione dello spazio relativo al log strutturato #
Il sistema di log strutturato raccoglie lâoutput di tutti i comandi di logging che sono stati inseriti nellâapplicazione e, se configurato, i testi di tutte le query eseguite. Lo spazio richiesto per memorizzare queste informazioni può crescere rapidamente se ci sono molte sessioni oppure se sono stati lasciati attivi log di oggetti molto corposi.
Dalla versione 22, il sistema possiede una protezione che disabilita il log strutturato se nel server rimangono meno di 500 MB di spazio libero. Si consiglia tuttavia di mantenere il log delle query normalmente disattivato e di evitare il log di oggetti complessi per non sovraccaricare inutilmente questo sistema.
Si segnala infine che i log strutturati delle sessioni vengono cancellati definitivamente dopo trenta giorni per motivi di privacy.
Gestione dei database di produzione #
I database di produzione sono collocati nello stesso server delle applicazioni che li devono usare. Ă possibile accedere alle pagine di gestione dei database del server in due modi:
- Tramite il sottomenu App e dati del menu Dati di progetto, oppure
- Tramite il sottomenu Database di produzione del menu Installazioni del server.
La pagina di gestione mostra la lista di ogni database del server. Per ognuno di essi è possibile eseguire le seguenti operazioni tramite il menu di lista:
- Backup
- Restore
- Download di un backup
- Eliminazione
Ă possibile inoltre accedere ad un query editor, come mostrato nellâimmagine seguente.
Le operazioni di backup e restore possono essere utili per spostare un database di produzione nellâambiente di sviluppo o viceversa, ma anche per preparare i dati per i test di non regressione o di carico.
Il sistema di backup periodico dei dati dei database viene invece implementato a livello dellâintero server, come illustrato nei paragrafi seguenti.
Configurazione del server #
La configurazione del server avviene attraverso le pagine a cui si accede dal menu del server. Vediamole una per una.
Impostazioni #
La pagina delle impostazioni contiene le impostazioni generali del server, ed è divisa in varie card. Nella prima è possibile tenere sotto controllo i parametri piĂš importanti (%CPU, RAM, storage e traffico), oltre a poter effettuare lâupgrade del server e la condivisione nel gruppo di lavoro.
Nella seconda card è possibile modificare il nome del server, cosÏ come è conosciuto nella console, mentre il codice univoco viene assegnato dalla console al momento della creazione e non è modificabile.
à inoltre possibile sapere quale versione della piattaforma è installata nel server ed eventualmente aggiornarla. Nei paragrafi seguenti illustreremo la procedura migliore per aggiornare la piattaforma dei propri server.
Nella zona seguente si possono attivare o meno alcuni servizi, fra i quali il test automatico, che permette di utilizzare il server come target di esecuzione di test automatici, e il servizio feedback e issue, che, appunto, permette di raccogliere feedback dagli utenti e gestire le issue sui server di sviluppo.
La gestione delle issue è attiva per default nei server di sviluppo, mentre quella dei feedback deve essere attivata in quanto il servizio di raccolta feedback è un servizio aggiuntivo contenuto nel pacchetto analytics.
Nellâultima zona infine è possibile configurare un’applicazione come default per il server. In questo caso sarĂ sufficiente digitare il nome completo del server per entrare nellâapplicazione.
à infine possibile aggiungere pacchetti Node.js personalizzati, inserendone il nome e la versione nel campo Pacchetti npm personalizzati. I pacchetti devono essere separati da virgola. Ad esempio, questa è una stringa valida per inserire il pacchetto ftps e image-size: ftps@1.1.1,image-size@1.0.0.
Dopo ogni modifica occorre cliccare il pulsante verde Salva in alto a destra per confermare lâoperazione.
Monitoraggio delle attivitĂ #
La pagina di monitoraggio delle attivitĂ permette di conoscere lâallocazione delle risorse del server in tempo reale. Oltre ai grafici relativi alla CPU, alla RAM e al numero di sessioni, è possibile conoscere lo stato di tutti i processi in esecuzione. Per ogni processo viene riportata la RAM allocata totale ed in percentuale, lâaffinitĂ con le CPU del server, la percentuale di CPU attualmente utilizzata e il codice di stato del processo.
I processi sono classificati nelle seguenti categorie:
- Processi di sistema (System).
- Processi del framework di Instant Developer Cloud (Framework).
- Processi per le connessioni ai database (Connections).
- Processi per la gestione del database (DB).
Infine ogni worker di ogni applicazione verrĂ riportato in un gruppo separato indicando il tipo di worker, il numero delle sessioni applicative nel worker e i restanti dati del processo.
Tutti i dati relativi ai processi vengono raccolti analizzando il risultato del comando top eseguito dal sistema operativo del server.
Se il periodo scelto nel filtro delle date contiene il momento attuale, il grafico delle risorse si aggiornerĂ ogni 30 secondi, mentre la lista dei processi si aggiornerĂ ogni 10 secondi. I dati vengono mantenuti solo per gli ultimi 60 giorni.
La pagina si chiude mostrando il grafico dellâutilizzo dello storage, cioè del disco dati e del traffico di rete.
Questa pagina fornisce informazioni molto importanti per comprendere se:
- La capacità del server è adeguata al carico di lavoro che varia nel tempo.
- Esistono processi bloccati o che assorbono una quantitĂ eccessiva di risorse.
- Quali tipi di attivitĂ sono in corso.
Configurazione dei worker #
Questa pagina permette di configurare i valori di default per la configurazione dei worker delle applicazioni installate.
In particolare, specificando il Numero massimo di worker per app è possibile definire il numero di processi worker che verranno creati dal server per gestire le sessioni di ogni applicazione. Il Numero minimo di utenti per worker indica qual è il numero di sessioni che ogni worker gestirĂ prima che venga avviato un nuovo processo che prenda in carico nuove sessioni client. Il Numero massimo di utenti per app indica il numero massimo di sessioni gestite contemporaneamente da unâapplicazione prima che questa rifiuti l’avvio di una nuova sessione. In questo caso il valore tiene conto della somma di tutte le sessioni dei worker della stessa app.
Parametri di runtime #
Questa pagina permette di aggiungere parametri di runtime che rappresentano valori di default per tutte le applicazioni installate nel server.
Installazioni #
La pagina delle installazioni contiene la lista delle applicazioni installate e permette di gestirle. Si ricorda che la stessa build può essere installata piÚ volte nello stesso server, per dare luogo a piÚ installazioni a partire dalla medesima base di codice.
Domini #
La pagina dei domini permette di configurare i nomi di dominio internet che devono essere associati al server. Per ogni nome di dominio configurato è possibile specificare lâeventuale certificato SSL da utilizzare e unâapplicazione predefinita da avviare automaticamente.
Esistono due tipi di domini: gli alias e i domini personalizzati.
Alias #
Gli alias sono i domini piĂš semplici da configurare; per crearne uno è sufficiente cliccare il pulsante +Alias. ApparirĂ una nuova riga nella lista dei domini, allâinterno della quale è possibile specificare un nome e lâapp predefinita da associare al dominio.
Il valore inserito nel campo del nome verrĂ usato per calcolare un dominio con il pattern [nome]-[codice della propria organizzazione].instantdevelopercloud.com. Ad esempio, usando come nome myapp su un server dellâorganizzazione myorg, il dominio personalizzato diventa myapp-myorg.instantdevelopercloud.com. Lo scopo è quello di fornire un modo semplice per personalizzare lâaccesso alle proprie applicazioni da parte degli utenti finali, senza dover necessariamente acquistare un proprio dominio.
Il pulsante Salva permette di salvare i dati nel database della console, mentre il pulsante Carica sul server configura effettivamente il server di riferimento per lâuso del certificato.
Per quanto riguarda i certificati HTTPS, Il dominio di tipo Alias viene sempre gestito automaticamente da Instant Developer Cloud, attraverso il sistema letâs encrypt.
Il pulsante Ripristina lâultima configurazione caricata permette di riallineare i dati della console di uno specifico Alias allâultima configurazione effettivamente caricata sul server.
Siccome i certificati sono caricati allâavvio di Node.js, dopo aver modificato e salvato i dati di questa pagina occorre riavviarlo per rendere effettiva la modifica. A tal fine, è possibile utilizzare il comando Riavvia Node.js disponibile nella pagina Impostazioni.
Dominio personalizzato #
I domini personalizzati permettono di utilizzare un qualsiasi dominio che sia puntato sullâIP del server. Questo dato è disponibile nel box in alto a sinistra nella pagina di gestione del server, sotto al nome, come mostrato nellâimmagine alla pagina seguente.
Per creare un dominio personalizzato è sufficiente cliccare il pulsante +Dominio. ApparirĂ una nuova riga nella lista dei domini, allâinterno della quale è possibile specificare un nome, i dati relativi al certificato SSL da utilizzare e lâapp predefinita da associare al dominio.
Per configurare il certificato SSL ci sono due possibilitĂ : usare il proprio certificato SSL oppure farne creare uno al sistema tramite Letâs Encrypt.
Per poter utilizzare il proprio certificato SSL è necessario caricare sul server tre file in formato PEM:
- Certificato SSL: è un file di testo che contiene la catena del certificato.
- Chiave del certificato: è un file di testo che contiene la chiave privata relativa al certificato.
- Bundle: è un file di testo che contiene gli eventuali certificati delle Autorità di Certificazione (AC) da utilizzare al posto della lista predefinita curata da Mozilla. Il file può essere vuoto, ma se il certificato è autofirmato è obbligatorio indicare la propria autorità di certificazione.
Per maggiori informazioni sul formato dei certificati è possibile far riferimento alla documentazione di node.js.
Ă possibile chiedere ad Instant Developer Cloud di generare i file del certificato in automatico, tramite il sistema Letâs Encrypt. A tal fine è sufficiente abilitare la casella di controllo Usa un certificato automatico.
Il pulsante Salva permette di salvare i dati nel database della console, mentre il pulsante Carica sul server configura effettivamente il server di riferimento per lâuso del certificato.
Il pulsante Ripristina lâultima configurazione caricata permette di riallineare i dati della console di uno specifico Dominio allâultima configurazione effettivamente caricata sul server.
Siccome i certificati sono caricati allâavvio di Node.js, dopo aver modificato e salvato i dati di questa pagina occorre riavviarlo per rendere effettiva la modifica. A tal fine, è possibile utilizzare il comando Riavvia Node.js disponibile nella pagina Impostazioni.
Letâs Encrypt con proprio nome di dominio #
Non appena si carica sul server un dominio basato su certificato Letâs Encrypt, il server effettua le operazioni di verifica e di creazione del dominio. Qualora si manifestassero errori nella registrazione del dominio, su Letâs Encrypt comparirĂ un messaggio di errore associato al dominio che lo ha generato.
La causa principale di errori di creazione del certificato risiede nella configurazione dei puntamenti del dominio al server. Infatti, il puntamento del dominio al server deve essere effettuato tramite IPv4, inoltre il dominio non deve avere un puntamento IPv6.
Molti registrar creano i domini con due puntamenti di default: IPv4 e IPv6. Modificando solo quello IPv4 per puntare allâIP del server e non cancellando il puntamento IPv6 si otterrĂ un errore nella fase di verifica effettuata da Letâs Encrypt.
Analytics #
Questa pagina permette di installare il servizio Analytics sul server di produzione e di configurarlo. Per poter installare Analytics è richiesto lâacquisto del relativo pacchetto.
Una volta installato il servizio Analytics, il server potrĂ essere utilizzato come punto di raccolta delle informazioni provenienti dalle applicazioni.
Backup #
La pagina dei backup contiene la lista degli snapshot del server effettuati dalla console tramite i servizi di Google Cloud Platform.
I backup del server vengono effettuati nelle seguenti condizioni:
- Subito prima dellâinstallazione o della disinstallazione di unâapplicazione.
- Se si clicca il pulsante Backup in alto nella pagina.
- Se è attivo il servizio Backup giornaliero o Backup orario per il server.
- Subito prima di effettuare un ripristino del server.
Verranno mantenuti i backup degli ultimi 30 giorni indipendentemente dal motivo per cui sono stati creati.
Siccome il backup è uno snapshot coerente del disco dati dellâintero server, esso contiene tutti i database, tutto il file system e tutto il codice di tutte le applicazioni in esso installate.
Nel caso in cui un server risulti irraggiungibile o compromesso, la procedura di ripristino permette di ricreare completamente il server usando come disco dati il backup desiderato. La procedura di ripristino richiede qualche minuto di tempo e riporta lo stato dellâintero server al momento in cui il backup è stato effettuato. Il ripristino del disco di sistema è invece sempre totale. Il disco di sistema viene ricostruito a partire dalla versione originale relativa alla versione di piattaforma installata nel server.
Lâuso degli snapshot coerenti è un ottimo sistema di disaster recovery in quanto permette di ripristinare lo stato del server ad un qualunque momento in cui è avvenuto il backup con una semplice operazione di console, richiedendo solo qualche minuto.
Log #
La pagina dei log, infine, permette di accedere ai log dellâintero server. In particolare ai dati di console.log e console.error non catturati dai log strutturati e al log del server vero e proprio.
Si consiglia di utilizzare il pulsante di download per ottenere il contenuto del log come file di testo. Il contenuto dei file di log è spesso utile per ottenere informazioni sulle operazioni del server e su eventuali anomalie di funzionamento.
Aggiornamento della piattaforma #
La piattaforma Instant Developer Cloud è in continua evoluzione: ogni anno sono previste due release maggiori, la prima a fine gennaio e la seconda a fine luglio. Fra queste due release maggiori possono essere rilasciate delle release minori, a seconda della necessità di correggere malfunzionamenti o regressioni.
Lâaggiornamento dei propri server di sviluppo e di produzione alle release maggiori deve essere accuratamente pianificato.
Lâaggiornamento alla release minori, invece, può essere tranquillamente demandato alla console attivando per il server il flag Installa gli aggiornamenti automaticamente, contenuto nella pagina delle impostazioni del server. In questo caso i server di sviluppo verranno automaticamente aggiornati. I server di produzione verranno invece aggiornati automaticamente al primo riavvio, oppure è possibile eseguire lâoperazione manualmente.
Lâaggiornamento di un server ad una nuova release avviene dalla pagina delle impostazioni del server, cliccando il pulsante Cambia versione. In questa fase verranno presentate anche le note di rilascio della nuova versione: si consiglia di leggerle accuratamente prima di continuare.
Aggiornamento alla release maggiore successiva #
Il passaggio ad una release maggiore successiva dei propri server di sviluppo e di produzione è unâoperazione normalmente non invertibile, fatta eccezione per i server di produzione, per i quali è possibile ritornare alla versione precedente ripristinando un backup del server eseguito tramite la console subito prima del passaggio.
La ragione consiste nel fatto che le nuove versioni possono contenere versioni successive dellâintero sistema operativo, a tutti i livelli. La versione 22.1, ad esempio, ha aggiornato il database server a Postgres 13.3 e questa operazione non è invertibile. Il codice stesso del framework di Instant Developer Cloud si adatta alle nuove versioni dei sistemi operativi e delle centinaia di pacchetti base che ogni volta vengono aggiornati per garantire la massima sicurezza.
Inoltre le migliaia di punti di modifica che ogni versione maggiore contiene, non permettono di garantire a priori al 100% che non ci saranno breaking change nei propri progetti. In questo caso la protezione dalle breaking change avviene a posteriori: ogni regressione segnalata al servizio di assistenza viene prontamente corretta, ripristinando esattamente il comportamento precedente o quello piĂš vicino ad esso tecnicamente possibile.
Per queste ragioni è necessario pianificare la fase di passaggio alla release maggiore successiva come segue:
- Evitare i periodi critici in cui sarĂ necessario effettuare rilasci delle proprie applicazioni. Si consiglia di mantenere una finestra temporale di due settimane.
- Effettuare lâaggiornamento del solo server di sviluppo e del server dedicato ai test, se disponibile.
- Testare prontamente i propri progetti per verificare che essi compilino ancora, possano essere installati su un server di test e che i test di non regressione abbiano successo.
- Segnalare prontamente al servizio di assistenza eventuali regressioni. Le segnalazioni di regressione vengono sempre considerate urgenti, sebbene si tenga conto anche degli effetti della regressione per valutare la prioritĂ .
- Solo quando tutti i test avranno avuto successo sarĂ possibile aggiornare i server di produzione alla nuova release e di conseguenza aggiornare le applicazioni, se necessario.
Nel caso in cui non sia possibile pianificare una finestra temporale di almeno due settimane in cui eseguire i test di passaggio, si consiglia di operare come segue:
- Nella console di Instant Developer Cloud, creare una seconda organizzazione dedicata ai test.
- Acquistare una licenza di sviluppo per una sola mensilitĂ .
- Aggiornare il server di produzione alla nuova release.
- Trasferire una copia dei progetti alla seconda organizzazione.
- Effettuare il test dei progetti nella seconda organizzazione. Quando tutti i test hanno successo, sarĂ possibile aggiornare tutti i server dellâorganizzazione principale.