{"id":40596,"date":"2020-02-02T10:38:43","date_gmt":"2020-02-02T07:38:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker"},"modified":"2020-02-02T10:38:43","modified_gmt":"2020-02-02T07:38:43","slug":"razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Per iniziare, un po' di teoria. Cos'\u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nIn parole semplici, si tratta di un documento concepito per semplificare lo sviluppo di applicazioni SaaS, indirizzando gli sviluppatori e gli ingegneri DevOps verso le problematiche e le pratiche pi\u00f9 comuni riscontrate nello sviluppo delle moderne applicazioni. <\/p>\n<p>Il documento \u00e8 stato creato dagli sviluppatori della piattaforma Heroku.<\/p>\n<p>La metodologia delle dodici pratiche (The Twelve-Factor App) pu\u00f2 essere applicata a applicazioni scritte in qualsiasi linguaggio di programmazione e che utilizzano combinazioni di servizi esterni (backing services) (database, code di messaggi, cache, ecc.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Un breve riepilogo dei fattori su cui si basa questa metodologia:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Codice sorgente<\/b> \u2013 Una base di codice, tracciata in un sistema di controllo versioni, \u2013 molteplici distribuzioni <\/li>\n<li><b>Dipendenze<\/b> \u2013 Dichiarare esplicitamente e isolare le dipendenze<\/li>\n<li><b>Configurazione<\/b> \u2013 Conservare la configurazione nell'ambiente di esecuzione<\/li>\n<li><b>Servizi di terze parti (Backing Services)<\/b> \u2013 Considerare i servizi esterni (backing services) come risorse connesse<\/li>\n<li><b>Costruzione, rilascio, esecuzione<\/b> \u2013 Separare rigorosamente le fasi di costruzione ed esecuzione<\/li>\n<li><b>Processi<\/b> \u2013 Esegui l'applicazione come uno o pi\u00f9 processi stateless <\/li>\n<li><b>Binding delle porte (Port binding)<\/b> \u2013 Esporta i servizi tramite binding delle porte <\/li>\n<li><b>Parallelsimo<\/b> \u2013 Scala l'applicazione utilizzando processi <\/li>\n<li><b>Disposabilit\u00e0 (Disposability)<\/b> \u2013 Massimizza l'affidabilit\u00e0 con avvii rapidi e corrette chiusure <\/li>\n<li><b>Parit\u00e0 sviluppo\/produzione dell'applicazione<\/b> \u2013 Mantieni gli ambienti di sviluppo, staging e produzione il pi\u00f9 simili possibile <\/li>\n<li><b>Logging (Logs)<\/b> \u2013 Considera il log come un flusso di eventi<\/li>\n<li><b>Task di amministrazione<\/b> \u2013 Esegui i compiti di amministrazione\/gestione tramite processi one-off <\/li>\n<\/ol>\n<p>\n<b>Per ulteriori informazioni sui 12 fattori, puoi consultare le seguenti risorse:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Fonte originale<\/a><\/noindex> \u2014 lettura obbligatoria<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Articolo su Habr. L'applicazione dei dodici fattori \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 traduzione ufficiale<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Articolo su Habr. 7 fattori mancanti nell'approccio 12 Factor App<\/a><\/noindex> \u2014 una nuova prospettiva sui 12 fattori per migliorare i fattori.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Cos'\u00e8 il Blue-Green deployment?<\/h3>\n<p>\nIl Blue-Green deployment \u00e8 un metodo per consegnare applicazioni su <b>produzione<\/b> in modo che il cliente finale non noti alcun cambiamento da parte sua. In altre parole, il deployment dell'applicazione avviene senza <b>downtime<\/b>.<\/p>\n<p>Lo schema classico di BG Deploy appare come indicato nell'immagine seguente. <\/p>\n<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>All'inizio ci sono 2 server fisici con codice, applicazione e progetto identici, e c'\u00e8 un router (bilanciatore di carico). <\/li>\n<li>Il router inizialmente indirizza tutte le richieste a uno dei server (<b>verde<\/b>). <\/li>\n<li>). Quando \u00e8 necessario effettuare nuovamente un rilascio, l'intero progetto viene aggiornato sull'altro server (<b>blu<\/b>), che in quel momento non gestisce alcuna richiesta. <\/li>\n<li>Dopo che il codice sul <b>server blu<\/b> \u00e8 stato completamente aggiornato, al router viene dato il comando di passare da <b>verde<\/b> con <b>blu<\/b> server. <\/li>\n<li>Ora tutti i clienti vedono il risultato del codice dal <b>server blu.<\/b> Per un certo periodo, <\/li>\n<li> Un po' di tempo, <b>verde<\/b> il server funge da backup nel caso di un deployment fallito su <b>blu<\/b> server e, in caso di errori e bug, il router reindirizza il flusso degli utenti di nuovo al <b>verde<\/b> server con la vecchia versione stabile, mentre il nuovo codice viene inviato per ulteriori sviluppi e testing.<\/li>\n<li>E alla fine del processo, viene aggiornato allo stesso modo <b>verde<\/b> server. E dopo il suo aggiornamento, il router reindirizza il flusso delle richieste di nuovo a <b>verde<\/b> server.<\/li>\n<\/ul>\n<p>\nTutto ci\u00f2 sembra molto buono e a prima vista non dovrebbero esserci problemi.<br \/>\nMa poich\u00e9 viviamo in un mondo moderno, l'opzione di commutazione fisica come indicato nello schema classico non \u00e8 adatta. Per ora, memorizza queste informazioni, ci torneremo sopra pi\u00f9 tardi.<\/p>\n<h3>Consigli cattivi e buoni<\/h3>\n<p>\n<i>Avvertenza<\/i>: Negli esempi sotto sono indicate le utilit\u00e0 \/ metodologie che utilizzo io, puoi usare qualsiasi alternativa con funzionalit\u00e0 simili. <\/p>\n<p>La maggior parte degli esempi sar\u00e0 in qualche modo collegata allo sviluppo web (che sorpresa!), con PHP e Docker.<\/p>\n<p>Nei punti seguenti \u00e8 presente una semplice descrizione pratica dell'utilizzo dei fattori in esempi specifici; se desideri avere pi\u00f9 teoria su questo argomento, fai riferimento ai link sopra per la fonte originale. <\/p>\n<h4>1. Base di codice<\/h4>\n<p>\nUtilizza FTP e FileZilla per caricare i file sui server uno alla volta, non memorizzare il codice in nessun luogo tranne che sul server di produzione.<\/p>\n<p>Nel progetto deve sempre esserci una base di codice unitaria, cio\u00e8, tutto il codice proviene da un unico <b>Git<\/b> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0421\u0435\u0440\u0432\u0435\u0440\u044b (production, staging, test1, test2 &#8230;) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u0434 \u0438\u0437 \u0432\u0435\u0442\u043e\u043a \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0434\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430.<\/p>\n<h4>2. Dipendenze<\/h4>\n<p>\nScarica tutte le librerie in cartelle direttamente nella radice del progetto. Aggiornamenti possono essere effettuati semplicemente trasferendo il nuovo codice nella cartella con la versione attuale della libreria. Installa tutte le utility necessarie direttamente sul server di hosting dove operano altre 20 service.<\/p>\n<p>Il progetto deve sempre avere un elenco di dipendenze chiaramente definito (con dipendenze intendo anche l'ambiente). Tutte le dipendenze devono essere esplicitamente definite e isolate. <br \/>\nCome esempio prendiamo <b>Composer<\/b> e <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2013 un gestore di pacchetti che consente di installare librerie PHP. Composer permette di specificare versioni in modo rigoroso o non rigoroso e di definirle esplicitamente. Sul server possono esserci 20 progetti diversi e ciascuno avr\u00e0 la propria lista di pacchetti e librerie indipendente dagli altri.<\/p>\n<p><b>Docker<\/b> \u2014 uno strumento che consente di determinare e isolare l'ambiente in cui funzioner\u00e0 l'applicazione. Pertanto, in modo simile a composer, ma con una solidit\u00e0 maggiore, possiamo definire gli elementi con cui lavora l'applicazione. Scegliere una versione specifica di PHP, installare solo i pacchetti necessari per il funzionamento del progetto, senza aggiungere nulla di superfluo. E, cosa pi\u00f9 importante, senza sovrapporci ai pacchetti e all'ambiente della macchina host e degli altri progetti. Questo significa che tutti i progetti sul server che operano tramite Docker possono utilizzare qualsiasi combinazione di pacchetti e un ambiente completamente diverso.<\/p>\n<h4>3. Configurazione<\/h4>\n<p>\nConserva le configurazioni come costanti direttamente nel codice. Costanti separate per il server di test e costanti separate per la produzione. Collega il funzionamento dell'applicazione alle condizioni ambientali direttamente nella logica aziendale del progetto utilizzando le strutture if else.<\/p>\n<p><b>Configurazioni<\/b> \u2014 sono l'unica cosa che dovrebbe differenziare i deployment del progetto. Idealmente, le configurazioni dovrebbero essere passate tramite variabili d'ambiente (env vars). <\/p>\n<p>Questo significa che anche se memorizzi pi\u00f9 file di configurazione .config.prod .config.local e li rinomini al momento del deployment in .config (il file di configurazione principale da cui l'applicazione legge i dati) \u2014 questo non \u00e8 un approccio corretto, in quanto in tal caso le informazioni delle configurazioni sarebbero accessibili a tutti gli sviluppatori dell'applicazione e i dati del server di produzione sarebbero compromessi. Tutte le configurazioni devono essere memorizzate direttamente nel sistema di deployment (CI\/CD) e generate per diversi ambienti con valori differenti necessari per ciascun ambiente al momento del deployment.<\/p>\n<h4>4. Servizi di terze parti (Backing Services)<\/h4>\n<p>\nFissati rigidamente all'ambiente, utilizza connessioni diverse per gli stessi servizi in ambienti specifici.<\/p>\n<p>In realt\u00e0, questo punto si sovrappone fortemente con il punto sulle configurazioni, poich\u00e9 senza la presenza di questo punto non \u00e8 possibile ottenere dati di configurazione adeguati e in generale la possibilit\u00e0 di configurare verrebbe meno.<\/p>\n<p>Tutte le connessioni ai servizi esterni, come server di coda, database e servizi di cache, devono essere uniformi sia per l'ambiente locale che per l'ambiente di produzione. In altre parole, posso cambiare la stringa di connessione per passare da un database #1 a un database #2 in qualsiasi momento, senza modificare il codice dell'applicazione. Oppure, per esempio, durante la scalabilit\u00e0 del servizio, non sar\u00e0 necessario indicare una connessione speciale per un server di cache aggiuntivo.<\/p>\n<h4>5. Costruzione, rilascio, esecuzione<\/h4>\n<p>\nAvere sul server solo la versione finale del codice, senza possibilit\u00e0 di tornare indietro nel rilascio. Non bisogna occupare spazio su disco. Chi pensa di poter lanciare il codice in produzione con errori \u00e8 un cattivo programmatore!<\/p>\n<p>Tutte le fasi del deployment devono essere separate tra loro.<\/p>\n<p>Avere la possibilit\u00e0 di tornare indietro. Effettua i rilasci mantenendo copie precedenti dell'applicazione (gi\u00e0 compilate e pronte all'uso) che possono essere ripristinate in caso di errori. Cio\u00e8, esiste, condizionatamente, una cartella <i>releases<\/i> e una cartella <i>current<\/i>, e dopo un deployment e una costruzione riusciti, la cartella <i>current<\/i> collegato tramite un collegamento simbolico alla nuova versione presente all'interno <i>releases<\/i> con un nome di rilascio provvisorio. <\/p>\n<p>Qui ricordiamo il Blue-Green deployment, che non solo consente di eseguire il cambio tra il codice, ma anche di passare tra tutte le risorse e persino gli ambienti, con la possibilit\u00e0 di ripristinare tutto indietro.<\/p>\n<h4>6. Processi<\/h4>\n<p>\nConserva i dati di stato dell'applicazione direttamente all'interno dell'app stessa. Utilizza sessioni nella memoria operativa dell'app. Condividi il pi\u00f9 possibile tra i servizi esterni. Presupponi che l'applicazione possa avere solo un processo e non consentire scaling.<\/p>\n<p>Per quanto riguarda le sessioni, memorizza i dati solo nella cache gestita da servizi esterni (memcached, redis). In questo modo, anche se hai 20 processi dell'applicazione in esecuzione, ognuno di essi pu\u00f2 accedere alla cache e continuare a lavorare con il cliente nello stesso stato in cui l'utente era durante l'interazione con l'applicazione in un altro processo. Con questo approccio, indipendentemente da quante copie di servizi esterni utilizzi, tutto funzioner\u00e0 normalmente e senza problemi di accesso ai dati.<\/p>\n<h4>7. Binding delle porte (Port binding)<\/h4>\n<p>\nSoltanto il server web dovrebbe sapere come lavorare con servizi esterni. \u00c8 preferibile avviare i servizi esterni direttamente all'interno del server web, ad esempio come modulo PHP in Apache.<br \/>\nTutti i tuoi servizi devono essere accessibili l'uno dall'altro tramite un indirizzo e una porta specifici (localhost:5432, localhost:3000, nginx:80, php-fpm:9000). Ad esempio, da nginx posso accedere sia a php-fpm che a postgres, e da php-fpm posso accedere a postgres e nginx. Quindi, da ciascun servizio, posso accedere ad un altro servizio. In questo modo, la funzionalit\u00e0 di un servizio non dipende dalla funzionalit\u00e0 di un altro servizio.<\/p>\n<h4>8. Parallelismo<\/h4>\n<p>\nLavora con un solo processo, altrimenti potrebbero sorgere conflitti tra pi\u00f9 processi! <\/p>\n<p>Lascia spazio per la scalabilit\u00e0. Docker Swarm \u00e8 ideale per questo. <br \/>\nDocker Swarm \u00e8 uno strumento per creare e gestire cluster di container, sia su macchine diverse che su un singolo server con molteplici container.<\/p>\n<p>Utilizzando Swarm, posso definire la quantit\u00e0 di risorse da allocare per ciascun processo e il numero di processi della stessa servizio da avviare. L bilanciatore interno, ricevendo i dati su una porta specifica, li gestir\u00e0 automaticamente verso i processi. Quindi, se vedo che il carico sul server aumenta, posso aggiungere pi\u00f9 processi per ridurre cos\u00ec il carico su alcuni di essi.<\/p>\n<h4>9. Smaltibilit\u00e0 (Disposability)<\/h4>\n<p>\nNon utilizzare code per gestire processi e dati. La terminazione di un processo deve influenzare il funzionamento dell'intera applicazione. Se un servizio fallisce, falliscono tutti.<\/p>\n<p>Ogni processo e servizio possono essere disattivati in qualsiasi momento senza influenzare gli altri servizi (non si parla del fatto che il servizio non sar\u00e0 disponibile per un altro servizio, ma che un altro servizio non si spegner\u00e0 in seguito a questo). Tutti i processi devono essere terminati in modo controllato, in modo tale che al momento della loro chiusura non vengano compromessi i dati e al successivo avvio il sistema funzioni correttamente. Quindi, anche in caso di arresto anomalo, i dati non devono andare persi (in questo caso un meccanismo di transazioni \u00e8 utile: le richieste al database vengono eseguite solo in gruppi, e se anche una sola richiesta del gruppo non \u00e8 andata a buon fine o ha restituito un errore, nessun'altra richiesta del gruppo viene effettivamente eseguita).<\/p>\n<h4>10. Parit\u00e0 dello sviluppo\/funzionamento dell'applicazione<\/h4>\n<p>\nLa versione di produzione, di staging e locale dell'applicazione devono essere diverse. In produzione utilizziamo il framework Yii Lite, mentre localmente Yii, per garantire prestazioni migliori in produzione!<\/p>\n<p>In realt\u00e0, tutte le implementazioni e il lavoro con il codice devono avvenire in un ambiente quasi identico (non si parla di hardware fisico). Inoltre, il codice deve poter essere implementato in produzione da qualsiasi membro del team di sviluppo, non solo da un apposito reparto devops addestrato, che potrebbe sollevare un'applicazione in produzione solo grazie a capacit\u00e0 particolari.<\/p>\n<p>Anche in questo ci aiuta Docker. Seguendo tutti i punti precedenti, l'uso di Docker ridurr\u00e0 il processo di implementazione dell'ambiente sia in produzione che sulla macchina locale a una o due semplici comandi.<\/p>\n<h4>11. Registrazione (Logs)<\/h4>\n<p>\nScriviamo i log in file e database! Non puliamo i file e i database dai log. Compreremo semplicemente un disco rigido da 9000 petabyte e va bene cos\u00ec.<\/p>\n<p>Tutti i log devono essere considerati come un flusso di eventi. L'applicazione stessa non dovrebbe occuparsi del trattamento dei log. I log devono essere inviati o a stdout, o tramite un protocollo come UDP, in modo che l'elaborazione dei log non crei problemi all'applicazione. A questo scopo, graylog \u00e8 un'ottima soluzione. Graylog, ricevendo tutti i log tramite UDP (con questo protocollo non \u00e8 necessario attendere una conferma di ricezione del pacchetto), non interferisce in alcun modo con l'applicazione e si occupa solo della strutturazione e del trattamento dei log. La logica dell'applicazione non cambia quando si utilizzano approcci simili.<\/p>\n<h4>12. Compiti di amministrazione<\/h4>\n<p>\nPer aggiornare i dati, il database, ecc., utilizza un endpoint API appositamente creato; l'esecuzione di questo due volte di seguito potrebbe portare a una duplicazione. Ma non siete persone stupide, non cliccherete due volte, e le migrazioni non ci servono.<\/p>\n<p>Tutte le operazioni di amministrazione devono essere eseguite nello stesso ambiente del codice, a livello di release. In altre parole, se dobbiamo modificare la struttura del database, non lo faremo manualmente cambiando i nomi delle colonne e aggiungendo nuove colonne tramite strumenti visivi di gestione del database. Per queste operazioni, creiamo script separati \u2014 le migrazioni, che vengono eseguite ovunque e in tutti gli ambienti con risultati chiari e coerenti. Per tutte le altre attivit\u00e0, come il riempimento del progetto con dati, devono essere applicate metodologie simili.<\/p>\n<h3>Esempio di implementazione in PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. Tutti gli esempi sono stati realizzati su MacOS. La maggior parte \u00e8 adatta anche per Linux. Gli utenti Windows, mi scuso, ma non lavoro con Windows da tempo.<\/p>\n<p>Immaginiamo di trovarci in una situazione in cui non \u00e8 installata alcuna versione di PHP sul nostro PC e non c'\u00e8 nulla. <br \/>\nInstalliamo le ultime versioni di Docker e Docker-Compose. (questo pu\u00f2 essere trovato online)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Installiamo <noindex><a rel=\"nofollow\" href=\"https:\/\/laradock.io\/\">Laradock<\/a><\/noindex><\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/Laradock\/laradock.git &amp;&amp; \nls\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRiguardo a Laradock posso dire che \u00e8 uno strumento eccellente, che raccoglie molti container e strumenti ausiliari. Tuttavia, utilizzare Laradock cos\u00ec com'\u00e8 in produzione senza modifiche non lo consiglio per via della sua complessit\u00e0. \u00c8 meglio creare i propri container basandosi sugli esempi di Laradock, poich\u00e9 questo consente un maggiore ottimizzamento, dato che non ha senso avere tutto ci\u00f2 che l\u00ec \u00e8 presente contemporaneamente.<\/p>\n<p>2. Configuriamo Laradock per il funzionamento della nostra applicazione.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. Apriamo la cartella habr (la cartella principale in cui \u00e8 clonata laradock) in un qualsiasi editor. (Nel mio caso PHPStorm)<\/p>\n<p>In questa fase inseriamo solo il nome del progetto.<\/p>\n<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Avviamo l'immagine del workspace. (Nel vostro caso le immagini verranno buildate per un certo periodo)<br \/>\nIl workspace \u00e8 un'immagine appositamente preparata per lavorare con il framework a nome dello sviluppatore.<\/p>\n<p>Accediamo all'interno del container utilizzando <\/p>\n<pre><code class=\"bash\">docker-compose up -d workspace &amp;&amp; \ndocker-compose exec workspace bash\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Installiamo Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Dopo l'installazione verifichiamo se \u00e8 stata creata la directory del progetto e poi chiudiamo compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. Torniamo indietro in PHPStorm e impostiamo il percorso corretto per la nostra applicazione Laravel nel file .env.<\/p>\n<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. Aggiungiamo tutto il codice su Git.<\/p>\n<p>A tal fine, creiamo un repository su Github (o altrove). Passiamo nella directory habr nel terminale e eseguiamo il seguente codice.<\/p>\n<pre><code class=\"bash\">echo &quot;# habr-12factor&quot; &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m &quot;first commit&quot;\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0430\u0448 \u0440\u0435\u043f\u043e\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nControlliamo se tutto \u00e8 a posto. <\/p>\n<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer comodit\u00e0, consiglio di utilizzare un'interfaccia visiva per Git, nel mio caso \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (qui il link di affiliazione)<\/p>\n<p>4. Avviamo!<\/p>\n<p>Prima di avviare, assicurati che non ci sia nulla in ascolto sulle porte 80 e 443.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo modo, il nostro progetto \u00e8 composto da 3 servizi distinti:<\/p>\n<ul>\n<li>nginx \u2014 server web<\/li>\n<li>php-fpm \u2014 php per ricevere richieste dal server web<\/li>\n<li>workspace \u2014 php per lo sviluppatore<\/li>\n<\/ul>\n<p>\nFinora abbiamo raggiunto l'obiettivo di creare un'applicazione conforme ai gi\u00e0 4 punti su 12, ovvero:<\/p>\n<p>1. <b>Codice sorgente<\/b> \u2014 tutto il codice \u00e8 in un unico repository (una piccola nota: potrebbe essere corretto inserire docker all'interno del progetto Laravel, ma non \u00e8 fondamentale).<\/p>\n<p>2. <b>Dipendenze<\/b> \u2014 Tutte le nostre dipendenze sono esplicitamente definite in application\/composer.json e in ogni Dockerfile di ciascun container.<\/p>\n<p>3. <b>Servizi di terze parti (Backing Services)<\/b> \u2014 Ogni servizio (php-fpm, nginx, workspace) vive la propria vita ed \u00e8 accessibile dall'esterno; lavorando su un servizio, l'altro non verr\u00e0 influenzato.<\/p>\n<p>4. <b>Processi<\/b> \u2014 ogni servizio \u00e8 un processo. Ogni servizio non conserva uno stato interno.<\/p>\n<p>5.<b> Binding delle porte (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCome possiamo vedere, ogni servizio \u00e8 in esecuzione sulla propria porta ed \u00e8 accessibile da tutti gli altri servizi.<\/p>\n<p>6.<b> Parallelsimo <\/b><\/p>\n<p>Docker ci consente di avviare pi\u00f9 processi dello stesso servizio con bilanciamento del carico automatico tra di essi. <\/p>\n<p>Arrestiamo i container e avviamoli tramite il flag <b>&#8212;scale<\/b><\/p>\n<pre><code class=\"bash\">docker-compose down &amp;&amp; \ndocker-compose up -d --scale php-fpm=3 nginx php-fpm\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCome possiamo vedere, sono state create copie per il container php-fpm. Non dobbiamo modificare nulla nel lavoro con questo container. Continuiamo a contattarlo sulla porta 9000, mentre Docker gestisce il carico tra i container.<\/p>\n<p>7. <b>Disposabilit\u00e0 (Disposability)<\/b> \u2014 ogni container pu\u00f2 essere arrestato senza compromettere gli altri. L'arresto o il riavvio di un container non influenzer\u00e0 il funzionamento dell'applicazione nei successivi avvii. Ogni container pu\u00f2 essere avviato in qualsiasi momento.<\/p>\n<p>8. <b>Parit\u00e0 sviluppo\/produzione dell'applicazione<\/b> \u2014 tutti i nostri ambienti sono identici. Avviando il sistema su un server di produzione, non dovrai modificare nulla nei tuoi comandi. Tutto sar\u00e0 esattamente basato su Docker.<\/p>\n<p>9. <b>Logging (Logs)<\/b> \u2014 tutti i log all'interno di questi container vengono inviati in streaming e sono visibili nella console di Docker. (in questo caso, in realt\u00e0, con altri container creati artigianalmente, potrebbe non essere cos\u00ec se non te ne prendi cura)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMa c'\u00e8 un problema, poich\u00e9 i valori di Default in PHP e Nginx registrano anche i log in un file. Per essere conformi ai 12 fattori, \u00e8 necessario <b>disabilitare<\/b> la registrazione dei log nei file nelle configurazioni di ogni container singolarmente.<\/p>\n<p>Docker offre anche la possibilit\u00e0 di inviare i log non solo a stdout, ma anche a strumenti come graylog, di cui ho parlato sopra. E all'interno di graylog possiamo gestire i log come vogliamo e la nostra applicazione non se ne accorger\u00e0.<\/p>\n<p>10. <b>Task di amministrazione<\/b> \u2014 tutte le attivit\u00e0 di amministrazione vengono gestite da Laravel grazie allo strumento artisan, proprio come desidererebbero i creatori di un'applicazione conforme ai 12 fattori.<\/p>\n<p>Come esempio, ti mostrer\u00f2 come vengono eseguite alcune comandi.<br \/>\nEntriamo nel container.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOra possiamo utilizzare qualsiasi comando. (si prega di notare che non abbiamo configurato il database e la cache, quindi met\u00e0 dei comandi non verr\u00e0 eseguita correttamente, poich\u00e9 sono progettati per lavorare con la cache e il database).<\/p>\n<p><img decoding=\"async\" alt=\"Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker.\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Configurazioni<\/b> e 12. <b>Costruzione, rilascio, esecuzione<\/b><\/p>\n<p>Questa parte volevo dedicarla al Blue-Green Deployment, ma si \u00e8 rivelata troppo complessa per questo articolo. Scriver\u00f2 un articolo separato al riguardo. <\/p>\n<p>In poche parole, il concetto si basa su sistemi CI\/CD come <b>Jenkins<\/b> e <b>Gitlab CI<\/b>. In entrambi si possono impostare variabili d'ambiente correlate a un ambiente specifico. Pertanto, in questo scenario verr\u00e0 eseguita la voce con <b>Configurazioni<\/b>.<\/p>\n<p>E la voce su <b>Costruzione, rilascio, esecuzione<\/b> \u00e8 gestita dalle funzioni integrate in entrambi gli strumenti chiamate <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> che consente di suddividere il processo di deployment in pi\u00f9 fasi, evidenziando le fasi di costruzione, rilascio e esecuzione. Inoltre, nel Pipeline, potrai creare backup e fare praticamente qualsiasi cosa. Questo strumento ha un potenziale illimitato.<\/p>\n<p>Il codice dell'applicazione si trova su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nNon dimenticare di inizializzare il submodule quando cloni questo repository.<\/p>\n<p>P.S.: Tutti questi approcci possono essere utilizzati con qualsiasi altro strumento e linguaggio di programmazione. L'importante \u00e8 che il principio rimanga lo stesso.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/480020\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 The Twelve-Factor App? \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 SaaS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u043c \u0447\u0442\u043e, \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Heroku. \u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432(The Twelve-Factor App) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":40597,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 The Twelve-Factor App? \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 SaaS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u043c \u0447\u0442\u043e, \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Heroku. \u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432(The Twelve-Factor App) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 Blue-Green deployment, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044e The Twelve-Factor App \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 php \u0438 docker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 The Twelve-Factor App? \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 SaaS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u043c \u0447\u0442\u043e, \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Heroku. \u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432(The Twelve-Factor App) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-02T07:38:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Sviluppo di applicazioni e Blue-Green deployment, basandosi sulla metodologia The Twelve-Factor App con esempi in php e docker | ProHoster","description":"Iniziamo con un po' di teoria. Che cos'\u00e8 il The Twelve-Factor App? In parole semplici, \u00e8 un documento progettato per semplificare lo sviluppo di applicazioni SaaS, utile per informare sviluppatori e ingegneri DevOps sulle pratiche e i problemi pi\u00f9 comuni riscontrati nello sviluppo di moderne applicazioni. Questo documento \u00e8 stato creato dagli sviluppatori della piattaforma Heroku. La metodologia dei dodici fattori (The Twelve-Factor App) pu\u00f2 essere applicata a qualsiasi applicazione scritta in qualsiasi linguaggio.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 Blue-Green deployment, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044e The Twelve-Factor App \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 php \u0438 docker | ProHoster","og:description":"\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 The Twelve-Factor App? \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 SaaS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0442\u0435\u043c \u0447\u0442\u043e, \u043e\u0441\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Heroku. \u041c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432(The Twelve-Factor App) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c","og:url":"https:\/\/prohoster.info\/it\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-02T07:38:43+00:00","article:modified_time":"2020-02-02T07:38:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40596","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:20:45","updated":"2022-09-27 22:57:35"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}