2018. 07. 28.
frissítve: 2022. 05. 15.
Olvasási idő: 15 perc

Docker és Traefik beállítása staging szerveren

Az előző bejegyzésben eljutottunk egy alapszinten konfigurált VPS-ig, amit most tovább okosítunk: telepítünk rá Docker-t és bekonfigurálunk egy Traefik-et reverse proxy-nak, automatikus SSL megújítással. Vágjunk is bele!


A Docker telepítése

A Docker telepítéséhez nincs szükségünk sok dologra, csak az alábbi parancsokat kell szépen bemásolnunk terminálba - értelmeszerűen, ahol kéri, adjuk meg a jelszavunkat:

Ellenőrizzük le, hogy működik-e a Docker:

Ha mindent jól csináltunk, valami ilyesmit kell visszakapnunk:

Ha látjuk a loaded és active (running) szövegeket, jók vagyunk.

A későbbi munkánk megkönnyítése miatt érdemes lehet betennünk magunkat a docker csoportba, így nem kell majd sudo-t használnunk a docker parancs használatához:

Még telepítsük a Docker Compose-t is:

A fenti parancsok csak példák és a Docker és a Docker Compose oldaláról származnak. Idővel elavulhatnak, így mindenképpen ellenőrizd le, hogy biztosan ezek szerepelnek-e az ottani oldalon is.

Traefik architecture

Traefik előkészítése

A Traefik egy modern HTTP reverse proxy és load balancer Let's Encrypt támogatással, automatikus konfigurálással... Szóval a teljes marketing szöveg itt van, amire mi használni fogjuk a Traefik-et, az "automatikus" része a fenti szövegnek: az ígéret az, hogy "magától" megtalálja a futó Docker containereket és automatikusan generál nekik SSL tanúsítványt, valamint létrehoz nekik egy frontend entry point-ot, amin keresztül elérjük. Ez így már kezd izgalmassá válni, szóval haladjunk tovább.

Készítettem egy alap csomagot, amit használhatsz kiindulási pontként:

Lépj be az infrastructure_traefik könyvtárba, majd hozd létre a .env fájlt a következő tartalommal:

Egy kis magyarázat:

  • DO_AUTH_TOKEN: DigitalOcean token, hogy tudja manipulálni a DNS rekordokat (ehhez a DigitalOcean-nek kell a névszervernek lennie, de erre még visszatérünk),
  • TRAEFIK_PREFIX és DOMAIN együttesen azt határozzák meg, hogy milyen címen éred el a Traefik frontendet,
  • TRAEFIK_PORT a Traefik container belső portja, ezt hagyjuk így,
  • TRAEFIK_STSPRELOAD és TRAEFIK_STSSECONDS meghatározzák, hogy a fenti előálló és a proxyzott címek csak HTTPS-en keresztül érhetőek el, és ha igen, akkor az utolsó látogatástól számítva mennyi ideig legyen ez a kikötés.

Egyelőre ne indítsd el a container-t, váltsunk egy kicsit témát!

DNS és névszerver előkészítése

Ha valami oknál fogva nem szeretnéd, hogy az összes DNS rekordod között randalírozzon a Traefik, lehetőség van egy aldomainre korlátozni a játszadozásunkat, amit az alábbiak szerint tudunk megtenni.

Első lépésként vigyük az első aldomainünk névszerver kezelését DigitalOcean droplethez. Ehhez fel kell vennünk néhány rekordot a fő DNS-nél (ez nálam a Cloudflare), én ezeket állítottam be:

  • NS yoda ns1.digitalocean.com

Ezzel a yoda.webmenedzser.hu cím DNS-kezelését sikeresen eltereltük a DigitalOcean-hez. A következő lépés a DigitalOcean token beszerzése (a Write legyen bepipálva) és az alap DNS rekordok beállítása:

  • A Networking aloldalon tudsz domaint felvenni, én felvettem a yoda.webmenedzser.hu-t,
  • Az itt szereplő DNS rekordok pedig az alábbiak:
    • A *.yoda.webmenedzser.hu {{ DROPLET_IP }} (nálam 188.166.22.129),
    • A yoda.webmenedzser.hu {{ DROPLET_IP }}
    • NS yoda.webmenedzser.hu ns1.digitalocean.com.
    • NS *.yoda.webmenedzser.hu ns1.digitalocean.com.

Mindegyikre alacsony TTL-t állítottam be (60 másodperc), de azért eltelt egy kis idő, amíg minden névszerver átállt. Ellenőrizni a dig -t ns yoda.webmenedzser.hu és dig -t a yoda.webmenedzser.hu parancsokkal tudod az állapotot - ha ilyesmit kapsz vissza, jó vagy:

Ellenőrizd le a valami.yoda.webmenedzser.hu-t is - ha ott is szerepel IP cím a válaszban, akkor sikeresen beállítottad az aldomained névszerverére a DigitalOcean DNS-ét, visszatérhetünk a Traefik-hez.

A Traefik beállítása és elindítása

Ha mindent jól csináltunk, akkor a nehezén túl vagyunk, már csak néhány egyszerű feladatunk maradt.

Először is hozzunk létre egy üres fájlt acme.json néven a klónozott mappában található traefik/ mappában (ott már van egy traefik.toml fájl), majd szűkítsük le rajta a jogosultságokat:

Ide fogja tenni a Traefik a Let's Encrypt-től kapott kulcsokat és a tanúsítványt, ha nem ezek a jogosultságok, nem fog működni a HTTPS.

Másodszor: be kell állítanunk a Traefik néhány paraméterét - ezt a traefik/traefik.toml fájlban találjuk. Nyissuk meg és a következő részeket vegyük szemügyre:

Az itt levő users tömbökbe idézőjelek közé, kettősponttal elválasztva kell beírnunk a HTTP autentikációnál használható felhasználónevet és jelszót. A fenti első példában a wbmngr + titok, illetve a client + nagyontitok párosok szerepelnek. Ilyeneket könnyedén tudsz generálni itt.

Ahogy láthatod, a HTTP rögtön átirányít HTTPS-re (mindegy, hogy milyen szolgáltatás van a Traefik mögött), a HTTPS részen pedig hitelesítést kér - így ami a Traefik mögött van, csak felhasználónév és jelszó birtokában nézhető meg. Mivel a többi szolgáltatás elé is "beül" a Traefik, ezért mindegyik mögötte levő szolgáltatást automatikusan levédi ezekkel a jelszavakkal - ez egy szinte tökéletes megoldás arra, hogy az ügyfél készülő weboldala ne legyen elérhető bárkinek.

Emellett pedig létezik még egy entry point, a traefik, ami a Traefik admin felületét védi a nagyon hatékony admin + admin párosítással. Igen, ezeket változtasd meg!

A konfiguráció még két pontjára fogok kitérni. Az első a Docker backend konfiguráció:

Itt a domain-t kell kézzel beállítani arra a domainre, ami ebben a DNS zónában a "gyökér" (ez gyakorlatilag megegyezik a .env fájlban beállított DOMAIN változó értékével).

Egy utolsó rész, amit mindenképpen meg kell nézned:

Változtass e-mail címet, illetve domaineket. Megtévesztő az, hogy a main értéke nem a yoda.webmenedzser.hu, hanem a wildcard-os verzió (amiben csillag van), de ez azért van így, mert az ACME szerint a SAN nem tartalmazhat wildcard-ot.

Ha mindennel megvagy, már csak hátra kell dőlnünk, kiadnunk a infrastructure_traefik mappában a docker-compose up -d parancsot, és várni egy kicsit.

Az állapotot többféleképpen tudod ellenőrizni:

  • meg tudod nézni, szerepelnek-e a TXT rekordok a domain DNS rekordjai között,
  • vagy hogy megérkeztek-e már a tanúsítványok a Let's Encrypt-től:

ha a tömbben a Certificate értéke nem null, akkor a felette lévő Domain-ben szereplő domainek rendelkeznek tanúsítvánnyal,

  • valamint megnézheted a Docker container logját is:

Ha itt nem szerepel ERROR, akkor alakul: ellenőrizd a traefik.DOMAIN (tehát a jelen példában a traefik.yoda.webmenedzser.hu) címet, hogy megfelelően működik-e minden. Ha feldobja a hitelesítéses dobozt, nyertél! :) Lépj be, és máris látni fogod, hogy milyen futó containereket ismert fel a Traefik (egyelőre csak önmagát), illetve a bal oldali (frontend) részben az adott frontendhez tartozó kártya Route Rule-jánál azt is láthatod, hogy milyen URL-en éred el az adott szolgáltatást (pl.: Host:traefik.yoda.webmenedzser.hu esetén az URL traefik.yoda.webmenedzser.hu lesz).

Most pedig a jutalom része következik: indítsunk el egy tetszőleges Docker container-t:

Fontos, hogy a docker-compose.yml fájl ebben az esetben tartalmazza a networks részeket mindkettő helyen, az infrastructure_traefik_web pedig azon a néven szerepeljen, melyen automatikusan létrejött a Traefik container elindításakor. Ez valószínűleg infrastructure_traefik_web lesz, de érdemes ellenőrizni a docker network ls paranccsal.

Köszi a kitartást, szuper vagy! Ha még van erőd, maradt egy utolsó rész is. :)