Sıfırdan Traefik Kurulumu: Laravel Sail + SSL + Subdomain Dashboard

AB

Ahmet Barut

22 Şubat 2026

4 dakika okuma
Paylaş:

Deploy etmek artık “Nginx yükle, config yaz, Certbot kur” demek değil. Modern dünyada router’ı metadatalar belirler, SSL otomatik gelir, container iç portu dış donanıma değil, reverse proxy’e bağlanır.

Bu yazıda: ✅ Traefik’i Docker ile kurduk ✅ Let’s Encrypt sertifikasını otomatik aldık ✅ Subdomain dashboard yapılandırdık ✅ En yaygın hataları beraber çözdük

İster production ister staging. Adım adım ilerliyoruz.


📌 1) Mimari – Neden Traefik?

Eski yaklaşımlar:

Sunucu
  └─ Nginx
      ├─ Uygulama
      └─ SSL

Yeni yaklaşım:

Traefik
   ├─ Router
   ├─ SSL (Let's Encrypt)
   └─ Backend Container

Uygulama
   └─ Docker

Traefik’in getirisi:

  • Let’s Encrypt otomatik SSL
  • Label’larla routing
  • Docker üzerinden metadata kontrol

📌 2) DNS – Temel Kontrol

İki kayıt mutlaka olmalı:

ratlog.info → SUNUCU_IP
traefik.ratlog.info → SUNUCU_IP

DNS yayılmadan sertifika alınamaz!


📌 3) Traefik + Laravel Docker Compose (Çalışan Hali)

Aşağıdaki yapı son halimizdir:

services:
  traefik:
    image: traefik:v3
    command:
      - "--api.dashboard=true"
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      
      # HTTP → HTTPS
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"

      # LetsEncrypt
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.email=${ACME_EMAIL}"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"

    ports:
      - "80:80"
      - "443:443"

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik-letsencrypt:/letsencrypt

    networks:
      - traefik-public

    labels:
      - "traefik.enable=true"

      ## Dashboard Router
      - "traefik.http.routers.traefik.rule=Host(`traefik.ratlog.info`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.tls=true"
      - "traefik.http.routers.traefik.tls.certresolver=myresolver"

      ## Auth
      - "traefik.http.routers.traefik.middlewares=dashboard-auth"
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=${TRAEFIK_DASHBOARD_AUTH}"

  laravel.test:
    build:
      context: .
      dockerfile: docker/8.5/Dockerfile
    networks:
      - traefik-public
      - sail
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.ratlog.rule=Host(`ratlog.info`)"
      - "traefik.http.routers.ratlog.entrypoints=websecure"
      - "traefik.http.routers.ratlog.tls=true"
      - "traefik.http.routers.ratlog.tls.certresolver=myresolver"
      - "traefik.http.services.ratlog.loadbalancer.server.port=8000"

volumes:
  traefik-letsencrypt:

networks:
  traefik-public:
  sail:

⚠️ 4) Gözden Kaçanlar (Yaptığımız Hatalar)

❌ DNS Kaydı Eksik

Let’s Encrypt iki domain doğruladı: ratlog.info OK www.ratlog.info NXDOMAIN → Sertifika alınamadı.

Çözüm: ya DNS’e www ekle ya config’ten kaldır.


❌ Yanlış Port

Sail container içinde Laravel 8000’de çalışıyordu. Traefik loadbalancer portu 80 diye tanımlanmış → 502 Bad Gateway!

Doğru port:

traefik.http.services.ratlog.loadbalancer.server.port=8000

❌ BasicAuth Hash

.env’de hatalı yazım:

Yanlış:

"ratlog:$apr1$..."

Doğru:

ratlog:$$apr1$$...  # Her $ → $$

Traefik $ karakterlerini kaçışla okumayı sever.


🧪 5) Sertifika (ACME) Nasıl Çalıştı?

ACME HTTP challenge şöyle işler:

/.well-known/acme-challenge/...

Traefik bunu otomatik expose eder. Ama DNS çözülemezse sertifika alınamaz.

Log’ta şunu gördük:

DNS problem: NXDOMAIN looking up A for www.ratlog.info

Bu kurtarıcı olmuştur:

docker compose down -v
docker volume rm traefik-letsencrypt
docker compose up -d

Temiz sertifika başarıyla alındı.


🔐 6) Dashboard’a Erişim

Dashboarda BasicAuth ekledik:

TRAEFIK_DASHBOARD_AUTH=ratlog:$$apr1$$HASH

Hash üretmek için:

htpasswd -nbB ratlog SIFRE | sed -e 's/\$/\$\$/g'

Sonra:

https://traefik.ratlog.info

User/Pass girilince panel açıldı.``


📌 7) Neden Traefik?

Modern ops’ta manual config en büyük düşman:

Eski Yol Yeni Yol
Manuel Nginx Traefik label’lar
Certbot elle ACME otomatik
Server block Container metadata
Reload restart Sıfır downtime

Traefik bir metadata motorudur. Docker label → Router → Middleware → SSL → Routing


🎯 8) Sonuç

Bu yapı ile:

  • Full HTTPS
  • Otomatik sertifika
  • Subdomain dashboard
  • BasicAuth güvenliği
  • Laravel Sail integration

hepsi bir arada çalışır.

Sorun yaşadık, öğrendik, düzelttik.

Ve artık deploy ilişkisi ezber değil: log + DNS + routing mantığı + container port = çözüm.


💡 Son Söz

Deploy, sadece “yapılandırma” değil, “anlamak”tır. Hatalar seni yavaşlatmaz; seni eğitir.

PushBrief tarzında net söyleyeyim:

Sorun, sen klavyeyi doğru kullandığında değil, sistemi doğru anladığında çözülür.

Etiketler

#traefik #server #docker