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şen | Görev | Hostta yayınlanıyor mu? |
|---|---|---|
| caddy container'ı | TLS sonlandırma, hostname'e göre yönlendirme, HTTP'den HTTPS'e yönlendirme | Evet: 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'u | Sertifikalar, özel anahtarlar, ACME hesabı | Hayır, ama kalıcı olmalı |
Adım adım: docker compose ile düz Caddyfile
- 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.
- 02.Paylaşılan ağı bir kez oluşturun: `docker network create web`.
- 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.
- 04.Her uygulama stack'ini harici `web` ağına bağlayın ve `docker compose up -d` ile başlatın.
- 05.İlk sertifikanın alınmasını `/opt/proxy` içinde `docker compose logs -f caddy` ile izleyin.
- 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: trueBir 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: trueDüz Caddyfile ve caddy-docker-proxy
| Düz Caddyfile | caddy-docker-proxy etiketleri | |
|---|---|---|
| Yapılandırmanın yeri | Git'te sürümlediğiniz tek bir dosya | Compose dosyalarına dağılmış etiketler |
| Docker socket erişimi | Gerekmez | Gerekir (güvenlik açısından hassas) |
| Yeni servis | Caddyfile'ı düzenle, `caddy reload` çalıştır | Etiketleri ekle, container'ı başlat |
| İmaj | Resmî `caddy:2` | Caddy üzerine kurulu topluluk imajı |
| Hata ayıklama | Dosyayı doğrudan oku | Üretilen yapılandırmayı loglarda incele |
| En uygun olduğu durum | Küçü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.