{"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\/sv\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker","title":{"rendered":"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/c8f98efef30babe012d23dd82a01c13b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>F\u00f6r att b\u00f6rja, lite teori. Vad \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">The Twelve-Factor App<\/a><\/noindex>?<\/h3>\n<p>\nEnkelt uttryckt, det h\u00e4r \u00e4r ett dokument som syftar till att f\u00f6renkla utvecklingen av SaaS-applikationer. Det hj\u00e4lper genom att informera utvecklare och DevOps-ingenj\u00f6rer om de problem och b\u00e4sta praxis som oftast f\u00f6rekommit i utvecklingen av moderna applikationer. <\/p>\n<p>Dokumentet har skapats av utvecklarna p\u00e5 plattformen Heroku.<\/p>\n<p>Tolvfaktormetodologin (The Twelve-Factor App) kan till\u00e4mpas p\u00e5 applikationer skrivna i vilket programmeringsspr\u00e5k som helst och som anv\u00e4nder alla m\u00f6jliga kombinationer av externa tj\u00e4nster (backing services) (databaser, meddelandek\u00f6er, cache-minnen, etc.).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Kort om de faktorer som denna metodologi bygger p\u00e5:<\/h3>\n<p><\/p>\n<ol>\n<li><b>Kodbasis<\/b> \u2013 En kodbas, sp\u00e5rad i versionskontrollsystem, \u2013 flera distributioner <\/li>\n<li><b>Beroenden<\/b> \u2013 Deklarera och isolera beroenden tydligt<\/li>\n<li><b>Konfiguration<\/b> \u2013 Spara konfigurationen i k\u00f6rmilj\u00f6n<\/li>\n<li><b>Externa tj\u00e4nster (Backing Services)<\/b> \u2013 Bet\u00e4nk externa tj\u00e4nster (backing services) som anslutna resurser<\/li>\n<li><b>Byggande, distribution, k\u00f6rning<\/b> \u2013 Strikt \u00e5tskiljning av bygg- och k\u00f6rsteget<\/li>\n<li><b>Processer<\/b> \u2013 K\u00f6r applikationen som en eller flera processer som \u00e4r stateless <\/li>\n<li><b>Portbindning (Port binding)<\/b> \u2013 Exportera tj\u00e4nster via portbindning <\/li>\n<li><b>Parallellism<\/b> \u2013 Skala applikationen med hj\u00e4lp av processer <\/li>\n<li><b>Avyttring (Disposability)<\/b> \u2013 Maximera tillf\u00f6rlitlighet genom snabb start och korrekt st\u00e4ngning <\/li>\n<li><b>Paritet mellan utveckling och produktion<\/b> \u2013 H\u00e5ll utvecklings-, staging- och produktionsmilj\u00f6erna s\u00e5 lika som m\u00f6jligt <\/li>\n<li><b>Loggning (Logs)<\/b> \u2013 Bet\u00e4nk loggen som en str\u00f6m av h\u00e4ndelser<\/li>\n<li><b>Administrationsuppgifter<\/b> \u2013 Utf\u00f6r administrationshantering med hj\u00e4lp av enstaka processer <\/li>\n<\/ol>\n<p>\n<b>Mer information om de 12 faktorerna kan du f\u00e5 fr\u00e5n f\u00f6ljande resurser:<\/b><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/ru\/\">Officiell k\u00e4lla<\/a><\/noindex> \u2014 ett m\u00e5ste att l\u00e4sa<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/258739\/\">Artikel p\u00e5 habr. Tolvfaktorsapplikationen \u2014 The Twelve-Factor App<\/a><\/noindex> \u2014 officiell \u00f6vers\u00e4ttning<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460363\/\">Artikel p\u00e5 habr. 7 saknade faktorer i 12-faktorsmetoden<\/a><\/noindex> \u2014 en ny blick p\u00e5 12 faktorer f\u00f6r att f\u00f6rb\u00e4ttra dem.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Vad \u00e4r Blue-Green deployment?<\/h3>\n<p>\nBlue-Green deployment \u00e4r ett s\u00e4tt att leverera applikationen <b>production<\/b> p\u00e5 ett s\u00e4tt som slutar anv\u00e4ndaren inte ser n\u00e5gra f\u00f6r\u00e4ndringar fr\u00e5n sin sida. Med andra ord, distributionen av applikationen med noll <b>d\u00f6dtid<\/b>.<\/p>\n<p>Den klassiska schemat f\u00f6r BG Deploy ser ut som p\u00e5 bilden nedan. <\/p>\n<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/8252356ac93ce40b248ab27982754985.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>I b\u00f6rjan finns det 2 fysiska servrar med exakt samma kod, applikation, projekt och det finns en router (lastbalanserare). <\/li>\n<li>Routern riktar ursprungligen alla f\u00f6rfr\u00e5gningar till en av servrarna (<b>gr\u00f6n<\/b>). <\/li>\n<li>Vid den tidpunkten d\u00e5 en ny release beh\u00f6ver g\u00f6ras, uppdateras hela projektet p\u00e5 den andra servern (<b>bl\u00e5<\/b>), som f\u00f6r n\u00e4rvarande inte behandlar n\u00e5gra f\u00f6rfr\u00e5gningar. <\/li>\n<li>Efter att koden p\u00e5 <b>den bl\u00e5<\/b> servern \u00e4r helt uppdaterad, f\u00e5r routern kommandot att v\u00e4xla fr\u00e5n <b>den gr\u00f6na<\/b> till <b>bl\u00e5<\/b> server. <\/li>\n<li>Nu ser alla kunder resultatet av koden fr\u00e5n <b>den bl\u00e5<\/b> servern. <\/li>\n<li> Under en tid fungerar <b>gr\u00f6n<\/b> servern som en reserv p\u00e5 fall att distributionen p\u00e5 <b>bl\u00e5<\/b> servern misslyckas och vid eventuella fel, v\u00e4xlar routern anv\u00e4ndarfl\u00f6det tillbaka till <b>gr\u00f6n<\/b> servern med den gamla stabila versionen, medan den nya koden skickas f\u00f6r omarbete och testning.<\/li>\n<li>Slutligen uppdateras \u00e4ven <b>gr\u00f6n<\/b> servern. Och efter dess uppdatering v\u00e4xlar routern anv\u00e4ndarfl\u00f6det tillbaka till <b>gr\u00f6n<\/b> server.<\/li>\n<\/ul>\n<p>\nDet hela ser v\u00e4ldigt bra ut och vid f\u00f6rsta anblicken borde det inte vara n\u00e5gra problem.<br \/>\nMen eftersom vi lever i en modern v\u00e4rld, s\u00e5 passar inte alternativet med fysisk v\u00e4xling som anges i den klassiska schemat oss. H\u00e5ll denna information i \u00e5tanke, vi \u00e5terkommer till den senare.<\/p>\n<h3>D\u00e5liga och bra r\u00e5d<\/h3>\n<p>\n<i>Ansvarsfriskrivning<\/i>: I exemplen nedan anges verktyg \/ metoder som jag anv\u00e4nder, du kan anv\u00e4nda absolut vilka alternativ som helst med liknande funktioner. <\/p>\n<p>St\u00f6rre delen av exemplen kommer p\u00e5 ett eller annat s\u00e4tt att \u00f6verlappa med webbutveckling (\u00f6verraskning), med PHP och Docker.<\/p>\n<p>I punkterna nedan ges en enkel praktisk beskrivning av anv\u00e4ndning av faktorer med specifika exempel; om du vill ha mer teori om detta \u00e4mne, h\u00e4nvisa till k\u00e4llorna ovan. <\/p>\n<h4>1. Kodbas<\/h4>\n<p>\nAnv\u00e4nd FTP och FileZilla f\u00f6r att ladda upp filer till servrarna en i taget, lagra inte koden n\u00e5gon annanstans \u00e4n p\u00e5 produktionsservern.<\/p>\n<p>Projektet ska alltid ha en enhetlig kodbas, det vill s\u00e4ga, all kod kommer fr\u00e5n en och samma <b>Git<\/b> repo. Servrar (produktion, staging, test1, test2 ...) anv\u00e4nder kod fr\u00e5n grenar i ett gemensamt repo. P\u00e5 s\u00e5 s\u00e4tt uppn\u00e5r vi en konsekvent kodstruktur.<\/p>\n<h4>2. Ber\u00e4ttelser<\/h4>\n<p>\nLadda ner alla bibliotek i mappar direkt till rotmappen av projektet. Uppdateringar g\u00f6rs genom att helt enkelt flytta ny kod till mappen med den aktuella versionen av biblioteket. Installera alla n\u00f6dv\u00e4ndiga verktyg direkt p\u00e5 v\u00e4rdservern d\u00e4r 20 andra tj\u00e4nster redan k\u00f6rs.<\/p>\n<p>Projektet b\u00f6r alltid ha en tydlig och begriplig lista \u00f6ver beroenden (med beroenden menar jag \u00e4ven milj\u00f6n). Alla beroenden m\u00e5ste vara tydligt definierade och isolerade. <br \/>\nSom exempel tar vi <b>Composer<\/b> och <b>Docker<\/b>.<\/p>\n<p><b>Composer<\/b> \u2014 en pakethanterare som g\u00f6r det m\u00f6jligt att installera PHP-bibliotek. Composer ger m\u00f6jlighet att strikt eller mer avslappnat ange versioner och definiera dem tydligt. Det kan finnas 20 olika projekt p\u00e5 servern och varje projekt har sin egen lista \u00f6ver paket och bibliotek som inte p\u00e5verkar varandra.<\/p>\n<p><b>Docker<\/b> \u2014 ett verktyg som m\u00f6jligg\u00f6r att definiera och isolera milj\u00f6n d\u00e4r applikationen kommer att k\u00f6ras. P\u00e5 liknande s\u00e4tt som med Composer, men mer grundligt, kan vi definiera vad applikationen arbetar med. V\u00e4lja en specifik PHP-version, installera endast de paket som \u00e4r n\u00f6dv\u00e4ndiga f\u00f6r projektets arbete utan att l\u00e4gga till n\u00e5got extra. Och viktigast av allt, inte korsa med paketen och milj\u00f6n f\u00f6r v\u00e4rdmaskinen och andra projekt. Det vill s\u00e4ga, alla projekt p\u00e5 servern som k\u00f6rs via Docker, kan anv\u00e4nda vilken upps\u00e4ttning paket som helst och en helt annan milj\u00f6.<\/p>\n<h4>3. Konfiguration<\/h4>\n<p>\nSpara konfigurationerna som konstanter direkt i koden. Separata konstanter f\u00f6r testservern och separata f\u00f6r produktionen. Koppla ihop applikationens arbete med milj\u00f6n direkt i aff\u00e4rslogiken i projektet med hj\u00e4lp av if-else-konstruktioner.<\/p>\n<p><b>Konfigurationer<\/b> \u2014 \u00e4r det enda som ska skilja mellan projektets distributioner (deployment). I idealfallet b\u00f6r konfigurationer \u00f6verf\u00f6ras via milj\u00f6variabler (env vars). <\/p>\n<p>Det vill s\u00e4ga, \u00e4ven om du lagrar flera konfigurationsfiler .config.prod .config.local och byter namn p\u00e5 dem vid distribution till .config (huvudkonfigurationen som anv\u00e4nds av applikationen f\u00f6r att l\u00e4sa data) \u2014 s\u00e5 \u00e4r det fortfarande en felaktig metod, eftersom informationen fr\u00e5n konfigurationerna d\u00e5 blir allm\u00e4nt tillg\u00e4nglig f\u00f6r alla utvecklare av applikationen och data fr\u00e5n produktionsservern kommer att bli komprometterade. Alla konfigurationer ska lagras direkt i distributionssystemet (CI\/CD) och genereras f\u00f6r olika milj\u00f6er med olika v\u00e4rden som kr\u00e4vs f\u00f6r en specifik milj\u00f6 just vid distribution.<\/p>\n<h4>4. Tredjepartstj\u00e4nster (Backing Services)<\/h4>\n<p>\nBind dig h\u00e5rt till milj\u00f6n, anv\u00e4nd olika anslutningar f\u00f6r samma tj\u00e4nster i specifika milj\u00f6er.<\/p>\n<p>Detta punkt \u00f6verlappar mycket med punkten om konfigurationer, eftersom utan denna punkt \u00e4r det om\u00f6jligt att skapa ordentliga konfigurationsdata, och m\u00f6jlighet till konfiguration skulle helt f\u00f6rsvinna.<\/p>\n<p>Alla anslutningar till externa tj\u00e4nster s\u00e5som k\u00f6-servrar, databaser och cache-tj\u00e4nster b\u00f6r vara enhetliga f\u00f6r b\u00e5de den lokala milj\u00f6n och den externa\/produktionsmilj\u00f6n. Med andra ord, jag kan n\u00e4r som helst \u00e4ndra anslutningsstr\u00e4ngen f\u00f6r att byta fr\u00e5n databas #1 till databas #2 utan att beh\u00f6va \u00e4ndra p\u00e5 applikationens kod. Som ett exempel, vid skalning av tj\u00e4nsten beh\u00f6ver du inte ange en speciell anslutning f\u00f6r den extra cache-servern.<\/p>\n<h4>5. Bygg, release, k\u00f6rning<\/h4>\n<p>\nHa endast den f\u00e4rdiga versionen av koden p\u00e5 servern, utan m\u00f6jlighet att rulla tillbaka en release. Det handlar om att inte belasta lagringsutrymmet. Den som tror att de kan skicka kod till produktion med ett fel \u00e4r en d\u00e5lig programmerare!<\/p>\n<p>Alla steg i distributionen b\u00f6r vara separerade fr\u00e5n varandra.<\/p>\n<p>Ha m\u00f6jlighet att rulla tillbaka. G\u00f6r releaser med snabba kopior av applikationen (redan byggda och klara f\u00f6r produktion) s\u00e5 att du kan \u00e5terst\u00e4lla en gammal version om fel uppst\u00e5r. Det finns allts\u00e5 en mapp <i>releases<\/i> och en mapp <i>current<\/i>, och efter en lyckad distribution och byggning kopplas mappen <i>current<\/i> via en symbolisk l\u00e4nk till den nya releasen som ligger inuti <i>releases<\/i> med ett hypotetiskt versionsnummer. <\/p>\n<p>H\u00e4r p\u00e5minner vi om Blue-Green deployment, som inte bara g\u00f6r det m\u00f6jligt att v\u00e4xla mellan kod, utan ocks\u00e5 mellan alla resurser och till och med milj\u00f6er med m\u00f6jlighet att rulla tillbaka allt.<\/p>\n<h4>6. Processer<\/h4>\n<p>\nSpara tillst\u00e5ndsdata f\u00f6r applikationen direkt i sj\u00e4lva applikationen. Anv\u00e4nd sessioner i applikationens minne. Anv\u00e4nd s\u00e5 m\u00e5nga delade resurser mellan externa tj\u00e4nster som m\u00f6jligt. Bind dig vid att applikationen kan ha endast en process och till\u00e5t inte skalning.<\/p>\n<p>N\u00e4r det g\u00e4ller sessioner, spara data endast i cache som kontrolleras av externa tj\u00e4nster (memcached, redis), s\u00e5 att \u00e4ven om du har 20 applikationsprocesser ig\u00e5ng, kan vilken som helst av dem, n\u00e4r den kontaktar cachen, forts\u00e4tta arbeta med klienten i samma tillst\u00e5nd som anv\u00e4ndaren var i n\u00e4r denne arbetade med applikationen i en annan process. Med detta tillv\u00e4gag\u00e5ngss\u00e4tt fungerar det s\u00e5 att ju fler kopior av externa tj\u00e4nster du anv\u00e4nder, desto mer problemfritt kommer allt att fungera utan problem med dat\u00e5tkomst.<\/p>\n<h4>7. Portbindning (Port binding)<\/h4>\n<p>\nDet \u00e4r bara webbservern som ska veta hur man arbetar med externa tj\u00e4nster. Det \u00e4r \u00e4nnu b\u00e4ttre att driva externa tj\u00e4nster direkt inuti webbservern. Till exempel som en PHP-modul i Apache.<br \/>\nAlla dina tj\u00e4nster b\u00f6r vara tillg\u00e4ngliga f\u00f6r varandra genom att kontakta n\u00e5gon adress och port (localhost:5432, localhost:3000, nginx:80, php-fpm:9000), det vill s\u00e4ga fr\u00e5n nginx kan jag f\u00e5 tillg\u00e5ng till b\u00e5de php-fpm och postgres, och fr\u00e5n php-fpm till postgres och nginx, och i sj\u00e4lva verket fr\u00e5n varje tj\u00e4nst kan jag f\u00e5 tillg\u00e5ng till en annan tj\u00e4nst. P\u00e5 s\u00e5 s\u00e4tt beror livskraften hos en tj\u00e4nst inte p\u00e5 livskraften hos en annan.<\/p>\n<h4>8. Parallellism<\/h4>\n<p>\nArbeta med en enda process, annars kanske flera processer inte kan samarbeta! <\/p>\n<p>L\u00e4mna utrymme f\u00f6r skalning. Perfekt f\u00f6r detta \u00e4r docker swarm. <br \/>\nDocker Swarm \u00e4r ett verktyg f\u00f6r att skapa och hantera kluster av containrar b\u00e5de mellan olika maskiner och en m\u00e4ngd containrar p\u00e5 en och samma maskin.<\/p>\n<p>Genom att anv\u00e4nda swarm kan jag best\u00e4mma hur m\u00e5nga resurser jag ska tilldela varje process och hur m\u00e5nga processer av samma tj\u00e4nst jag ska starta. Den interna lastbalanseraren tar emot data p\u00e5 den angivna porten och kommer automatiskt att proxy till processerna. Om jag ser att belastningen p\u00e5 servern har \u00f6kat kan jag l\u00e4gga till fler processer f\u00f6r att d\u00e4rigenom minska belastningen p\u00e5 vissa processer.<\/p>\n<h4>9. Utslippbarhet (Disposability)<\/h4>\n<p>\nAnv\u00e4nd inte k\u00f6er f\u00f6r att hantera processer och data. Att avsluta en process ska p\u00e5verka hela applikationen. Om en tj\u00e4nst faller, faller allt.<\/p>\n<p>Varje process och tj\u00e4nst kan st\u00e4ngas av vilket \u00f6gonblick som helst utan att det p\u00e5verkar andra tj\u00e4nster (det handlar inte om att en tj\u00e4nst blir otillg\u00e4nglig f\u00f6r en annan tj\u00e4nst, utan om att en annan tj\u00e4nst inte ska st\u00e4ngas av ihop med denna). Alla processer b\u00f6r avslutas mjukt, s\u00e5 att inga data skadas vid avslutningen och systemet fungerar korrekt vid n\u00e4sta start. \u00c4ven vid en n\u00f6dst\u00e4ngning ska inga data skadas (detta \u00e5stadkommes med hj\u00e4lp av transaktionsmekanismer, databasfr\u00e5gor fungerar endast i grupper, och om n\u00e5gon fr\u00e5ga i gruppen misslyckas eller ger ett fel, ska ingen annan fr\u00e5ga i gruppen faktiskt k\u00f6ras).<\/p>\n<h4>10. Paritet mellan utveckling och drift av applikationen<\/h4>\n<p>\nProduktions-, staging- och lokalversionen av applikationen b\u00f6r vara olika. I produktion anv\u00e4nder vi Yii Lite-ramverket, medan vi lokalt anv\u00e4nder Yii, f\u00f6r att det fungerar snabbare i produktion!<\/p>\n<p>I verkligheten b\u00f6r alla distributioner och kodhanteringar ske i n\u00e4stan identiska milj\u00f6er (det handlar inte om fysisk h\u00e5rdvara). Dessutom b\u00f6r alla anst\u00e4llda inom utvecklingen kunna distribuera koden i produktion vid behov, inte en s\u00e4rskilt utbildad devops-avdelning som endast kan starta applikationen i produktion tack vare s\u00e4rskild kompetens.<\/p>\n<p>Detta st\u00f6ds ocks\u00e5 av Docker. Genom att f\u00f6lja alla f\u00f6reg\u00e5ende punkter kommer anv\u00e4ndningen av Docker att g\u00f6ra distributionsprocessen inom b\u00e5de produktion och lokal maskin s\u00e5 enkel som att k\u00f6ra ett par kommandon.<\/p>\n<h4>11. Loggning (Logs)<\/h4>\n<p>\nVi skriver loggar i filer och databaser! Vi rensar inte filer och databaser fr\u00e5n loggar. Vi k\u00f6per bara en h\u00e5rddisk p\u00e5 9000 petabyte och det \u00e4r bra.<\/p>\n<p>Alla loggar b\u00f6r ses som en str\u00f6m av h\u00e4ndelser. Sj\u00e4lva applikationen ska inte hantera loggar. Loggar ska antingen skickas till stdout eller \u00f6ver ett protokoll som udp, s\u00e5 att hanteringen av loggar inte st\u00f6r applikationen. Graylog \u00e4r ett bra alternativ f\u00f6r detta. Graylog tar emot alla loggar via udp (f\u00f6r detta protokoll beh\u00f6vs inget svar p\u00e5 att paketet har tagits emot) och st\u00f6r d\u00e4rmed inte applikationen, utan hanterar endast struktureringen och behandlingen av loggar. Applikationens logik f\u00f6r\u00e4ndras inte f\u00f6r att arbeta med s\u00e5dana metoder.<\/p>\n<h4>12. Administrationsuppgifter<\/h4>\n<p>\nF\u00f6r att uppdatera data, databasen, etc. anv\u00e4nd en separat skapad endpoint i API:t, vars k\u00f6rning tv\u00e5 g\u00e5nger i rad kan resultera i att allt dupliceras. Men ni \u00e4r ju inte dumma och trycker inte tv\u00e5 g\u00e5nger, och vi beh\u00f6ver inga migrationer.<\/p>\n<p>Alla administrationsuppgifter m\u00e5ste utf\u00f6ras i samma milj\u00f6 som hela koden, p\u00e5 versionsniv\u00e5. S\u00e5 om vi beh\u00f6ver \u00e4ndra databassens struktur, ska vi inte g\u00f6ra det manuellt genom att \u00e4ndra kolumnnamn och l\u00e4gga till nya genom n\u00e5gon visuell databasverktyg. F\u00f6r s\u00e5dana saker skapar vi separata skript \u2014 migrationer, som k\u00f6rs p\u00e5 alla milj\u00f6er med ett enhetligt och tydligt resultat. F\u00f6r alla andra uppgifter, som att fylla projektet med data, b\u00f6r liknande metoder till\u00e4mpas.<\/p>\n<h3>Exempel p\u00e5 implementation med PHP, Laravel, Laradock, Docker-Compose<\/h3>\n<p>\nP.S. Alla exempel gjordes p\u00e5 MacOS. St\u00f6rsta delen fungerar \u00e4ven f\u00f6r Linux. Anv\u00e4ndare av Windows, ber om urs\u00e4kt, men jag har inte arbetat med Windows p\u00e5 l\u00e4nge.<\/p>\n<p>L\u00e5t oss f\u00f6rest\u00e4lla oss en situation d\u00e4r vi inte har installerat n\u00e5gon version av PHP p\u00e5 v\u00e5r dator och inte har n\u00e5got alls. <br \/>\nVi installerar de senaste versionerna av docker och docker-compose. (detta kan hittas p\u00e5 internet)<\/p>\n<pre><code class=\"bash\">docker -v &amp;&amp; \ndocker-compose -v\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/d9e77c47eef486befb6ebd8118403d13.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n1. Vi installerar <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=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67b3214d9a5cff4596c4914ea6e199c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4r det g\u00e4ller Laradock kan jag s\u00e4ga att det \u00e4r en riktigt bra grej som samlar m\u00e5nga containrar och hj\u00e4lpfunktioner. Men att anv\u00e4nda Laradock utan modifieringar i produktion \u2014 skulle jag inte rekommendera p\u00e5 grund av dess \u00f6verfl\u00f6dighet. Det \u00e4r b\u00e4ttre att skapa egna containrar baserat p\u00e5 exemplen i Laradock, s\u00e5 kan man optimera, eftersom ingen beh\u00f6ver allt som finns d\u00e4r samtidigt.<\/p>\n<p>2. Vi konfigurerar Laradock f\u00f6r att arbeta med v\u00e5r applikation.<\/p>\n<pre><code class=\"bash\">cd laradock &amp;&amp; \ncp env-example .env\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/df8107e1be933cc955be8ca5066f22f2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.1. \u00d6ppna katalogen habr (f\u00f6r\u00e4ldramappen d\u00e4r laradock har klonats) i en valfri editor. (I mitt fall PHPStorm)<\/p>\n<p>I det h\u00e4r steget ger vi bara projektet ett namn.<\/p>\n<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f6026fd04130590539e0945db30ec0dd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.2. Starta bilden f\u00f6r workspace. (I ditt fall kommer bilderna att byggas under en tid)<br \/>\nWorkspace \u00e4r en s\u00e4rskilt f\u00f6rberedd bild f\u00f6r arbete med ramverket fr\u00e5n utvecklarens sida.<\/p>\n<p>G\u00e5 in i containern med hj\u00e4lp av <\/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=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e839a5cd055b6c06c02cdd03a5054477.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.3. Installera Laravel<\/p>\n<pre><code class=\"bash\">composer create-project --prefer-dist laravel\/laravel application<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/b21b3fc30ce1bec63aee43ab5fce53e3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.4. Efter installationen kontrollerar vi om katalogen med projektet har skapats, och tar ner compose.<\/p>\n<pre><code class=\"bash\">ls\nexit\ndocker-compose down\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e812f383138637656ec96804833cfc53.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n2.5. \u00c5terg\u00e5 till PHPStorm och ange r\u00e4tt s\u00f6kv\u00e4g till v\u00e5r laravel-applikation i filen .env.<\/p>\n<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/abb9a5694d01163960af5375767f331b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n3. L\u00e5t oss l\u00e4gga till hela koden i Git.<\/p>\n<p>F\u00f6r detta \u00e4ndam\u00e5l skapar vi ett repository p\u00e5 Github (eller n\u00e5gon annanstans). G\u00e5 till katalogen habr i terminalen och k\u00f6r f\u00f6ljande kod.<\/p>\n<pre><code class=\"bash\">echo \"# habr-12factor\" &gt;&gt; README.md\ngit init\ngit add README.md\ngit commit -m \"first commit\"\ngit remote add origin git@github.com:nzulfigarov\/habr-12factor.git # h\u00e4r kommer l\u00e4nken till ditt repo\ngit push -u origin master\ngit status\n<\/code><\/pre>\n<p>\nKontrollera att allt \u00e4r i sin ordning. <\/p>\n<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/cbcb770a95d91655bdaf727be79742ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r bekv\u00e4mlighetens skull rekommenderar jag att anv\u00e4nda n\u00e5got visuellt gr\u00e4nssnitt f\u00f6r Git, i mitt fall \u00e4r det <noindex><a rel=\"nofollow\" href=\"https:\/\/www.gitkraken.com\/invite\/qXBXV9Wm\">GitKraken<\/a><\/noindex>. (h\u00e4r \u00e4r en referralsl\u00e4nk)<\/p>\n<p>4. Starta!<\/p>\n<p>Innan du startar, se till att ingenting k\u00f6rs p\u00e5 port 80 och 443.<\/p>\n<pre><code class=\"bash\">docker-compose up -d nginx php-fpm<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f0bf0416e67b918e0966100e37c74454.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e4rmed best\u00e5r v\u00e5rt projekt av 3 separata tj\u00e4nster:<\/p>\n<ul>\n<li>nginx \u2014 webserver<\/li>\n<li>php-fpm \u2014 php f\u00f6r att ta emot f\u00f6rfr\u00e5gningar fr\u00e5n webservern<\/li>\n<li>workspace \u2014 php f\u00f6r utvecklaren<\/li>\n<\/ul>\n<p>\nF\u00f6r tillf\u00e4llet har vi uppn\u00e5tt det att vi har skapat en applikation motsvarande redan 4 punkter av 12, n\u00e4mligen:<\/p>\n<p>1. <b>Kodbasis<\/b> \u2014 All kod ligger i ett repository (en liten kommentar: det kan vara b\u00e4ttre att f\u00f6ra in docker i projektet laravel, men det \u00e4r inte avg\u00f6rande).<\/p>\n<p>2. <b>Beroenden<\/b> \u2014 Alla v\u00e5ra beroenden \u00e4r tydligt angivna i application\/composer.json och i varje Dockerfile f\u00f6r varje container.<\/p>\n<p>3. <b>Externa tj\u00e4nster (Backing Services)<\/b> \u2014 Varje tj\u00e4nst (php-fpm, nginx, workspace) lever sitt eget liv och \u00e4r uppkopplad utifr\u00e5n, och n\u00e4r man arbetar med en tj\u00e4nst p\u00e5verkas ingen annan.<\/p>\n<p>4. <b>Processer<\/b> \u2014 varje tj\u00e4nst \u00e4r en process. Ingen av tj\u00e4nsterna sparar ett internt tillst\u00e5nd.<\/p>\n<p>5.<b> Portbindning (Port binding)<\/b><\/p>\n<pre><code class=\"bash\">docker ps\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/e6e3fa4a12a43d1bcd51992c424c1245.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom vi ser, varje tj\u00e4nst k\u00f6rs p\u00e5 sin egen port och \u00e4r tillg\u00e4nglig f\u00f6r alla andra tj\u00e4nster.<\/p>\n<p>6.<b> Parallellism <\/b><\/p>\n<p>Docker till\u00e5ter oss att starta flera processer av samma tj\u00e4nster med automatisk lastbalansering mellan dem. <\/p>\n<p>Vi stoppar containrarna och startar dem med en flagga <b>\u2014skala<\/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=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/f5d279b8a034512dd20024272c7f03b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom vi ser, har php-fpm-containern skapat kopior. Vi beh\u00f6ver inte \u00e4ndra n\u00e5got i arbetet med denna container. Vi forts\u00e4tter ocks\u00e5 att kommunicera med den via port 9000, och Docker hanterar belastningen mellan containrarna \u00e5t oss.<\/p>\n<p>7. <b>Avyttring (Disposability)<\/b> \u2014 varje container kan stoppas utan att p\u00e5verka de andra. St\u00e4ngning eller omstart av en container p\u00e5verkar inte applikationens arbete vid framtida lanseringar. Varje container kan ocks\u00e5 startas n\u00e4r som helst.<\/p>\n<p>8. <b>Paritet mellan utveckling och produktion<\/b> \u2014 alla v\u00e5ra milj\u00f6er \u00e4r identiska. N\u00e4r du k\u00f6r systemet p\u00e5 en server i produktion beh\u00f6ver du inte \u00e4ndra n\u00e5got i dina kommandon. Allt kommer att baseras p\u00e5 Docker p\u00e5 exakt samma s\u00e4tt.<\/p>\n<p>9. <b>Loggning (Logs)<\/b> \u2014 alla loggar i dessa containrar str\u00f6mmas och visas i Docker-konsolen. (i detta fall, i verkligheten, kan det vara annorlunda med andra anpassade containrar om du inte tar hand om det)<\/p>\n<pre><code class=\"bash\"> docker-compose logs -f<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/67e275042b96f5270534466b426d4fdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMen h\u00e4r finns det en hake: Standardv\u00e4rdena i PHP och Nginx skriver ocks\u00e5 loggar i filen. F\u00f6r att uppfylla 12-faktorprinciperna \u00e4r det n\u00f6dv\u00e4ndigt <b>st\u00e4nga av<\/b> att loggar skrivs till filer i konfigurationerna f\u00f6r varje container individuellt.<\/p>\n<p>Docker erbjuder \u00e4ven m\u00f6jligheten att rikta loggar inte bara till stdout, utan ocks\u00e5 till saker som graylog som jag n\u00e4mnde ovan. Inom graylog kan vi hantera loggarna p\u00e5 valfritt s\u00e4tt, och v\u00e5r applikation kommer inte att m\u00e4rka n\u00e5got.<\/p>\n<p>10. <b>Administrationsuppgifter<\/b> \u2014 alla administrationsuppgifter l\u00f6ses av laravel tack vare verktyget artisan precis som skaparna av 12-faktorapplikationen skulle vilja.<\/p>\n<p>Som exempel visar jag hur n\u00e5gra kommandon utf\u00f6rs.<br \/>\nVi g\u00e5r in i containern.<\/p>\n<pre><code class=\"bash\"> \ndocker-compose exec workspace bash\nphp artisan list\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/3d5fb5bc40b4b8b0cb225116c0f3d625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNu kan vi anv\u00e4nda vilket kommando vi vill. (Observera att vi inte har konfigurerat databasen och cachen, s\u00e5 h\u00e4lften av kommandona kommer inte att fungera korrekt, eftersom de \u00e4r avsedda f\u00f6r arbete med cache och databasen).<\/p>\n<p><img decoding=\"async\" alt=\"Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker.\" src=\"\/wp-content\/uploads\/2020\/02\/6f84bb2ade2ade654d2c361c585edeae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n11. <b>Konfigurationer<\/b> och 12. <b>Byggande, distribution, k\u00f6rning<\/b><\/p>\n<p>Den h\u00e4r delen ville jag \u00e4gna \u00e5t Blue-Green Deployment, men det visade sig vara f\u00f6r omfattande f\u00f6r denna artikel. Jag kommer att skriva en separat artikel om detta. <\/p>\n<p>I korthet bygger konceptet p\u00e5 CI\/CD-system som <b>Jenkins<\/b> och <b>Gitlab CI<\/b>. I b\u00e5da kan man st\u00e4lla in milj\u00f6variabler kopplade till en specifik milj\u00f6. D\u00e4rmed kommer punkt med <b>Konfigurationer<\/b>.<\/p>\n<p>Och punkten om <b>Byggande, distribution, k\u00f6rning<\/b> l\u00f6ses av inbyggda funktioner i b\u00e5da verktygen som kallas <b>Pipeline<\/b>.<\/p>\n<p><b>Pipeline<\/b> m\u00f6jligg\u00f6r att dela in deploymentsprocessen i flera steg, d\u00e4r bygg-, release- och k\u00f6rningsfaserna framh\u00e4vs. I Pipeline kan du ocks\u00e5 skapa backup och faktiskt allt m\u00f6jligt. Detta verktyg har en o\u00e4ndlig potential.<\/p>\n<p>Kodbasen f\u00f6r applikationen ligger p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nzulfigarov\/habr-12factor\">Github<\/a><\/noindex>.<br \/>\nKom ih\u00e5g att initialisera submodulen n\u00e4r du klonar detta repository.<\/p>\n<p>P.S.: Alla dessa tillv\u00e4gag\u00e5ngss\u00e4tt kan anv\u00e4ndas med andra verktyg och programmeringsspr\u00e5k. Det viktigaste \u00e4r att k\u00e4rnan inte skiljer sig.<br \/>\n<br \/>K\u00e4lla: <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 5.0.4 - aioseo.com -->\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\/sv\/blog\/razrabotka-prilozhenij-i-blue-green-deployment-opirayas-na-metodologiyu-the-twelve-factor-app-s-primerami-na-php-i-docker\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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:url\" content=\"https:\/\/prohoster.info\/sv\/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\udd47Utveckling av applikationer och Blue-Green deployment, baserat p\u00e5 metodologin The Twelve-Factor App med exempel p\u00e5 php och docker | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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:url":"https:\/\/prohoster.info\/sv\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/40596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=40596"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/40596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/40597"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=40596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=40596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=40596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}