Dockerizované nasazení Drupalu přes FTP

Napsal uživatel Stopka dne

V průběhu času se seznam webů které spravuji poměrně rozrostl. Všechny jsem je postavil na opensource projektu Drupal, takže když vyjde nová verze Drupalu nebo některého z jeho rozšíření, začne pro mě pravidelné kolečko aktualizací.

Dříve byly aktualizace rozšíření jednoduchou záležitostí, protože Drupal má vestavěný instalátor. Jenže svět php adoptoval moderní způsob instalace závislostí pomocí Composeru a spousta rozšíření na tomto způsobu instalace začala záviset. To značně zkomplikovalo aktualizace, protože člověk musí stáhnout, rozšířit a přestavět vendor adresář s php závislostmi. A to při každé aktualizaci. Navíc Drupal neumí aktualizovat své jádro, takže je potřeba stáhnout nový Drupal, znovu kvůli doplňkům přestavět vendor adresář a pak vše nasadit.

Nasazení samotné je taky problematické. Několik webu provozuji na svém serveru, kde je to jednoduché, protože mi běží v Dockeru Aktualizace je tak jen otázka přestavění kontejneru - tedy jeden příkaz a je to. Ale většina webu mi běží na nějakém LAMP webhostingu, kam se musí aplikace nahrát přes FTP (FTPS abych byl přesný). A to je velmi otravný způsob nasazení. Člověk musí nahrát nové soubory a u toho dávat pozor aby nepřepsal adresář s konfiguracemi nebo daty. Pak je nutné smazat soubory, které již potřeba nejsou. Hrůza, určitě musí existovat jednodušší způsob jak na to.

Sestavení

Řekl jsem si, že tohle přece nemůže trápit jen mě a začal hledat řešení. Zjistil jsem, že Drupal dnes může být plně nainstalován jen pomocí Composeru a to i se s rozšířeními. Všechny core moduly v composer repozitáři a lze je tak stáhnoutnaráz pouhým přidáním závislosti "drupal/core-recommended". Navíc všechna oficiální rozšíření publikována na webu drupal.org jsou také publikována v Composer repozitáři pod prefixem "drupal/". A jde to ještě dál. Existuje totiž doplněk pro Composer s názvem  "drupal/core-composer-scaffold", který automaticky uloží stažené moduly do správné adresářové struktury. Moduly tak uloží do adresáře "www/modules", vzhledy do adresáře "www/themes", jádro do "www/core" a podobně. Tím se zjednoduší definice webu na jeden Composer soubor. Paráda.

Všechny weby jsem přepracoval do této nové podoby. Připravil jsem soubor composer.json, přidal Dockerfile, který nainstaluje Nginx, Php a Composer a sestaví celou aplikaci. Za zmínku stojí, že již existují na webu docker obrazy, které dělají to samé. Stáhnou Drupal, potřebná rozšíření a spustí aplikaci s celým webovým stackem. Jenže často používají Apache jako web server a jeho php modul a já bych to raději provozoval na Nginxu s php-fpm. Nebo instalaci řídí pomocí jednotlivých RUN příkazů v Dockeru, já bych raději měl jeden ucelený composer.json, ze kterého se vše nainstaluje. Zkrátka žádný z již existujících obrazů mi plně nevyhovoval a tak bylo jednodušší si sepsat Dockerfile vlastní.

Každý mnou vytvořený web má samozřejmě i vlastní na míru vytvořený vzhled. Proto i témata jsem přestavěl na samostatné composer knihovny aby mohly být do aplikace nainstalovány stejným způsobem s ostatními rozšířeními. Vzhledové moduly často potřebují sestavit pomocí frontendových nástrojů a stáhnout frontendové závislosti z npm repozitářů. Přidal jsem proto do Dockerfile i fázi sestavující css a javascripty.

Weby které provozuji na svém železe v Dockeru jsou tímto hotovy. Ale jak jsem říkal, většina webů musí být ještě nasazena na webhosting pomocí FTP.

Nasazení

V této fázi přijde na řadu další jednoduchý nástroj který jsem objevil. Jde o "dg/ftp-deployment", aplikace pro příkazovou řádku napsaná Davidem Grudlem v PHP, také vystavená jako Composer knihovna. Aplikace je navržena chytře: společně se soubory na cílový server nahraje i seznam nahraných souborů s jejich hashem. Takže při aktualizaci může nahrát jen upravené a nové soubory a smazat ty nepotřebné.

Aplikace je také velmi jednoduše konfigurovaná pomocí ini nebo php souboru. Já zvolil konfiguraci pomocí php, protože takhle mohu načíst některé proměnné z aplikačního prostředí kontejneru. Konfigurace definuje, které adresáře se mají nahrát na server, na jaký server, s jakými přihlašovacími údaji. Hesla a další citlivé údaje jsou uložena v .env souboru Dockeru, takže mimo git repozitář.

Znovu jsem tedy rozšířil Dockerfile, tentokrát o fázi nasazení, která doinstaluje aplikaci ftp-deployment a přidá její konfiguraci. Když sestavení kontejneru dojde až do této fáze, je vše připraveno abych mohl jen spustit tuto nasazovací aplikaci.

Po všech těchto úpravách je aktualizace webu provedena téměř automaticky. Nejdříve sestavím nový kontejner, tím se mi spustí kopie webu na localhostu, kde mohu web proklikat a otestovat zda vše funguje jak má. Pak se připojím do kontejneru a spustím nasazovací aplikaci. To je vše. To je obrovské zjednodušení práce.

Kde se na to můžu kouknout?

Upravené zdrojové soubory jednoho z webů jsem vystavil veřejně na GitHubu, odkaz je níže. Jde o drobnou webovou prezentaci květinářky Petry Šípkové.