Tüm yazılar

blog

Caddy ile bir Docker konteynerine domain bağlamak

Yayın tarihi

Caddy, domainin için sertifikayı kendisi alır. Sana doğru yapman gereken iki şey kalır: sunucuyu zaten gösteren bir DNS kaydı ve proxy’nin konteynerine adıyla ulaşabildiği bir ağ.

Önce DNS

Domain için sunucunun IP adresini gösteren bir A kaydı oluştur ve Caddy’yi başlatmadan önce çözümlenmesini bekle. Sertifika otoritesi, domainin kontrolünün sende olduğunu ona internet üzerinden bağlanarak doğrular; ad henüz sunucunu göstermiyorsa bu kontrol başka birine ya da hiçbir yere ulaşır.

Yalnızca DNS sağlayıcının panelinden değil, kendi makinenden kontrol et:

dig +short app.example.com A      # sunucunun IPv4 adresini yazmalı
dig +short app.example.com AAAA   # hiçbir şey ya da sunucunun IPv6 adresini yazmalı

Gözden kaçan satır AAAA. Sertifika otoritesi, kayıt varsa IPv6’yı da kullanır; başka bir makineyi gösteren eski bir AAAA kaydı, A kaydı kusursuz görünürken doğrulamayı başarısız yapabilir.

En küçük Caddyfile

Her domain için bir site bloğu. Domain adı, HTTPS yapılandırmasının tamamıdır: Caddy herkese açık bir host adı görür, onun için sertifika alır ve HTTP’yi HTTPS’e yönlendirir.

conf/Caddyfile

app.example.com {
	reverse_proxy app:3000
}

app:3000, konteynerin adı ve uygulamanın konteyner içinde dinlediği port — host’ta yayınlanmış bir port değil.

Caddy’yi uygulamanın yanında çalıştır

Proxy’nin uygulamaya adıyla ulaşabilmesi için Caddy ile uygulama aynı Docker ağında olmalı. Tek bir Compose projesinde bu kendiliğinden olur: servisler projenin varsayılan ağına katılır.

Uygulama başka bir Compose projesindeyse bir kez docker network create web ile ağ oluştur ve iki dosyada da networks: altında external: true olarak listele.

compose.yml

services:
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./conf:/etc/caddy
      - caddy_data:/data
      - caddy_config:/config
  app:
    image: ghcr.io/example/app:1.4.0
    restart: unless-stopped

volumes:
  caddy_data:
  caddy_config:

Uygulama hiçbir port yayınlamıyor: internete yalnızca Caddy bakıyor. caddy_data volume’u sertifikaları ve hesap anahtarlarını tutar. Onu koru — yoksa her yeniden oluşturmada yeni sertifika istenir ve er geç sertifika otoritesinin istek sınırlarına takılırsın.

Sertifika nasıl alınıyor, neden başarısız oluyor

Caddy başlarken Let’s Encrypt gibi bir ACME sertifika otoritesinden sertifika ister, domainin kontrolünü 80 ya da 443 portundaki bir doğrulamayla kanıtlar ve sonucu /data içine kaydeder. Çalıştığında saniyeler sürer.

Çalışmadığında sebep neredeyse her zaman bunlardan biridir ve docker compose logs caddy adını söyler:

  1. 01Domain henüz bu sunucuya çözümlenmiyor ya da bir AAAA kaydı başka bir yeri gösteriyor.
  2. 0280 ve 443 portları kapalı — sunucunun kendi güvenlik duvarı kadar sık, bulut sağlayıcının güvenlik duvarı tarafından.
  3. 0380 ya da 443’te zaten başka bir şey dinliyor; çoğunlukla sunucu imajıyla gelen bir nginx ya da Apache.

Yenileme senin işin değil

Caddy sertifikaları süreleri dolmadan çok önce kendisi yeniler ve bir deneme başarısız olursa tekrar dener. Yazılacak bir cron işi, takvime not edilecek bir bitiş tarihi yok.

İlk gün sahip olduğu koşullara ise ihtiyacı var: DNS hâlâ burayı göstermeli, portlar açık olmalı ve /data kalıcı kalmalı.

İkinci bir site eklemek

Bir blok daha ekle ve yeniden yükle. Reload yapılandırmayı yerinde değiştirir: mevcut siteler hizmet vermeye devam eder, açık bağlantılar düşmez. Hatalı bir Caddyfile reddedilir ve çalışan yapılandırma olduğu gibi kalır.

Compose dosyasının bulunduğu dizinden docker compose exec -w /etc/caddy caddy caddy reload ile yeniden yükle.

app.example.com {
	reverse_proxy app:3000
}

status.example.com {
	reverse_proxy uptime:3001
}

Tek dosyayı değil, yapılandırma dizinini bağla. Birçok editör yeni bir dosya yazıp eskisinin üzerine taşıyarak kaydeder; yalnızca o tek dosyanın bind mount edildiği bir konteyner eski sürümü görmeye devam eder.

Otomatik sürüm

MihraOps aynı kurulumu senin yerine yapar: yapılandırması /opt/mihraops/caddy içinde duran, mihraops-caddy adlı bir Caddy konteyneri. Domaini uygulamada eklersin; site bloğunu SSH üzerinden yazar, yeni yapılandırmayı çalışanın yerine geçmeden önce doğrular ve önceki sürümü saklar — böylece bir domaindeki hata diğer siteleri düşüremez.

DNS’i önce kurmak yine sana kalıyor. Uygulama içi adımlar doküman sayfasında.

Sırada