In passato gestivamo un sito Web social, con una configurazione LAMP standard. Avevamo un server Live, un server di prova e un server di sviluppo, nonché i computer degli sviluppatori locali. Tutti sono stati gestiti utilizzando GIT.
Su ogni macchina c'erano i file PHP, ma anche il servizio MySQL e una cartella con Immagini che gli utenti avrebbero caricato. Il server Live è cresciuto fino ad avere circa 100K (!) Utenti ricorrenti, il dump era di circa 2 GB (!), La cartella Image era di circa 50 GB (!). Quando me ne sono andato, il nostro server stava raggiungendo il limite della sua CPU, Ram e, soprattutto, i limiti della connessione di rete simultanea (Abbiamo anche compilato la nostra versione del driver della scheda di rete per massimizzare il server 'lol'). Non potremmo ( né dovresti supporre con il tuo sito Web ) inserire 2 GB di dati e 50 GB di immagini in GIT.
Per gestire facilmente tutto ciò sotto GIT, ignoreremmo le cartelle binarie (le cartelle che contengono le Immagini) inserendo questi percorsi di cartelle in .gitignore. Avevamo anche una cartella chiamata SQL al di fuori del percorso documentroot di Apache. In quella cartella SQL, inseriremmo i nostri file SQL dagli sviluppatori in numerazioni incrementali (001.florianm.sql, 001.johns.sql, 002.florianm.sql, ecc.). Questi file SQL sono stati gestiti anche da GIT. Il primo file sql conterrebbe infatti un ampio set di schemi DB. Non aggiungiamo dati utente in GIT (ad es. I record della tabella degli utenti o della tabella dei commenti), ma i dati come le configurazioni o la topologia o altri dati specifici del sito sono stati mantenuti nei file sql (e quindi da GIT). Principalmente sono gli sviluppatori (che conoscono meglio il codice) che determinano cosa e cosa non è gestito da GIT per quanto riguarda lo schema e i dati SQL.
Quando è arrivato a una versione, l'amministratore accede al server dev, unisce il ramo live con tutti gli sviluppatori e i rami necessari sulla macchina dev in un ramo di aggiornamento e lo ha inviato al server di test. Sul server di prova, controlla se il processo di aggiornamento per il server Live è ancora valido e, in rapida successione, indirizza tutto il traffico in Apache verso un sito segnaposto, crea un dump DB, punta la directory di lavoro da "live" a "update ', esegue tutti i nuovi file sql in mysql e reindirizza il traffico al sito corretto. Quando tutte le parti interessate hanno concordato dopo aver esaminato il server di prova, l'amministratore ha fatto la stessa cosa dal server di prova al server live. Successivamente, unisce il ramo attivo sul server di produzione, al ramo principale in tutti i server e ha riformulato tutti i rami attivi.
Se si sono verificati problemi sul server di prova, ad es. le fusioni hanno avuto troppi conflitti, quindi il codice è stato ripristinato (riportando il ramo funzionante su "live") e i file sql non sono mai stati eseguiti. Nel momento in cui sono stati eseguiti i file sql, questa è stata considerata come un'azione non reversibile al momento. Se i file SQL non funzionavano correttamente, il DB è stato ripristinato utilizzando il dump (e gli sviluppatori lo hanno informato, per aver fornito file SQL non testati).
Oggi manteniamo sia una cartella sql-up che sql-down, con nomi di file equivalenti, in cui gli sviluppatori devono testare che entrambi i file sql di aggiornamento possano essere ugualmente declassati. Questo alla fine potrebbe essere eseguito con uno script bash, ma è una buona idea se gli occhi umani continuassero a monitorare il processo di aggiornamento.
Non è eccezionale, ma è gestibile. Spero che questo dia un'idea di un sito nella vita reale, pratico e relativamente disponibile. Sia un po 'obsoleto, ma ancora seguito.