Uvod
WordPress je jedan od najpopularnijih sustava za upravljanje sadržajem (CMS) na tržištu. Statistički gledano, pokreće više od 39% svih web stranica koje vidite na svjetskoj mreži. Popularan je izbor zbog svoje proširivosti putem dodataka i fleksibilnog sustava predložaka. Omogućuje vam promjenu izgleda u nekoliko sekundi. Štoviše, njegovo se administriranje može obavljati putem web sučelja bez potrebe za velikim tehničkim znanjem.
Osim toga, WordPress je besplatan i otvorenog koda te je izgrađen na MySQL bazi podataka s PHP obradom. Možete postaviti WordPress na LAMP stog (Linux, Apache, MySQL i PHP) ili na LEMP stog (Linux, Nginx, MySQL i PHP). Međutim, pokazalo se da postavljanje stoga svaki put kada želite pokrenuti aplikaciju oduzima puno vremena.
Srećom, suvremene metode isporuke softvera kao što su računarstvo u oblaku, Docker, i Docker Compose olakšali su cjelokupno razvojno iskustvo. Ovi alati pojednostavljuju postupak postavljanja bilo kojeg stoga izbjegavajući opterećenje instaliranja i konfiguriranja pojedinačnih komponenti svaki put kada želite pokrenuti aplikaciju. Umjesto toga, pišete konfiguracijske datoteke koje će se koristiti za preuzimanje i stvaranje slika te njihovo pokretanje u Docker spremnicima, što vam omogućuje pokretanje aplikacije sa samo jednom naredbom.
Spremnici su lagana, virtualizirana, prijenosna, softverski definirana standardizirana okruženja koja omogućuju softveru da radi izolirano od ostalog softvera koji se izvodi na fizičkom računalu domaćinu. Docker Compose omogućuje vam upravljanje s više spremnika i osiguravanje njihove međusobne komunikacije. Na primjer, izvorni kod aplikacije i baza podataka moraju komunicirati.
U ovom vodiču ćemo izgraditi WordPress aplikaciju s više spremnika. Potpuna WordPress aplikacija zahtijeva tri spremnika: MySQL bazu podataka, Nginx poslužitelj i WordPress izvorni kod. Budući da je sigurnost prioritet na modernim web stranicama, dobit ćemo SSL certifikat od Let’s Encrypt kako bismo osigurali vašu instalaciju. Zatim ćemo postaviti cron zadatak za periodičku provjeru i obnovu certifikata kako bi se sigurnost vaše web stranice neprekidno održavala.
Preduvjeti
- Budući da je ovo praktični vodič, trebali biste imati instaliran Ubuntu 20.04 kao svoje početno operativno okruženje. Također biste trebali imati ne-root korisnika sa sudo privilegijama. Ovdje je vodič korak-po-korak koji će vam pomoći postaviti vaš Ubuntu poslužitelj.
- Također morate instalirati Docker. Možete pogledati ovaj vodič o tome kako instalirati i upravljati Dockerom na Ubuntu 18.04.
- Instalacija Docker Composea. Možete pratiti 1. korak vodiča Kako instalirati i konfigurirati Docker Compose na Ubuntu 20.04.
- Registrirani naziv domene potreban je za dobivanje TLS/SSL certifikata od Let’s Encrypt. Za potrebe ovog vodiča koristit ćemo
example.com. - Postavite DNS zapise kako biste usmjerili promet na svoj VPS. Potrebna su vam dva DNS zapisa:
- A zapis s
example.comkoji upućuje na javnu IP adresu vašeg poslužitelja. - A zapis s
www.example.comkoji upućuje na javnu IP adresu vašeg poslužitelja.
- A zapis s
Korak 1: Definiranje konfiguracija za web poslužitelj
Web poslužitelj sadrži datoteke vaše web stranice i omogućuje korisnicima pristup vašoj web aplikaciji. Stoga je sasvim prikladno da u prvom koraku definiramo konfiguraciju za web poslužitelj. Definirat ćemo konfiguraciju Nginx poslužitelja datoteku koja će uključivati lokacijske blokove specifične za WordPress. Također ćemo uključiti lokacijske blokove za usmjeravanje zahtjeva za provjeru Let’s Encrypt na Certbot klijent radi automatske obnove certifikata.
Započnimo stvaranjem direktorija za projekt. Možete odabrati naziv direktorija koji želite. Za ovaj vodič koristit ćemo wordpress_docker za ovaj vodič. Unesite sljedeću naredbu kako biste stvorili direktorij i ušli u njega:
|
1 |
mkdir wordpress_docker && cd wordpress_docker |
Zatim stvorite direktorij za pohranu Nginx konfiguracijskih datoteka pomoću naredbe:
|
1 |
mkdir nginx-conf |
Koristite nano za otvaranje datoteke sa sljedećom naredbom:
|
1 |
nano nginx-conf/nginx.conf |
U ovoj datoteci definirat ćemo osnovne direktive za konfiguraciju Nginx bloka poslužitelja. To uključuje direktive za naziv poslužitelja, korijenski direktorij dokumenata i lokacijske blokove za usmjeravanje zahtjeva Certbot dodataka za certifikate, statičke datoteke i PHP obradu. Možete pročitati naš vodič o Kako osigurati Nginx s Let’s Encrypt kako biste saznali više. Dodajte sljedeći kod u datoteku, zamjenjujući example.com sa svojim registriranim nazivom domene:
|
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; } } |
Definirajmo odjeljke koje ste dodali:
-
Direktive:
listen: govori Nginxu da sluša na portu80. To omogućuje korištenje Certbotovog webroot dodatka za podnošenje zahtjeva za certifikate. Nakon što dobijemo SSL certifikat, ažurirat ćemo ovu konfiguraciju kako bi koristila port443.server_name: ovo definira naziv domene koji bi ova konfiguracija trebala obrađivati. Promet prema nazivu domene definiranom ovdje bit će usmjeren na ovaj određeni blok poslužitelja, a time i na korijenski direktorij dokumenata (documentroot.root: definira korijenski direktorij za zahtjeve prema gore navedenom nazivu domene. To je obično direktorij koji sadrži stvarne datoteke naše web stranice. Postavili smo direktorij na ovaj/var/www/html. Bit će kreiran kao Docker točka montiranja tijekom vremena izgradnje kontejnera. Definirat ćemo upute za ovaj proces unutar WordPress Dockerfile.index: ovo definira datoteke koje će se koristiti kao indeksi ili ulazna točka za vaš web poslužitelj prilikom obrade zahtjeva. Pomaknuli smo index.php ispred index.html kako bi Nginx dao prioritetindex.php.
-
Location blokovi:
location ~ /.well-known/acme-challenge: obrađuje zahtjeve prema dobro poznatom direktoriju gdje Certbot dodaje privremenu datoteku kako bi potvrdio da DNS za navedenu domenu usmjerava na određeni poslužitelj od kojeg tražimo SSL certifikate. Zbog toga biste trebali dodati valjanu domenu kako bi ovaj korak funkcionirao umjestoexample.comkoju koristimo u ovom vodiču.location /: preuzima URI zahtjeve i daje kontrolu WordPressuindex.phpza traženje argumenata za obradu.location ~ \.php$: obrađuje PHP obradu i prosljeđuje zahtjev WordPress kontejneru (definirat ćemo konfiguracijsku datoteku za to u kasnijem koraku). Ovdje smo definirali konfiguracije specifične za FastCGI protokol jer će se WordPress Docker slika temeljiti na php:fpm slici. Nginx koristi neovisni PHP procesor za zahtjeve specifične za PHP. Koristit ćemophp-fpmprocesor koji dolazi sphp:fpmDocker slikom.location ~ /\.ht: obrađuje.htaccessdatoteke koje Nginx ne koristi. Direktivadeny allosigurava da se ove datoteke nikada ne poslužuju posjetiteljima web stranice.location = /favicon.ico, location = /robots.txt: kao što se vidi u definiciji, ovo sprječava bilježenje zahtjeva za/favicon.icoi/robots.txtdatoteke.location ~* \.(css|gif|ico|jpeg|jpg|js|png)$: isključuje bilježenje zahtjeva za statičke datoteke i osigurava njihovo predmemoriranje kako bi se smanjilo opterećenje poslužitelja.
Sada možete spremiti i zatvoriti datoteku pritiskom na CTRL+X, Y, a zatim ENTER. Time je završen prvi korak.
Korak 2: Definiranje varijabli okruženja
Varijable okruženja potrebne su za olakšavanje komunikacije između WordPress aplikacije i baze podataka. One također osiguravaju postojanost podataka aplikacije. Varijable okruženja uključuju osjetljive informacije kao što su vjerodajnice baze podataka i neosjetljive informacije kao što su naziv baze podataka i host.
Iz sigurnosnih razloga, uvijek je dobra ideja ne dodavati osjetljive informacije u repozitorije projekata. Stoga, umjesto postavljanja osjetljivih vrijednosti u Docker Compose datoteku, definirat ćemo MySQL vjerodajnice unutar .env datoteka koje se neće slati u repozitorij projekta i riskirati javno izlaganje. Unutar korijenskog direktorija projekta root ~/wordpress_docker otvorite .env datoteku:
|
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 |
Sljedeće što morate učiniti je dodati .env datoteku u .gitignore i .dockerignore datoteke kako biste osigurali da se ne doda u vaše repozitorije, odnosno Docker slike.
Ovo nije potrebno za ovaj vodič, ali ako želite raditi s Git za kontrolu verzija, unesite sljedeću naredbu za inicijalizaciju trenutnog direktorija kao git repozitorija:
|
1 |
git init |
Otvorite .gitignore pomoću nano:
|
1 |
nano .gitignore |
Dodajte sljedeći redak:
|
1 |
.env |
Spremite i zatvorite datoteku. Zatim otvorite .dockerignore pomoću nano:
|
1 |
nano .dockerignore |
Dodajte sljedeći redak:
|
1 |
.env |
Tijekom toga, po želji možete dodati i druge datoteke i direktorije povezane s razvojem vaše aplikacije:
|
1 2 3 |
.env .git docker-compose.yml |
Spremite i zatvorite datoteku kada završite. To je sve za ovaj korak. Prijeđimo na definiciju Docker Composea.
Korak 3: Konfiguriranje usluga pomoću Docker Composea
Docker Compose koristi docker-compose.yml datoteku za izgradnju slika. Ova datoteka sadrži definicije usluga za potpuno postavljanje aplikacije. Definicije usluga su u osnovi upute o tome kako će se kontejner pokrenuti. Usluga je stvarni pokrenuti kontejner.
Docker Compose omogućuje definiranje različitih usluga za višekontejnerske aplikacije povezivanjem različitih usluga putem zajedničkih mreža i volumena. Vidjet ćete ovo na djelu jer ćemo definirati tri kontejnera za našu aplikaciju: web poslužitelj, instalaciju WordPressa i bazu podataka. Dodat ćemo četvrti kontejner za pokretanje Certbot klijenta za obnavljanje certifikata.
Unesite sljedeću naredbu za stvaranje docker-compose.yml datoteke:
|
1 |
nano docker-compose.yml |
Prvi redak u docker-compose.yml datoteci je redak za definiranje verzije. Za našu smo postavili 3. Zatim možete početi definirati svoje usluge. Dodajte sljedeći isječak koda u datoteku kako biste definirali db uslugu:
|
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 |
Raspravimo o tome što imamo u definicijama usluge db u nastavku:
image: određuje sliku na kojoj će se kontejner temeljiti. Uvijek je bolje navesti određenu verziju (mysql:8.0) nego koristiti najnoviju oznaku (mysql:latest) jer bi se buduće verzije MySQL slika mogle sukobiti s našom aplikacijom ako ponovno izgradimo ovu sliku. Više informacija o Dockerfiles Best practices on the official Dockerfile Docs.container_name: ovdje navodimo naziv kontejnera.restart: ova direktiva određuje ponašanje kontejnera pri ponovnom pokretanju. Zadano jenoali mi smo je postavili da se uvijekponovno pokrećeosim ako se ručno ne zaustavi.env_file: ova direktiva se koristi za navođenje lokacije datoteke s varijablama okruženja (.env) koje koristi naša aplikacija.environment: koristi se za navođenje dodatnih varijabli okruženja. U ovom smo vodiču naveli varijabluMYSQL_DATABASEkako bi sadržavala naziv baze podataka za našu aplikaciju. Naziv baze podataka može se uključiti udocker-compose.yml.volumes: koristi se za navođenje lokacija montiranja. U našem smo primjeru montirali imenovani volumen pod nazivom dbdata u direktorij/var/lib/mysqlna kontejneru, što je obično standardni direktorij podataka za MySQL.command: ova direktiva navodi naredbu koja će nadjačati zadanu CMD instrukciju za sliku. Dodali smo opciju standardnoj naredbimysqldkoja pokreće MySQL poslužitelj unutar kontejnera. Opcija koju smo dodali je--default-authentication-plugin=mysql_native_password, što ažurira zadani dodatak za autentifikaciju za MySQL kako bi koristio autentifikaciju lozinkom (mysql_native_password). To je neophodno kako bi vaša PHP (WordPress) aplikacija radila jer koristi korisničko ime i lozinku za pristup bazi podataka. U novijim verzijama MySQL-a, default authentication plugin has changed. Međutim, većina aplikacija koristi autentifikaciju lozinkom. Stoga morate promijeniti ovu postavku kako bi aplikacija radila.networks: ova direktiva se koristi za određivanje da bi se uslugadbtrebala pridružiti mrežiapp-network, koju ćemo definirati u nastavku vodiča.
Zatim definirajmo konfiguraciju usluge za našu WordPress aplikaciju. Nazvat ćemo uslugu i container_name app. Dodajte sljedeći isječak koda ispod db definicije usluge, imajući na umu pravilno uvlačenje:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#Usluga koda WordPress aplikacije 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 |
Baš kao što smo učinili s db uslugom, imenovali smo naš kontejner i definirali pravilo ponovnog pokretanja. Još neke opcije koje smo dodali definirane su u nastavku:
depends_on: ova direktiva osigurava da se kontejneri pokreću redoslijedom ovisnosti. U našem slučaju,appkontejner ovisi odbkontejneru. Stoga će se pokrenuti nakon što sedbkontejner pokrene. To se mora dogoditi ovim redoslijedom jer WordPress aplikacija ovisi o dostupnosti MySQL baze podataka kako bi funkcionirala.image: kao što se vidi u isječku koda, koristit ćemo WordPress verziju 5.1.1 fpm alpine sliku. Objasnili smophp-fpmprocesor koji Nginx zahtijeva za PHP obradu. Ova slika se brine o tome. Alpine slika temeljena na projektu Alpine Linux pomaže u održavanju manje veličine slike. Ako trebate više informacija o varijacijama slika, možete pratiti ovu poveznicu za Docker Hub Wordpress slike.env_file: specificira lokaciju.envdatoteke koja sadrži vjerodajnice baze podataka.environment: ova direktiva definira dodatne varijable okruženja. U našem slučaju, definiramo varijable koje WordPress očekuje i dodjeljujemo im vrijednosti varijabli iz naše.envdatoteke. To suWORDPRESS_DB_USER,WORDPRESS_DB_PASSWORD, iWORDPRESS_DB_HOSTkoji se odnosi na MySQL poslužitelj koji se izvodi nadbkontejneru, dostupnom s MySQL-ovog zadanog porta3306. Na kraju, viditeWORDPRESS_DB_NAMEkoji smo postavili na WordPress. Ista vrijednost navedena je u definiciji MySQL usluge u db kontejneru:MYSQL_DATABASE=wordpress.volumes: ova direktiva montira volumen pod nazivom app na/var/www/htmltočku montiranja, koju je kreirala WordPress slika. Imenovanje volumena omogućuje dijeljenje koda aplikacije s drugim kontejnerima.networks: na kraju, dodajemo app kontejner uapp-networkkako bismo osigurali da komunicira s drugim kontejnerima na mreži.
To će biti sve za app uslužni kontejner za WordPress sliku. Definirajmo sada webserver uslugu za Nginx sliku. Prvo dodajte sljedeći isječak koda ispod definicije usluge app u vašoj docker-compose.yml datoteci:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#Usluga web poslužitelja 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 |
Već smo objasnili opciju depends_on. U slučaju ove webserver usluge, kontejner će se pokrenuti nakon što se app kontejner pokrene. Kontejner web poslužitelja temelji se na alpine Nginx slici. Ima slično pravilo ponovnog pokretanja kao i prethodne definicije usluga. Ostale opcije u definiciji usluge webserver uključuju:
ports: povezuje portove između računala domaćina i spremnika. U Koraku 1, definirali smo port80unginx.confdatoteci. Ovaj port je mapiran na port80na spremniku.volumes: imamo kombinaciju bind mounts i imenovanih volumena pod ovom opcijom:app:/var/www/html: ova definicija volumena montira WordPress aplikaciju na/var/www/htmldirektorij koji smo ranije postavili kao korijenski (root) u Nginx bloku poslužitelja../nginx-conf:/etc/nginx/conf.d: ova definicija povezuje (bind mount) konfiguracijski direktorij Nginxa na računalu domaćinu s konfiguracijskim direktorijem Nginxa koji smo definirali za spremnik. Stoga se sve promjene na računalu domaćinu automatski odražavaju u spremniku.certbot-etc:/etc/letsencrypt: ova definicija montira Let’s Encrypt certifikate i ključeve za domenu u odgovarajući direktorij na spremniku.
networks: kao i u prethodnim definicijama usluga, direktivanetworksdodaje uslugu webserver uapp-networks.
Budući da smo završili s definicijom web poslužitelja, dodajmo upute za uslugu Certbot. Ona će se pobrinuti za preuzimanje vaših TLS/SSL certifikata od Let’s Encrypt. Ako želite saznati više o osiguravanju Nginx poslužitelja, ovaj vodič o tome kako osigurati Nginx s Let’s Encrypt je dobar izvor.
Zatim dodajte sljedeći isječak koda ispod usluge webserver. Ne zaboravite postaviti svoj točan naziv domene i e-mail adresu:
|
1 2 3 4 5 6 7 8 9 10 |
#certbot usluga 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 |
Slika certbot pokrenut će se tek nakon što se pokrene webserver, zbog direktive depends_on. Docker Compose će preuzeti Certbot sliku s Docker Huba kako je definirano.
Pod definicijom volumena, Certbot spremnik će dijeliti certifikate domene i ključ u certbot-etc s Nginx webserver spremnikom i kod aplikacije s app spremnikom.
Pod definicijom command, naveli smo podnaredbu za pokretanje zadane Certbot naredbe certonly s dodatnim opcijama kako je navedeno u nastavku:
-
--webroot: specificira upotrebu webroot dodatka koji postavlja datoteke u webroot mapu radi provjere autentičnosti.--webroot-path: specificira putanju webroot direktorija.--agree-tos: specificira da se slažete s ACME-ovim Uvjetima pružanja usluge.--no-eff-email: specificira da ne želite dijeliti svoju e-mail adresu s EFF. Možete ovo izostaviti ako je želite podijeliti.--staging: govori Certbotu da prvo želite dobiti testne certifikate iz staging okruženja Let’s Encrypt za testiranje vaše konfiguracije prije dobivanja stvarnog certifikata. Let’s Encrypt ima ograničenje učestalosti zahtjeva za domene. Stoga će vam prvo testiranje konfiguracije pomoći da izbjegnete ograničenje vaše domene.-d: ova opcija prima nazive domena za zahtjev za certifikat. U ovom vodiču uključili smoexample.comiwww.example.com. Molimo navedite svoju stvarnu registriranu domenu.
Naša docker-compose.yml datoteka je gotovo dovršena. Međutim, morate također dodati definicije mreže i volumena ispod Certbot usluge:
|
1 2 3 4 5 6 7 8 9 10 |
#Volumeni volumes: certbot-etc: app: dbdata: #Mreže networks: app-network: driver: bridge |
Ključ volumes definira volumene koji će se dijeliti sa svim uslugama (spremnicima) definiranim u ovoj compose dateci: certbot-etc, app, i dbdata. Sadržaj volumena koje Docker stvara pohranjuje se u direktoriju kojim upravlja Docker na datotečnom sustavu domaćina: /var/lib/docker/volumes/. Sadržaj svakog volumena se zatim montira na bilo koji kontejner koji koristi taj volumen. To omogućuje dijeljenje podataka i koda između kontejnera.
Ključ networks definira bridge mrežu koja omogućuje komunikaciju između kontejnera. Kontejneri na istoj bridge mreži kao što su webserver i db mogu sigurno komunicirati putem portova bez izlaganja prometa vanjskoj mreži. Izlažemo samo port 80 kako bismo omogućili pristup front-end stranicama web-mjesta.
Potpuna docker-compose.yml datoteka izgledat će ovako:
|
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: #MySQL usluga 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 #Usluga koda WordPress aplikacije 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 #Webserver Nginx usluga 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 #certbot usluga 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 #Volumeni volumes: certbot-etc: app: dbdata: #Mreže networks: app-network: driver: bridge |
Možete spremiti i zatvoriti datoteku. U sljedećem koraku pokrenut ćemo i testirati kontejner i zahtjeve za certifikate.
Korak 4: Pokretanje kontejnera i dobivanje SSL certifikata
Najveća prednost Docker Composea je u tome što, nakon što definirate sve svoje usluge u docker-compose.yml datoteku, možete pokrenuti sve kontejnere sa samo jednom naredbom: docker-compose up. Naredba pokreće svaku navedenu instrukciju. Ako su zahtjevi za domenu uspješni, trebali biste moći vidjeti ispravan izlazni status u svom terminalu. Unesite sljedeću naredbu za stvaranje kontejnera. Zastavica -d služi za pokretanje kontejnera u pozadini:
|
1 |
docker-compose up -d |
Ako vidite izlaz kao na snimci zaslona u nastavku, usluge su uspješno stvorene:
Za potvrdu statusa usluga, pokrenite naredbu docker-compose ps:
|
1 |
docker-compose ps |
Izlaz naredbe je kao što je prikazano u nastavku ako je sve bilo uspješno. Stanje kontejnera app, db, i webserver trebalo bi biti pokrenuto, a kontejner certbot bi trebao imati Exit0 status:
Ako vidite bilo što osim Up u stupcu stanja za app, db ili webserver, ili Exit status koji nije 0 za kontejner certbot, onda je nešto pošlo po zlu. Možete provjeriti zapisnike svakog kontejnera pomoću naredbe docker-compose logs, i navesti service_name:
|
1 |
docker-compose logs service_name |
Na primjer, možete provjeriti zapisnike kontejnera certbot unosom sljedeće naredbe:
|
1 |
docker-compose logs certbot |
Da biste provjerili jesu li certifikati montirani na kontejner webserver, upotrijebite naredbu docker-compose exec:
|
1 |
docker-compose exec webserver ls -la /etc/letsencrypt/live |
Ako ste koristili stvarnu registriranu domenu umjesto example.com i zahtjevi za certifikat su bili uspješni, trebali biste vidjeti izlaz sličan ovome:
Nakon što potvrdite da je zahtjev za certifikat bio uspješan, možete urediti datoteku docker-compose.yml i ukloniti zastavicu --staging. Otvorite datoteku pomoću nano:
|
1 |
nano docker-compose.yml |
Pomaknite se prema dolje do odjeljka definicije usluge Certbot, u opciji naredbe i zamijenite zastavicu --staging sa zastavicom --force-renewal. To govori Certbotu da tražite obnovu certifikata za certifikat iste domene. Vaša definicija usluge Certbot sada bi trebala izgledati ovako:
|
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 |
Spremite datoteku kada završite s uređivanjem.
Unesite sljedeću naredbu za ponovno stvaranje kontejnera certbot. Uključena zastavica --no-deps govori Composeu da preskoči ponovno pokretanje usluge web poslužitelja jer već radi:
|
1 |
docker-compose up --force-recreate --no-deps Certbot |
Naredba daje sljedeći snimak zaslona, koji pokazuje da je zahtjev za certifikat bio uspješan:
To je sve za ovaj korak. U sljedećem koraku izmijenit ćete Nginx konfiguracijsku datoteku kako biste uključili SSL certifikat.
Korak 5: Omogućavanje SSL-a u Nginx konfiguraciji i definiciji usluge
Kako bi Nginx posluživao promet preko sigurnog SSL-a, prvo ćete izmijeniti Nginx konfiguracijsku datoteku kako biste dodali HTTP preusmjeravanje na HTTPS. Zatim trebate navesti lokacije certifikata i ključa, te na kraju dodati sigurnosne parametre i zaglavlja.
Prije izmjene konfiguracijske datoteke, trebali biste preuzeti preporučene sigurnosne parametre za Nginx iz Certbotovog GitHub repozitorija pomoću curl sa sljedećom naredbom:
|
1 |
curl -sSLo nginx-conf/options-ssl-nginx.conf |
Naredba se pokreće i sprema parametre koje povlači u datoteku pod nazivom options-ssl-nginx.conf, unutar nginx-conf direktorija. Uklonite Nginx konfiguracijsku datoteku kako bismo mogli stvoriti novu pomoću sljedećih naredbi:
|
1 2 |
rm nginx-conf/nginx.conf nano nginx-conf/nginx.conf |
U sada praznu nginx.conf datoteku dodajte sljedeći kôd koji uključuje preusmjeravanje s HTTP na HTTPS, SSL protokole vjerodajnica i sigurnosna zaglavlja. Kao što ste učinili ranije, zamijenite example.com domenu svojom vlastitom registriranom domenom:
|
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-Sigurnost-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # omogućite strict transport security samo ako razumijete implikacije 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; } } |
U prvom bloku poslužitelja koji obrađuje neosigurane zahtjeve koristeći port 80, specificiramo webroot za Certbot zahtjeve za obnovu. Također uključujemo direktivu preusmjeravanja koja preusmjerava HTTP zahtjeve na HTTPS.
Drugi blok poslužitelja obrađuje siguran HTTPS promet koji dolazi na portu 443. Kao što možete vidjeti, također omogućujemo SSL i HTTP2. HTTP/2 poboljšava performanse vašeg poslužitelja. Više o tome možete pročitati u službenoj Nginx dokumentaciji o HTTP/2.
U ovom bloku također smo specificirali da Nginx uključuje lokacije SSL certifikata i ključa, kao i preporučene Certbot sigurnosne parametre koje je curl spremio u nginx-conf/options-ssl-nginx.conf direktorij.
Dodatna sigurnosna zaglavlja služe za poboljšanje ocjena vaše web stranice na sigurnosnim testnim stranicama kao što su Security Headers i SSL Labs. Možete pratiti poveznice na ovim zaglavljima kako biste saznali više: X-Frame-Options, Referrer Policy, X-Content-Type-Options, X-XSS-Protection, Content-Security-Policy. Zakomentirali smo HTTP Strict Transport Security (HSTS) zaglavlje. Slobodno pročitajte o njegovoj funkcionalnosti predučitavanja (preload) i odlučite želite li ga omogućiti.
Ostatak direktiva kao što su root, index, blokovi lokacija specifični za WordPress ostaju kako je opisano u Koraku 1. Sada možete spremiti i zatvoriti datoteku kada završite s uređivanjem.
Sada kada smo omogućili HTTPS promet koji koristi port 443, moramo također omogućiti taj port u definiciji usluge web poslužitelja. Unesite sljedeću naredbu za otvaranje docker-compose.yml datoteke pomoću nano:
|
1 |
nano docker-compose.yml |
U odjeljku web poslužitelja pod opcijom ports, dodajte mapiranje za port 443 kako je istaknuto u nastavku:
|
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 |
Potpuna docker-compose.yml datoteka sada bi trebala izgledati ovako:
|
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 |
version: '3' services: #MySQL usluga 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 #WordPress usluga koda aplikacije 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 #Webserver Nginx usluga 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 #certbot usluga 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 #Volumeni volumes: certbot-etc: app: dbdata: #Mreže networks: app-network: driver: bridge |
Nakon što potvrdite da sve izgleda ispravno, spremite i zatvorite datoteku. Nakon toga pokrenite sljedeću naredbu kako biste ponovno stvorili webserver uslugu:
|
1 |
docker-compose up -d --force-recreate --no-deps webserver |
|
1 |
docker-compose ps |
Sada kada svi vaši spremnici rade, moguće je nastaviti s konfiguracijom WordPressa putem web sučelja.
Korak 6: Dovršite konfiguraciju WordPressa putem web sučelja
Idite na naziv domene svog poslužitelja kako biste nastavili instalaciju. Trebali biste vidjeti početnu stranicu za postavljanje WordPressa. Ona vas poziva da odaberete svoj jezik prije nastavka:
Odaberite svoj jezik i kliknite Nastavi za prijelaz na sljedeću stranicu:
Na ovoj stranici unesite naslov svoje web stranice, odaberite korisničko ime koje ćete lako zapamtiti i jaku lozinku. Preporučuje se da ne koristite Admin kao svoje korisničko ime iz sigurnosnih razloga. Unesite svoju e-poštu i kliknite gumb Instaliraj WordPress kako biste započeli instalaciju WordPressa.
Nakon što instalacija završi, bit ćete preusmjereni na zaslon za prijavu gdje ćete unijeti korisničko ime i lozinku koje ste postavili. Kada unesete valjane vjerodajnice, trebali biste moći vidjeti svoju WordPress nadzornu ploču:
Sada ste uspješno instalirali WordPress! Zatim morate poduzeti korake kako biste osigurali automatsko obnavljanje SSL certifikata.
Korak 7: Konfiguriranje automatskog obnavljanja SSL certifikata
Let’s Encrypt TLS/SSL certifikati vrijede samo 90 dana. Na vama je da izradite konfiguraciju za automatsko obnavljanje kako biste osigurali da ne isteknu. To možete postići stvaranjem skripte i njezinim zakazivanjem pomoću alata cron job. U ovom koraku pokazat ćemo vam kako stvoriti skriptu koja će obnoviti certifikate. Zatim ćemo je zakazati pomoću alata cron job kako bismo je povremeno pokretali i obnovili certifikate ako se približava datum isteka.
Unutar direktorija projekta wordpress_docker, otvorite skriptu pod nazivom ssl_renewer.sh pomoću nano:
|
1 |
nano ssl_renewer.sh |
Dodajte sljedeći kod u skriptu za upravljanje automatskim obnavljanjem i ponovnim učitavanjem Nginx konfiguracije. Ne zaboravite zamijeniti istaknuto korisničko ime svojim korisničkim imenom koje nije 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 |
U ovoj skripti dodjeljujemo docker-compose binarnu datoteku varijabli pod nazivom COMPOSE. Također uključujemo opciju –ansi never koja govori skripti da pokrene naredbe docker-compose bez ANSI kontrolnih znakova. Nadalje, dodjeljujemo Docker binarnu datoteku varijabli pod nazivom DOCKER.
Skripta zatim prelazi u naš projektni direktorij wordpress_docker i izvršava sljedeće naredbe:
docker-compose run: pokreće certbot spremnik i nadjačava naredbu koju smo naveli u definiciji usluge certbot. Umjesto pokretanja podnaredbe certonly, pokreće podnaredbu renew koja će obnoviti SSL/TLS certifikate od Let’s Encrypt ako im se bliži istek.docker-compose kill: šalje signal SIGHUP spremnikuwebserverkako bi ponovno učitao Nginx konfiguracije. Možda biste željeli pogledati ovaj vodič od Dockera o tome kako koristiti službenu Nginx Docker sliku.docker system prune: ova naredba uklanja sve neiskorištene spremnike i slike.
Spremite i zatvorite datoteku kada završite s uređivanjem. Zatim pokrenite sljedeću naredbu kako biste je učinili izvršnom:
|
1 |
chmod +x ssl_renewer.sh |
Nakon što ste je učinili izvršnom, otvorite svoju root crontab datoteku kako biste povremeno pokretali skriptu u intervalima koje ćemo odrediti:
|
1 |
sudo crontab -e |
The crontab će od vas tražiti da odaberete željeni uređivač ako ga koristite prvi put:
Odaberite željeni uređivač i pritisnite Enter kako biste otvorili datoteku. Na dno datoteke dodajte sljedeći redak:
|
1 |
*/5 * * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
To postavlja interval na pet minuta kako bi nam se omogućilo testiranje hoće li naša skripta za obnavljanje raditi ili ne. Također smo odredili datoteku dnevnika koja će sadržavati izlaz iz zadatka: cron_docker.log.
Pričekajte pet minuta i provjerite cron.log kako biste vidjeli je li skripta bila uspješna sa zahtjevom za obnovu:
|
1 |
tail -f /var/log/cron_docker.log |
Trebali biste vidjeti nešto slično snimci zaslona u nastavku ako su zahtjevi bili uspješni:
Sada kada smo testirali i potvrdili da radi, možete izmijeniti crontab datoteku kako biste odredili dnevnu obnovu. Na primjer, možda želite odrediti da se skripta pokreće svaki dan u 18:00 sati. Da biste to učinili, izmijenite zadnji redak crontab da izgleda ovako:
|
1 |
0 18 * * * /home/hackins/wordpress_docker/ssl_renewer.sh >> /var/log/cron_docker.log 2>&1 |
Osim toga, trebate ukloniti –dry-run zastavicu iz ssl_renewer.sh skripte kako biste osigurali da se stvarna obnova dogodi kada se pokrene. Trebala bi izgledati ovako:
|
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 |
Zatim spremite i zatvorite datoteku. Nakon što to učinite, cron posao će održavati vaše skripte valjanima tako što će ih obnoviti prije isteka 90 dana.
Zaključak
Ako ste stigli ovako daleko u vodiču, možete se smatrati korak bliže tome da postanete DevOps inženjer. Uspjeli ste stvoriti Nginx konfiguracijsku skriptu, stvorili ste docker-compose.yml datoteku i definirali nekoliko usluga potrebnih za pokretanje WordPress aplikacije s Dockerom i Docker Composeom. Dobili ste SSL/TLS certifikate od Let’s Encrypt kako biste osigurali da je vaš web poslužitelj siguran. Na kraju, stvorili ste cron posao kako biste osigurali da certifikati ne isteknu. Odličan posao!
Ako želite dublje ući u DevOps, pogledajte više resursa o kontejnerima na našem blogu:
- Upoznavanje s Kubernetesom
- Kako implementirati Node.js (Express.js) aplikaciju s Dockerom na Ubuntu 20.04
- Implementacija PHP aplikacije na Kubernetes klasteru s Ubuntuom 18.04.
- Implementacija Laravela, Nginxa i MySQL-a s Docker Composeom
Sretno računanje!










Komentari
Još nema komentara. Budite prvi.