ݺߣ

ݺߣShare a Scribd company logo
Deployment PHP aplikacíJan Mittner
Kdo jsme a co děláme?
Vergilio, s.r.o.malé webové studioco dělámetvorba webů a webových aplikacídesítky klientů150 projektůze známějších projektů např. Jízdomat.cz
Jaký problém jsme řš?
Deployment PHP aplikacímnoho projektů s častými aktualizacemidesítky až stovky úprav měsíčnějak je nahrát do produkčního prostředí?deployment aplikaceřada rutinních krokůna mnoha místech možnost udělání chybyžádná přidaná hodnotanikoho to nebaví
Otevření databázového klientaPřihlášení do databázeÚprava databázového schématuLokální práce vývojářeJe vše OK?Kontrola výsledku a chybCommit do repositoryČekání na dokončení přenosuobčas se na commit zapomene…Je vše OK?opakování přenosu (FTP padá…)Spuštění FTP klientaSpuštění přenosuNotifikace týmu o deploymentuNotifikace zákazníka o deploymentuPřipojení ke správnému FTP serveruVýběr změněných souborů
Lokální práce vývojářeCommit do repositoryOtevření deployovací aplikaceKliknutí na tlačítko „Deploy!”
Jak jsme to vyřš?
Automatizovaný deploymentSVN + Phing + DBDeploydeployovací aplikace vývojářprodukční server(y)integrační / test serverklient deployovací aplikacePhing skriptSVN repositorySVN klientdeployovací aplikacePhing skript
Live ukázka
Funkcionalita#1přenos jen změněných souborůtisíce souborů, stovky adresářůmigrace databázespouštění delta skriptů pro migraci databázezálohování databáze před migracírůzná konfigurace pro různá běhová prostředínapř. doplnění produkčních heselaby nebyla uložena v repository, ale doplnila se až při deploymentumůžeme tak nechat na projektu pracovat kohokoliv
Deployment PHP aplikací | WebExpo 2011
Funkcionalita #2linkování externích knihoven a sdílených adresářůZend Framework, Nette, ...uploadované soubory, logy, ...automatické odstraňování cache a dalších souborůčlenové týmu i zákazník obdrží e-mail s notifikacívčetně přehledu provedených změn (volitelně)
Eliminace rizika lidského faktorunikdo nezná hesla do žádných služeb FTP, SSH, DB, …špatný adresář nebo soubor při uploaduopomenutí commitu do repositoryméně technicky zkušení členové týmu např. grafici… a to vše na jedno kliknutí
Jak tedy na to?
Charakteristika řešení #1systém pro správu verzí nezbytným základemSVN, Git, …automatizace potřebných kroků pomocí nástroje Phingvelmi podobné javovému nástroji Antřada připravených a užitečných tasků možnost psát vlastní tasky jednoduše a rychle přímo v PHPspouštění phingových skriptů pomocí deployovací aplikace instalované na produkčním a integračním serveru
Deployment PHP aplikací | WebExpo 2011
Deployment PHP aplikací | WebExpo 2011
Charakteristika řešení #2pro všechny projekty je stejný build skript (orchestrační skript)automaticky modifikován dle konfigurace daného projektusymlinky (sdílené adresáře)replace pravidla (produkční hesla)remove pravidla (cache)dostatečně univerzální řešení (proprietární aplikace, ZF, Wordpress)logika fungování podobná nástroji Capistrano pro RoRcurrent, releases a shared adresáře - symlinkingPhing i DBDeploy musel být trochu upravenúprava stávajících tasků, přidání vlastních taskůcelé ale v PHP
Deployment PHP aplikací | WebExpo 2011
Možná rozšířeníspouštěnítestů na testovacím serverunapojení na CI serverJenkins, PHPUnderControl, CruiseControl, …PHP CodeSniffer, PHPMD, PDepend, …javascripty a CSS souboryminifikacekombinování souborůpřímá podpora Phingu
Co když…… máte hosting jen s FTP přístupem?… máte hosting se SFTP/SCP přístupem?… máte vlastní server nebo SSH přístup?
Jak začít?1. Nainstalujte si PEAR + Phing 2. Vytvořte první build skript3. Přidejte úkoly pro deploy target 4. Spusťte phing deploy –buildfilescript.xml5. Upravujte build skript k obrazu svému6. Zautomatizujte spouštění phingu
Zhodnocení našeho řešeníaktivně využíváno od dubna 2010 u 150 projektůprůměrně 8 deploymentů denněmin. 1/2hodinová úspora času denněroční úspora odhadem až 20 čld.značné snížení chybovosti a zvýšení agilnosticokoliv se otestuje, je možné ihned nasaditdatabáze a aplikace vždy ve stejné verzivšechno musí projít přes repository
Existující řešeníCapistrano, Capifony, Phingistrano, Pake, …ne však zcela univerzální řešeníPHPFog, PagodaBoxPaaS cloudové služby s možností one-click deploymentuneposkytují však všechny popisované funkcepřipravujeme vlastní projekt Elephantra.czne open-source, ale důležité funkce zdarma
Co si odnést?manuální deployment je ztráta času a penězdeployment PHP aplikací lze automatizovatexistujínástroje, které vám pomohou
Děkuji za pozornostVaše dotazy?

More Related Content

Viewers also liked (17)

WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
BrnoPHP
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
éá첹ř
Nikola luxova
Nikola luxovaNikola luxova
Nikola luxova
cekaon
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php framework
Martin Zeman
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
éá첹ř
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspective
BrnoPHP
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
Jakub Kulhan
Asynchronně v PHP
Asynchronně v PHPAsynchronně v PHP
Asynchronně v PHP
Josef Kříž
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
Vojta Svoboda
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
Jakub Nesetril
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015
David Grudl
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?
David Grudl
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
Mike Crabb
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
BrnoPHP
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
éá첹ř
Nikola luxova
Nikola luxovaNikola luxova
Nikola luxova
cekaon
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php framework
Martin Zeman
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
éá첹ř
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspective
BrnoPHP
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
Jakub Kulhan
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
Vojta Svoboda
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
Jakub Nesetril
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015
David Grudl
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?
David Grudl
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
Mike Crabb

Similar to Deployment PHP aplikací | WebExpo 2011 (20)

Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
éá첹ř
vSphere automation workshop python
vSphere automation workshop pythonvSphere automation workshop python
vSphere automation workshop python
Vladan Laxa
Instalace WordPress
Instalace WordPressInstalace WordPress
Instalace WordPress
Vladimír Smitka
Lotus Notes 7
Lotus Notes 7Lotus Notes 7
Lotus Notes 7
Martin Humpolec
Studie webserveru OpenLiteSpeed a LiteSpeed Enterprise
Studie webserveru OpenLiteSpeed a LiteSpeed EnterpriseStudie webserveru OpenLiteSpeed a LiteSpeed Enterprise
Studie webserveru OpenLiteSpeed a LiteSpeed Enterprise
SEO specialista a copywriter Daniel Beránek
Generátory statických webů
Generátory statických webůGenerátory statických webů
Generátory statických webů
Michal Doležel
2009 X33EJA Moderní Technologie Pro Vývoj JEE
2009 X33EJA Moderní Technologie Pro Vývoj JEE2009 X33EJA Moderní Technologie Pro Vývoj JEE
2009 X33EJA Moderní Technologie Pro Vývoj JEE
Martin Ptáček
atoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeceptionatoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeception
atotocz
WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3
Vladimír Smitka
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně
Jiří Mareš
Semináře M-Files: Konec hledání řešení pro správu firemních dat
Semináře M-Files: Konec hledání řešení pro správu firemních datSemináře M-Files: Konec hledání řešení pro správu firemních dat
Semináře M-Files: Konec hledání řešení pro správu firemních dat
Jaroslav Prodelal
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & ReplicationWebinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Jaroslav Prodelal
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Vašek Purchart
Odborná snídaně 20.9. - Agile@DevOps - 2. část
Odborná snídaně 20.9. - Agile@DevOps - 2. částOdborná snídaně 20.9. - Agile@DevOps - 2. část
Odborná snídaně 20.9. - Agile@DevOps - 2. část
Profinit
Nové »bezhlavé« CMS — přechod od monolitů ke službám
Nové »bezhlavé« CMS — přechod od monolitů ke službámNové »bezhlavé« CMS — přechod od monolitů ke službám
Nové »bezhlavé« CMS — přechod od monolitů ke službám
Jaroslav Vrána
Bezpečnost WordPress pro začátečníky
Bezpečnost WordPress pro začátečníkyBezpečnost WordPress pro začátečníky
Bezpečnost WordPress pro začátečníky
Vladimír Smitka
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
éá첹ř
VersionPress - jak dělat WP weby lépe
VersionPress - jak dělat WP weby lépeVersionPress - jak dělat WP weby lépe
VersionPress - jak dělat WP weby lépe
Borek Bernard
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
Vašek Purchart - Optimalizace Symfony na devu (2. sraz přátel Symfony v Praze)
éá첹ř
vSphere automation workshop python
vSphere automation workshop pythonvSphere automation workshop python
vSphere automation workshop python
Vladan Laxa
2009 X33EJA Moderní Technologie Pro Vývoj JEE
2009 X33EJA Moderní Technologie Pro Vývoj JEE2009 X33EJA Moderní Technologie Pro Vývoj JEE
2009 X33EJA Moderní Technologie Pro Vývoj JEE
Martin Ptáček
atoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeceptionatoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeception
atotocz
WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3WordPress: Základy - bezpečnost 3x3
WordPress: Základy - bezpečnost 3x3
Vladimír Smitka
20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně20110511 Vývoj software - produktivně, efektivně, kvalitně
20110511 Vývoj software - produktivně, efektivně, kvalitně
Jiří Mareš
Semináře M-Files: Konec hledání řešení pro správu firemních dat
Semináře M-Files: Konec hledání řešení pro správu firemních datSemináře M-Files: Konec hledání řešení pro správu firemních dat
Semináře M-Files: Konec hledání řešení pro správu firemních dat
Jaroslav Prodelal
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & ReplicationWebinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Webinář: Vylepšete ochranu virtuální infrastruktury - Veeam Backup & Replication
Jaroslav Prodelal
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Continuous integration pro Symfony/PHP aplikaci s Dockerem v GitLabu [CZ]
Vašek Purchart
Odborná snídaně 20.9. - Agile@DevOps - 2. část
Odborná snídaně 20.9. - Agile@DevOps - 2. částOdborná snídaně 20.9. - Agile@DevOps - 2. část
Odborná snídaně 20.9. - Agile@DevOps - 2. část
Profinit
Nové »bezhlavé« CMS — přechod od monolitů ke službám
Nové »bezhlavé« CMS — přechod od monolitů ke službámNové »bezhlavé« CMS — přechod od monolitů ke službám
Nové »bezhlavé« CMS — přechod od monolitů ke službám
Jaroslav Vrána
Bezpečnost WordPress pro začátečníky
Bezpečnost WordPress pro začátečníkyBezpečnost WordPress pro začátečníky
Bezpečnost WordPress pro začátečníky
Vladimír Smitka
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
éá첹ř
VersionPress - jak dělat WP weby lépe
VersionPress - jak dělat WP weby lépeVersionPress - jak dělat WP weby lépe
VersionPress - jak dělat WP weby lépe
Borek Bernard

Deployment PHP aplikací | WebExpo 2011

  • 2. Kdo jsme a co děláme?
  • 3. Vergilio, s.r.o.malé webové studioco dělámetvorba webů a webových aplikacídesítky klientů150 projektůze známějších projektů např. Jízdomat.cz
  • 5. Deployment PHP aplikacímnoho projektů s častými aktualizacemidesítky až stovky úprav měsíčnějak je nahrát do produkčního prostředí?deployment aplikaceřada rutinních krokůna mnoha místech možnost udělání chybyžádná přidaná hodnotanikoho to nebaví
  • 6. Otevření databázového klientaPřihlášení do databázeÚprava databázového schématuLokální práce vývojářeJe vše OK?Kontrola výsledku a chybCommit do repositoryČekání na dokončení přenosuobčas se na commit zapomene…Je vše OK?opakování přenosu (FTP padá…)Spuštění FTP klientaSpuštění přenosuNotifikace týmu o deploymentuNotifikace zákazníka o deploymentuPřipojení ke správnému FTP serveruVýběr změněných souborů
  • 7. Lokální práce vývojářeCommit do repositoryOtevření deployovací aplikaceKliknutí na tlačítko „Deploy!”
  • 8. Jak jsme to vyřš?
  • 9. Automatizovaný deploymentSVN + Phing + DBDeploydeployovací aplikace vývojářprodukční server(y)integrační / test serverklient deployovací aplikacePhing skriptSVN repositorySVN klientdeployovací aplikacePhing skript
  • 11. Funkcionalita#1přenos jen změněných souborůtisíce souborů, stovky adresářůmigrace databázespouštění delta skriptů pro migraci databázezálohování databáze před migracírůzná konfigurace pro různá běhová prostředínapř. doplnění produkčních heselaby nebyla uložena v repository, ale doplnila se až při deploymentumůžeme tak nechat na projektu pracovat kohokoliv
  • 13. Funkcionalita #2linkování externích knihoven a sdílených adresářůZend Framework, Nette, ...uploadované soubory, logy, ...automatické odstraňování cache a dalších souborůčlenové týmu i zákazník obdrží e-mail s notifikacívčetně přehledu provedených změn (volitelně)
  • 14. Eliminace rizika lidského faktorunikdo nezná hesla do žádných služeb FTP, SSH, DB, …špatný adresář nebo soubor při uploaduopomenutí commitu do repositoryméně technicky zkušení členové týmu např. grafici… a to vše na jedno kliknutí
  • 16. Charakteristika řešení #1systém pro správu verzí nezbytným základemSVN, Git, …automatizace potřebných kroků pomocí nástroje Phingvelmi podobné javovému nástroji Antřada připravených a užitečných tasků možnost psát vlastní tasky jednoduše a rychle přímo v PHPspouštění phingových skriptů pomocí deployovací aplikace instalované na produkčním a integračním serveru
  • 19. Charakteristika řešení #2pro všechny projekty je stejný build skript (orchestrační skript)automaticky modifikován dle konfigurace daného projektusymlinky (sdílené adresáře)replace pravidla (produkční hesla)remove pravidla (cache)dostatečně univerzální řešení (proprietární aplikace, ZF, Wordpress)logika fungování podobná nástroji Capistrano pro RoRcurrent, releases a shared adresáře - symlinkingPhing i DBDeploy musel být trochu upravenúprava stávajících tasků, přidání vlastních taskůcelé ale v PHP
  • 21. Možná rozšířeníspouštěnítestů na testovacím serverunapojení na CI serverJenkins, PHPUnderControl, CruiseControl, …PHP CodeSniffer, PHPMD, PDepend, …javascripty a CSS souboryminifikacekombinování souborůpřímá podpora Phingu
  • 22. Co když…… máte hosting jen s FTP přístupem?… máte hosting se SFTP/SCP přístupem?… máte vlastní server nebo SSH přístup?
  • 23. Jak začít?1. Nainstalujte si PEAR + Phing 2. Vytvořte první build skript3. Přidejte úkoly pro deploy target 4. Spusťte phing deploy –buildfilescript.xml5. Upravujte build skript k obrazu svému6. Zautomatizujte spouštění phingu
  • 24. Zhodnocení našeho řešeníaktivně využíváno od dubna 2010 u 150 projektůprůměrně 8 deploymentů denněmin. 1/2hodinová úspora času denněroční úspora odhadem až 20 čld.značné snížení chybovosti a zvýšení agilnosticokoliv se otestuje, je možné ihned nasaditdatabáze a aplikace vždy ve stejné verzivšechno musí projít přes repository
  • 25. Existující řešeníCapistrano, Capifony, Phingistrano, Pake, …ne však zcela univerzální řešeníPHPFog, PagodaBoxPaaS cloudové služby s možností one-click deploymentuneposkytují však všechny popisované funkcepřipravujeme vlastní projekt Elephantra.czne open-source, ale důležité funkce zdarma
  • 26. Co si odnést?manuální deployment je ztráta času a penězdeployment PHP aplikací lze automatizovatexistujínástroje, které vám pomohou