Il rollback è un'operazione di recovery che inverte una modifica software o di configurazione, ripristinando uno stato precedente noto come funzionante. In Kubernetes, la cronologia dei deployment mantiene 10 vecchi ReplicaSet di default, mentre PostgreSQL ROLLBACK scarta gli aggiornamenti della transazione corrente, non i dati precedentemente commitati.
Un rilascio va live, i primi utenti aprono l'app e arrivano i ticket di supporto prima ancora che il team abbia finito di festeggiare. Una schermata di checkout crasha, una nuova risposta API rompe un client più vecchio, o un cambio di configurazione devia le richieste. Il team deve ripristinare il servizio senza dover indovinare quali file siano cambiati o chiedere a ogni utente di reinstallare tutto.
A questo serve il rollback. Non è prevenzione, né un tasto 'undo' magico. Il nuovo rilascio è già stato applicato. Il rollback è la risposta controllata quando quel rilascio causa errori, cali di performance, crash o comportamenti anomali. In pratica, solitamente ridistribuisce la versione precedente dell'app o ripristina una configurazione versionata, verificando poi che il servizio sia tornato in uno stato accettabile. Il tecniche di analisi dei fallimenti che il tuo team userà in seguito rimangono importanti, perché il rollback stabilizza l'incidente ma non ne spiega la causa.
Indice dei contenuti
- La realtà dei fallimenti in fase di deployment
- Come i sistemi moderni preservano la cronologia dei rilasci
- Il pericolo nascosto del rollback di database e dati
- Prendere la decisione operativa di revertare
- Ripristino istantaneo nelle app mobile e cross-platform
- Costruire una strategia di release resiliente
- Punti chiave per deployment più sicuri
La realtà dei fallimenti in fase di deployment
Un team mobile rilascia un nuovo bundle con una modifica alla navigazione e un aggiornamento di compatibilità del backend. Il pubblico in staging lo riceve per primo. In pochi minuti, gli utenti segnalano che una schermata principale non si carica. Il monitoraggio mostra un aumento degli errori, ma il team non riesce ancora a capire se il problema derivi dal bundle, dal API, da un feature flag o da una dipendenza.
La risposta corretta non è discutere la diagnosi perfetta mentre il numero di utenti colpiti aumenta. Se il team dispone di un artifact funzionante, può interrompere il rollout e ripristinare quella versione. L'applicazione torna a uno stato precedentemente validato, permettendo agli ingegneri di investigare il difetto e preparare una correzione.
Il rollback è ripristino, non prevenzione
Prevenzione tenta di bloccare un cambiamento errato prima che raggiunga gli utenti. Test, code review, controlli delle dipendenze, canary release e approval gate servono a questo scopo. Il rollback inizia quando la prevenzione fallisce o quando compare un'interazione imprevista in produzione.
Un rollback può interessare diverse parti di un sistema di delivery:
- code dell'applicazione: Redeploy dell'eseguibile o del web bundle precedente.
- Configurazione: Ripristina una versione di impostazioni, regole di routing o configurazioni di feature.
- Asset: Ritorno a immagini, script o file di contenuto compatibili.
- Esposizione delle feature: Disabilita una nuova funzionalità tramite kill switch o controllo del pubblico.
- Dati: Aborta una transazione attiva o ripristina i dati da un backup, con vincoli molto più stringenti.
L'ultima categoria richiede un trattamento separato. Il rollback di code dell'applicazione è spesso semplice se gli artifact sono immutabili e le dipendenze rimangono compatibili. Il rollback di dati salvati può causare perdite, corruzione o problemi normativi. Un rollback del rilascio non deve quindi implicare che ogni operazione sul database correlata possa tornare indietro in sicurezza.
Perché il delivery frequente richiede un recovery rapido
Il continuous delivery moderno rende i rilasci più frequenti. Questo crea un requisito pratico: il costo operativo di un cambiamento fallito deve rimanere limitato. Un team che può deployare velocemente ma necessita di un lungo processo manuale per il recovery ha ottimizzato solo metà del delivery.
Il rollback manuale è ancora possibile, ma dipende dalla memoria degli operatori su quali file siano cambiati, quali server siano stati aggiornati e quale configurazione appartenesse al rilascio precedente. Questo processo diventa fragile durante un incidente. I sistemi automatizzati migliorano il percorso conservando artifact immutabili, monitorando i segnali di health e effettuando il rollback quando vengono soddisfatte condizioni predefinite.
Regola pratica: Tratta il rollback come una capacità di produzione testata, non come un pulsante di emergenza che qualcuno dovrà imparare a usare durante l'outage.
Anche un rollback non è una soluzione permanente. Ripristina il servizio temporaneamente, ma il difetto di fondo rimane. Gli ingegneri devono comunque identificare il trigger, valutare i dati scritti durante il rilascio fallito e rilasciare una versione corretta o prendere un'altra decisione operativa consapevole.
Come i sistemi moderni preservano la cronologia dei rilasci
Un sistema di recovery può ripristinare solo ciò che riesce a identificare e recuperare. Conservare un vecchio commit del codice sorgente non basta se la build è stata creata con dipendenze divergenti, se il binario è stato sovrascritto o se la native shell non supporta più il bundle.
I sistemi di rilascio moderni risolvono il problema conservando una catena di evidenze dal codice sorgente all'artifact distribuito. Il team tagga una revisione stabile, blocca il dependency graph, crea un artifact indirizzabile e registra quale artifact ha raggiunto ogni ambiente. Quel registro dà agli operatori un target specifico invece di un'istruzione ambigua come "torna alla versione precedente".

Kubernetes come modello concreto
Kubernetes illustra chiaramente la struttura. Un Deployment controlla i ReplicaSet, e quei ReplicaSet conservano le revisioni del deployment. Kubernetes mantiene 10 vecchi ReplicaSet di default, e i team possono modificare questa retention con spec.revisionHistoryLimit. Impostando il valore a 0 disabilita completamente il rollback, come documentato nella Riferimento al Deployment di Kubernetes.
Un operatore può tornare alla revisione immediatamente precedente o selezionare una revisione storica specifica. Il rollback modifica la configurazione del template del Pod del Deployment, inclusi campi come l'immagine del container e le label. Non inverte automaticamente campi non correlati, come il numero di repliche. Successivamente, i controlli rollout-status confermano se la revisione di destinazione è diventata operativa.
Questa distinzione è fondamentale per il delivery di bundle mobile e web. Un sistema dovrebbe registrare:
- La versione attiva: Quale release ha ricevuto ogni ambiente, channel o dispositivo.
- L'identità dell'artifact: Una build immutabile o content-addressable, non un file che può essere sostituito sul posto.
- La compatibilità delle dipendenze: Se il bundle precedente funziona con il native shell, le API, i servizi e lo schema dati attuali.
- L'esito del ripristino: Se i dispositivi o le istanze hanno adottato con successo la release ripristinata.
“Precedente” deve indicare un artifact specifico
Un'etichetta come previous è utile solo se corrisponde a un rilascio immutabile. Se un team sovrascrive il file a cui punta quell'etichetta, il target di ripristino può cambiare senza che nessuno se ne accorga. Se l'artefatto non è più disponibile nello storage, il sistema di deployment potrebbe conoscere il numero di revisione ma non avere i byte necessari per ripristinarlo.
Per un'applicazione Capacitor, il web bundle gira anche all'interno di una shell nativa. Un bundle JavaScript precedente potrebbe dipendere da plugin nativi, permessi o comportamento del bridge che la shell attuale ha modificato. Ripristinarlo senza controllare la compatibilità può trasformare un incidente in un altro.
L'oggetto Approccio Capgo al version control e ai rollback riflette un principio più ampio: la cronologia dei rilasci deve essere esplicita, recuperabile e collegata al pubblico che ha ricevuto ogni build. Un rollback riesce quando il team può rispondere rapidamente a tre domande: cosa era attivo, cosa era stabile e cosa può girare in sicurezza con il sistema circostante ora?
Il pericolo nascosto dei rollback di database e dati
Un deployment fallito può lasciare il team con un'istruzione urgente: "Ripristina semplicemente la versione precedente". Questo può funzionare per l'eseguibile code. Per un database può essere pericoloso, perché l'attività già confermata dei clienti potrebbe essere impossibile da annullare in modo pulito.
Il rollback dell'applicazione e il rollback dei dati sono operazioni diverse con modalità di errore diverse. Una release di code può spesso essere sostituita con un altro artefatto immutabile. Una migrazione dello schema potrebbe aver rinominato o rimosso un campo, trasformato valori salvati o cambiato le assunzioni per le scritture successive. Ordini, pagamenti, messaggi, record e consensi sono dati utente validi. Non dovrebbero scomparire solo perché una release dell'applicazione è fallita.
Perché code e lo schema possono andare fuori sincrono
Supponiamo che la release A utilizzi il vecchio schema, mentre la release B aggiunga una colonna o cambi il modo in cui un valore viene salvato. Dopo il deploy di B e l'esecuzione della migrazione, ripristinare A potrebbe far sì che la vecchia query code interroghi campi inesistenti o interpreti i nuovi dati in modo errato.
Il contrario crea un problema diverso. Revertire il database mentre i processi della release B sono ancora attivi può causare il fallimento delle scritture o lasciare uno stato parziale. Revertire sia code che il database può sembrare più pulito, ma rischia di cancellare attività legittime create dopo il deployment. La distinzione tra rollback dell'applicazione e rollback dei dati va inserita in ogni piano di release, non solo nelle operazioni sul database.
PostgreSQL mostra cosa fa un rollback transazionale. ROLLBACK interrompe la transazione corrente e scarta gli aggiornamenti effettuati all'interno di essa, evitando che un gruppo di scritture parziali diventi persistente. Non può annullare modifiche confermate da una transazione precedente. Eseguire comandi ROLLBACK fuori da un blocco di transazione non inverte i dati salvati.
Progetta le migrazioni per andare avanti
Un design di rilascio sicuro mantiene compatibili le versioni dell'app e gli schemi durante la transizione. I team dovrebbero anche documentare le pratiche di crittografia SQLite per le app Capacitor oltre alla compatibilità dello schema, ai controlli di accesso e alle procedure di recovery.
Una migrazione di tipo expand-and-contract segue solitamente questa sequenza:
- Expand: Aggiungi la nuova funzionalità allo schema senza rimuovere quella vecchia.
- Adopt: Distribuisci code in grado di leggere e scrivere entrambi i formati, o introduci il nuovo percorso mantenendo quello vecchio.
- Migrate: Sposta i record esistenti tramite un processo controllato, con monitoraggio e riconciliazione.
- Contract: Rimuovi la vecchia struttura solo quando le versioni dipendenti non ne avranno più bisogno.
Questa sequenza rende più plausibile un rollback di code, perché l'applicazione precedente può ancora usare uno schema che ne supporta il contratto. Non rende sicuro ogni rollback: riduce la probabilità che il ripristino introduca una nuova incompatibilità.
Anche i sistemi fintech, sanitari ed e-commerce hanno bisogno di auditabilità, controlli sulla privacy, gestione dello stato dei pagamenti e un piano di riconciliazione. Un forward fix può essere più sicuro che annullare transazioni valide o ripristinare uno snapshot che elimina l'attività successiva degli utenti.
Regola del database: Esegui il rollback di code liberamente solo quando le sue dipendenze e il data contract supportano questa azione. Tratta i dati committati come un record che va solo in avanti, a meno che una procedura di ripristino separata e testata non dimostri il contrario.
Prima del deployment, classifica ogni componente del rilascio in base alla sua reversibilità. Code, configurazione, esposizione delle feature, asset, schema e dati utente seguono regole di recupero diverse. Un backup testato può aiutare dopo una corruzione catastrofica, ma ripristinare un backup non sostituisce un design delle migrazioni backward-compatible.
Prendere la decisione operativa di revertare
Il rollback è una decisione operativa, non solo un comando di deployment. Qualcuno deve decidere se il problema osservato derivi dal rilascio, se lo stato precedente sia sicuro, se gli utenti coinvolti siano abbastanza da giustificare il revert e se un forward fix ridurrebbe il rischio in modo più efficace.
DORA considera il change-failure rate come i deployment che richiedono un intervento immediato, spesso un rollback o un hotfix, e traccia separatamente il tempo di ripristino dei deployment falliti. Questo rende il rollback sia un evento di affidabilità che un indicatore di performance del delivery, come descritto nella storia delle metriche DORA.
Definisci il trigger prima dell'incidente
I team migliori concordano sulle condizioni di rollback durante la fase di design del rilascio. Un trigger può combinare segnali di crash, tassi di errore, health check falliti, segnalazioni del supporto o un confronto con una release canary. Un singolo evento isolato non dovrebbe necessariamente invertire un rilascio, ma un pattern chiaro su un campione monitorato deve avere una risposta definita.
Il rollback automatico è appropriato solo quando il guasto è ben compreso, reversibile e osservabile tramite segnali affidabili. Un sistema automatizzato che risponde a ogni anomalia può peggiorare un incidente oscillando tra le versioni, nascondendo il problema alla base o reintroducendo ripetutamente una dipendenza incompatibile.
Per un'applicazione mobile, la decisione richiede un contesto extra:
- Utenti offline: Alcuni dispositivi non controlleranno gli aggiornamenti immediatamente.
- Versioni miste: Client vecchi e nuovi possono coesistere per molto tempo.
- Rilascio graduale: Un canale o una release canary possono rivelare un problema prima della produzione.
- Compatibilità Native Build: Un web bundle ripristinato deve essere compatibile con la shell installata.
- Effetti sui dati: Un rollback di code potrebbe non annullare le scritture già accettate dal backend.
Rollback vs roll-forward
Il rollback ripristina uno stato precedente. Il roll-forward distribuisce una correzione. Nessuno dei due è universalmente più sicuro.
Il rollback è ideale per difetti di presentazione reversibili, configurazioni errate o release che falliscono prima di modificare lo stato persistente. Il roll-forward può essere più sicuro se la migrazione è già avvenuta, se gli utenti hanno creato record validi o se la versione precedente non supporta lo schema attuale. Un kill switch può essere ancora più sicuro se la funzionalità difettosa può essere isolata senza sostituire l'intera release.
Il runbook dovrebbe indicare l'incident commander, la persona autorizzata a eseguire l'azione, i segnali di health che confermano il successo e i canali di comunicazione per il prodotto e il supporto. Deve inoltre specificare quando il team deve smettere di tentare il revert e iniziare a correggere con un roll-forward.
Un runbook utile registra:
- La revisione target e la relativa posizione dell'artifact.
- I controlli di compatibilità per client nativi, servizi, dipendenze e schema.
- Il controllo del blast-radius, come un canale, una cohort o un canary.
- I criteri di successo, inclusi i segnali di recovery e l'impatto sugli utenti.
- Il responsabile del follow-up, incaricato del rilascio corretto e della post-mortem dell'incidente.
L'oggetto differenza tra mettere in pausa un rollout e un rollback è fondamentale a livello operativo. La pausa limita l'esposizione. Il rollback cambia attivamente ciò che ricevono gli utenti impattati. I team devono sapere quale azione intraprendere prima di scegliere.
Ripristino istantaneo nelle app mobile e cross-platform
Il recovery dei rilasci mobile tradizionali dipende dalla distribuzione degli app store. Se il difetto è nel binario nativo, il team deve preparare un binario corretto o precedente, inviarlo allo store e attendere la distribuzione. Questo processo è adatto per modifiche native, ma crea attrito quando il difetto riguarda solo JavaScript, CSS, configurazione, testi o asset web.
La distribuzione over-the-air cambia il percorso di recovery per queste modifiche al web layer. Un sistema live update può pubblicare un bundle firmato a un pubblico controllato, lasciare che i dispositivi lo applichino al successivo avvio o controllo aggiornamenti e conservare il bundle precedente come fallback. Non elimina la necessità della revisione degli store quando cambiano il code nativo o i permessi della piattaforma, e non rende sicuro il rollback dei dati.

La distribuzione store e i live update risolvono problemi diversi
| Necessità di recovery | Rilascio binario tramite store | live update firmato |
|---|---|---|
| Modifica di plugin o permessi nativi | Appropriato | Non è un sostituto |
| Difetto JavaScript o CSS | Percorso di recovery più lento | Adatto se policy e compatibilità lo permettono |
| Controllo dell'audience | Canali e controlli di rollout salvati | Canali mirati e rilascio graduale |
| Target di recovery | Binario pubblicato | Web bundle versionato |
| Dipendenza principale | Distribuzione store | Updater, firma, compatibilità e observability |
Una piattaforma come Capgo supporta gli Capacitor live updates inviando web bundle firmati a canali mirati, mantenendo lo storico delle versioni, applicando gli aggiornamenti al lancio successivo o al controllo aggiornamenti, e fornendo protezione rollback se un nuovo bundle fallisce gli health check configurati. La consegna differenziale può inviare solo i file modificati, mentre i canali possono separare audience beta, staging, produzione o specifiche per cliente. Queste funzionalità aiutano i team a ridurre l'impatto di un rilascio fallito nel web layer, ma non eliminano la necessità di validare la compatibilità con la native-shell o i contratti dei dati backend.
Il fallback automatico richiede un health signal affidabile
An updater shouldn’t mark a bundle healthy merely because the download completed. It should distinguish between retrieval, installation, launch, and actual application health. If the new bundle crashes or fails its health checks on the next launch, the device can return to the last stable version without downloading a full app-store binary.
Tuttavia, questo recupero ha dei limiti. Il dispositivo potrebbe essere offline, l'aggiornamento fallito potrebbe aver già modificato i dati lato server, o il bundle precedente potrebbe non essere compatibile con la native shell installata. I log per dispositivo e i dati sull'adozione delle versioni aiutano il supporto a capire quali utenti hanno ricevuto quale bundle e se il fallback ha funzionato.
L'oggetto guida alla configurazione del rollback degli update Capacitor dovrebbe affiancare una release policy, non sostituirla. Firma ogni artifact, limita chi può pubblicare sui canali di produzione, preserva la versione di fallback e testa il percorso di errore su dispositivi reali. La distribuzione rapida è utile solo se il sistema può garantire che il bundle ripristinato sia quello corretto.
Costruire una strategia di release resiliente
La prontezza al rollback è una proprietà dell'intero sistema di rilascio. Un vecchio build in object storage non offre una protezione reale se il team non riesce a identificarne le dipendenze, non vede quali dispositivi lo hanno adottato o non ha mai testato il recupero con dati simili a quelli di produzione.

Parti dalla catena degli artifact. Tagga gli stati stabili del codice, blocca le dipendenze, preserva i build firmati e non sovrascrivere mai un rilascio pubblicato. Poi collega ogni artifact a un ambiente, un canale e un evento di deployment. Il team deve poter ricostruire cosa è successo senza dipendere dalla macchina locale di uno sviluppatore.
Quattro controlli per ridurre il rischio di recovery
- Artifact immutabili: Salva ogni bundle di produzione sotto un'identità univoca. Un puntatore "previous" può selezionare un rilascio, ma non deve mutare il rilascio stesso.
- Migrazioni compatibili: Usa tecniche di expand-and-contract per permettere la coesistenza di versioni dell'app più vecchie e nuove durante una transizione controllata.
- Automazione protetta: Automatizza il fallback solo per i segnali che distinguono un vero fallimento del rilascio da un problema di servizio transitorio.
- Validazione delle dipendenze: Controlla la native shell, i plugin, le API, i servizi e lo schema prima di rendere attiva una revisione target.
L'osservabilità chiude il cerchio. Cattura la versione per dispositivo, l'esito del lancio, lo stato dell'update, il motivo del fallimento e lo stato di adozione. Questi record permettono al supporto di capire se un utente è ancora sul bundle fallito, ha già ricevuto il fallback o non ha mai scaricato l'update.
I team dovrebbero provare il percorso di recovery con dati realistici e versioni client eterogenee. Un test che ripristina code su un database di sviluppo vuoto può non rilevare l'incompatibilità causata da record reali, vecchie varianti di schema, scritture in coda e migrazioni parzialmente completate. I test di recovery devono verificare anche autorizzazione, firma, recupero degli artifact, targeting dei channel e il piano di comunicazione.
Il recovery non si misura dall'esistenza di una vecchia build, ma da quanto precisamente il team riesce a controllare l'impatto e ripristinare uno stato compatibile.
La pianificazione del rilascio dovrebbe includere una responsabilità esplicita per il coordinamento delle dipendenze. I team che necessitano di un framework più ampio per gestire le dipendenze in agile può usare quella disciplina di pianificazione per allineare modifiche a mobile, backend, database e prodotto prima del deployment.
Una revisione pratica della prontezza si chiede:
- Il team riesce a identificare l'artifact esatto attivo su ogni channel?
- Può sospendere l'esposizione senza modificare i code già installati?
- Può ripristinare un bundle firmato e compatibile?
- Può dimostrare che il database rimane sicuro dopo un rollback dell'app?
- Può rilevare i fallimenti per versione invece che solo a livello aggregato del servizio?
- Può scegliere il roll-forward quando un rollback danneggerebbe i dati validi?
Se una risposta non è chiara, il processo di rilascio ha un gap nel recovery. Colmare quel gap prima del prossimo incidente costa meno che improvvisare mentre gli utenti aspettano.
Punti chiave per deployment più sicuri
Il rollback inverte una modifica software o di configurazione applicata per ripristinare uno stato noto e funzionante. Non previene i difetti, non ripara la causa principale né annulla automaticamente le modifiche al database già confermate.
Mantieni gli artefatti dell'applicazione immutabili e indirizzabili. Traccia la versione attiva, le dipendenze, la compatibilità con la shell nativa e l'audience di ogni rilascio. Tratta le migrazioni dello schema e i dati utente come target di recovery separati, perché un rollback di code può lasciare il database modificato e un rollback del database può distruggere record validi.
Usa il rilascio graduale, segnali di health affidabili, autorizzazioni esplicite e un runbook testato. Per i team mobile, i bundle firmati over-the-air possono offrire un recovery rapido per le modifiche compatibili al web-layer, mentre le modifiche native richiedono ancora il giusto percorso di rilascio del binario. Misura il recovery in base alla riduzione del blast radius e al ripristino verificato del servizio, non alla presenza di una vecchia build.
Capgo offre ai team Capacitor ed Electron bundle firmati per i Live Update, canali mirati, cronologia delle versioni, osservabilità per singolo dispositivo e protezione dal rollback per i rilasci compatibili del web-layer. Analizza il tuo attuale percorso di recovery e scopri come Capgo può aiutarti a limitare l'esposizione, ripristinare un bundle funzionante e mantenere sotto controllo la gestione degli incidenti.