NoctisNode
← RehberlerSelf-hosting2026-10-239 dk

Caddy Docker reverse proxy: otomatik HTTPS ile Compose kurulumu

Caddy'yi Docker reverse proxy olarak çalıştırın: tek bir compose stack'i, paylaşılan bir ağ, servis adlarına reverse_proxy ve otomatik HTTPS — ayrıca caddy-docker-proxy etiketlerinin ne zaman işe yaradığı.

Kısaca: Caddy'yi 80 ve 443 portlarını yayınlayan kendi container'ında çalıştırın, onu ve uygulama container'larınızı paylaşılan tek bir Docker ağına bağlayın ve `reverse_proxy`'yi her servis adına ve dahili porta yönlendirin (örneğin `reverse_proxy app:3000`). Caddy adı Docker'ın gömülü DNS'i üzerinden çözer ve her site adresi için otomatik olarak TLS sertifikası alır.

Bu rehber önce düz Caddyfile yaklaşımını, ardından etiket tabanlı caddy-docker-proxy varyantını gösteriyor ve tek bir VPS'te hangisinin ne zaman uygun olduğunu açıklıyor. Caddy'yi Docker yerine doğrudan hostta çalıştırıyorsanız temel Caddy reverse proxy rehberine bakın.

Parçalar nasıl birleşir

Dış dünyaya port yayınlayan yalnızca Caddy container'ıdır. Her backend container'ı kullanıcı tanımlı bir bridge ağına (burada `web` adında) katılır ve portunu yalnızca o ağda açar. Kullanıcı tanımlı ağlarda bulunan Docker'ın gömülü DNS sunucusu, Caddy'nin `app:3000`'e servis veya container adıyla ulaşmasını sağlar; böylece her yeniden oluşturmada değişen container IP'lerini asla sabit kodlamazsınız.

Backend'leri yayınlamamak göründüğünden daha önemlidir: Docker kendi iptables kurallarını yazar, bu yüzden `ports:` ile yayınlanan bir port, ufw engellendiğini söylese bile internetten erişilebilir olabilir. Proxy'nin arkasında durması gereken her şey için `expose:` kullanın veya hiç port eşlemesi yapmayın.

BileşenGörevHostta yayınlanıyor mu?
caddy container'ıTLS sonlandırma, hostname'e göre yönlendirme, HTTP'den HTTPS'e yönlendirmeEvet: 80/tcp, 443/tcp, 443/udp
web ağıServis adları için yerleşik DNS'e sahip paylaşılan bridge ağıHayır
uygulama container'larıServisleriniz (web uygulamaları, API'ler, paneller)Hayır, yalnızca Caddy üzerinden erişilebilir
caddy_data volume'uSertifikalar, özel anahtarlar, ACME hesabıHayır, ama kalıcı olmalı

Adım adım: docker compose ile düz Caddyfile

  1. 01.Caddy'yi başlatmadan önce her hostname için bir A kaydını (IPv6 kullanıyorsanız AAAA kaydını da) VPS'e yönlendirin, aksi halde sertifika alımı başarısız olur.
  2. 02.Paylaşılan ağı bir kez oluşturun: `docker network create web`.
  3. 03.Aşağıda gösterildiği gibi `/opt/proxy/compose.yaml` ve `/opt/proxy/Caddyfile` oluşturun, ardından `/opt/proxy` içinde `docker compose up -d` çalıştırın.
  4. 04.Her uygulama stack'ini harici `web` ağına bağlayın ve `docker compose up -d` ile başlatın.
  5. 05.İlk sertifikanın alınmasını `/opt/proxy` içinde `docker compose logs -f caddy` ile izleyin.
  6. 06.Caddyfile'ı düzenledikten sonra kesintisiz yeniden yükleyin: `docker compose exec -w /etc/caddy caddy caddy reload`.
# /opt/proxy/compose.yaml
services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"   # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data      # certificates and ACME account keys
      - caddy_config:/config
    networks:
      - web

volumes:
  caddy_data:
  caddy_config:

networks:
  web:
    external: true

Bir uygulama bağlayın ve Caddyfile'ı yazın

Her uygulama stack'i aynı harici ağı tanımlar. Servis adı, Caddy'nin bağlandığı hostname olur. `caddy_data` volume'u asla kaybetmemeniz gereken volume'dur: onu silmek Caddy'yi her sertifikayı yeniden istemeye zorlar ve bu ACME rate limit'lerine takılabilir.

# /opt/app/compose.yaml
services:
  app:
    image: ghcr.io/example/app:latest
    restart: unless-stopped
    expose:
      - "3000"        # reachable on the network, NOT published on the host
    networks:
      - web

networks:
  web:
    external: true

# /opt/proxy/Caddyfile
{
	email [email protected]
}

app.example.com {
	reverse_proxy app:3000
}

grafana.example.com {
	reverse_proxy grafana:3000
}

api.example.com {
	reverse_proxy api-1:8080 api-2:8080 {
		lb_policy round_robin
		health_uri /healthz
		health_interval 10s
	}
}

Caddy backend'leri: upstream'ler, yük dengeleme ve health check'ler

Caddy terminolojisinde backend, `reverse_proxy`'nin bir upstream'idir. Tek bir direktifte birkaç upstream listeleyebilir, `round_robin`, `least_conn` veya `ip_hash` gibi bir `lb_policy` seçebilir ve `health_uri` ile aktif health check'ler ekleyebilirsiniz; böylece başarısız container'lar rotasyondan çıkar. Uygulamanın health endpoint'i yoksa pasif kontroller (`fail_duration`, `max_fails`) da işe yarar.

Caddy varsayılan olarak proxy'lenen isteklerde `X-Forwarded-For`, `X-Forwarded-Proto` ve `X-Forwarded-Host` ayarlar. Uygulamanızı proxy'nin ağ aralığına güvenecek şekilde yapılandırın, böylece gerçek istemci IP'sini görür ve `https://` bağlantılar oluşturur. WebSocket'ler ve gRPC `reverse_proxy` üzerinden ek ayar olmadan çalışır; şifresiz gRPC için `reverse_proxy h2c://service:50051` kullanın.

Caddyfile yerine etiketler: caddy-docker-proxy

"Caddy proxy manager" arayanlar genellikle Nginx Proxy Manager'ın sunduğu şeyi ister: bir container ekle, merkezi bir dosyayı düzenlemeden hostname ve sertifika al. Caddy'nin resmî bir GUI'si yoktur, ancak topluluk projesi caddy-docker-proxy (github.com/lucaslorentz/caddy-docker-proxy) Caddyfile'ı container etiketlerinden üretir ve container'lar başladığında veya durduğunda Caddy'yi yeniden yükler.

Docker socket'ine okuma erişimi gerektirir; bu da fiilen hostta root demektir. Socket'i salt okunur bağlayın, proxy imajını güncel tutun ve yalnızca birkaç servis çalıştırıyorsanız düz Caddyfile'ı tercih edin.

services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    environment:
      - CADDY_INGRESS_NETWORKS=web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - caddy_data:/data
    networks:
      - web

  whoami:
    image: traefik/whoami
    networks:
      - web
    labels:
      caddy: whoami.example.com
      caddy.reverse_proxy: "{{upstreams 80}}"

volumes:
  caddy_data:

networks:
  web:
    external: true

Düz Caddyfile ve caddy-docker-proxy

Düz Caddyfilecaddy-docker-proxy etiketleri
Yapılandırmanın yeriGit'te sürümlediğiniz tek bir dosyaCompose dosyalarına dağılmış etiketler
Docker socket erişimiGerekmezGerekir (güvenlik açısından hassas)
Yeni servisCaddyfile'ı düzenle, `caddy reload` çalıştırEtiketleri ekle, container'ı başlat
İmajResmî `caddy:2`Caddy üzerine kurulu topluluk imajı
Hata ayıklamaDosyayı doğrudan okuÜretilen yapılandırmayı loglarda incele
En uygun olduğu durumKüçük, sabit VPS kurulumlarıÇok sayıda kısa ömürlü veya sık değişen servis

VPS'te çalıştırmak

Bir NoctisNode KVM VPS'inde tam root ve dedicated IPv4 alırsınız; bu yüzden 80 ve 443'ü tek bir Caddy container'ından yayınlayıp geri kalan her şeyi gizlemek kolaydır. Bir Wisp (1 vCPU, 1 GB RAM) Caddy artı birkaç hafif container için yeterlidir; daha ağır stack'ler Pulse veya Umbra'ya sığar. Sertifika alma ayrıntıları ve hata durumları Caddy otomatik HTTPS nasıl çalışır rehberinde, ham TCP veya SSH iletimi ise Caddy TCP ve SSH proxy rehberinde. Host SSH'ını SSH sıkılaştırma rehberi ile kilitleyin.

SSS

QCaddy'nin bir Docker container'ına reverse proxy yapmasını nasıl sağlarım?

ACaddy'yi ve container'ı aynı kullanıcı tanımlı Docker ağına koyun ve Caddyfile'da `reverse_proxy service-name:port` kullanın. `localhost` kullanmayın, çünkü Caddy container'ı içinde bu Caddy'nin kendisini ifade eder.

QCaddy container'ım için neden 502 Bad Gateway döndürüyor?

AGenellikle container'lar paylaşılan bir ağda değildir, port yanlıştır (yayınlanan host portunu değil, container'ın dahili portunu kullanın) veya uygulama container'ı içinde yalnızca 127.0.0.1'i dinliyordur. Uygulamayı 0.0.0.0'a bağlayın ve `docker network inspect web` ile kontrol edin.

Qcaddy-docker-proxy kullanmak güvenli mi?

Aİyi çalışır, ancak host üzerinde root'a eşdeğer kontrol veren Docker socket'ini gerektirir. Socket'i salt okunur bağlayın, imajı güncel tutun ve Caddy admin endpoint'ini dışarı açmaktan kaçının.

QCaddy Docker'da sertifikaları nerede saklar?

AResmî imajda `/data` içinde; bu yüzden oraya adlandırılmış bir volume bağlayın. Onu kaybetmek her sertifikayı yeniden almak ve muhtemelen ACME rate limit'lerine takılmak demektir.

QWeb arayüzlü bir Caddy proxy manager var mı?

ACaddy'nin kendisinin resmî bir web arayüzü yoktur; Caddyfile, JSON veya admin API'si ile yapılandırılır. caddy-docker-proxy gibi etiket tabanlı araçlar benzer bir "container ekle ve çalıştır" iş akışı sunar.

Caddy Docker reverse proxy: otomatik HTTPS ile Compose kurulumu · NoctisNode