Sıfırdan Traefik Kurulumu: Laravel Sail + SSL + Subdomain Dashboard
Ahmet Barut
22 Şubat 2026
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.