Vai al contenuto
megapromotingParliamone

Competenza · Infrastruttura e operazioni

Mettiamo l’applicazione su un server che controlliamo, con pubblicazione reversibile, copie di sicurezza verificate e un punto in cui si vede quando qualcosa è caduto.

Hosting, messa in funzione, monitoraggio e continuità per applicazioni web e piattaforme con database. Lavoriamo su un'infrastruttura che il cliente può rivendicare: macchine virtuali presso fornitori europei, nginx, processi sotto supervisione, container, database autogestito. Include la risposta alla domanda «dove stanno effettivamente i miei dati».

Già costruitoOperăm în acest fel mai multe sisteme proprii, iar configurațiile sunt în depozite, nu doar pe servere. Site-ul acesta rulează pe nginx cu Next.js 16 sub PM2, la OVHcloud București. Platforma de asistenți rulează pe Microsoft Azure, Poland Central, cu MySQL, Redis și RabbitMQ în containere legate la interfața locală. O platformă civică proprie folosește unități systemd cu publicare prin comutare atomică de legătură simbolică, copie de siguranță zilnică verificată și o sarcină separată de retenție care rulează numai dacă acea copie a reușit. Un board intern se publică prin runner propriu, cu acțiuni GitHub fixate pe amprentă completă și cu revenire automată la versiunea anterioară dacă verificarea de sănătate cade după publicare. Rezerva care trebuie spusă: gradul de automatizare diferă de la sistem la sistem. Publicarea acestui site se face încă manual, iar migrările de bază de date sunt aplicate cu mâna, deliberat. Nu vindem un lanț automat pe care nu îl avem peste tot.

Un’app che funziona sul laptop e una che funziona in produzione si distinguono per cose che non si vedono nell’interfaccia: cosa succede quando il processo muore alle tre di notte, cosa succede quando una pubblicazione va male, dove finiscono i log, chi scopre per primo che qualcosa è caduto e da dove si ripristina il database se il disco scompare. Questo servizio si occupa proprio di quella parte.

La scelta di base che proponiamo è l’infrastruttura che il cliente può rivendicare: una macchina virtuale presso un fornitore europeo, nginx davanti, processi sotto un supervisore, container dove ha senso, database autogestito dove l’indipendenza conta più della comodità. Non perché le piattaforme gestite siano cattive — ma perché un giorno si vuole poter prendere tutto e andarsene, e se questo non è stato pensato dall’inizio, non si può più fare a buon mercato.

La domanda sulla sovranità dei dati ha una sola risposta onesta: una verificata. La localizzazione si conferma interrogando il servizio di metadati della macchina virtuale e il registro degli indirizzi, non leggendo la pagina di marketing del fornitore. La differenza non è teorica — per un trasferimento all’interno dello Spazio Economico Europeo, il capitolo sui trasferimenti della Legge 195/2024 semplicemente non si applica. Una migrazione fatta da noi ha spostato una piattaforma da un database ospitato negli Stati Uniti a uno stack autogestito nell’Unione Europea, proprio per questo motivo.

Ciò che non promettiamo: che tutto sia automatico. Le migrazioni di schema le applichiamo a mano, deliberatamente, perché una migrazione applicata automaticamente in produzione da una catena che non sa cosa c’è nella tabella è il modo abituale in cui si perdono dati. La pubblicazione del codice si automatizza; la modifica della struttura del database resta una decisione umana, con una copia di sicurezza recente alle spalle.

Cosa comprende

Il lavoro, per componenti

Pubblicazione reversibile, con verifica dopo, non solo prima

La pubblicazione non termina quando i file sono arrivati sul server, ma quando una richiesta reale dimostra che la nuova versione è quella servita. In una delle implementazioni, lo script sincronizza la directory, conserva la versione precedente accanto, poi estrae il nome del pacchetto dalla pagina distribuita e verifica sull’indirizzo pubblico se viene servito esattamente quel file; se no, torna da solo alla versione precedente. Non è teorico: il meccanismo ha intercettato un pacchetto rimasto vecchio nella directory del runner e ha annullato una pubblicazione che altrimenti sarebbe sembrata riuscita.

Commutazione atomica di versione, con il processo sotto systemd

L’alternativa a «fermiamo, copiamo sopra, avviamo» è la directory delle versioni più un collegamento simbolico commutato in un’unica operazione. L’unità systemd punta sempre al percorso stabile, e il rollback significa commutare il collegamento indietro. L’unità ha una politica di riavvio in caso di errore con breve pausa, tempo massimo di arresto e restrizioni di sistema: niente escalation di privilegi, file system protetto, directory personali inaccessibili, con un elenco esplicito di percorsi in cui è autorizzata a scrivere.

nginx davanti, con limiti scritti per il caso reale

Terminazione TLS con rinnovo automatico del certificato, HSTS con durata di un anno e inclusione dei sottodomini, compressione con soglia minima di dimensione, risorse statiche con scadenza lunga e marcatura immutabile, e l’applicazione collegata all’interfaccia locale così da non poter essere raggiunta direttamente da Internet. I limiti di rate si stabiliscono per tipo di traffico, non globalmente. Una lezione pagata merita di essere detta: sotto HTTP/2, il limite di connessioni conta i flussi, non le connessioni — a un valore basso, un solo caricamento di pagina respinge da solo i propri font e script con 429.

Copia di sicurezza che si verifica, non solo si esegue

Attività quotidiana programmata, con avvio al boot successivo se la macchina era spenta all’ora prevista e con ritardo casuale per non avviare tutto nello stesso secondo. L’esportazione del database viene compressa, e se il file risultante è vuoto, l’esecuzione è trattata come fallimento — un export che termina «con successo» e produce zero byte è il modo abituale in cui si scopre, sei mesi dopo, che non esiste una copia. I file nel deposito di oggetti vengono sincronizzati separatamente. Una copia 100% locale non sopravvive alla perdita del disco, quindi la copia va anche fuori dalla macchina, in un account di archiviazione nell’Unione Europea con replicazione geografica, versioning, cancellazione reversibile e scadenza automatica — con accesso tramite identità gestita, così non esiste alcuna chiave di archiviazione sul disco.

La cancellazione programmata viene eseguita solo dopo una copia riuscita

L’attività di conservazione dipende esplicitamente da quella di copia e parte dopo di essa. Una pulizia senza copia recente è l’unica forma di cancellazione da cui non esiste ritorno. A differenza della copia, la cancellazione non recupera le esecuzioni mancate: se la macchina era spenta, il giorno dopo non si cancella due volte. Ogni esecuzione scrive una riga in una tabella delle esecuzioni, e prima della prima attivazione reale l’attività gira a vuoto per almeno una settimana e si legge il log.

Allarmi che non mentono e non fanno spam

Un’attività programmata che restituisce 200 non significa un’attività che ha funzionato. Il nostro wrapper di esecuzione legge il corpo della risposta e vi cerca gli errori parziali, poi invia un avviso con limitazione di frequenza, così un servizio guasto per tutto il giorno non produca novantasei messaggi identici. Il motivo per cui esiste: un report giornaliero è rimasto morto per undici giorni di fila, e l’unica traccia era un vuoto in una tabella che nessuno guardava. L’attività programmata era scattata tutte e undici le volte.

Catena di pubblicazione che non può essere deviata a monte

Le azioni nel flusso di integrazione sono fissate all’ampronta completa del commit, non all’etichetta. Nel marzo 2026, un’azione diffusa è stata reindirizzata dalle etichette `v1`…`v45` verso codice malevolo e ha raggiunto oltre 23.000 depositi in 24 ore; un’impronta non si sposta. Il flusso non conserva credenziali nella copia di lavoro, e la pubblicazione non passa tramite un token: passa tramite un runner proprio, sulla macchina di destinazione, con diritti concessi puntualmente. Così nessuna chiave di accesso al server resta sulla piattaforma di codice.

Container con limiti, controlli di salute e log che non riempiono il disco

Ogni servizio ha politica di riavvio, controllo di salute proprio (preparazione del database, un endpoint di stato dell’applicazione), limiti di CPU e memoria dove il carico lo richiede, e rotazione dei log a livello del motore dei container, con dimensione massima e numero di file. Le porte dei database si collegano all’interfaccia locale, mai pubblica. Le variabili obbligatorie sono dichiarate in modo che il container rifiuti di avviarsi se mancano, invece di partire con un valore predefinito pericoloso.

Database self-hosted, quando l’indipendenza conta

Stack completo in container — database, autenticazione, interfaccia REST, canale in tempo reale, archiviazione file, gate di accesso — con le estensioni attivate esplicitamente e con i parametri di memoria e di connessioni adatti alla macchina, non lasciati ai valori predefiniti. Le migrazioni sono file versionati nel repository e vengono applicate manualmente, con il riavvio del componente che mantiene lo schema in memoria. Il motivo di questa scelta è semplice: una piattaforma gestita al di fuori dell’Unione Europea può essere eccellente dal punto di vista tecnico e tuttavia inadeguata dal punto di vista giuridico.

Come si presenta

Il percorso, passo dopo passo.

01

Inventariamo ciò che esiste e ciò che si può perdere

Ciò che gira effettivamente sulla macchina, sotto quale supervisore, con quali versioni, con quali porte esposte; quali copie di sicurezza esistono e se qualcuna sia mai stata ripristinata; quali segreti sono finiti nei depositi; qual è la differenza tra la configurazione nel deposito e il file sul server. L’ultimo punto produce quasi sempre sorprese — noi stessi abbiamo documentato un caso in cui il file sul server era stato modificato direttamente, fuori dal deposito, e aveva lasciato accanto a sé una copia di riserva con marca temporale. Consegnamo l’inventario e l’elenco dei punti unici di guasto.

02

Impostiamo la base: server, nginx, processi, hardening

Firewall che rifiuta per impostazione predefinita le entrate e apre solo ciò che serve, protezione contro i tentativi ripetuti di autenticazione, spazio di swap dimensionato, nginx con TLS e rinnovo automatico, applicazione legata all’interfaccia locale, supervisore di processi configurato per avviarsi al boot. Consegnamo le configurazioni nel deposito, non solo sulla macchina, così che la persona successiva non debba ricostruirle a memoria.

03

Rendiamo la pubblicazione ripetibile e reversibile

Script di pubblicazione con la versione precedente conservata, verifica di salute dopo la pubblicazione e ritorno automatico in caso di errore. Dove esistono team e integrazione continua, si aggiunge un runner proprio sulla macchina target, con azioni fissate sul fingerprint e senza credenziali nella copia di lavoro. Consegnamo la procedura scritta e un ritorno eseguito davanti al cliente — un ritorno non testato non è un ritorno.

04

Impostiamo le copie, la conservazione e gli allarmi

Copia giornaliera con verifica che il file non sia vuoto, copia fuori dalla macchina in una regione dell’Unione Europea, attività di retention che viene eseguita solo dopo una copia riuscita e lascia traccia, più allarmi con limitazione di frequenza che leggono il contenuto della risposta, non solo il codice di stato. Consegnamo un ripristino di prova effettivamente eseguito e il suo registro.

05

Consegniamo le chiavi e scriviamo ciò che resta non fatto

Accesso con un proprio account, documentazione operativa, elenco delle attività pianificate e — obbligatoriamente — l’elenco onesto delle cose che non sono state automatizzate e perché. Da noi, due restano quasi sempre in elenco: le migrazioni di schema, applicate deliberatamente a mano, e la pubblicazione di questo sito, che è ancora manuale.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Straturile unei instalări, de jos în sus: mașina virtuală într-o regiune europeană confirmată, motorul de containere cu rotația jurnalelor, baza de date cu copia zilnică verificată și copia din afara mașinii, procesele sub supraveghetor cu repornire la eșec, nginx cu TLS și limite de rată — iar lateral, lanțul de publicare cu versiunea anterioară păstrată și revenirea automată.

I dati

Cosa tocchiamo, dove risiedono e quanto rimangono

Le domande che pone chiunque abbia un responsabile della protezione dei dati — poste qui prima che le ponga lui.

Dove stanno effettivamente i dati e come si verifica
La posizione si conferma dalla macchina, non dalla documentazione: il servizio di metadati del fornitore indica la regione reale, mentre il registro dell’indirizzo indica il paese. I nostri sistemi si trovano su OVHcloud, București, România e su Microsoft Azure, Poland Central — entrambi nello Spazio Economico Europeo. Le copie di sicurezza della piattaforma civica si trovano in una regione nordica dell’Unione, con replica in una seconda regione anch’essa dell’Unione. Queste righe hanno sostituito un elenco più lungo di luoghi che non siamo riusciti a confermare.
Ciò che vediamo noi durante il lavoro
Configurazione, log, schema del database e stato dei processi. Il contenuto dei dati personali non fa parte del lavoro; dove il debug richieda comunque un esempio, si usa un caso creato apposta. L’accesso amministrativo viene concesso per la durata dell’intervento, nominativamente, e revocato alla fine — e la revoca viene verificata, non presunta.
I log e per quanto tempo durano
I log web di questo sito vengono ruotati ogni giorno, con quattordici esemplari conservati, con diritti di lettura limitati al gruppo di amministrazione. A livello di container, la rotazione è eseguita dal motore di container, con dimensione e numero di file fissati, così che un servizio loquace non riempia il disco e non fermi il database — il modo più banale per mandare in crash una produzione.
I segreti non stanno nel deposito
I valori sensibili entrano da file di ambiente con diritti limitati, letti dall’unità di sistema, non scritti nell’unità — perché la definizione di un’unità e il journal di sistema sono leggibili da più persone di quanto si creda. Nella catena di pubblicazione, il file di ambiente della produzione non passa attraverso la piattaforma di codice: viene copiato localmente sulla macchina ed eliminato subito dopo la build. Quando prendiamo in carico un’infrastruttura esistente, il primo passaggio è sempre un inventario dei segreti finiti nei depositi, con un piano di rotazione.
Continuità: cosa succede quando ce ne andiamo
La consegna significa accesso in proprio presso il fornitore di infrastruttura, il deposito con tutte le configurazioni del server, la procedura di pubblicazione e di rollback, quella di ripristino della copia di sicurezza — testata, non solo scritta — e l’elenco delle attività programmate con ciò che fa ciascuna. Il blocco contro l’eliminazione accidentale viene impostato sul gruppo di risorse della produzione fin dall’inizio.

Un caso

Un report giornaliero che non andava più da undici giorni, in un sistema in cui tutto rispondeva 200

La situazione

In una piattaforma interna proprietaria, più routine automatiche producono ogni giorno report e puliscono i dati. I task venivano avviati dall’interno dell’applicazione, con contatori nel processo. Nulla segnalava alcun problema: il servizio era avviato, l’indirizzo rispondeva, i journal non contenevano errori.

Cosa abbiamo costruito

Il report giornaliero mancava da undici giorni, e l’unica traccia era un vuoto in una tabella che nessuno guardava. Sono emersi due difetti distinti. Il primo: un contatore avviato all’interno dell’applicazione si resetta a ogni riavvio del servizio, quindi una routine con intervallo più lungo dell’intervallo tra le pubblicazioni non si attiva mai. Il secondo, più insidioso: la routine era stata avviata correttamente tutte le undici volte e aveva restituito ogni volta codice 200 — ma il corpo della risposta conteneva fallimenti parziali che nessuno leggeva.

Cosa è emerso

La pianificazione è stata spostata fuori dall’applicazione, in un pianificatore di sistema a cui non importano i riavvii. L’esecuzione è stata racchiusa in uno script che scrive una riga di journal per esecuzione, analizza il corpo della risposta alla ricerca di chiavi di errore e invia un allarme a un canale di messaggistica — con limitazione di frequenza, affinché una dipendenza caduta per tutto il giorno non produca novantasei messaggi identici. Una risposta 200 con fallimenti interni ha ora uno stato proprio, distinto dal successo.

Cosa non dice il caso

Nulla di tutto questo è stato un problema di infrastruttura nel senso classico: il server funzionava, il disco aveva spazio, il processo era vivo. Proprio per questo è durato undici giorni. I difetti operativi più costosi non sono i blocchi — quelli si vedono — ma le cose che riportano successo senza fare nulla. Il controllo di salute che conta non chiede «è avviato?», ma «ha fatto ciò che doveva, quante volte doveva?».

Domande

Cosa ci chiedono le persone prima di chiamare

Dove saranno effettivamente i nostri dati?

Dove scegliete, e verifichiamo che sia davvero lì. I nostri sistemi si trovano su OVHcloud, Bucarest e su Microsoft Azure, Poland Central, entrambi nello Spazio Economico Europeo, e la posizione è stata confermata interrogando il servizio di metadati della macchina virtuale e il registro dell’indirizzo — non leggendo la documentazione del fornitore. La verifica conta: per un trasferimento all’interno dello Spazio Economico Europeo, il capitolo sui trasferimenti della Legea 195/2024 non si applica e non sono necessarie autorizzazioni speciali. Al di fuori di esso, compare un dossier di garanzie.

Perché un server proprio e non una piattaforma gestita?

Non sempre. Una piattaforma gestita è la scelta corretta quando il team è piccolo, il traffico è irregolare e nulla nello stack ha requisiti di residenza. Il server proprio diventa l’argomento migliore in tre situazioni: quando i dati devono restare in una determinata giurisdizione, quando il costo diventa imprevedibile su scala, e quando volete poter prendere tutto e andarvene. Abbiamo fatto anche la migrazione inversa per un sistema proprio: da un database ospitato negli Stati Uniti a uno stack self-hosted nell’Unione Europea, con otto container — database, autenticazione, interfaccia REST, tempo reale, storage, metadati, pannello e porta di accesso.

Cosa succede se una pubblicazione va male?

Si fa rollback, e preferibilmente da sola. La versione precedente resta sul disco accanto a quella nuova, e dopo la pubblicazione un controllo richiede la pagina reale e conferma che il file servito sia quello appena costruito; in caso contrario, lo script torna automaticamente indietro. Dove usiamo il passaggio atomico del collegamento simbolico, il rollback è una sola operazione. Non è una descrizione da brochure — il meccanismo ha già intercettato una pubblicazione con un pacchetto vecchio rimasto nella directory di lavoro del runner e l’ha annullata.

Fate copie di sicurezza? Con quale frequenza e le testate?

Ogni giorno dove l’abbiamo costruita — e lo sottolineiamo, perché una copia automatica non appare da sola quando si sposta un’applicazione su un server. La copia parte a un’ora fissa, viene recuperata al boot successivo se la macchina era spenta, e se l’esportazione esce vuota l’esecuzione è trattata come fallimento. La copia parte anche fuori dalla macchina, in una regione dell’Unione Europea, con replica, versioning, eliminazione reversibile e scadenza automatica. Il test di ripristino fa parte della consegna: una copia mai ripristinata è un’ipotesi, non una copia.

Chi lo viene a sapere per primo quando qualcosa cade?

Dipende da cosa abbiamo costruito, e vale la pena dirlo senza abbellimenti. I controlli di salute a livello di container e i punti di stato delle applicazioni esistono; l’allarme verso un canale di messaggistica, con limitazione di frequenza, esiste dove lo abbiamo costruito. Un punto di verifica dello stato che nessuno interroga non è monitoraggio — è una pagina. Se volete vero monitoraggio, è una fase separata, con un osservatore esterno che interroga periodicamente e con un destinatario dell’allarme che può essere svegliato.

Applicate automaticamente le migrazioni del database a ogni pubblicazione?

No, ed è una decisione presa consapevolmente, non una svista. La catena di pubblicazione costruisce e copia il codice; e basta. Le modifiche di schema sono file versionati nel repository, applicati manualmente, con una copia di backup fresca dietro, e i componenti che mantengono lo schema in memoria vengono riavviati dopo. Una migrazione applicata automaticamente in produzione da un processo che non sa cosa c’è nella tabella è il modo abituale in cui si perdono dati in modo irreversibile.

Come evitate che la vostra catena di pubblicazione diventi un vettore di attacco?

Attraverso tre regole. Le azioni esterne sono fissate sull’impronta completa del commit, non sull’etichetta — a marzo 2026 un’azione usata su larga scala è stata reindirizzata dalle sue etichette verso codice malevolo e ha raggiunto oltre 23.000 repository in 24 ore. La copia di lavoro non conserva credenziali. La pubblicazione non avviene con una chiave di accesso memorizzata nella piattaforma di codice, ma tramite un esecutore proprio che gira sulla macchina di destinazione, con diritti concessi puntualmente. Riconosciamo che non tutti i nostri progetti più vecchi rispettano ancora tutte e tre; la loro migrazione è un lavoro a sé.

Prendete in carico un’infrastruttura fatta da altri?

Sì, e il primo passaggio è sempre un inventario, non una modifica. Cosa gira effettivamente, sotto quale supervisore, con quali versioni, quali porte sono esposte, quali copie di sicurezza esistono, se qualcuna è mai stata ripristinata, quali segreti sono finiti nei repository e in che misura la configurazione nel repository assomiglia ancora al file sul server. L’ultima verifica produce quasi sempre qualcosa: abbiamo documentato, in un progetto proprio, un file di configurazione modificato direttamente in produzione, che ha lasciato accanto una copia di backup con timestamp.

Cosa succede se vogliamo lavorare con qualcun altro?

Andate via del tutto. L’infrastruttura sta fin dall’inizio sui vostri account presso il fornitore, e la consegna include il repository con tutte le configurazioni del server, la procedura di pubblicazione e di rollback, la procedura di ripristino testata e l’elenco delle attività programmate con ciò che fa ciascuna. Il blocco contro la cancellazione accidentale del gruppo di risorse di produzione viene impostato fin dall’installazione. Se un fornitore condiziona la vostra uscita alla riscrittura dell’infrastruttura, quello era il problema, non la tecnologia.

Su cosa si basano le affermazioni sopra (30 fonti)
  1. https://www.megapromoting.com răspunde 200 pe nginx + Next.jshttps://www.megapromoting.com/servicii · 2026-09-06

29 di esse sono codice e file dei nostri repository. Non ne pubblichiamo il nome né la riga: insieme, in un'unica pagina, descriverebbero con troppa precisione come sono costruiti sistemi che non sono solo nostri. Le esaminiamo con te, nel repository, su richiesta — la verifica resta possibile, solo che avviene in una discussione.

Cosa vorresti che funzionasse meglio?

Raccontaci il tuo processo. Insieme stabiliamo cosa vale la pena costruire, cosa possiamo collegare e come verifichiamo il risultato.

Parliamone