Dockerizovaný FTP deploy Drupalu

Napsal uživatel Stopka dne So, 25. 04. 2020 - 18:12
deploy

V průběhu času se mi celkem rozrostl počet webů, které spravuji. Všechny weby jsem postavil na opensource projektu Drupal, a tak když vyjde jeho aktualizace, nebo některého z rozšíření, které na webech používám, začne mi kolečko aktualizací.

Aktualizovat rozšíření bylo do nedávna jednoduché, protože Drupal má k tomu vestavěný instalátor. Jenže php svět adoptoval instalaci závislostí pomocí Composeru a i leckteré rozšíření Drupalu dnes potřebuje doinstalovat knihovny. Tím se aktualizace komplikuje, protože si člověk musí stáhnout, rozšířit a znovu sestavit vendor složku s php knihovnami. Podobné utrpení přijde když je potřeba aktualizovat Drupal samotný. Drupal narozdíl od Wordpressu neumí aktualizovat vlastní jádro. A tak zase přijde na řadu stahování balíku, přestavění vendoru kvůli rozšířením a deploy.

A deploy je taky problematický. Některé weby provozuji u sebe na serveru, tam je to ještě jednoduché, protože takové weby provozuju v Docker kontejnerech a stačí tedy jen přestavět kontejner a jede se dál. Jenže většina webů mi běží na nějakém LAMP webhostingu, kam je nutné aplikaci nahrát pomocí FTP (respektive bezpečně přes FTPS). A to je zatraceně otravná činnost. Člověk musí nahrát/aktualizovat nové soubory aplikace, musí dávat pozor, aby nepřepsal konfigurace či uživatelská data a pak je ještě potřeba smazat staré soubory. Uff, prostě takhle to dál nejde.

Sestavení

Říkal jsem si, že tohle přeci nemůže trápet jen mě, a začal jsem hledat řešení. Zjistil jsem, že Drupal může být dnes celý instalovaný pomocí Composeru a to včetně rozšíření. Všechny Drupal core komponenty jsou publikovány v Composer repozitářích a lze je stáhnout pod jedním souhrným balíčkem "drupal/core-recommended". Navíc i všechna oficiální rozšíření Drupalu publikovaná na drupal.org jsou zároveň publikovaná i v Composer repozitáři. A jako třešnička na dortu, existuje doplněk Composeru "drupal/core-composer-scaffold", který umí závislosti automaticky uložit do adresářové struktury drupalu, takže všechny moduly přijdou do složky www/modules, témata do složky www/themes a jádro do www/core a podobně. Tím se definice aplikace zjednoduší na jeden composer soubor. Paráda.

Do této podoby jsem převedl všechny své Drupal weby. Připravil jsem composer soubor a přidal Dockerfile, který nainstaluje nginx, php, composer a sestaví aplikaci. Zde je nutno zmínit, že existují již připravené Docker image, které dělají to samé. Postahují drupal a jeho rozšíření a rozběhnou aplikaci. Jenže často používají web server Apache a jeho php modul a já dávám přednost nginx a php-fpm, instalace je řešena run příkazy v dockerfile, mě více vyhovuje sepsat rovnou composer.json, instalace nepočítá s vlastními nepublikovanými moduly, já mám v každém webu minimálně vlastní téma. Jednoduše řečeno, žádný již připravený image mi nevyhovoval a tak bylo jednodušší sestavit si vlastní Dockerfile od začátku.

Jak jsem zmínil, každý můj web má samozřejmě i svůj vlastní na míru dělaný vzhled. Přidal jsem jej tedy do repozitáře s composer souborem a tak z něj vytvořil samostatný modul instalovatelný pomocí Composeru. Vzhledový modul je vždy částečně sestavován frontendovými nástroji a balíčky z Npm repozitářů, a tak jsem Dockerfile rozšířil i o fázi sestavení kaskádových stylů a javascriptů.

Tím jsou hotové weby, které provozuji přímo v Dockeru. Jak jsem ale psal, spoustu webů provozuji na webhostingu a musím je tam nějak nacpat přes FTP. 

Deploy

Tady přichází na řadu další jednoduchý nástroj, který jsem objevil. Jde o "dg/ftp-deployment", aplikace pro příkazovou řádku, napsaná Davidem Grudlem v PHP a instalovatelná taky přes Composer. Aplikace je vymyšlena chytře, na server nahraje i seznam nahraných souborů s jejich hashi a tak při další aktualizaci nahrává jen nové nebo aktualizované soubory a umí i smazat ty co již potřeba nejsou.

Konfigurovat ji lze pomocí ini nebo php souboru. Zvolil jsem php soubor, protože tímto způsobem mohu do konfigurace načítat některé hodnoty z paramterů lokálního env prostředí. V souboru mám tedy nastaveno, které složky se mají nakopírovat na vzdálený server, na jaký server s jakými přihlašovacími údaji. Citlivé údaje mám bezpěčně uložené vedle, jsou načítané právě z env prostředí a nejsou tedy v git repozitáři.

Do Dockerfile souboru jsem tedy přidal fázi pro deploy, ta nainstaluje ftp-deployment, přidá do kontejneru jeho konfiguraci a mě již stačí jen ji zavolat.

Jak tedy nyní vypadá aktualizace? Stačí znovu spustit build kontejneru (občas je potřeba nejdříve upravit verze rozšíření v compser.json). Tím se sestaví funkční web, kde lze lokálně otestovat správné fungování po aktualizaci. Pak se přihlásím do kontejneru a zavolám deploy. To je vše. Pro mě to je velké zjednodušení, o všechnu práci se postará automatika Dockeru, composeru, gulpu a ftp-deploye.

Kde se na to dá kouknout?

Jeden z takto upravených webů jsem zveřejnil na Githubu, odkaz je k nalezení níže. Je to jednoduchý prezentační webík květinářky a šperkařky Petry Šípkové.