Traefik v3 rutand trafic HTTPS catre containere Docker cu Docker Compose
Docker

Traefik Docker Compose: reverse proxy v3 cu HTTPS automat

Fiecare aplicatie pe care o gazduiesti singur iti cere ceva: un port al ei, un domeniu al ei si, daca nu vrei ca browserul sa afiseze un avertisment urat, un certificat HTTPS al ei. Fa asta de mana pentru trei sau patru aplicatii si ajungi sa jonglezi cu fisiere de configurare Nginx, timere certbot si o lista de porturi pe care trebuie sa le tii minte. Traefik intoarce problema pe dos. Urmareste Docker, citeste cateva labels pe care le pui pe fiecare container si construieste singur rutarea si certificatele Let’s Encrypt. Pornesti un container cu labels potrivite si, dupa cateva secunde, raspunde pe domeniul lui, prin HTTPS. Il opresti, iar ruta dispare.

In acest tutorial traefik docker compose instalam Traefik v3 ca punct unic de intrare pe un VPS proaspat. Rutam domenii catre containere folosind labels Docker, obtinem certificate gratuite automat, redirectionam orice cerere HTTP catre HTTPS si punem dashboard-ul Traefik in spatele unei parole. Traefik este open source (licenta MIT), dezvoltat de Traefik Labs, cu documentatia pe doc.traefik.io si codul pe github.com/traefik/traefik . Toate comenzile de mai jos se pot copia direct; trebuie doar sa inlocuiesti example.com cu domeniul tau.

Ce este Traefik si de ce ai nevoie de un reverse proxy

Intai cativa termeni, pentru ca restul articolului se sprijina pe ei.

Un port este o usa numerotata a serverului. Browserele bat la usa 80 pentru HTTP simplu si la usa 443 pentru HTTPS. Un singur program poate asculta pe un anumit port la un moment dat, si exact de aceea, cand rulezi mai multe aplicatii web pe acelasi server, ai nevoie de cineva care sa dirijeze traficul.

Un container este o aplicatie impachetata cu tot ce are nevoie, care ruleaza izolat de restul sistemului. Docker este unealta care ruleaza containerele, iar Docker Compose te lasa sa le descrii intr-un fisier YAML, in loc sa tastezi comenzi lungi de fiecare data.

Un reverse proxy este un program care sta in fata aplicatiilor tale. Este singurul care asculta pe porturile 80 si 443. Se uita la domeniul cerut de vizitator (header-ul Host al cererii) si trimite cererea mai departe catre aplicatia potrivita. Aplicatiile tale nu mai trebuie sa fie accesibile direct din internet, iar reverse proxy-ul devine singurul loc in care stau certificatele HTTPS.

Traefik este un reverse proxy gandit pentru containere. Proxy-urile clasice, cum e Nginx, citesc un fisier de configurare pe care il editezi de mana si apoi faci reload. Traefik se conecteaza la API-ul Docker, observa cand containerele pornesc sau se opresc si le citeste labels: mici adnotari cheie=valoare salvate pe container, de exemplu traefik.http.routers.blog.rule=Host(`blog.example.com`). Asta e tot secretul: configuratia de rutare sta langa aplicatia careia ii apartine, in fisierul compose al aplicatiei.

Cele patru cuvinte de retinut: entrypoints, routers, middlewares, services

Documentatia Traefik foloseste peste tot patru concepte. Odata intelese, fiecare label din tutorial devine logic:

  • Entrypoint: un port pe care asculta Traefik. Noi cream doua: web pe portul 80 si websecure pe portul 443.
  • Router: o regula care potriveste cererile primite, de obicei dupa domeniu, de exemplu Host(`whoami.example.com`). Router-ul mai spune si pe ce entrypoint asculta si daca foloseste TLS.
  • Middleware: un pas optional care modifica cererea pe drum: cere o parola, face redirect, adauga headere de securitate.
  • Service: destinatia finala a cererii, adica adresa IP si portul unui container. Cu Docker, Traefik descopera singur IP-ul; tu ii spui doar portul.

Traefik mai face diferenta intre configuratia statica si configuratia dinamica. Configuratia statica descrie cum porneste Traefik insusi (entrypoints, provider-ul Docker, rezolvatorul de certificate); o dam ca parametri in linia de comanda, iar orice schimbare cere repornirea containerului. Configuratia dinamica (routers, middlewares, services) este citita live din labels, fara niciun restart.

Cum ajunge o cerere la containerul tauInternetbrowsereLet's EncryptCA ACMEVPS DreamServer (Debian 13 / Ubuntu 24.04)ufwSSH :22doar servicii de pe hostpublicate de Docker: 80, 443Traefik v3web :80 -> HTTPSwebsecure :443routere + TLSmiddlewaresACMEdocker.sockdoar citireacme.jsoncertificateDoar Traefik publica porturiRetea Docker: proxywhoamiwhoami.example.comblogblog.example.comstatusstatus.example.comaplicatia taapp.example.comaplicatiile nu publica porturi, doar intra in proxyVolume Docker: datele raman la update
Figura 1: Traefik este singurul container cu porturi publicate. Ruteaza fiecare domeniu catre un container din reteaua proxy, iar ufw protejeaza doar serviciile de pe host, cum e SSH (porturile publicate de Docker ocolesc ufw).

Ce ai nevoie

  • Un VPS cu Debian 13 sau Ubuntu 24.04 si o adresa IPv4 publica. 1 vCPU si 1 GB RAM sunt suficiente pentru Traefik plus cateva aplicatii mici. Un VPS KVM este cea mai simpla alegere pentru Docker; intr-un container LXC neprivilegiat, Docker functioneaza doar daca este activat nesting pentru acel container, si chiar si asa unele functii pot face probleme.
  • Un utilizator cu drepturi sudo si acces SSH.
  • Un domeniu la care poti edita inregistrarile DNS. In exemple folosim traefik.example.com pentru dashboard si whoami.example.com pentru o aplicatie de test.
  • O adresa de email pentru contul Let’s Encrypt.
  • Porturile 80 si 443 libere pe host. Daca ai instalat Apache sau Nginx direct pe VPS, opreste-le si dezactiveaza-le inainte (vezi sectiunea de depanare).
  • Un sistem la zi:
sudo apt update && sudo apt full-upgrade -y

Pe Ubuntu, reporneste daca dupa upgrade exista fisierul /var/run/reboot-required. Debian nu creeaza mereu acest fisier, asa ca pe Debian reporneste pur si simplu daca upgrade-ul a instalat un pachet linux-image nou.

Configurare Traefik cu Docker Compose, pas cu pas

Procedura are sapte pasi. Numerele din diagrama corespund titlurilor pasilor de mai jos, ca sa stii mereu unde te afli.

Configurarea Traefik in 7 pasi1234567InstaleziDockerSeteziDNSRetea+ acme.jsonTraefikcompose.yamlParoladashboardPornire+ verificareAplicatiecu labelsNumerele corespund titlurilor Pasul 1 - Pasul 7 de mai jos
Figura 2: Cei sapte pasi ai tutorialului, de la Pasul 1 (instalare Docker) la Pasul 7 (prima aplicatie in spatele Traefik). Fiecare numar corespunde unui titlu de pas.

Pasul 1: Instaleaza Docker Engine si pluginul Compose

Pachetele Docker din depozitele implicite Debian si Ubuntu raman de obicei in urma, asa ca folosim depozitul oficial Docker. Blocul de mai jos merge pe ambele distributii: citeste /etc/os-release ca sa afle daca esti pe Debian sau Ubuntu ($ID) si ce versiune rulezi ($VERSION_CODENAME, adica trixie pe Debian 13 si noble pe Ubuntu 24.04), apoi scrie depozitul in formatul deb822 actual al Docker, in /etc/apt/sources.list.d/docker.sources.

sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/${ID}/gpg" -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/${ID}
Suites: ${VERSION_CODENAME}
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Singura diferenta intre cele doua distributii este URL-ul depozitului (.../linux/debian sau .../linux/ubuntu), iar variabilele se ocupa de asta. Verifica apoi ca ambele componente raspund:

sudo docker version --format '{{.Server.Version}}'
sudo docker compose version

Ar trebui sa vezi versiunea Docker Engine si o linie de tipul Docker Compose version v2.x.x. In tutorial rulam comenzile Docker cu sudo. Poti adauga utilizatorul tau in grupul docker ca sa scapi de sudo, dar tine minte ca apartenenta la acest grup inseamna practic acces root pe masina.

Pasul 2: Indreapta inregistrarile DNS catre VPS

Let’s Encrypt emite un certificat pentru un domeniu doar daca iti poate contacta serverul pe acel nume. Asa ca, inainte sa pornesti Traefik, creeaza cate o inregistrare A (o intrare DNS care leaga un nume de o adresa IPv4) pentru fiecare nume pe care il vei folosi, in panoul DNS al furnizorului de domeniu:

NumeTipValoare
traefik.example.comAadresa IPv4 a VPS-ului
whoami.example.comAadresa IPv4 a VPS-ului

Daca VPS-ul are si IPv6 si adaugi inregistrari AAAA, asigura-te ca IPv6 chiar functioneaza pe server: cand exista o inregistrare AAAA, Let’s Encrypt prefera sa valideze prin IPv6. Verifica de pe VPS ca numele se rezolva corect:

getent ahostsv4 whoami.example.com | head -n 1

Prima coloana trebuie sa fie adresa VPS-ului tau. Daca rezultatul e gol sau arata un IP vechi, mai asteapta cateva minute. Cererea de certificate pentru un nume care inca nu duce la tine este cea mai frecventa cauza de validari esuate, iar esecurile repetate se aduna la limitele Let’s Encrypt.

Pasul 3: Creeaza reteaua proxy si acme.json

Traefik trebuie sa fie in aceeasi retea Docker cu fiecare aplicatie catre care trimite trafic. Cream o retea numita proxy, in afara oricarui proiect compose, ca orice aplicatie viitoare sa se poata conecta la ea:

sudo docker network create proxy

Urmeaza folderul pentru fisierele Traefik. Il tinem in /opt/traefik si il dam in proprietatea utilizatorului tau, ca sa poti edita fisierele fara sudo:

sudo mkdir -p /opt/traefik/letsencrypt
sudo chown -R "$USER": /opt/traefik
touch /opt/traefik/letsencrypt/acme.json
chmod 600 /opt/traefik/letsencrypt/acme.json

acme.json este fisierul in care Traefik pastreaza contul Let’s Encrypt si fiecare certificat impreuna cu cheia lui privata. Traefik refuza sa-l foloseasca daca permisiunile sunt mai largi decat 600 (citire si scriere doar pentru proprietar), de aceea le setam explicit.

Pasul 4: Scrie compose.yaml pentru Traefik

Intai un mic fisier .env. Docker Compose il citeste automat si inlocuieste in fisierul compose variabilele de forma ${VARIABILA}, asa ca datele tale personale nu stau in YAML:

cd /opt/traefik
cat > .env <<'EOF'
ACME_EMAIL=tu@example.com
TRAEFIK_DOMAIN=traefik.example.com
EOF
chmod 600 .env

Inlocuieste ambele valori cu ale tale. Acum creeaza fisierul compose cu nano /opt/traefik/compose.yaml (merge si vechiul nume docker-compose.yml) si lipeste:

services:
  traefik:
    image: traefik:v3
    container_name: traefik
    restart: unless-stopped
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=proxy
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --entrypoints.websecure.http.tls.certresolver=le
      - --certificatesresolvers.le.acme.email=${ACME_EMAIL}
      - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.le.acme.httpchallenge=true
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
      - --api.dashboard=true
      - --log.level=INFO
      - --accesslog=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - proxy
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`${TRAEFIK_DOMAIN}`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=dashboard-auth"
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=${DASHBOARD_AUTH}"

networks:
  proxy:
    external: true

Observa ca nu exista cheia version: la inceput: Docker Compose v2 nu mai are nevoie de ea. Iata ce face fiecare parte:

  • image: traefik:v3: tag-ul versiunii majore curente. Urmeaza toate versiunile v3.x, deci un docker compose pull ulterior aduce corecturi fara sa sari la un viitor v4 cu schimbari incompatibile. Verifica pagina de release-uri Traefik pentru cea mai noua versiune si notele ei; daca vrei control total, fixeaza un tag exact v3.x.
  • providers.docker=true: Traefik citeste containerele si labels din Docker.
  • providers.docker.exposedbydefault=false: un container este ignorat daca nu are traefik.enable=true. Fara asta, orice container pornit ar primi o ruta publica, inclusiv bazele de date.
  • providers.docker.network=proxy: cand un container e in mai multe retele, Traefik foloseste reteaua proxy ca sa ajunga la el.
  • entrypoints.web si entrypoints.websecure: cele doua usi, porturile 80 si 443.
  • entrypoints.web.http.redirections...: orice cerere venita pe portul 80 este redirectionata permanent catre HTTPS. Provocarea HTTP de la Let’s Encrypt functioneaza in continuare, pentru ca Traefik ii raspunde cu prioritate mai mare decat redirectul.
  • entrypoints.websecure.http.tls.certresolver=le: fiecare router de pe portul 443 primeste implicit TLS si un certificat de la rezolvatorul numit le.
  • certificatesresolvers.le.acme.*: configurarea Let’s Encrypt: emailul, locul in care se salveaza certificatele si provocarea HTTP-01 pe entrypoint-ul web (Let’s Encrypt descarca un token prin portul 80 ca sa verifice ca domeniul e al tau).
  • api.dashboard=true: activeaza dashboard-ul web. Nu il expunem niciodata direct, doar prin router-ul protejat definit in labels.
  • ports: singurul loc din intreaga configuratie in care se publica porturi catre internet.
  • /var/run/docker.sock:ro: ii permite lui Traefik sa urmareasca Docker. Despre implicatiile de securitate vorbim mai jos.
  • logging: limiteaza logurile Docker la trei fisiere de 10 MB, ca access log-urile sa nu umple discul. Il setam pe serviciu, deci nu e nevoie sa atingi daemon.json global.
  • labels de pe Traefik creeaza router-ul pentru dashboard: api@internal este serviciul intern al dashboard-ului, iar dashboard-auth este middleware-ul cu parola pe care il completam la pasul urmator.

Sfat: cat timp testezi, adauga - --certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory in lista de comenzi. Serverul de staging emite certificate de test, neacceptate de browsere, dar are limite mult mai generoase, asa ca greselile nu te blocheaza in productie. Inainte de lansare, sterge linia, goleste acme.json (vezi depanarea) si porneste din nou.

Pasul 5: Protejeaza dashboard-ul cu parola

Dashboard-ul arata toate routerele, serviciile si middleware-urile pe care le cunoaste Traefik. Util pentru tine, la fel de util pentru un atacator, asa ca il protejam cu autentificare HTTP basic. Traefik asteapta utilizatorul si parola criptata in format htpasswd. Instaleaza unealta care o genereaza (pachetul se numeste apache2-utils atat pe Debian, cat si pe Ubuntu) si adauga rezultatul in .env:

sudo apt install -y apache2-utils
cd /opt/traefik
echo "DASHBOARD_AUTH='$(htpasswd -nB admin)'" >> .env

htpasswd iti cere parola de doua ori si produce o linie de forma admin:$2y$05$Qe.... Optiunea -B foloseste bcrypt, un hash lent intentionat, rezistent la brute force. Uita-te acum in fisier:

cat .env

Ultima linie trebuie sa arate ca DASHBOARD_AUTH='admin:$2y$05$...', intre ghilimele simple. Ele conteaza: hash-ul contine caractere $, iar intre ghilimele simple Compose le ia ca atare, in loc sa le trateze ca variabile. Daca pui vreodata hash-ul direct in compose.yaml, trebuie sa dublezi fiecare $ ca $$.

Pasul 6: Porneste Traefik si verifica certificatele

E momentul sa pornim proxy-ul:

cd /opt/traefik
sudo docker compose up -d
sudo docker compose ps

Compose descarca imaginea si porneste containerul. Rezultatul lui ps ar trebui sa il arate pornit, cu ambele porturi publicate (scurtat aici):

NAME      IMAGE        SERVICE   STATUS         PORTS
traefik   traefik:v3   traefik   Up 8 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp

Imediat ce vede router-ul dashboard-ului, Traefik cere de la Let’s Encrypt un certificat pentru traefik.example.com. Urmareste logurile ca sa vezi daca a reusit:

sudo docker compose logs -f traefik

Cu log.level=INFO, Traefik este destul de tacut; problemele apar ca linii marcate ERR, de multe ori cu mesajul Unable to obtain ACME certificate. Liniile de access log apar pe masura ce vin cereri. Apasa Ctrl+C ca sa iesi din urmarire; containerul ramane pornit.

Deschide acum in browser https://traefik.example.com/dashboard/ (pastreaza slash-ul de la final). Ar trebui sa vezi lacatul, o fereastra de login si, dupa ce introduci admin si parola, dashboard-ul. Acelasi lucru il poti confirma si din linia de comanda:

curl -sI https://traefik.example.com/dashboard/ | head -n 1
curl -sI -u admin https://traefik.example.com/dashboard/ | head -n 1

Prima comanda ar trebui sa afiseze HTTP/2 401: TLS functioneaza (altfel curl s-ar opri cu o eroare de certificat) si se cere parola. A doua iti cere parola si ar trebui sa afiseze HTTP/2 200.

Pasul 7: Adauga o aplicatie cu labels Docker

Acum partea care face Traefik placut de folosit. Instalam traefik/whoami, un server web minuscul care afiseaza detalii despre fiecare cerere, in folderul lui si in proiectul compose al lui, complet separat de Traefik:

sudo mkdir -p /opt/whoami
sudo chown "$USER": /opt/whoami
cd /opt/whoami
nano compose.yaml

Lipeste:

services:
  whoami:
    image: traefik/whoami
    container_name: whoami
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls.certresolver=le"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"

networks:
  proxy:
    external: true

Folosim imaginea fara tag (adica :latest) pentru ca e un container de test pe care il stergi oricand; pentru aplicatii reale prefera un tag de versiune. Pe rand, labels spun: Traefik, ocupa-te de acest container; creeaza un router numit whoami care potriveste domeniul whoami.example.com; asculta pe entrypoint-ul HTTPS; ia certificat de la le (e deja implicit din Pasul 4, dar scris explicit fisierul se explica singur); si trimite traficul pe portul 80 din interiorul containerului. Observa ce lipseste: nu exista sectiunea ports:. Containerul este accesibil doar prin Traefik, pe reteaua proxy.

Porneste-l si testeaza atat HTTP, cat si HTTPS:

sudo docker compose up -d
curl -sI http://whoami.example.com | grep -iE '^(HTTP|location)'
curl -s https://whoami.example.com

Primul test ar trebui sa arate un redirect permanent catre HTTPS, de exemplu:

HTTP/1.1 308 Permanent Redirect
Location: https://whoami.example.com/

In functie de versiunea Traefik, poti vedea 301 Moved Permanently in loc de 308; pentru browsere ambele inseamna “foloseste mereu HTTPS”. Al doilea test intoarce ceva asemanator cu:

Hostname: 3f2a1c9d8e7b
IP: 127.0.0.1
IP: 172.18.0.3
RemoteAddr: 172.18.0.2:41234
GET / HTTP/1.1
Host: whoami.example.com
X-Forwarded-For: 203.0.113.25
X-Forwarded-Proto: https
X-Real-Ip: 203.0.113.25

X-Forwarded-Proto: https si X-Forwarded-For (IP-ul tau) dovedesc ca cererea a trecut prin Traefik. In dashboard, la HTTP Routers, vei vedea acum whoami@docker cu un scut TLS langa el. Fara reload, fara restart de Traefik: a observat singur containerul nou.

Mai multe site-uri: tiparul de labels de retinut

Orice aplicatie noua urmeaza aceleasi cinci reguli: intra in reteaua proxy, are traefik.enable=true, primeste un router cu nume unic si o regula Host(), sta pe websecure cu rezolvatorul le si ii spune lui Traefik portul pe care asculta aplicatia in container. Iata o aplicatie reala, Uptime Kuma, care asculta pe portul 3001:

services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    restart: unless-stopped
    volumes:
      - kuma_data:/app/data
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.kuma.rule=Host(`status.example.com`)"
      - "traefik.http.routers.kuma.entrypoints=websecure"
      - "traefik.http.routers.kuma.tls.certresolver=le"
      - "traefik.http.services.kuma.loadbalancer.server.port=3001"

volumes:
  kuma_data:

networks:
  proxy:
    external: true

Ca de obicei, verifica release-urile proiectului pentru cel mai nou tag major. WebSockets, folosite de Uptime Kuma pentru dashboard-ul live, trec prin Traefik fara configurare suplimentara.

Cateva variatii de care vei avea nevoie mai devreme sau mai tarziu:

  • Mai multe domenii pe aceeasi aplicatie: Host(`example.com`) || Host(`www.example.com`). Traefik cere un singur certificat care acopera ambele nume.
  • Aplicatii cu baza de date: pune in proxy doar containerul web. Baza de date intra intr-o a doua retea, privata, comuna cu aplicatia, si nu atinge niciodata proxy. Un fragment:
services:
  app:
    networks: [proxy, internal]
  db:
    image: postgres:17
    networks: [internal]

networks:
  proxy:
    external: true
  internal:
  • Headere de securitate reutilizabile: adauga aceste labels pe containerul Traefik din /opt/traefik/compose.yaml si ruleaza acolo sudo docker compose up -d ca sa fie recreat:
      - "traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true"
      - "traefik.http.middlewares.secure-headers.headers.referrerPolicy=strict-origin-when-cross-origin"

Orice aplicatie le poate folosi apoi cu traefik.http.routers.kuma.middlewares=secure-headers@docker. Ai grija cu stsSeconds (HSTS): odata ce un browser il vede, refuza HTTP simplu pentru acel domeniu timp de un an, deci activeaza-l doar cand HTTPS merge sigur.

Cat consuma Traefik?

Traefik este scris in Go si vine ca un singur binar. Foloseste mai multa memorie decat un Nginx simplu, pentru ca tine in memorie starea Docker, tabelele de rutare si managerul de certificate, dar diferenta conteaza rar pe un VPS modern.

RAM aproximativ in repaus pentru reverse proxy5 site-uri HTTPS pe un VPS mic, valori aproximativeNginx + certbot~10 MBHAProxy~15 MBCaddy~35 MBTraefik v3~50 MB0102030405060RAM in MB (aproximativ, in repaus)Reverse proxyDoar ordin de marime, valorile reale variaza cu traficul si versiunea
Figura 3: Memoria aproximativa in repaus pentru cateva reverse proxy-uri uzuale, cu cinci site-uri HTTPS. Traefik foloseste mai mult decat Nginx, dar circa 50 MB inseamna putin chiar si pe un VPS de 1 GB.

Ce cumperi cu acei megabytes in plus este timp: un site nou inseamna cateva labels in fisierul aplicatiei, in loc de un server block nou, o rulare certbot si un reload. Sub trafic real, memoria creste odata cu numarul de conexiuni deschise la toate proxy-urile din grafic, asa ca trateaza cifrele ca ordin de marime, nu ca benchmark. In repaus, consumul de CPU este neglijabil pentru toate.

Depanare si greseli frecvente

404 page not found de la Traefik. Cererea a ajuns la Traefik, dar niciun router nu se potriveste. De obicei lipseste traefik.enable=true, domeniul din Host() are o greseala sau containerul aplicatiei nu ruleaza. Deschide dashboard-ul, uita-te la HTTP Routers si cauta erori cu sudo docker compose logs traefik | grep -i err in /opt/traefik.

Bad Gateway (502) sau Gateway Timeout (504). Un router s-a potrivit, dar Traefik nu poate vorbi cu containerul. Fie label-ul de port e gresit (trebuie sa fie portul pe care asculta aplicatia in interiorul containerului), fie containerul nu e in reteaua proxy. Verifica cu:

sudo docker inspect whoami --format '{{json .NetworkSettings.Networks}}'

Rezultatul trebuie sa contina "proxy".

Browserul avertizeaza despre un certificat numit TRAEFIK DEFAULT CERT. Traefik nu a putut obtine certificatul Let’s Encrypt si a folosit certificatul lui auto-semnat. Logurile spun de ce: DNS-ul nu duce inca la VPS, portul 80 nu e accesibil, o inregistrare AAAA gresita sau o limita atinsa dupa prea multe incercari esuate. Rezolva cauza, apoi ruleaza sudo docker compose restart traefik.

permissions 644 for /letsencrypt/acme.json are too open. Ruleaza chmod 600 /opt/traefik/letsencrypt/acme.json si reporneste Traefik.

client version 1.24 is too old in loguri. Rulezi o imagine Traefik mai veche decat schimbarile de API din versiunile recente Docker Engine. Descarca imaginea v3 curenta: sudo docker compose pull && sudo docker compose up -d.

Dashboard-ul cere parola la nesfarsit. Hash-ul s-a stricat, de obicei pentru ca semnele $ au fost interpretate ca variabile. Verifica ce a primit de fapt Traefik:

sudo docker inspect traefik --format '{{ index .Config.Labels "traefik.http.middlewares.dashboard-auth.basicauth.users" }}'

Trebuie sa inceapa cu admin:$2y$. Daca nu, corecteaza ghilimelele simple din .env (Pasul 5) si ruleaza din nou sudo docker compose up -d.

bind: address already in use pe portul 80 sau 443. Pe host ruleaza alt server web. Gaseste-l si dezactiveaza-l (numele serviciilor sunt aceleasi pe Debian si Ubuntu):

sudo ss -tlnp | grep -E ':(80|443) '
sudo systemctl disable --now nginx    # sau apache2

Trecerea de la staging la productie. Sterge linia caserver din compose.yaml, apoi goleste certificatele de test salvate, ca Traefik sa ceara certificate reale:

cd /opt/traefik
sudo docker compose down
sudo truncate -s 0 letsencrypt/acme.json
sudo docker compose up -d

truncate pastreaza permisiunile 600. Reteaua externa proxy nu este stearsa de docker compose down.

Note de securitate

  • Socket-ul Docker inseamna acces root. Cine controleaza containerul Traefik poate controla Docker si, prin el, tot host-ul. Optiunea :ro opreste doar scrierea in fisierul socket, nu si apelurile catre API. Tine Traefik la zi, nu activa niciodata --api.insecure si, pe servere sensibile, ia in calcul un container proxy pentru socket-ul Docker care permite doar endpoint-uri de citire.
  • Docker ocoleste ufw. Porturile publicate cu ports: sunt gestionate de regulile de firewall ale Docker, inainte ca ufw sa vada pachetul. De aceea, in aceasta configuratie, containerele aplicatiilor nu publica nimic. Daca ai nevoie de un port pentru depanare locala, leaga-l doar de localhost: "127.0.0.1:8080:80".
  • Foloseste ufw pentru serviciile de pe host. Debian 13 nu vine cu ufw instalat; Ubuntu 24.04 il are instalat, dar inactiv. Permite SSH inainte sa-l activezi, altfel te blochezi singur afara (daca SSH asculta pe alt port, permite acel port):
sudo apt install -y ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Regulile pentru 80 si 443 mai mult documenteaza intentia, pentru ca Docker gestioneaza el insusi acele porturi.

  • Restrictioneaza si mai mult dashboard-ul cu o lista de IP-uri permise. Adauga primul label de mai jos pe Traefik si inlocuieste label-ul middlewares existent cu al doilea (pune IP-ul tau):
      - "traefik.http.middlewares.dashboard-ip.ipallowlist.sourcerange=203.0.113.10/32"
      - "traefik.http.routers.dashboard.middlewares=dashboard-ip,dashboard-auth"

Sau sterge complet labels pentru router-ul dashboard-ului, daca nu ai nevoie de el.

  • acme.json si .env sunt secrete. Contin chei private si hash-ul parolei. Fa backup la folder si copiaza arhiva in afara serverului:
sudo tar czf ~/traefik-backup.tar.gz -C /opt traefik
sudo chown "$USER": ~/traefik-backup.tar.gz

Fiind creata cu sudo, arhiva apartine lui root pana faci chown; dupa aceea o poti copia cu scp pe calculatorul tau. Pastreaz-o intr-un loc privat.

  • Actualizeaza regulat. Citeste notele de release, apoi:
cd /opt/traefik
sudo docker compose pull
sudo docker compose up -d

Deci, merita Traefik pe VPS-ul tau?

Daca rulezi mai mult de o aplicatie in containere pe acelasi server, da. Configurezi Traefik o singura data, iar de acolo inainte fiecare serviciu nou are nevoie doar de cinci labels in propriul fisier compose: HTTPS, reinnoiri, redirecturi si rutare vin automat. Daca ai un singur site static, un Nginx simplu sau Caddy sunt mai simple; daca configuratia ta traieste in afara Docker, un proxy clasic se poate potrivi mai bine.

Poti urma acest tutorial pe un VPS din data center-ul nostru din Romania in cateva minute. Iar daca preferi ca altcineva sa construiasca si sa intretina proxy-ul, certificatele si containerele din spatele lui, echipa noastra de administrare servere le poate configura pentru tine si le tine la zi.

Intrebari frecvente

Poate Traefik sa emita certificate wildcard?

Da, dar doar prin provocarea DNS-01, care cere acces prin API la furnizorul tau de DNS. Provocarea HTTP folosita in tutorial emite cate un certificat pentru fiecare set de nume, ceea ce ajunge pentru majoritatea configuratiilor. Documentatia Traefik listeaza furnizorii DNS suportati si variabilele lor.

Trebuie ca aplicatiile sa fie in acelasi fisier compose cu Traefik?

Nu, si e mai bine sa fie separate. Atata timp cat o aplicatie intra in reteaua externa proxy si are labels corecte, Traefik o gaseste, indiferent din ce folder sau proiect compose vine.

Cum se reinnoiesc certificatele?

Automat. Traefik verifica certificatele salvate si le reinnoieste cu mult inainte sa expire, apoi le pastreaza pe cele noi in acme.json. Treaba ta este doar sa pastrezi fisierul persistent si porturile 80 si 443 accesibile.

Traefik, Caddy sau Nginx Proxy Manager?

Toate trei sunt bune. Caddy se configureaza printr-un Caddyfile si e mai usor; Nginx Proxy Manager iti da o interfata web peste Nginx. Traefik castiga cand vrei ca rutarea sa fie definita langa fiecare aplicatie, ca cod, si descoperita automat din Docker.

Avem Incredere & Suntem Membri

Suntem membri ai principalelor organizatii de infrastructura internet.

RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX RIPE NCC MANRS PeeringDB RoTLD DSIX SBIX 4IXP LOCIX Euro-IX