Ú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
- Keďže ide o praktický návod, mali by ste mať nainštalovaný systém Ubuntu 20.04 ako vaše počiatočné operačné prostredie. Mali by ste mať tiež používateľa bez oprávnení root s privilégiami sudo. Tu je podrobný návod, ktorý vám pomôže nastaviť váš server Ubuntu.
- Musíte tiež nainštalovať Docker. Môžete si prečítať tento návod na tému ako nainštalovať a prevádzkovať Docker na Ubuntu 18.04.
- Inštalácia Docker Compose. Môžete postupovať podľa kroku 1 v návode Ako nainštalovať a nakonfigurovať Docker Compose na Ubuntu 20.04.
- Na získanie TLS/SSL certifikátu od Let’s Encrypt je potrebný registrovaný názov domény. Pre účely tohto návodu budeme používať
example.com. - Nastavte DNS záznamy tak, aby smerovali prevádzku na váš VPS. Potrebujete dva DNS záznamy:
- A záznam s
example.comsmerujúci na verejnú IP adresu vášho servera. - A záznam s
www.example.comsmerujúci na verejnú IP adresu vášho servera.
- A záznam s
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ň:
|
1 |
mkdir wordpress_docker && cd wordpress_docker |
Ďalej vytvorte adresár pre konfiguračné súbory Nginx pomocou príkazu:
|
1 |
mkdir nginx-conf |
Použite nano na otvorenie súboru pomocou nasledujúceho príkazu:
|
1 |
nano nginx-conf/nginx.conf |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
server { listen 80; listen [::]:80; server_name example.com www.example.com; index index.php index.html index.htm; root /var/www/html; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } |
Poďme si definovať sekcie, ktoré ste pridali:
-
Direktívy:
listen: hovorí Nginx, aby počúval na porte80. To umožňuje použitie webrootu Certbotu. Po získaní SSL certifikátu aktualizujeme túto konfiguráciu tak, aby používala port443.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éhoroot.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 uprednostnilindex.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 namiestoexample.com, ktorú používame v tomto návode.location /: preberá požiadavky URI a odovzdáva riadenie WordPressuindex.phpna 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 procesorphp-fpm, ktorý je súčasťou Docker obrazuphp:fpm.location ~ /\.ht: spracováva súbory.htaccess, ktoré Nginx nepoužíva. Direktívadeny allzabezpeč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.icoa/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:
|
1 |
nano .env |
|
1 2 3 |
MYSQL_ROOT_PASSWORD=your_strong_root_password MYSQL_USER=your_wordpress_database_user MYSQL_PASSWORD=strong_wordpress_database_password |
Ď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:
|
1 |
git init |
Otvorte súbor .gitignore pomocou nano:
|
1 |
nano .gitignore |
Pridajte nasledujúci riadok:
|
1 |
.env |
Uložte a zatvorte súbor. Ďalej otvorte súbor .dockerignore pomocou nano:
|
1 |
nano .dockerignore |
Pridajte nasledujúci riadok:
|
1 |
.env |
Popritom môžete voliteľne pridať ďalšie súbory a adresáre spojené s vývojom vašej aplikácie:
|
1 2 3 |
.env .git docker-compose.yml |
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 :
|
1 |
nano 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 :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3' services: #MySQL Service db: image: mysql:8.0 container_name: db restart: unless-stopped env_file: .env environment: - MYSQL_DATABASE=wordpress volumes: - dbdata:/var/lib/mysql command: '--default-authentication-plugin=mysql_native_password' networks: - app-network |
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 jeno, ale my sme ju nastavili na vždyreš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ý vdocker-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/mysqlv 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íkazumysqldobrazu 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žbadbsa má pripojiť k sietiapp-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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#Služba kódu aplikácie WordPress app: depends_on: - db image: wordpress:5.1.1-fpm-alpine container_name: app restart: unless-stopped env_file: .env environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress volumes: - app:/var/www/html networks: - app-network |
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 kontajnerappzávisí od kontajneradb. Preto sa spustí až po tom, čo sa spustí kontajnerdb. 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 procesorphp-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ú toWORDPRESS_DB_USER,WORDPRESS_DB_PASSWORDaWORDPRESS_DB_HOST, ktorý odkazuje na MySQL server bežiaci v kontajneridb, prístupný z predvoleného portu MySQL3306. Nakoniec vidíteWORDPRESS_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 sieteapp-networkaby 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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#Služba webového servera Nginx webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network |
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 port80v súborenginx.conf. Tento port je namapovaný na port80na 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ívanetworkspridáva službu webserver doapp-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:
|
1 2 3 4 5 6 7 8 9 10 |
#certbot service certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com |
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 zahrnuliexample.comawww.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:
|
1 2 3 4 5 6 7 8 9 10 |
#Volumes volumes: certbot-etc: app: dbdata: #Networks networks: app-network: driver: bridge |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
version: '3' services: #Služba MySQL db: image: mysql:8.0 container_name: db restart: unless-stopped env_file: .env environment: - MYSQL_DATABASE=wordpress volumes: - dbdata:/var/lib/mysql command: '--default-authentication-plugin=mysql_native_password' networks: - app-network #Služba s kódom aplikácie WordPress app: depends_on: - db image: wordpress:5.1.1-fpm-alpine container_name: app restart: unless-stopped env_file: .env environment: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress volumes: - app:/var/www/html networks: - app-network #Služba webového servera Nginx webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network #Služba certbot certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --staging -d example.com -d www.example.com #Zväzky volumes: certbot-etc: app: dbdata: #Siete networks: app-network: driver: bridge |
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í:
|
1 |
docker-compose up -d |
Ak vidíte výstup ako na snímke obrazovky nižšie, služby boli úspešne vytvorené:
Ak chcete potvrdiť stav služieb, spustite príkaz docker-compose ps:
|
1 |
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:
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:
|
1 |
docker-compose logs service_name |
Napríklad môžete skontrolovať protokoly kontajnera certbot zadaním nasledujúceho príkazu:
|
1 |
docker-compose logs certbot |
Ak chcete skontrolovať, či boli certifikáty pripojené ku kontajneru webserver, použite príkaz docker-compose exec:
|
1 |
docker-compose exec webserver ls -la /etc/letsencrypt/live |
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:
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:
|
1 |
nano docker-compose.yml |
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:
|
1 2 3 4 5 6 7 8 9 10 |
#certbot service certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - app:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --force-renewal -d example.com -d www.example.com |
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ží:
|
1 |
docker-compose up --force-recreate --no-deps Certbot |
Príkaz vygeneruje nasledujúci výstup (ako na snímke obrazovky), ktorý ukazuje, že požiadavka na certifikát bola úspešná:
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:
|
1 |
curl -sSLo nginx-conf/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:
|
1 2 |
rm nginx-conf/nginx.conf nano nginx-conf/nginx.conf |
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:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
server { listen 80; listen [::]:80; server_name example.com www.example.com; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { rewrite ^ https://$host$request_uri? permanent; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; index index.php index.html index.htm; root /var/www/html; server_tokens off; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/nginx/conf.d/options-ssl-nginx.conf; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Bezpečnosť-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # povoľte strict transport security iba vtedy, ak rozumiete dôsledkom location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } |
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:
|
1 |
nano docker-compose.yml |
V sekcii webového servera pod možnosťou ports pridajte mapovanie pre port 443 ako je zvýraznené nižšie:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
webserver: depends_on: - app image: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" - "443:443" volumes: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - app-network |
Kompletný súbor docker-compose.yml by mal teraz vyzerať takto:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
verzia: '3' služby: #Služba MySQL db: obraz: mysql:8.0 container_name: db restart: unless-stopped env_file: .env prostredie: - MYSQL_DATABASE=wordpress zväzky: - dbdata:/var/lib/mysql príkaz: '--default-authentication-plugin=mysql_native_password' siete: - app-network #Služba aplikačného kódu WordPress app: depends_on: - db obraz: wordpress:5.1.1-fpm-alpine container_name: app restart: unless-stopped env_file: .env prostredie: - WORDPRESS_DB_HOST=db:3306 - WORDPRESS_DB_USER=$MYSQL_USER - WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD - WORDPRESS_DB_NAME=wordpress zväzky: - app:/var/www/html siete: - app-network #Služba webového servera Nginx webserver: depends_on: - app obraz: nginx:1.15.12-alpine container_name: webserver restart: unless-stopped ports: - "80:80" - "443:443" zväzky: - app:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt siete: - app-network #Služba certbot certbot: depends_on: - webserver obraz: certbot/certbot container_name: certbot zväzky: - certbot-etc:/etc/letsencrypt - app:/var/www/html príkaz: certonly --webroot --webroot-path=/var/www/html --email hackins@cloudsigma.com --agree-tos --no-eff-email --force-renewal -d example.com -d www.example.com #Zväzky zväzky: certbot-etc: app: dbdata: #Siete siete: app-network: driver: bridge |
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:
|
1 |
docker-compose up -d --force-recreate --no-deps webserver |
|
1 |
docker-compose ps |
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:
Vyberte si jazyk a kliknite na Pokračovať pre prechod na ďalšiu stránku:
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:
Ú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:
|
1 |
nano ssl_renewer.sh |
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:
|
1 2 3 4 5 6 7 8 |
#!/bin/bash COMPOSE="/usr/local/bin/docker-compose –ansi never" DOCKER="/usr/bin/docker" cd /home/hackins/wordpress_docker/ $COMPOSE run certbot renew --dry-run && $COMPOSE kill -s SIGHUP webserver $DOCKER system prune -af |
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 kontajneruwebserverna 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:
|
1 |
chmod +x ssl_renewer.sh |
Keď ho urobíte spustiteľným, otvorte svoj rootovský súbor crontab, aby ste skript spúšťali periodicky v intervaloch, ktoré určíme:
|
1 |
sudo crontab -e |
Nástroj crontab vás požiada o výber preferovaného editora, ak ho používate prvýkrát:
Vyberte si preferovaný editor a stlačte Enter na otvorenie súboru. Na koniec súboru pridajte nasledujúci riadok:
|
1 |
*/5 * * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
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:
|
1 |
tail -f /var/log/cron_docker.log |
Ak boli požiadavky úspešné, mali by ste vidieť niečo podobné ako na snímke obrazovky nižšie:
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:
|
1 |
0 18 * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
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:
|
1 2 3 4 5 6 7 8 |
#!/bin/bash COMPOSE="/usr/local/bin/docker-compose --ansi never" DOCKER="/usr/bin/docker" cd /home/hackins/wordpress_docker/ $COMPOSE run certbot renew && $COMPOSE kill -s SIGHUP webserver $DOCKER system prune -af |
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:
- Zoznámenie sa s Kubernetes
- Ako nasadiť aplikáciu Node.js (Express.js) pomocou Dockeru na Ubuntu 20.04
- Nasadenie PHP aplikácie na Kubernetes cluster s Ubuntu 18.04.
- Nasadenie Laravel, Nginx a MySQL pomocou Docker Compose
Príjemnú prácu!










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