Traefik reverse proxy su automatiniais SSL

Kodėl verta susipažinti su Traefik

Jei kada nors bandėte sukonfigūruoti Nginx ar Apache kaip reverse proxy su SSL sertifikatais, tikriausiai žinote, kokia tai gali būti kančia. Reikia rankiniu būdu redaguoti konfigūracijos failus, generuoti sertifikatus, nustatyti automatinį atnaujinimą, o kai pridedi naują servisą – vėl iš naujo. Traefik atsirado būtent tam, kad išspręstų šias problemas ir padarytų mūsų gyvenimą paprastesnį.

Traefik yra modernaus dizaino reverse proxy ir load balancer, kuris puikiai supranta konteinerizuotą pasaulį. Jis automatiškai aptinka jūsų Docker konteinerius, Kubernetes pod’us ar kitas paslaugas ir konfigūruoja save pats. O geriausias dalykas? SSL sertifikatai generuojami ir atnaujinami visiškai automatiškai per Let’s Encrypt. Skamba kaip sapnas, tiesa?

Aš pats pradėjau naudoti Traefik prieš kelerius metus, kai mano asmeninių projektų skaičius išaugo iki tokio lygio, kad Nginx konfigūracijų valdymas tapo košmaru. Kiekvieną kartą pridėjus naują servisą reikėjo prisiminti, kur ten buvo tas konfigūracijos failas, kaip teisingai nustatyti proxy_pass, ar nepamiršau atnaujinti sertifikato… Traefik viską pakeitė.

Pasiruošimas darbui

Prieš pradedant, jums reikės kelių dalykų. Pirma, veikiančios Docker aplinkos – Traefik puikiai veikia kaip Docker konteineris. Antra, domeno vardo, kuris nurodo į jūsų serverį. Tai būtina Let’s Encrypt sertifikatams gauti. Trečia, 80 ir 443 portai turi būti laisvi ir prieinami iš interneto.

Sukurkime darbo katalogą ir būtinus failus:

„`bash
mkdir traefik
cd traefik
mkdir data
touch data/traefik.yml
touch data/acme.json
chmod 600 data/acme.json
„`

Tas `chmod 600` komanda labai svarbi – Traefik atsisakys dirbti, jei acme.json failas bus per daug atviras. Šiame faile bus saugomi jūsų SSL sertifikatai, todėl saugumas čia kritiškai svarbus.

Bazinė Traefik konfigūracija

Dabar ateina įdomiausia dalis – pats Traefik konfigūravimas. Traefik naudoja du konfigūracijos lygius: statinę (traefik.yml) ir dinaminę (kuri ateina iš Docker labels ar kitų šaltinių). Pradėkime nuo statinės konfigūracijos.

Atidarykite `data/traefik.yml` ir įdėkite:

„`yaml
api:
dashboard: true
insecure: false

entryPoints:
web:
address: „:80”
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: „:443”

providers:
docker:
endpoint: „unix:///var/run/docker.sock”
exposedByDefault: false
network: traefik-network

certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: acme.json
httpChallenge:
entryPoint: web
„`

Paaiškinkim, kas čia vyksta. `entryPoints` – tai įėjimai į jūsų sistemą. Mes apibrėžiame du: `web` (80 portas) ir `websecure` (443 portas). Pastebėkite, kad web automatiškai peradresuoja visą srautą į HTTPS – tai saugumo praktika, kurią turėtumėte naudoti visada.

`providers.docker` sako Traefik’ui, kad jis turi klausytis Docker įvykių. `exposedByDefault: false` reiškia, kad konteineriai nebus automatiškai prieinami – turite juos aiškiai pažymėti labels’ais. Tai saugumo priemonė, kuri apsaugo nuo atsitiktinio servisų atidarymo.

Docker Compose failas ir tinklo konfigūracija

Dabar sukurkime `docker-compose.yml` failą Traefik’ui paleisti:

„`yaml
version: ‘3.8’

services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
security_opt:
– no-new-privileges:true
networks:
– traefik-network
ports:
– 80:80
– 443:443
volumes:
– /etc/localtime:/etc/localtime:ro
– /var/run/docker.sock:/var/run/docker.sock:ro
– ./data/traefik.yml:/traefik.yml:ro
– ./data/acme.json:/acme.json
labels:
– „traefik.enable=true”
– „traefik.http.routers.traefik.rule=Host(`traefik.jusudomenas.lt`)”
– „traefik.http.routers.traefik.entrypoints=websecure”
– „traefik.http.routers.traefik.tls.certresolver=letsencrypt”
– „traefik.http.routers.traefik.service=api@internal”
– „traefik.http.routers.traefik.middlewares=traefik-auth”
– „traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$…”

networks:
traefik-network:
external: true
„`

Prieš paleidžiant, turite sukurti tinklą: `docker network create traefik-network`. Šis tinklas bus naudojamas visiems jūsų servams, kuriuos norite eksponuoti per Traefik.

Dėl to `basicauth.users` – jums reikės sugeneruoti slaptažodžio hash’ą. Galite tai padaryti su htpasswd įrankiu: `htpasswd -nb admin jususlaptazodis`. Svarbu: Docker Compose faile reikia dvigubinti dolerio ženklus (`$$`), nes vienas dolerio ženklas yra specialus simbolis.

Prijungimas pirmojo serviso

Dabar, kai Traefik veikia, prijunkime kokį nors servisą. Tarkime, turite paprastą web aplikaciją. Štai kaip atrodytų jos docker-compose.yml:

„`yaml
version: ‘3.8’

services:
webapp:
image: nginx:alpine
container_name: mano-webapp
restart: unless-stopped
networks:
– traefik-network
labels:
– „traefik.enable=true”
– „traefik.http.routers.webapp.rule=Host(`webapp.jusudomenas.lt`)”
– „traefik.http.routers.webapp.entrypoints=websecure”
– „traefik.http.routers.webapp.tls.certresolver=letsencrypt”
– „traefik.http.services.webapp.loadbalancer.server.port=80”

networks:
traefik-network:
external: true
„`

Ir tiek! Paleiskite šį konteinerį, ir Traefik automatiškai:
– Aptiks naują servisą
– Sukonfigūruos routing’ą
– Sugeneruos SSL sertifikatą iš Let’s Encrypt
– Pradės perduoti srautą į jūsų aplikaciją

Pirmą kartą sertifikato generavimas gali užtrukti minutę ar dvi. Galite stebėti Traefik logus su `docker logs -f traefik`. Jei viskas gerai, pamatysite pranešimus apie sėkmingą sertifikato gavimą.

Middleware ir papildomos galimybės

Traefik middleware – tai funkcijos, kurios apdoroja užklausas prieš jas pasiekiant jūsų servisą. Galite pridėti autentifikaciją, keisti antraštes, nustatyti rate limiting ir daug daugiau.

Pavyzdžiui, norite pridėti IP whitelist’ą tam tikram servisui? Paprasčiausiai:

„`yaml
labels:
– „traefik.http.middlewares.admin-ipwhitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8”
– „traefik.http.routers.admin.middlewares=admin-ipwhitelist”
„`

Arba norite pridėti papildomus saugumo header’ius? Nėra problemos:

„`yaml
labels:
– „traefik.http.middlewares.security-headers.headers.frameDeny=true”
– „traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true”
– „traefik.http.middlewares.security-headers.headers.browserXssFilter=true”
– „traefik.http.middlewares.security-headers.headers.stsSeconds=31536000”
– „traefik.http.routers.webapp.middlewares=security-headers”
„`

Galite sujungti kelis middleware į vieną grandinę, atskirdami juos kableliais: `middlewares=auth,security-headers,rate-limit`.

Dar viena naudinga funkcija – automatinis redirect’as iš www į non-www (ar atvirkščiai). Tai padaro jūsų svetainę profesionalesnę ir padeda su SEO:

„`yaml
labels:
– „traefik.http.middlewares.www-redirect.redirectregex.regex=^https://www\\.(.+)”
– „traefik.http.middlewares.www-redirect.redirectregex.replacement=https://$${1}”
– „traefik.http.routers.webapp.middlewares=www-redirect”
„`

Problemų sprendimas ir debug’inimas

Net ir su tokiu patogiu įrankiu kaip Traefik, kartais kažkas nutinka ne taip. Štai keletas dažniausių problemų ir jų sprendimų.

**Sertifikatas nesigeneruoja**. Pirmas dalykas – patikrinkite, ar jūsų domenas tikrai nurodo į serverį. Naudokite `nslookup jusudomenas.lt` arba `dig jusudomenas.lt`. Let’s Encrypt turi pasiekti jūsų serverį per 80 portą HTTP challenge’ui atlikti. Taip pat įsitikinkite, kad `acme.json` failas turi teisingas teises (600).

**Traefik nemato konteinerių**. Patikrinkite, ar konteineris yra tame pačiame tinkle kaip Traefik. Taip pat įsitikinkite, kad `traefik.enable=true` label’as yra nustatytas. Kartais padeda Traefik’ą perkrauti: `docker restart traefik`.

**502 Bad Gateway klaida**. Tai dažniausiai reiškia, kad Traefik negali pasiekti jūsų serviso. Patikrinkite, ar teisingai nurodėte portą `loadbalancer.server.port` label’e. Taip pat įsitikinkite, kad jūsų aplikacija tikrai klausosi to porto.

Naudingos komandos debug’inimui:

„`bash
# Traefik logai
docker logs -f traefik

# Patikrinti, kokius router’ius Traefik matė
docker exec traefik traefik healthcheck

# Peržiūrėti visus Docker label’us konteinerio
docker inspect konteinero-vardas | grep -A 20 Labels
„`

Traefik dashboard’as taip pat labai naudingas – ten galite matyti visus router’ius, servisus ir middleware. Tiesiog atidarykite `https://traefik.jusudomenas.lt` (jei sukonfigūravote kaip parodyta aukščiau).

Kai viskas veikia ir ką daryti toliau

Kai jau turite veikiantį Traefik su automatiniais SSL sertifikatais, atsivers daug galimybių. Galite lengvai pridėti naujus servisus – tiesiog sukuriate naują Docker konteinerį su tinkamais labels’ais, ir viskas veikia. Nebereikia prisiminti sudėtingų Nginx konfigūracijų ar rūpintis sertifikatų atnaujinimu.

Keli patarimai produktyviam naudojimui: visada naudokite išorinius tinklus, kaip parodyta pavyzdžiuose. Tai leidžia lengvai valdyti, kurie konteineriai gali bendrauti tarpusavyje. Naudokite Docker Compose failus kiekvienam projektui atskirai – taip lengviau valdyti ir migruoti. Reguliariai darokite `acme.json` failo backup’ą – ten yra visi jūsų sertifikatai.

Jei planuojate naudoti Traefik production’e, apsvarstykite šiuos papildomus dalykus: metrics eksportavimą į Prometheus, centralizuotą logų valdymą su Loki ar ELK stack’u, ir rate limiting middleware kritiniams endpoint’ams. Taip pat verta sukonfigūruoti monitoring’ą, kuris praneštų, jei Traefik nustotų veikti.

Traefik puikiai skalėjasi – galite turėti kelis Traefik instance’us už load balancer’io, naudoti Consul ar etcd dinaminei konfigūracijai, integruoti su Kubernetes. Bet pradžiai to, ką aprašėme šiame straipsnyje, tikrai pakanka net rimtesnėms aplikacijoms.

Pats naudoju Traefik jau kelerius metus ir nė karto nesigailėjau sprendimo pereiti nuo Nginx. Automatiniai SSL sertifikatai, paprastas naujų servisų pridėjimas, puiki integracija su Docker – visa tai daro kasdienį darbą daug malonesnį. O kai kažkas veikia sklandžiai ir nereikalauja nuolatinio dėmesio, lieka daugiau laiko tikram darbui – aplikacijų kūrimui.

Daugiau

Fresh Deno web framework