Späť na blog

Ako nasadiť WordPress pomocou Docker kontajnerov na Ubuntu 20.04

Ako nasadiť WordPress pomocou Docker kontajnerov na Ubuntu 20.04

Úvod

WordPress je jedným z najpopulárnejších redakčných systémov (CMS) na svete. Štatisticky poháňa viac ako 39 % všetkých webových stránok, ktoré vidíte na celosvetovej sieti. Je to populárna voľba vďaka svojej rozšíriteľnosti pomocou zásuvných modulov (pluginov) a flexibilnému systému šablón. Umožňuje zmeniť vzhľad v priebehu niekoľkých sekúnd. Jeho správu navyše môžete vykonávať cez webové rozhranie bez toho, aby ste vyžadovali veľa technických znalostí.

Okrem toho je WordPress bezplatný a open-source a je postavený na databáze MySQL s procesovaním v PHP. WordPress môžete nasadiť na LAMP stacku (Linux, Apache, MySQL a PHP) alebo LEMP stacku (Linux, Nginx, MySQL a PHP). Ukazuje sa však, že nastavenie tohto stacku pri každom nasadení je časovo náročné.

Našťastie moderné metódy poskytovania softvéru, ako napríklad cloud computing, Docker, a Docker Compose zjednodušili celkovú prácu vývojárov. Tieto nástroje zjednodušujú proces nastavenia akéhokoľvek stacku tým, že eliminujú réžiu spojenú s inštaláciou a konfiguráciou jednotlivých komponentov pri každom nasadení aplikácie. Namiesto toho píšete konfiguračné súbory, ktoré sa použijú na stiahnutie a vytvorenie obrazov (images) a ich spustenie v kontajneroch Docker, čo vám umožní nasadiť aplikáciu pomocou jediného príkazu.

Kontajnery sú ľahké, virtualizované, prenosné, softvérovo definované štandardizované prostredia, ktoré umožňujú softvéru bežať izolovane od ostatného softvéru bežiaceho na fyzickom hostiteľskom stroji. Docker Compose vám umožňuje spravovať viacero kontajnerov a zabezpečiť ich vzájomnú komunikáciu. Napríklad zdrojový kód aplikácie a databáza musia komunikovať.

V tomto návode budeme vytvárať aplikáciu WordPress s viacerými kontajnermi. Kompletná aplikácia WordPress vyžaduje tri kontajnery: databázu MySQL, server Nginx a zdrojový kód WordPress. Keďže bezpečnosť je na moderných webových stránkach prioritou, získame SSL certifikát od Let’s Encrypt na zabezpečenie vašej inštalácie. Potom nastavíme cron úlohu na pravidelnú kontrolu a obnovu certifikátov, aby bola bezpečnosť vášho webu neustále udržiavaná.

Požiadavky

Krok 1: Definujte konfigurácie pre webový server

Webový server uchováva súbory vášho webu a umožňuje používateľom prístup k vašej webovej aplikácii. Preto je vhodné, aby sme v prvom kroku definovali konfiguráciu pre webový server. Budeme definovať konfiguráciu servera Nginx, ktorá bude obsahovať bloky umiestnenia (location blocks) špecifické pre WordPress. Zahrnieme tiež bloky umiestnenia na smerovanie overovacích požiadaviek Let’s Encrypt do klienta Certbot pre automatické obnovovanie certifikátu.

Začnime vytvorením adresára pre projekt. Môžete si vybrať názov adresára, ktorý uprednostňujete. V tomto návode použijeme wordpress_docker . Zadaním nasledujúceho príkazu vytvorte adresár a prejdite doň:

Ďalej vytvorte adresár pre konfiguračné súbory Nginx pomocou príkazu:

Použite nano na otvorenie súboru pomocou nasledujúceho príkazu:

V tomto súbore zadefinujeme základné direktívy pre konfiguráciu bloku servera Nginx. Tieto zahŕňajú direktívy pre názov servera, koreňový adresár dokumentov a bloky umiestnenia (location) na smerovanie požiadaviek pluginu Certbot na certifikáty, statické súbory a spracovanie PHP. Viac informácií sa dozviete v našom návode na Ako zabezpečiť Nginx pomocou Let’s Encrypt. Pridajte do súboru nasledujúci kód a nahraďte example.com vaším registrovaným názvom domény:

Poďme si definovať sekcie, ktoré ste pridali:

  • Direktívy:
    • listen: hovorí Nginx, aby počúval na porte 80. To umožňuje použitie webrootu Certbotu. Po získaní SSL certifikátu aktualizujeme túto konfiguráciu tak, aby používala port 443.
    • server_name: definuje doménové meno, ktoré má táto konfigurácia obsluhovať. Prevádzka na názov domény definovaný tu bude smerovaná do tohto konkrétneho bloku servera, a teda do dokumentového root.
    • root: definuje koreňový adresár pre požiadavky na vyššie uvedený názov domény. Zvyčajne je to adresár, ktorý obsahuje skutočné súbory našej webovej stránky. Tento adresár sme nastavili na /var/www/html. Bude vytvorený ako prípojný bod Dockeru počas vytvárania kontajnera. Inštrukcie pre tento proces zadefinujeme vo vnútri WordPress Dockerfile.
    • index: toto definuje súbory, ktoré sa použijú ako indexy alebo vstupný bod pre váš webový server pri spracovaní požiadaviek. Presunuli sme index.php pred index.html, aby Nginx uprednostnil index.php.
  • Bloky Location:
    • location ~ /.well-known/acme-challenge: spracováva požiadavky do adresára .well-known, kde Certbot pridáva dočasný súbor na overenie, že DNS pre špecifikovanú doménu smeruje na konkrétny server, od ktorého požadujeme SSL certifikáty. Preto by ste mali pre fungovanie tohto kroku pridať platnú doménu namiesto example.com, ktorú používame v tomto návode.
    • location /: preberá požiadavky URI a odovzdáva riadenie WordPressu index.php na vyžiadanie argumentov na spracovanie.
    • location ~ \.php$: spracováva PHP a odovzdáva požiadavku kontajneru WordPress (konfiguračný súbor pre tento krok zadefinujeme neskôr). Tu sme definovali konfigurácie špecifické pre protokol FastCGI, pretože Docker obraz WordPressu bude založený na obraze php:fpm. Nginx používa nezávislý PHP procesor pre požiadavky špecifické pre PHP. Použijeme procesor php-fpm, ktorý je súčasťou Docker obrazu php:fpm.
    • location ~ /\.ht: spracováva súbory .htaccess, ktoré Nginx nepoužíva. Direktíva deny all zabezpečuje, že tieto súbory sa návštevníkom webu nikdy neposkytnú.
    • location = /favicon.ico, location = /robots.txt: ako je vidieť v definícii, toto zabraňuje zaznamenávaniu požiadaviek na súbory /favicon.ico a /robots.txt.
    • location ~* \.(css|gif|ico|jpeg|jpg|js|png)$: vypína zaznamenávanie požiadaviek na statické súbory a zabezpečuje ich ukladanie do vyrovnávacej pamäte (cache), aby sa znížilo zaťaženie servera.

Teraz môžete súbor uložiť a zatvoriť stlačením CTRL+X, Y, potom ENTER. Tým je prvý krok dokončený.

Krok 2: Definovanie premenných prostredia

Premenné prostredia sú potrebné na uľahčenie komunikácie medzi aplikáciou WordPress a databázou. Zabezpečujú tiež trvalé uchovanie údajov aplikácie. Premenné prostredia zahŕňajú citlivé informácie, ako sú prihlasovacie údaje k databáze, a necitlivé informácie, ako je názov databázy a hostiteľ.

Z bezpečnostných dôvodov je vždy dobré nepridávať citlivé informácie do repozitárov projektov. Preto namiesto nastavovania citlivých hodnôt v súbore Docker Compose zadefinujeme prihlasovacie údaje pre MySQL v súboroch .env, ktoré sa nebudú odosielať do repozitára projektu, čím sa predíde riziku ich verejného odhalenia. V koreňovom adresári projektu root ~/wordpress_docker otvorte súbor .env:

Pridajte do súboru nasledujúce prihlasovacie údaje pre MySQL a aktualizujte ich o silné heslo podľa vlastného výberu:
Najprv sme definovali heslo pre administrátorský účet root pre MySQL a prihlasovacie údaje špecifické pre našu aplikáciu WordPress. Po dokončení súbor uložte a zatvorte.

Ďalšia vec, ktorú musíte urobiť, je pridať súbor .env do súborov .gitignore a .dockerignore, aby ste zabezpečili, že sa nepridá do vašich repozitárov, resp. Docker obrazov.

Pre tento návod to nie je potrebné, ale ak chcete pracovať s nástrojom Git na správu verzií, zadajte nasledujúci príkaz na inicializáciu aktuálneho adresára ako git repozitára:

Otvorte súbor .gitignore pomocou nano:

Pridajte nasledujúci riadok:

Uložte a zatvorte súbor. Ďalej otvorte súbor .dockerignore pomocou nano:

Pridajte nasledujúci riadok:

Popritom môžete voliteľne pridať ďalšie súbory a adresáre spojené s vývojom vašej aplikácie:

Po dokončení súbor uložte a zatvorte. To je pre tento krok všetko. Prejdime k definícii Docker Compose.

Krok 3: Konfigurácia služieb pomocou Docker Compose

Docker Compose používa docker-compose.yml súbor na zostavenie obrazov. Tento súbor obsahuje definície služieb pre kompletné nastavenie aplikácie. Definície služieb sú v podstate inštrukcie, ako bude kontajner bežať. Služba je skutočne spustený kontajner.

Docker Compose umožňuje definovať rôzne služby pre aplikácie s viacerými kontajnermi prepojením rôznych služieb pomocou zdieľaných sietí a zväzkov. Uvidíte to v praxi, keďže pre našu aplikáciu budeme definovať tri kontajnery: webový server, inštaláciu WordPressu a databázu. Pridáme štvrtý kontajner na spustenie klienta Certbot pre obnovu certifikátov.

Zadaním nasledujúceho príkazu vytvorte súbor docker-compose.yml :

Prvý riadok v súbore docker-compose.yml je riadok s definíciou verzie. Pre náš sme nastavili hodnotu 3. Potom môžete začať definovať svoje služby. Pridajte do súboru nasledujúci úryvok kódu na definovanie služby db :

Poďme si prediskutovať, čo máme v definíciách služby db nižšie:

  • image: určuje obraz, na ktorom bude kontajner založený. Vždy je lepšie špecifikovať konkrétnu verziu (mysql:8.0) ako používať značku latest (mysql:latest), pretože budúce verzie obrazov MySQL môžu byť v konflikte s našou aplikáciou, ak by sme tento obraz znova zostavovali. Viac informácií o najlepších postupoch pre Dockerfile nájdete v oficiálnej dokumentácii Dockerfile.
  • container_name: tu špecifikujeme názov kontajnera.
  • restart: táto direktíva určuje správanie kontajnera pri reštarte. Predvolená hodnota je no, ale my sme ju nastavili na vždy reštartovať pokiaľ nie je manuálne zastavený.
  • env_file: táto direktíva sa používa na špecifikovanie umiestnenia súboru s premennými prostredia (.env) používanými našou aplikáciou.
  • environment: používa sa na špecifikovanie ďalších premenných prostredia. V tomto návode sme špecifikovali premennú MYSQL_DATABASE , ktorá bude obsahovať názov databázy pre našu aplikáciu. Názov databázy môže byť zahrnutý v docker-compose.yml.
  • volumes: používa sa na špecifikovanie umiestnení pripojenia. V našom príklade sme pripojili pomenovaný zväzok (volume) s názvom dbdata do adresára /var/lib/mysql v kontajneri, čo je zvyčajne štandardný dátový adresár pre MySQL.
  • command: táto direktíva špecifikuje príkaz, ktorý prepíše predvolenú inštrukciu CMD pre obraz. K štandardnému príkazu mysqld obrazu Docker, ktorý spúšťa MySQL server vo vnútri kontajnera, sme pridali voľbu. Pridaná voľba je --default-authentication-plugin=mysql_native_password, ktorá aktualizuje predvolený autentifikačný plugin pre MySQL na používanie overovania heslom (mysql_native_password). Je to potrebné pre fungovanie vášho PHP (aplikácie WordPress), pretože na prístup k databáze používajú používateľské meno a heslo. V novších verziách MySQL sa predvolený autentifikačný plugin zmenil. Väčšina aplikácií však používa overovanie heslom. Preto musíte toto nastavenie zmeniť, aby aplikácia fungovala.
  • networks: táto direktíva sa používa na špecifikovanie, že služba db sa má pripojiť k sieti app-network, ktorú zadefinujeme v priebehu tohto návodu.

Ďalej definujme konfiguráciu služby pre našu aplikáciu WordPress. Službu a container_name nazveme app. Pridajte nasledujúci úryvok kódu pod definíciu db služby, pričom dbajte na správne odsadenie:

Podobne ako sme to urobili so službou db sme pomenovali náš kontajner a definovali politiku reštartu. Niektoré ďalšie možnosti, ktoré sme pridali, sú definované nižšie:

  • depends_on: táto direktíva zabezpečuje, že kontajnery sa spúšťajú v poradí závislostí. V našom prípade kontajner app závisí od kontajnera db. Preto sa spustí až po tom, čo sa spustí kontajner db. To sa musí stať v tomto poradí, pretože aplikácia WordPress závisí od dostupnosti databázy MySQL, aby mohla fungovať.
  • image: ako je vidieť v úryvku kódu, budeme používať WordPress verzie 5.1.1 fpm alpine obraz. Vysvetlili sme si procesor php-fpm, ktorý Nginx vyžaduje na spracovanie PHP. Tento obraz sa o to postará. Obraz alpine založený na projekte Alpine Linux pomáha udržiavať veľkosť obrazu menšiu. Ak potrebujete viac informácií o variantoch obrazov, môžete prejsť na tento odkaz pre obrazy WordPress na Docker Hub.
  • env_file: špecifikuje umiestnenie súboru .env, ktorý obsahuje prihlasovacie údaje k databáze.
  • environment: táto direktíva definuje ďalšie premenné prostredia. V našom prípade definujeme premenné, ktoré WordPress očakáva, a priraďujeme im hodnoty premenných z nášho súboru .env. Sú to WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD a WORDPRESS_DB_HOST, ktorý odkazuje na MySQL server bežiaci v kontajneri db, prístupný z predvoleného portu MySQL 3306. Nakoniec vidíte WORDPRESS_DB_NAME, ktorý sme nastavili na wordpress. Rovnaká hodnota je špecifikovaná v definícii služby MySQL v kontajneri db: MYSQL_DATABASE=wordpress.
  • volumes: táto direktíva pripája zväzok s názvom app do prípojného bodu /var/www/html, ktorý vytvoril obraz WordPress. Pomenovanie zväzkov umožňuje zdieľanie kódu aplikácie s inými kontajnermi.
  • networks: nakoniec pridáme kontajner app do siete app-network aby sme zabezpečili jeho komunikáciu s ostatnými kontajnermi v sieti.

To bude všetko pre kontajner služby app pre obraz WordPress. Teraz definujme službu webserver pre obraz Nginx. Najprv pridajte nasledujúci úryvok kódu pod definíciu služby app vo vašom súbore docker-compose.yml:

Možnosť depends_on sme už vysvetlili. V prípade tejto služby webserver sa kontajner spustí po tom, čo sa spustí kontajner app. Kontajner webového servera je založený na obraze alpine Nginx. Má podobnú politiku reštartu ako predchádzajúce definície služieb. Medzi ďalšie možnosti v definícii služby webserver patria:

  • ports: viaže porty medzi hostiteľským strojom a kontajnerom. V Kroku 1, sme definovali port 80 v súbore nginx.conf. Tento port je namapovaný na port 80 na kontajneri.
  • volumes: pod touto voľbou máme kombináciu pripojení typu bind a pomenovaných zväzkov:
    • app:/var/www/html: táto definícia zväzku pripája aplikáciu WordPress do adresára /var/www/html, ktorý sme predtým nastavili ako koreňový (root) v bloku servera Nginx.
    • ./nginx-conf:/etc/nginx/conf.d: táto definícia pripája konfiguračný adresár Nginx na hostiteľskom stroji do konfiguračného adresára Nginx, ktorý sme definovali pre kontajner. Akékoľvek zmeny na hostiteľskom stroji sa preto automaticky prejavia v kontajneri.
    • certbot-etc:/etc/letsencrypt: táto definícia pripája certifikáty a kľúče Let’s Encrypt pre doménu do príslušného adresára v kontajneri.
  • networks: rovnako ako v predchádzajúcich definíciách služieb, direktíva networks pridáva službu webserver do app-networks.

Keďže sme s definíciou webového servera hotoví, pridajme inštrukcie pre službu Certbot. Tá sa postará o získanie vašich TLS/SSL certifikátov od Let’s Encrypt. Ak by ste sa chceli dozvedieť viac o zabezpečení servera Nginx, tento návod na ako zabezpečiť Nginx pomocou Let’s Encrypt je dobrým zdrojom.

Ďalej pridajte nasledujúci úryvok kódu pod službu webserver. Nezabudnite nastaviť správny názov domény a e-mailovú adresu:

Obraz certbot sa spustí až po spustení webserver, a to kvôli direktíve depends_on. Docker Compose stiahne obraz Certbot z Docker Hub tak, ako je definované.

V rámci definície zväzkov (volumes) bude kontajner Certbot zdieľať certifikáty a kľúč domény v certbot-etc s kontajnerom Nginx webserver a kód aplikácie s kontajnerom app.

V rámci definície command sme špecifikovali podpríkaz na spustenie predvoleného príkazu Certbotu certonly s ďalšími voľbami, ktoré sú uvedené nižšie:

    • --webroot: špecifikuje použitie zásuvného modulu webroot, ktorý umiestňuje súbory do priečinka webroot na účely overenia.
    • --webroot-path: špecifikuje cestu k adresáru webroot.
    • --agree-tos: špecifikuje, že súhlasíte s podmienkami používania služby ACME.
    • --no-eff-email: špecifikuje, že nechcete zdieľať svoj e-mail s EFF. Ak ho chcete zdieľať, môžete túto voľbu vynechať.
    • --staging: hovorí Certbotu, že chcete najprv získať testovacie certifikáty z testovacieho (staging) prostredia Let’s Encrypt na otestovanie vašej konfigurácie pred získaním skutočného certifikátu. Let’s Encrypt má obmedzenia počtu požiadaviek na doménu (rate limiting). Prvotné otestovanie vašej konfigurácie vám preto pomôže vyhnúť sa obmedzeniu vašej domény.
    • -d: táto voľba preberá názvy domén pre žiadosť o certifikát. V tomto návode sme zahrnuli example.com a www.example.com. Uveďte, prosím, svoju skutočnú registrovanú doménu.

Náš súbor docker-compose.yml je takmer kompletný. Pod službu Certbot však musíte pridať aj definície sietí a zväzkov:

Kľúč volumes definuje zväzky, ktoré sa majú zdieľať so všetkými službami (kontajnermi) definovanými v tomto súbore compose: certbot-etc, app a dbdata. Obsah zväzkov, ktoré Docker vytvorí, sa ukladá v adresári spravovanom Dockerom v hostiteľskom súborovom systéme: /var/lib/docker/volumes/. Obsah každého zväzku sa potom pripojí k akémukoľvek kontajneru, ktorý tento zväzok používa. To umožňuje zdieľať dáta a kód medzi kontajnermi.

Kľúč networks definuje premostenú sieť (bridge network), ktorá umožňuje komunikáciu medzi kontajnermi. Kontajnery v rovnakej premostenej sieti, ako napríklad webserver a db môžu bezpečne komunikovať cez porty bez toho, aby vystavovali prevádzku vonkajšej sieti. Vystavujeme iba port 80 na povolenie prístupu k webovým stránkam front-endu.

Kompletný súbor docker-compose.yml bude vyzerať takto:

Súbor môžete uložiť a zatvoriť. V ďalšom kroku spustíme a otestujeme kontajner a žiadosti o certifikáty.

Krok 4: Spustenie kontajnerov a získanie SSL certifikátov

Najväčšou výhodou Docker Compose je, že akonáhle definujete všetky svoje služby v súbore docker-compose.yml súbor, môžete spustiť všetky kontajnery pomocou jediného príkazu: docker-compose up. Tento príkaz spustí každú zadanú inštrukciu. Ak sú požiadavky na doménu úspešné, mali by ste vo svojom termináli vidieť správny stav ukončenia. Zadajte nasledujúci príkaz na vytvorenie kontajnerov. Príznak -d slúži na spustenie kontajnerov na pozadí:

Ak vidíte výstup ako na snímke obrazovky nižšie, služby boli úspešne vytvorené:

docker-compose up

Ak chcete potvrdiť stav služieb, spustite príkaz docker-compose ps:

Výstup príkazu je zobrazený nižšie, ak bolo všetko úspešné. Stav kontajnerov app, db, a webserver by mal byť spustený (up) a kontajner certbot by mal mať stav Exit0:

Exit0

Ak vidíte čokoľvek iné ako Up v stĺpci stavu pre app, db alebo webserver, alebo stav Exit, ktorý nie je 0 pre kontajner certbot, potom sa niečo pokazilo. Protokoly každého kontajnera môžete skontrolovať pomocou príkazu docker-compose logs a špecifikovať service_name:

Napríklad môžete skontrolovať protokoly kontajnera certbot zadaním nasledujúceho príkazu:

Ak chcete skontrolovať, či boli certifikáty pripojené ku kontajneru webserver, použite príkaz docker-compose exec:

Ak ste použili skutočný registrovaný názov domény iný ako example.com a požiadavky na certifikát boli úspešné, mali by ste vidieť výstup podobný tomuto:

registered domain

Keď potvrdíte, že požiadavka na certifikát bola úspešná, môžete upraviť súbor docker-compose.yml a odstrániť príznak --staging. Otvorte súbor pomocou nano:

Prejdite nadol k sekcii definície služby Certbot, k možnosti command a nahraďte príznak --staging príznakom --force-renewal. To povie Certbotu, že požadujete obnovenie certifikátu pre rovnakú doménu. Vaša definícia služby Certbot by teraz mala vyzerať takto:

Po dokončení úprav súbor uložte.

Zadaním nasledujúceho príkazu znova vytvorte kontajner certbot. Priložený príznak --no-deps hovorí nástroju Compose, aby preskočil reštartovanie služby webového servera, keďže už beží:

Príkaz vygeneruje nasledujúci výstup (ako na snímke obrazovky), ktorý ukazuje, že požiadavka na certifikát bola úspešná:

docker-compose up

To je pre tento krok všetko. V ďalšom kroku upravíte konfiguračný súbor Nginx tak, aby obsahoval SSL certifikát.

Krok 5: Povolenie SSL v konfigurácii Nginx a definícii služby

Aby Nginx obsluhoval prevádzku cez zabezpečené SSL, najprv upravíte konfiguračný súbor Nginx a pridáte presmerovanie z HTTP na HTTPS. Potom musíte zadať umiestnenie certifikátu a kľúča a nakoniec pridať bezpečnostné parametre a hlavičky.

Pred úpravou konfiguračného súboru by ste mali získať odporúčané bezpečnostné parametre pre Nginx z GitHub repozitára Certbotu pomocou príkazu curl:

https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf

Príkaz sa spustí a uloží parametre, ktoré získa, do súboru s názvom options-ssl-nginx.conf, v adresári nginx-conf. Odstráňte konfiguračný súbor Nginx, aby sme mohli vytvoriť nový pomocou nasledujúcich príkazov:

V teraz prázdnom súbore nginx.conf pridajte nasledujúci kód, ktorý obsahuje presmerovanie z HTTP na HTTPS, SSL protokoly poverení a bezpečnostné hlavičky. Ako ste to urobili predtým, nahraďte doménu example.com svojou vlastnou registrovanou doménou:

V prvom bloku servera, ktorý spracováva nezabezpečené požiadavky pomocou portu 80, špecifikujeme webroot pre požiadavky na obnovenie Certbotu. Tiež zahŕňame smernicu presmerovania ktorá presmerováva HTTP požiadavky na HTTPS.

Druhý blok servera spracováva zabezpečenú HTTPS prevádzku prichádzajúcu na porte 443. Ako môžete vidieť, povoľujeme aj SSL a HTTP2. HTTP/2 zlepšuje výkon vášho servera. Viac si o tom môžete prečítať v oficiálnej dokumentácii Nginx o HTTP/2.

V tomto bloku sme tiež špecifikovali, že Nginx zahŕňa umiestnenia SSL certifikátu a kľúča, ako aj odporúčané bezpečnostné parametre Certbotu, ktoré curl uložil do nginx-conf/options-ssl-nginx.conf adresára.

Dodatočné bezpečnostné hlavičky slúžia na zlepšenie hodnotenia vašej webovej stránky na testovacích bezpečnostných weboch, ako sú Security Headers a SSL Labs. Pre viac informácií môžete prejsť na odkazy v týchto hlavičkách: X-Frame-Options, Referrer Policy, X-Content-Type-Options, X-XSS-Protection, Content-Security-Policy. Zakomentovali sme hlavičku HTTP Strict Transport Security (HSTS). Môžete si prečítať o jej funkcii preload a rozhodnúť sa, či ju chcete povoliť.

Zvyšok smerníc, ako napríklad root, index, bloky location špecifické pre WordPress zostávajú rovnaké, ako sme rozoberali v Kroku 1. Po dokončení úprav môžete súbor uložiť a zatvoriť.

Teraz, keď sme povolili prevádzku HTTPS využívajúcu port 443, musíme tento port povoliť aj v definícii služby webového servera. Zadaním nasledujúceho príkazu otvorte súbor docker-compose.yml pomocou nano:

V sekcii webového servera pod možnosťou ports pridajte mapovanie pre port 443 ako je zvýraznené nižšie:

Kompletný súbor docker-compose.yml by mal teraz vyzerať takto:

Keď potvrdíte, že všetko vyzerá správne, uložte a zatvorte súbor. Potom spustite nasledujúci príkaz na opätovné vytvorenie webserver služby:

Pomocou nasledujúceho príkazu potvrďte, že vaše služby bežia:
Mali by ste vidieť niečo podobné ako na snímke obrazovky nižšie, čo potvrdzuje, že vaše služby bežia v poriadku:

confirming

Teraz, keď už bežia všetky vaše kontajnery, je možné pokračovať v konfigurácii WordPressu z webového rozhrania.

Krok 6: Dokončenie konfigurácie WordPressu z webového rozhrania

Prejdite na doménové meno vášho servera a pokračujte v inštalácii. Mali by ste vidieť domovskú stránku nastavenia WordPress. Pred pokračovaním vás vyzve na výber jazyka:

WordPress with Docker 6

Vyberte si jazyk a kliknite na Pokračovať pre prechod na ďalšiu stránku:

WordPress with Docker 5

 

Na tejto stránke vyplňte názov svojho webu, vyberte si zapamätateľné používateľské meno a silné heslo. Z bezpečnostných dôvodov sa odporúča nepoužívať Admin ako vaše používateľské meno. Zadajte svoj e-mail a kliknutím na tlačidlo Inštalovať WordPress spustite inštaláciu WordPressu.

Po dokončení inštalácie budete presmerovaní na prihlasovaciu obrazovku, kde zadáte používateľské meno a heslo, ktoré ste si nastavili. Po zadaní platných údajov by ste mali vidieť svoju nástenku WordPress:

WordPress with Docker 4

Úspešne ste nainštalovali WordPress! Ďalej musíte vykonať kroky na zabezpečenie automatického obnovovania SSL certifikátov.

Krok 7: Konfigurácia automatického obnovovania SSL certifikátu

TLS/SSL certifikáty Let’s Encrypt sú platné iba 90 dní. Je na vás, aby ste vytvorili konfiguráciu automatického obnovovania, aby ste zabezpečili, že nevypršia. Môžete to dosiahnuť vytvorením skriptu a jeho naplánovaním pomocou nástroja cron job. V tomto kroku vám ukážeme, ako vytvoriť skript, ktorý bude obnovovať certifikáty. Potom ho naplánujeme pomocou nástroja cron job, aby sa periodicky spúšťal a obnovoval certifikáty, ak sa blíži dátum ich vypršania.

Vo vnútri adresára projektu wordpress_docker otvorte skript s názvom ssl_renewer.sh pomocou nano:

Pridajte do skriptu nasledujúci kód na spracovanie automatického obnovenia a opätovného načítania konfigurácie Nginx. Nezabudnite nahradiť zvýraznené používateľské meno vaším používateľským menom, ktoré nie je root:

In this script, we assign the docker-compose binary to a variable called COMPOSE. We also include the –ansi never option which tells the script to run docker-compose commands without riadiacich znakov ANSI. We further assign the Docker binary to a variable called DOCKER.

Skript sa potom presunie do nášho projektového adresára wordpress_docker and executes the following commands:

  • docker-compose run: spustí kontajner certbot a prepíše príkaz, ktorý sme uviedli v definícii služby certbot. Namiesto spustenia podpríkazu certonly spustí podpríkaz renew, ktorý obnoví SSL/TLS certifikáty od Let’s Encrypt, ak sa blíži koniec ich platnosti.
  • docker-compose kill: odošle signál SIGHUP kontajneru webserver na opätovné načítanie konfigurácií Nginx. Možno si budete chcieť pozrieť tento návod od Dockeru o tom, ako používať oficiálny Docker obrazok Nginx.
  • docker system prune: tento príkaz odstráni všetky nepoužívané kontajnery a obrazy.

Po dokončení úprav súbor uložte a zatvorte. Potom spustite nasledujúci príkaz, aby ste ho urobili spustiteľným:

Keď ho urobíte spustiteľným, otvorte svoj rootovský súbor crontab, aby ste skript spúšťali periodicky v intervaloch, ktoré určíme:

Nástroj crontab vás požiada o výber preferovaného editora, ak ho používate prvýkrát:

WordPress with Docker 2

Vyberte si preferovaný editor a stlačte Enter na otvorenie súboru. Na koniec súboru pridajte nasledujúci riadok:

Týmto sa nastaví interval na päť minút, aby sme mohli otestovať, či náš skript na obnovenie bude fungovať alebo nie. Určili sme aj súbor protokolu (log), ktorý bude obsahovať výstup z úlohy: cron_docker.log.

Počkajte päť minút a skontrolujte cron.log aby ste zistili, či bol skript úspešný s požiadavkou na obnovenie:

Ak boli požiadavky úspešné, mali by ste vidieť niečo podobné ako na snímke obrazovky nižšie:

WordPress with Docker 1

Teraz, keď sme to otestovali a potvrdili, že to funguje, môžete upraviť súbor crontab , aby ste špecifikovali denné obnovovanie. Môžete napríklad chcieť určiť, aby sa skript spúšťal každý deň o 18:00. Ak to chcete urobiť, upravte posledný riadok súboru crontab tak, aby vyzeral takto:

Okrem toho musíte odstrániť príznak –dry-run zo skriptu ssl_renewer.sh , aby ste zabezpečili, že pri jeho spustení dôjde k skutočnému obnoveniu. Mal by vyzerať takto:

Potom súbor uložte a zatvorte. Po vykonaní tohto kroku bude úloha cron udržiavať vaše certifikáty platné tým, že ich obnoví pred uplynutím 90 dní.

Záver

Ak ste sa v tomto návode dostali až sem, môžete sa považovať za o krok bližšie k tomu, aby ste sa stali DevOps inžinierom. Dokázali ste vytvoriť konfiguračný skript pre Nginx, vytvorili ste súbor docker-compose.yml a definovali ste niekoľko služieb potrebných na spustenie aplikácie WordPress pomocou nástrojov Docker a Docker Compose. Získali ste SSL/TLS certifikáty od autority Let’s Encrypt, aby ste zaistili bezpečnosť svojho webového servera. Nakoniec ste vytvorili úlohu cron, aby ste zabezpečili, že platnosť certifikátov nevyprší. Dobrá práca!

Ak sa chcete ponoriť hlbšie do DevOps, pozrite si ďalšie zdroje o kontajneroch na našom blogu:

Príjemnú prácu!

 

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.