Tamam, elimizde Apache var, Nginx var, hatta lighttpd bile var. E peki bu Caddy de neyin nesi?
Kısaca: Caddy kolay, modüler ve işlevsel.
Özellikle otomatik sertifika alması olayın seyrini değiştiriyor. Ve bizlere sürdürülebilir bir çözüm ile geliyor.
Direkt GitHub’dan wget ile alıyoruz:
wget https://github.com/caddyserver/caddy/releases/download/v2.10.0/caddy_2.10.0_linux_amd64.deb
dpkg -i caddy_*.deb
Caddy kurmak bu kadar basit. E tabi kurduk ama her seferinde upgrade etmek için elle yeni paket mi indireceğiz?
Kısa cevap, hayır.
Yazılımcılar acımızı anlamış ve bunun için caddy upgrade özelliğini geliştirmişler.
caddy upgrade
Bu tek komudu kullanarak Caddy'nizi güncele çekebilirsiniz.
Caddy’nin bazı dizinlere erişmesi gerekebiliyor. O yüzden www-data grubuna ekliyoruz:
usermod -a -G www-data caddy
Caddy yapacağı işlemlerin hepsini Caddyfile dosyasından alır.
Yaptığımız kurulumdaki systemd servisi /etc/caddy/Caddyfile dosyasını config olarak kullanıyor.
Basit bir test yapalım.
:80 {
respond "OK" 200
}
Port 80'den ister gelirse "OK" mesajını 200 HTTP kodu ile cevapla şeklinde bir config yazmış olduk Caddy'ye. Şimdi bu konfigürasyonu alması için restart etmemiz gerekiyor.
systemctl restart caddy
Caddy kurulu olan makinenin IP'sine istek atıp test edelim. Ya da direkt bağlı olduğumuz makinede istek atalım.
curl http://localhost
Bu isteği attığımızda cevap olarak OKmesajını göreceğiz. HTTP kodunu görmek için:
curl -I http://localhost
Aşağıdaki gibi bir çıktısı olmalı:
[12:33:20@3] [root@caddy:~]$ curl -I http://localhost
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Server: Caddy
Date: Sun, 04 May 2025 09:33:26 GMT
Content-Length: 2
Biraz reverse proxy’den bahsedelim. 192.168.1.100 IP adresinde çalışan bir servisiniz var ve bu servis 3000 portunda ayakta. Şimdi bunu bir domain’e bağlamak istiyorsunuz. Ancak router’ınızda yalnızca birer adet 80 ve 443 portu var. Her yeni servisi farklı bir web sunucusuna yönlendirmek gibi bir lüksünüz yok. Bunun yerine, tüm gelen trafiği tek bir web sunucusuna (yani reverse proxy’ye) yönlendirin. O da gelen isteğin domain adına göre arka plandaki doğru servise yönlendirme yapsın. Sertifika alımını da bu proxy sunucusu üstlensin.
İşte bu noktada reverse proxy hayat kurtarır. Reverse proxy, gelen isteği analiz eder ve doğru hedefe yönlendirir. Böylece, yalnızca tek bir noktadan (şuan ki kurulumumuzda Caddy) tüm servislerinizi dış dünyaya açabilirsiniz. Üstelik HTTPS sertifikalarını da bu sunucu otomatik olarak yönetebilir, Let’s Encrypt gibi servislerle uğraşmadan güvenli bağlantılar sunabilirsiniz.
Bu sayede hem port kısıtlamalarını aşmış olduk, hem de merkezi bir yapı kurarak sistem yönetimini kolaylaştırdık.
Aşağıda bu yapı için bir Caddyfile var inceleyelim.
site1.example.com {
reverse_proxy 192.168.1.100:3000
}
site2.example.com {
reverse_proxy 192.168.1.200:3000
}
Bu yapı güzel ancak diyelim ki bu isteklere gelen request'leri de görmek istiyorum. O zaman log'lamaya ihtiyacımız olacak. Caddy bizlere bunu da sağlıyor.
(log-access) {
log {
output file /var/log/caddy/access.json
format json {
time_format wall
time_local
}
}
}
site1.example.com {
import log-access
reverse_proxy 192.168.1.100:3000
}
site2.example.com {
import log-access
reverse_proxy 192.168.1.200:3000
}
Yukarıda gördüğünüz formatta Caddy /var/log/caddy/access.json dosyasına site1 ve site2 için gelen istekleri log'layacak. Bizim de gözümü arkada kalmayacak.
Tek Caddyfile ile işleri halletmek keyifli güzel ancak bunları biraz daha modüler hale getirsek güzel olabilir.
Özellikle büyük çaplı işlerde hayat kurtaracaktır.
/etc/caddy/Caddyfile dosyamızı aşağıdaki şekilde güncellediğimizde, /etc/caddy/snippetsve /etc/caddy/sites klasörlerinin altındaki tüm dosyaları konfigürasyonumuza dahil ediyor.
import snippets/*
import sites/*
Bu sayede snippet'larımızı ve reverse proxy'lerimizi aşağıdaki şekilde ayırabiliyoruz.
/etc/caddy/snippets/log.caddy(log-access) {
log {
output file /var/log/caddy/access.json
format json {
time_format wall
time_local
}
}
}
/etc/caddy/sites/site1.example.comsite1.example.com {
import log-access
reverse_proxy 192.168.1.100:3000
}
/etc/caddy/sites/site1.example.comsite2.example.com {
import log-access
reverse_proxy 192.168.1.200:3000
}
Caddy reverse proxy yapacaksa, hedef IP local ağdaysa, NAT şart.
Caddy’nin çalıştığı makine 192.168.1.1, target 192.168.1.100 ise teoride sıkıntı yok. Ancak sertifika almak için yine NAT yapılı olması gerekiyor.
Ama…
Domain kayıtlarını Cloudflare üzerinden yapıyorsanız Port açmadan iç ağınızda kullanmak adına sertifika alabilirsiniz.
Öncelikle Cloudflare plugin'ini kuruyoruz.
caddy add-package github.com/caddy-dns/cloudflare
Aşağıdaki config ile artık port 80/443 açık olmasa da Cloudflare DNS API sayesinde Caddy sertifika alabiliyor:
(tls-cloudflare) {
tls {
dns cloudflare YOUR_CLOUDFLARE_API_TOKEN
}
}
Ayrıca email de eklerseniz Caddy’nin Let’s Encrypt (veya ZeroSSL) üzerinden sertifika alırken hangi mail adresini kullanacağını belirtmiş olursunuz. Bu mail:
{
email [email protected]
}
(tls-cloudflare) {
tls {
dns cloudflare YOUR_CLOUDFLARE_API_TOKEN
}
}
Site tarafına da import etmeyi unutma:
site1.example.com {
import log-access
import tls-cloudflare
reverse_proxy 192.168.1.100:3000
}
Bu yöntem ile Cloudflare sertifikayı DNS challenge üzerinden verir. İç ağda kullanım için hiç port açmaya gerek yok.
Cloudflare token'i nasıl aldığınızı vb işlemleri internetten ufak bir aratmayla ya da ChatGPT'ye sorarak bulabilirsiniz o nedenle buraya eklemiyorum.
Domain’in A kaydını iç IP’ye (mesela 192.168.x.x) almak gerekir tabii ki bu durum için.
| Özellik | Nginx | Apache | Caddy |
|---|---|---|---|
| HTTPS Otomatik | Hayır | Hayır | Evet |
| Kolay Reverse Proxy | Orta | Zor | Kolay |
| Plugin Sistemi | Sınırlı | Var C dilinde yazılmalı | Var Go dilinde yazılmalı |
| Konfigürasyon | Orta | Karmaşık | Basit |
Caddy’nin en büyük farkı plugin kolaylığı. Go ile yazıldığı için kendi modülünü yazıp Caddy’ye kolaylıkla ekleyebiliyorsun. xcaddy ile kendi binary’ni build edebilirsin. Nginx’te modül eklemek için source’tan derlemek gerekiyor, biraz dertli iş. Apache'yi zaten sevmediğim için biassed olacaktır bu nedenle çok yorum yapmayacağım.
Caddy tam bir System Admin, DevOps dostu. Basit, hızlı, dertsiz. İster statik site sun, ister container arkası proxy kur, her durumda “ben hallederim” diyor.
Hatırlatmak gerekli bu sadece giriş. Hook'lar ekle, health check yaz, Load Balance yap çok fazla özelliği mevcut. Hepsini buraya sığdırmak zor iş. Bu nedenle sonraki yazılarda görüşmek üzere.