Takip et

Traefik’i Ubuntu 18.04 Üzerinde Docker Konteynerleri İçin Ters Proxy Olarak Kullanma Rehberi

Traefik’i Ubuntu 18.04 Üzerinde Docker Konteynerleri İçin Ters Proxy Olarak Kullanma Rehberi Bu makale, modern web uygulamalarının dağıtımın

Traefik’i Ubuntu 18.04 Üzerinde Docker Konteynerleri İçin Ters Proxy Olarak Kullanma Rehberi

Bu makale, modern web uygulamalarının dağıtımında ve yönetiminde merkezi bir rol oynayan ters proxy kavramını, özellikle Traefik’in Docker konteynerleri ile entegrasyonunu ve Ubuntu 18.04 işletim sistemi üzerindeki kurulumunu detaylı bir şekilde ele almaktadır. Geliştiriciler ve sistem yöneticileri için dinamik, otomatik SSL sertifikası yönetimi ve kolay yapılandırma imkanları sunan Traefik, Docker ekosistemiyle mükemmel bir uyum içinde çalışarak uygulama dağıtım süreçlerini büyük ölçüde basitleştirir.

Giriş: Ters Proxy, Traefik ve Dinamik Yapılandırma

Günümüzün mikroservis tabanlı mimarilerinde ve konteynerize edilmiş uygulamalarında, gelen trafiği doğru servislere yönlendirmek, yük dengelemesi yapmak, SSL/TLS sonlandırması gerçekleştirmek ve güvenlik politikaları uygulamak kritik öneme sahiptir. İşte tam bu noktada bir ters proxy devreye girer. Ters proxy, istemciden gelen istekleri alır ve bu istekleri arkasındaki bir veya daha fazla sunucuya (bu durumda Docker konteynerlerine) iletir. Bu sayede, arka uç servislerinin doğrudan internete açık olması engellenir, güvenlik artırılır ve karmaşık dağıtım senaryoları yönetilebilir hale gelir.

Traefik, “Edge Router” olarak bilinen modern bir ters proxy ve yük dengeleyici çözümüdür. Özellikle Docker, Kubernetes, Swarm gibi dinamik orkestrasyon ortamlarıyla entegre çalışmak üzere tasarlanmıştır. Traefik’in en büyük avantajlarından biri, yapılandırma dosyalarını manuel olarak düzenlemek yerine, orkestrasyon platformlarından (örneğin Docker etiketleri) bilgileri doğrudan çekerek kendini otomatik olarak yapılandırmasıdır. Bu dinamik yapılandırma yeteneği, yeni bir konteyner başlatıldığında veya durdurulduğunda Traefik’in anında güncellenmesini sağlar, böylece manuel müdahaleye gerek kalmaz. Ayrıca, Let’s Encrypt ile entegrasyonu sayesinde otomatik SSL sertifikası yönetimi sunarak HTTPS’i uygulamalarınıza kolayca entegre etmenizi sağlar.

Neden Traefik ve Docker ikilisi tercih edilmeli? Çünkü Docker, uygulamaları izole edilmiş konteynerler içinde paketleyerek taşınabilirlik ve tutarlılık sağlarken, Traefik bu konteynerlere gelen trafiği akıllıca yönetir. Bir uygulama konteynerini başlattığınızda, Traefik etiketlerini kullanarak bu uygulamaya bir alan adı atayabilir, SSL sertifikası sağlayabilir ve hatta trafik kurallarını belirleyebilirsiniz. Tüm bunlar, ek bir yapılandırma dosyası değişikliği yapmadan gerçekleşir. Ubuntu 18.04 ise, sunucu tarafında yaygın olarak kullanılan, stabil ve iyi belgelenmiş bir işletim sistemi olduğu için bu rehber için ideal bir temel sunmaktadır. Bu makalede, Traefik’i Ubuntu 18.04 üzerinde Docker konteynerleriniz için nasıl kuracağınızı, yapılandıracağınızı ve kullanacağınızı adım adım göstereceğiz.

Ön Gereksinimler

Traefik’i Ubuntu 18.04 üzerinde Docker konteynerleriyle kullanmaya başlamadan önce bazı temel ön gereksinimlerin karşılandığından emin olmalıyız. Bu adımlar, sorunsuz bir kurulum ve yapılandırma süreci için zemin hazırlayacaktır.

Ubuntu 18.04 Sunucusu

Bu rehber, Ubuntu 18.04 LTS (Bionic Beaver) işletim sistemi yüklü bir sunucu üzerinde çalıştırılmak üzere tasarlanmıştır. Eğer farklı bir Ubuntu sürümü kullanıyorsanız, komutlarda veya paket adlarında küçük farklılıklar olabilir. Sunucunuza SSH erişiminizin olması ve sudo yetkilerine sahip bir kullanıcı hesabınızın bulunması gerekmektedir.

SSH Erişimi ve Sudo Yetkileri

Sunucunuza uzaktan bağlanabilmek için SSH (Secure Shell) erişimine sahip olmanız şarttır. Ayrıca, sistem çapında değişiklikler yapacağımız için, kullanacağınız hesabın sudo komutuyla yönetici yetkilerini kullanabilmesi gerekmektedir. Genellikle, yeni bir Ubuntu sunucusu kurduğunuzda oluşturduğunuz ilk kullanıcı hesabı bu yetkilere sahip olur.

Docker ve Docker Compose Kurulumu

Traefik ve yöneteceği uygulamalar Docker konteynerleri olarak çalışacağı için, Docker Engine ve Docker Compose’un sunucunuzda kurulu olması gerekmektedir. Docker Engine, konteynerleri çalıştırmak için temel platformu sağlarken, Docker Compose birden fazla Docker konteynerini tanımlayan ve çalıştıran araçtır. Bu rehberde, Traefik’i ve örnek uygulamaları Docker Compose ile yöneteceğiz.

Alan Adı ve DNS Ayarları

Traefik’i ters proxy olarak kullanmak için, internet üzerinden erişilebilir bir alan adına ihtiyacınız olacaktır. Bu alan adını (örneğin example.com) veya bir alt alan adını (örneğin app.example.com) Traefik’in yönetecek olduğu uygulamalara yönlendireceksiniz. Alan adı sağlayıcınızın kontrol panelinden, sunucunuzun genel IP adresine işaret eden bir A kaydı veya CNAME kaydı oluşturmanız gerekecektir. Let’s Encrypt ile otomatik SSL sertifikaları alabilmek için bu adım zorunludur.

* A Kaydı: example.com veya www.example.com gibi ana alan adlarını doğrudan sunucunuzun IP adresine yönlendirir.
* CNAME Kaydı: Bir alt alan adını (örneğin app.example.com) başka bir alan adına veya A kaydına yönlendirir.
Wildcard Sertifikalar İçin DNS Challenge: Eğer .example.com gibi wildcard sertifikalar kullanmayı planlıyorsanız, Let’s Encrypt’in DNS challenge yöntemini kullanmanız gerekecektir. Bu, alan adı sağlayıcınızın API’si aracılığıyla DNS kayıtlarını otomatik olarak doğrulamasını gerektirir.

Güvenlik Duvarı Ayarları (UFW)

Sunucunuzun güvenliğini sağlamak için güvenlik duvarını yapılandırmanız önemlidir. Ubuntu’da yaygın olarak kullanılan güvenlik duvarı aracı UFW (Uncomplicated Firewall) olarak bilinir. Traefik’in düzgün çalışabilmesi için 80 (HTTP) ve 443 (HTTPS) portlarının dışarıdan erişime açık olması gerekmektedir. Ayrıca, SSH erişiminiz için 22 numaralı portun da açık olması önemlidir.

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # Veya 80/tcp ve 443/tcp
sudo ufw enable
sudo ufw status

Bu ön gereksinimleri tamamladıktan sonra, Traefik kurulumuna ve yapılandırmasına geçmeye hazır olacaksınız.

Docker ve Docker Compose Kurulumu

Traefik’i konteynerize edilmiş bir uygulama olarak çalıştıracağımız ve diğer uygulamalarımızı da Docker konteynerleri olarak dağıtacağımız için, sunucunuzda Docker ve Docker Compose’un kurulu olması hayati önem taşır. İşte Ubuntu 18.04 üzerinde bu bileşenleri kurmak için adımlar:

Docker Engine Kurulumu

İlk olarak, mevcut paket listesini güncelleyelim ve gerekli bağımlılıkları yükleyelim:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

Ardından, Docker’ın resmi GPG anahtarını sisteminize ekleyelim:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker deposunu APT kaynaklarına ekleyelim:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Paket listesini tekrar güncelleyelim ve Docker Engine’i kuralım:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

Docker servisinin çalıştığını doğrulayalım:

sudo systemctl status docker

Çıktıda active (running) ibaresini görmelisiniz.

Kullanıcıyı docker Grubuna Ekleme

sudo kullanmadan Docker komutlarını çalıştırabilmek için, mevcut kullanıcınızı docker grubuna eklemeniz önerilir. Bu, Docker ile çalışırken her seferinde sudo yazma zahmetinden kurtarır.

sudo usermod -aG docker ${USER}

Bu komutu çalıştırdıktan sonra, değişikliğin etkili olması için oturumu kapatıp tekrar açmanız (veya sunucuyu yeniden başlatmanız) gerekmektedir. Oturumunuzu yeniden başlattıktan sonra, docker run hello-world komutunu sudo kullanmadan çalıştırarak kurulumu test edebilirsiniz.

Docker Compose Kurulumu

Docker Compose, Docker’ın resmi GitHub deposundan indirilen bir ikili dosyadır. Kurulum için aşağıdaki adımları izleyin:

En son kararlı Docker Compose sürümünü indirin. (Sürüm numarasını kontrol etmek için [Docker Compose GitHub Releases](https://github.com/docker/compose/releases) sayfasını ziyaret edebilirsiniz.)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

İndirilen dosyaya yürütme izinleri verin:

sudo chmod +x /usr/local/bin/docker-compose

Docker Compose kurulumunu doğrulayın:

docker-compose --version

Çıktıda yüklü olan Docker Compose sürümünü görmelisiniz, örneğin docker-compose version 1.29.2, build 5becea4c.

Artık Docker ve Docker Compose sunucunuzda başarıyla kurulu olduğuna göre, Traefik’i yapılandırmaya başlayabiliriz.

Traefik Kurulumu ve Temel Yapılandırma

Traefik’i Docker konteynerleri için ters proxy olarak kurmanın en yaygın ve önerilen yolu, onu bir Docker konteyneri olarak Docker Compose ile çalıştırmaktır. Bu yaklaşım, Traefik’in kendi yaşam döngüsünü Docker tarafından yönetilmesini sağlar ve diğer uygulamalarınızla tutarlı bir dağıtım modeli sunar.

Traefik İçin docker-compose.yml Dosyası Oluşturma

Traefik’in yapılandırmasını ve çalışmasını tanımlayacak bir docker-compose.yml dosyası oluşturalım. Bu dosya, Traefik’in hangi portları dinleyeceğini, Docker ile nasıl etkileşim kuracağını ve Let’s Encrypt sertifikalarını nasıl yöneteceğini belirleyecektir.

Öncelikle, Traefik için bir dizin oluşturalım ve içine girelim:

mkdir traefik && cd traefik

Şimdi docker-compose.yml dosyasını oluşturalım ve düzenleyelim:

nano docker-compose.yml

Dosyanın içeriği aşağıdaki gibi olmalıdır:

version: '3.8'

services:
  traefik:
    image: traefik:v2.9 # Traefik'in en son kararlı sürümünü kullanın
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - web
    ports:
      - "80:80"   # HTTP istekleri için
      - "443:443" # HTTPS istekleri için
      # Dashboard'a dışarıdan erişim için portu açabilirsiniz, ancak güvenlik önlemleri almalısınız
      # - "8080:8080" # Traefik Dashboard için (yalnızca dahili ağda veya güvenli bir şekilde erişin)
    volumes:
      - /etc/localtime:/etc/localtime:ro # Zaman senkronizasyonu
      - /var/run/docker.sock:/var/run/docker.sock:ro # Docker API'sine erişim
      - ./traefik.yml:/etc/traefik/traefik.yml:ro # Ana Traefik yapılandırma dosyası
      - ./acme.json:/etc/traefik/acme.json # Let's Encrypt sertifikaları için
    labels:
      # Traefik Dashboard için etiketler
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
      - "traefik.http.routers.traefik-dashboard.rule=Host(traefik.example.com)" # Kendi alan adınızı kullanın
      - "traefik.http.routers.traefik-dashboard.tls=true"
      - "traefik.http.routers.traefik-dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      # Dashboard'a erişimi şifre ile koruyun (user:hashed_password)
      # 'htpasswd -nb user password' komutuyla oluşturabilirsiniz
      # Örneğin: traefikuser:$apr1$D9f2/q.S$QxR8C0o/y1.W4uE0m.B2Y/
      - "traefik.http.routers.traefik-dashboard.middlewares=traefik-auth"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=traefikuser:$$apr1$$D9f2/q.S$$QxR8C0o/y1.W4uE0m.B2Y/" # Kendi kullanıcı adı/şifrenizi kullanın
      # HTTP'den HTTPS'e yönlendirme middleware'ı
      - "traefik.http.routers.http-catchall.rule=HostRegexp({host:.+})"
      - "traefik.http.routers.http-catchall.entrypoints=web"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

networks:
  web:
    external: true # Traefik'in diğer konteynerlerle iletişim kuracağı ağ

Açıklamalar:

* image: traefik:v2.9: Traefik’in belirli bir sürümünü kullanırız. v2.x serisi için etiketler (labels) ile yapılandırma önemlidir.
* ports: 80 (HTTP) ve 443 (HTTPS) portlarını dışarıya açarız. Bu portlar üzerinden gelen tüm web trafiğini Traefik dinleyecektir.
* volumes:
* /var/run/docker.sock:/var/run/docker.sock:ro: Traefik’in Docker API’sine salt okunur erişim sağlaması için gereklidir. Bu sayede Traefik, yeni konteynerleri ve onların etiketlerini algılayabilir.
* ./traefik.yml:/etc/traefik/traefik.yml:ro: Traefik’in ana yapılandırma dosyasını belirtiriz.
* ./acme.json:/etc/traefik/acme.json: Let’s Encrypt tarafından alınan SSL sertifikalarının saklandığı dosyadır. Bu dosyanın izinleri önemlidir (chmod 600 acme.json).
* networks: Traefik’in diğer uygulamaların konteynerleriyle iletişim kurabilmesi için web adında bir Docker ağı tanımlarız. Bu ağ, diğer uygulamaların da bağlanacağı bir köprü görevi görecektir. external: true olarak işaretlenmesi, bu ağın Docker Compose tarafından değil, manuel olarak veya başka bir docker-compose.yml tarafından oluşturulacağı anlamına gelir.
* labels: Traefik’in kendisini yapılandırması için kullanılan etiketlerdir. Burada Traefik Dashboard’u için bir router tanımlanır, Let’s Encrypt ile SSL sağlanır ve basic authentication (temel kimlik doğrulama) ile korunur. traefikuser:$$apr1$$D9f2/q.S$$QxR8C0o/y1.W4uE0m.B2Y/ kısmını kendi kullanıcı adınız ve şifrenizle değiştirmelisiniz. Şifrenizi oluşturmak için htpasswd -nb traefikuser YOUR_PASSWORD komutunu kullanabilirsiniz. (Önce sudo apt install apache2-utils ile htpasswd aracını kurmanız gerekebilir). Ayrıca HTTP’den HTTPS’e yönlendirme için bir redirect-to-https middleware’ı ve http-catchall router’ı tanımlanmıştır.

traefik.yml Ana Yapılandırma Dosyası

docker-compose.yml dosyasında referans gösterdiğimiz traefik.yml dosyasını oluşturalım:

nano traefik.yml

Dosyanın içeriği aşağıdaki gibi olmalıdır:

api:
  dashboard: true
  insecure: false # Dashboard'a güvenli erişim için false olarak ayarlayın

entrypoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false # Varsayılan olarak hiçbir konteyner Traefik tarafından gösterilmeyecektir
    network: web # Traefik'in dinleyeceği Docker ağı
    swarmMode: false # Swarm modu kullanmıyorsanız false bırakın

certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com # Let's Encrypt bildirimleri için kendi e-posta adresinizi kullanın
      storage: acme.json
      # HTTP Challenge kullanmak istemiyorsanız, DNS Challenge kullanabilirsiniz
      httpChallenge:
        entryPoint: web
      # DNS Challenge örneği (Cloudflare için)
      # dnsChallenge:
      #   provider: cloudflare
      #   resolvers:
      #     - "1.1.1.1:53"
      #     - "8.8.8.8:53"
      #   delayBeforeCheck: 0 # Genellikle gerekli değildir, ancak bazı DNS sağlayıcıları için gecikme gerekebilir

Açıklamalar:

* api.dashboard: true: Traefik Dashboard’u etkinleştirir.
* entrypoints: Traefik’in dinleyeceği portları ve protokolleri tanımlar. web (HTTP) ve websecure (HTTPS) olmak üzere iki giriş noktası vardır. web giriş noktası, tüm HTTP isteklerini otomatik olarak HTTPS’e yönlendirecek şekilde yapılandırılmıştır.
* providers.docker: Traefik’in Docker ile nasıl entegre olacağını belirtir.
* endpoint: "unix:///var/run/docker.sock": Docker soketinin yolunu gösterir.
* exposedByDefault: false: Bu önemli bir güvenlik ayarıdır. Varsayılan olarak hiçbir Docker konteyneri Traefik tarafından gösterilmeyecektir. Yalnızca traefik.enable=true etiketi olan konteynerler işlenecektir.
* network: web: Traefik’in uygulama konteynerlerini bulmak için kullanacağı Docker ağını belirtir.
* certificatesResolvers.myresolver.acme: Let’s Encrypt ile SSL sertifikası yönetimini yapılandırır.
* email: your-email@example.com: Let’s Encrypt’ten gelen bildirimler için kullanılacak e-posta adresiniz.
* storage: acme.json: Sertifikaların saklanacağı dosya.
* httpChallenge.entryPoint: web: Let’s Encrypt’in HTTP doğrulama yöntemini kullanır. Bu, 80 numaralı portun dışarıdan erişilebilir olmasını gerektirir.
* dnsChallenge: Wildcard sertifikalar veya 80 numaralı portun kapalı olduğu durumlar için DNS doğrulama yöntemini kullanır. Örneğin Cloudflare gibi bir DNS sağlayıcısıyla entegrasyon için API anahtarları gibi ek ortam değişkenleri gerektirir. (Örnek olarak yorum satırına alınmıştır).

acme.json Dosyası ve İzinleri

Let’s Encrypt sertifikalarının saklanacağı acme.json dosyasını oluşturalım ve doğru izinleri verelim. Bu dosya, Traefik tarafından yazılabilir olmalı ancak diğer kullanıcılar tarafından okunamaz olmalıdır.

touch acme.json
chmod 600 acme.json

Docker Ağı Oluşturma

docker-compose.yml dosyasında external: true olarak tanımladığımız web ağını manuel olarak oluşturalım:

docker network create web

Traefik’i Başlatma

Tüm yapılandırma dosyaları hazır olduğuna göre, Traefik’i Docker Compose ile başlatabiliriz:

docker-compose up -d

up -d komutu, konteyneri arka planda (detached mode) başlatır.

Traefik’in çalıştığını doğrulamak için:

docker-compose ps

Veya loglarını kontrol etmek için:

docker-compose logs traefik

Eğer her şey yolundaysa, Traefik Dashboard’unu https://traefik.example.com (kendi alan adınızla) adresinden, belirlediğiniz kullanıcı adı ve şifre ile erişebilirsiniz. İlk başta Let’s Encrypt sertifikasının alınması biraz zaman alabilir.

Örnek Uygulama ile Traefik’i Test Etme

Traefik’i başarıyla kurduktan sonra, şimdi basit bir web uygulaması (örneğin Whoami) konteynerini Traefik üzerinden erişilebilir hale getirerek çalışmasını test edelim. Bu, Traefik’in dinamik yapılandırma yeteneklerini ve Let’s Encrypt entegrasyonunu anlamak için harika bir yoldur.

Traefik dizininden çıkalım ve yeni bir uygulama için bir dizin oluşturalım:

cd ..
mkdir my-app && cd my-app

Şimdi docker-compose.yml dosyasını oluşturalım:

nano docker-compose.yml

Dosyanın içeriği aşağıdaki gibi olmalıdır:

version: '3.8'

services:
  whoami:
    image: traefik/whoami # Basit bir web sunucusu uygulaması
    container_name: whoami
    restart: unless-stopped
    networks:
      - web # Traefik'in bağlı olduğu ağa bağlanın
    labels:
      - "traefik.enable=true" # Bu konteynerin Traefik tarafından işlenmesini sağlar
      - "traefik.http.routers.whoami.rule=Host(whoami.example.com)" # Uygulamanın alan adı
      - "traefik.http.routers.whoami.entrypoints=websecure" # HTTPS üzerinden erişim
      - "traefik.http.routers.whoami.tls.certresolver=myresolver" # Let's Encrypt sertifika çözümleyici
      - "traefik.http.services.whoami.loadbalancer.server.port=80" # Uygulamanın dinlediği port
      # HTTP'den HTTPS'e yönlendirme middleware'ını kullanmak için:
      # - "traefik.http.routers.whoami-http.rule=Host(whoami.example.com)"
      # - "traefik.http.routers.whoami-http.entrypoints=web"
      # - "traefik.http.routers.whoami-http.middlewares=redirect-to-https"
      # redirect-to-https middleware'ı traefik'in kendi docker-compose.yml dosyasında tanımlı olduğu için,
      # bu etiketler traefik'in otomatik yönlendirme mekanizmasıyla çakışabilir.
      # Traefik'in ana yapılandırmasındaki otomatik yönlendirme, çoğu durumda yeterlidir.

networks:
  web:
    external: true # Traefik'in kullandığı harici ağı kullanın

Açıklamalar:

* image: traefik/whoami: Traefik’in sağladığı basit bir “whoami” uygulamasını kullanırız. Bu uygulama, isteği gönderen istemcinin IP adresi ve HTTP başlıkları gibi bilgileri gösterir.
* networks: - web: Uygulama konteynerini, Traefik’in de bağlı olduğu web ağına bağlarız. Bu, Traefik’in bu konteyneri keşfetmesini sağlar.
* labels: Bu etiketler, Traefik’e bu konteyner hakkında bilgi verir:
* traefik.enable=true: Traefik’in bu servisi izlemesini sağlar. exposedByDefault: false ayarını yaptığımız için bu etiket zorunludur.
* traefik.http.routers.whoami.rule=Host(whoami.example.com): Bu router’ın hangi alan adına gelen istekleri yakalayacağını belirtir. whoami.example.com yerine kendi alt alan adınızı kullanmalısınız.
* traefik.http.routers.whoami.entrypoints=websecure: Bu router’ın websecure (HTTPS) giriş noktasını kullanmasını sağlar.
* traefik.http.routers.whoami.tls.certresolver=myresolver: Bu router için SSL sertifikasını myresolver adlı Let’s Encrypt çözümleyicisi aracılığıyla almasını sağlar.
* traefik.http.services.whoami.loadbalancer.server.port=80: whoami konteynerinin dahili olarak 80 numaralı portta çalıştığını Traefik’e bildirir.

DNS Ayarlarını Güncelleme

whoami.example.com (veya sizin seçtiğiniz alt alan adı) için alan adı sağlayıcınızın kontrol panelinden sunucunuzun IP adresine işaret eden bir A kaydı oluşturduğunuzdan emin olun.

Uygulamayı Başlatma

docker-compose.yml dosyasını kaydettikten sonra, uygulamayı başlatın:

docker-compose up -d

Birkaç dakika bekledikten sonra (Let’s Encrypt sertifikasının alınması ve DNS yayılımı için), web tarayıcınızdan https://whoami.example.com adresine gidin. Uygulamanın başarıyla çalıştığını ve HTTPS üzerinden erişilebilir olduğunu görmelisiniz. Ayrıca, Traefik Dashboard’undan da whoami servisini ve router’ını kontrol edebilirsiniz.

Bu örnek, Traefik’in Docker etiketleri aracılığıyla nasıl dinamik olarak yapılandırılabileceğini ve otomatik SSL sertifikası yönetimini nasıl sağladığını açıkça göstermektedir. Yeni bir uygulama eklemek veya mevcut bir uygulamayı güncellemek için tek yapmanız gereken, docker-compose.yml dosyasındaki etiketleri düzenlemek ve konteyneri yeniden başlatmaktır; Traefik geri kalanını halleder.

Gelişmiş Traefik Yapılandırmaları

Traefik’in gücü sadece temel ters proxy işlevselliğiyle sınırlı değildir. Gelişmiş yapılandırmalar sayesinde daha karmaşık senaryoları yönetebilir, güvenliği artırabilir ve trafik akışını optimize edebilirsiniz.

HTTP’den HTTPS’e Yönlendirme (HTTP to HTTPS Redirection)

Güvenlik nedeniyle tüm trafiğin HTTPS üzerinden geçmesi istenir. Traefik, bu yönlendirmeyi otomatik olarak yapacak middleware’lar ve router’lar tanımlamanıza olanak tanır. Önceki traefik.yml dosyasında web giriş noktası için zaten bir yönlendirme tanımlamıştık:

entrypoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
          permanent: true

Bu yapılandırma, web (80 portu) üzerinden gelen tüm istekleri websecure (443 portu) giriş noktasına ve HTTPS şemasına kalıcı olarak yönlendirir. Bu sayede, her uygulamanın docker-compose.yml dosyasında ayrı ayrı yönlendirme etiketleri tanımlamanıza gerek kalmaz.

Birden Fazla Uygulama ve Alt Alan Adları

Traefik, aynı sunucu üzerinde birden fazla Docker uygulamasını farklı alt alan adları üzerinden yönetmek için idealdir. Her uygulama için ayrı bir docker-compose.yml dosyası oluşturup, bunları aynı web ağına bağlayarak ve farklı Host kuralları tanımlayarak bunu yapabilirsiniz.

Örneğin, my-app dizininden çıkıp another-app adında yeni bir uygulama için dizin oluşturalım:

cd ..
mkdir another-app && cd another-app
nano docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: another-app-nginx
    restart: unless-stopped
    networks:
      - web
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.another-app.rule=Host(another.example.com)"
      - "traefik.http.routers.another-app.entrypoints=websecure"
      - "traefik.http.routers.another-app.tls.certresolver=myresolver"
      - "traefik.http.services.another-app.loadbalancer.server.port=80"

networks:
  web:
    external: true

another.example.com için DNS kaydınızı güncelledikten sonra, bu uygulamayı da docker-compose up -d ile başlatabilirsiniz. Traefik otomatik olarak bu yeni uygulamayı keşfedecek, another.example.com için bir Let’s Encrypt sertifikası alacak ve trafiği Nginx konteynerine yönlendirecektir.

Güvenlik

Traefik, çeşitli güvenlik özelliklerini middleware’lar aracılığıyla uygulamanıza entegre etmenizi sağlar.

Traefik Dashboard İçin Temel Kimlik Doğrulama (BasicAuth)

Yukarıdaki docker-compose.yml dosyasında Traefik Dashboard için zaten basicauth middleware’ını kullanmıştık. Bu, hassas bilgilerin bulunduğu paneli yetkisiz erişime karşı korur.

- "traefik.http.middlewares.traefik-auth.basicauth.users=traefikuser:$$apr1$$D9f2/q.S$$QxR8C0o/y1.W4uE0m.B2Y/"
Rate Limiting (Oran Sınırlama)

Uygulamalarınızı DDoS saldırılarından veya kötüye kullanımdan korumak için oran sınırlama uygulayabilirsiniz.

# Uygulamanızın docker-compose.yml dosyasında
services:
  my-app:
    # ...
    labels:
      # ...
      - "traefik.http.routers.my-app.middlewares=rate-limit"
      - "traefik.http.middlewares.rate-limit.ratelimit.average=100" # Saniyede ortalama 100 istek
      - "traefik.http.middlewares.rate-limit.ratelimit.burst=50" # Maksimum 50 isteğe kadar patlama

Bu etiketleri my-app servisine ekleyip yeniden başlattığınızda, bu uygulama için oran sınırlaması aktif olacaktır.

IP Beyaz Listesi/Kara Listesi

Belirli IP adreslerinden gelen erişimi kısıtlayabilirsiniz.

# Uygulamanızın docker-compose.yml dosyasında
services:
  my-app:
    # ...
    labels:
      # ...
      - "traefik.http.routers.my-app.middlewares=ip-whitelist"
      - "traefik.http.middlewares.ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.1" # İzin verilen IP'ler
Header Ekleme/Çıkarma

Güvenlik başlıkları ekleyerek veya gereksiz başlıkları kaldırarak uygulamanızın güvenliğini artırabilirsiniz.

# Uygulamanızın docker-compose.yml dosyasında
services:
  my-app:
    # ...
    labels:
      # ...
      - "traefik.http.routers.my-app.middlewares=secure-headers"
      - "traefik.http.middlewares.secure-headers.headers.framedeny=true"
      - "traefik.http.middlewares.secure-headers.headers.contentsecuritypolicy=frame-ancestors 'self'"
      - "traefik.http.middlewares.secure-headers.headers.sslredirect=true"
      - "traefik.http.middlewares.secure-headers.headers.stsseconds=31536000"
      - "traefik.http.middlewares.secure-headers.headers.stspreload=true"
      - "traefik.http.middlewares.secure-headers.headers.stsincludessubdomains=true"
      - "traefik.http.middlewares.secure-headers.headers.contenttypeNosniff=true"
      - "traefik.http.middlewares.secure-headers.headers.browserxssfilter=true"

Bu middleware’lar, docker-compose.yml dosyalarındaki labels aracılığıyla tanımlanır ve router’lara atanır.

Let’s Encrypt DNS Challenge (DNS Sorgulama ile Sertifika Alma)

HTTP challenge, 80 numaralı portun açık olmasını ve alan adının doğrudan sunucuya işaret etmesini gerektirir. Eğer wildcard sertifikalar (*.example.com) almak istiyorsanız veya 80 numaralı portu açamıyorsanız, DNS challenge yöntemini kullanmanız gerekir. Bu yöntem, Let’s Encrypt’in alan adı sağlayıcınızın DNS kayıtlarını doğrulamasını sağlar.

DNS challenge kullanmak için traefik.yml dosyanızı güncellemeniz gerekir. Örneğin Cloudflare için:

certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com
      storage: acme.json
      dnsChallenge:
        provider: cloudflare # Kullandığınız DNS sağlayıcısı
        resolvers:
          - "1.1.1.1:53"
          - "8.8.8.8:53"
        # delayBeforeCheck: 0 # Gerekirse gecikme ekleyebilirsiniz

Ayrıca, Traefik konteynerine DNS sağlayıcınızın API kimlik bilgilerini ortam değişkenleri olarak sağlamanız gerekir. Örneğin Cloudflare için:

# traefik'in docker-compose.yml dosyasında
services:
  traefik:
    # ...
    environment:
      - CF_API_EMAIL=your-cloudflare-email@example.com
      - CF_API_KEY=your-cloudflare-api-key # Güvenlik için bu anahtarı bir sır olarak saklamanız önerilir
    # ...

Bu anahtarlar, DNS sağlayıcınızın kontrol panelinden alınmalıdır. Güvenlik açısından, bu tür hassas bilgileri doğrudan docker-compose.yml dosyasına yazmak yerine Docker Secrets veya ortam değişkenleri aracılığıyla yönetmek daha güvenlidir. Bu değişikliklerden sonra Traefik konteynerini yeniden başlatmayı unutmayın (docker-compose up -d).

Sık Karşılaşılan Sorunlar ve Çözümleri

Traefik kurulumu ve yapılandırması sırasında bazı yaygın sorunlarla karşılaşılabilir. İşte bunlardan bazıları ve olası çözümleri:

DNS Çözümleme Sorunları

* Belirti: Uygulamanıza alan adınız üzerinden erişemiyorsunuz.
* Çözüm: Alan adı sağlayıcınızın kontrol panelinden A kaydının veya CNAME kaydının doğru IP adresine işaret ettiğinden emin olun. DNS yayılımı biraz zaman alabilir (birkaç dakika ila birkaç saat). dig yourdomain.com veya nslookup yourdomain.com komutlarıyla DNS kayıtlarını kontrol edebilirsiniz.

Port Çakışmaları

* Belirti: Traefik konteyneri başlatılamıyor veya 80/443 portları zaten kullanımda hatası veriyor.
* Çözüm: Başka bir uygulamanın (örneğin Nginx, Apache) 80 veya 443 portlarını kullanıp kullanmadığını kontrol edin: sudo lsof -i :80 veya sudo lsof -i :443. Çakışan servisi durdurun veya kaldırın.

Let’s Encrypt Sertifika Hataları

* Belirti: Uygulamanıza HTTPS üzerinden erişilemiyor, tarayıcı sertifika hatası veriyor veya Traefik loglarında ACME (Let’s Encrypt) ile ilgili hatalar görünüyor.
* Çözüm:
* E-posta Adresi: traefik.yml dosyasındaki email adresinin doğru ve geçerli olduğundan emin olun.
* DNS Kaydı: Alan adınızın doğru IP adresine işaret ettiğinden emin olun. Let’s Encrypt, alan adının sunucunuza çözümlenmesini gerektirir.
* Port 80 Erişimi: HTTP challenge kullanıyorsanız, 80 numaralı portun dışarıdan erişilebilir olduğundan emin olun (güvenlik duvarı ayarları).
* Rate Limits: Çok fazla sertifika denemesi yaptıysanız Let’s Encrypt’in oran sınırlamalarına takılmış olabilirsiniz. Bir süre bekleyin ve tekrar deneyin.
* acme.json İzinleri: acme.json dosyasının izinlerinin 600 olduğundan emin olun: chmod 600 acme.json.
* Traefik Logları: docker-compose logs traefik komutunu kullanarak Traefik loglarını detaylıca inceleyin. Hata mesajları genellikle sorunun kaynağını gösterir.

Traefik Dashboard Erişim Sorunları

* Belirti: Dashboard’a erişilemiyor veya kimlik doğrulama başarısız oluyor.
* Çözüm:
* Alan Adı: traefik.example.com için DNS kaydının doğru olduğundan emin olun.
* BasicAuth Şifresi: docker-compose.yml dosyasındaki basicauth.users etiketindeki kullanıcı adı ve şifre hash’inin doğru olduğundan emin olun. htpasswd -nb user password komutuyla doğru hash’i oluşturduğunuzdan emin olun.
* Portlar: Traefik’in 443 portunu dinlediğinden emin olun.

Konteynerlerin Traefik Ağına Bağlı Olmaması

* Belirti: Uygulama konteyneri çalışıyor ancak Traefik üzerinden erişilemiyor. Traefik Dashboard’da servisi göremiyorsunuz.
* Çözüm: Uygulama konteynerinin docker-compose.yml dosyasında networks: - web satırının olduğundan ve web ağının external: true olarak doğru tanımlandığından emin olun. Ayrıca, uygulama konteynerinin traefik.enable=true etiketine sahip olduğundan emin olun.

Traefik Loglarını İnceleme

Herhangi bir sorunla karşılaştığınızda başvurmanız gereken ilk yer Traefik’in loglarıdır.

docker-compose logs traefik

Bu komut, Traefik konteynerinin tüm çıktılarını gösterecektir. Özellikle ERROR veya WARN seviyesindeki mesajlara dikkat edin. Loglardaki detaylı bilgiler, sorunun nedenini anlamanıza ve çözmenize yardımcı olacaktır. docker-compose logs -f traefik komutuyla logları gerçek zamanlı olarak takip edebilirsiniz.

Bu sorun giderme adımları, Traefik ile çalışırken karşılaşabileceğiniz çoğu yaygın sorunu çözmenize yardımcı olacaktır. Unutmayın, Traefik’in dinamik yapısı nedeniyle, bir yapılandırma değişikliği yaptığınızda veya bir konteyneri yeniden başlattığınızda Traefik’in bu değişiklikleri algılaması birkaç saniye sürebilir.

Sonuç

Bu kapsamlı rehber boyunca, Traefik’i Ubuntu 18.04 üzerinde Docker konteynerleri için güçlü ve dinamik bir ters proxy olarak nasıl kuracağınızı ve yapılandıracağınızı adım adım inceledik. Ters proxy kavramının temel prensiplerinden başlayarak, Traefik’in dinamik yapılandırma yeteneklerini, Let’s Encrypt ile otomatik SSL sertifikası yönetimini ve Docker ekosistemiyle olan mükemmel entegrasyonunu keşfettik.

Traefik, uygulama dağıtım süreçlerini otomatize etme ve basitleştirme konusunda geliştiriciler ve sistem yöneticileri için paha biçilmez bir araçtır. Docker etiketleri aracılığıyla yapılan yapılandırma, yeni bir servis devreye alındığında veya mevcut bir servis güncellendiğinde manuel müdahaleye olan ihtiyacı ortadan kaldırır. Bu, özellikle mikroservis mimarileri ve sürekli entegrasyon/sürekli teslimat (CI/CD) süreçleri için büyük bir avantaj sağlar. Otomatik HTTP’den HTTPS’e yönlendirme ve Let’s Encrypt entegrasyonu sayesinde, uygulamalarınızı güvenli ve güncel SSL sertifikalarıyla yayınlamak hiç bu kadar kolay olmamıştı.

Gelişmiş yapılandırma seçenekleri, oran sınırlamaları, IP beyaz/kara listeleri ve özel başlık yönetimi gibi özelliklerle Traefik, uygulamalarınızın güvenliğini ve performansını artırmak için kapsamlı bir çözüm sunar. Karşılaşılabilecek yaygın sorunlara yönelik çözüm önerileri ise, kurulum ve yönetim sürecini daha sorunsuz hale getirmeye yardımcı olacaktır.

Traefik’in bu esnek ve güçlü yetenekleri, onu yalnızca Docker konteynerleri için değil, aynı zamanda Kubernetes ve diğer konteyner orkestrasyon platformları için de tercih edilen bir ters proxy çözümü haline getirmektedir. Bu rehber, Traefik ile modern web uygulamalarınız için sağlam, güvenli ve otomatik bir trafik yönetim altyapısı oluşturmanız için gerekli temel bilgileri ve pratik adımları sağlamıştır. Gelecekte, Traefik’in sunduğu daha birçok gelişmiş özelliği keşfederek altyapınızı daha da optimize edebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version