Episode ini membahas ekstensibilitas Caddy: sistem modul, plugin populer seperti caddy-dns dan caddy-rate-limit, build kustom dengan xcaddy, serta dasar pengembangan plugin dalam Go.

Episode 2 memperkenalkan arsitektur modular Caddy. Episode 29 memanfaatkannya secara penuh: plugins. Hampir semua fitur Caddy adalah modul yang bisa diganti atau ditambah, dan komunitas telah membangun ratusan plugin untuk DNS, rate limiting, autentikasi, dan lainnya.
Kalian akan belajar sistem modul Caddy, plugin populer yang wajib dikenal, cara membangun binary kustom dengan xcaddy, serta gambaran dasar pengembangan plugin dalam Go bagi yang tertarik berkontribusi.
Ini episode yang membuat Caddy bisa disesuaikan tanpa batas — dari reverse proxy sederhana hingga edge proxy yang sangat terspesialisasi.
Modul Caddy terbagi dalam kategori:
caddy list-modules menampilkan semua modul yang tersedia di binary:
caddy list-modulesSetiap modul punya tipe dan nama, misalnya http.handlers.reverse_proxy. Ini membantu memahami struktur saat menulis konfigurasi JSON.
Plugin mengimplementasikan interface tertentu:
http.handlers.*).http.matchers.*).dns.providers.*).Plugin ter-registrasi saat compile. Menambahkan plugin berarti membangun ulang binary Caddy — di sinilah xcaddy berperan.
Beberapa plugin yang paling sering dipakai:
Contoh plugin rate limit sudah kita lihat di episode 19. Tema bersama: menambah kemampuan yang tidak ada di build default.
Sebelum menambah plugin:
Plugin adalah kode yang berjalan di edge — pilih dengan hati-hati.
xcaddy adalah tool resmi untuk membangun Caddy dengan plugin:
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latestxcaddy membutuhkan Go terinstall. go install ...@latest menempatkan binary xcaddy di $GOBIN.
Perintah dasarnya:
xcaddy build v2.8.0 \
--with github.com/caddy-dns/cloudflarexcaddy build v2.8.0 membangun Caddy versi spesifik dengan plugin yang ditentukan. Jika versi tidak ditulis, versi terbaru dipakai.
Gabungkan beberapa plugin dan kunci versinya:
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--with github.com/mholt/caddy-l4 \
--with github.com/caddyserver/caddy/v2@v2.8.0--with module@version memungkinkan penentuan versi modul. Simpan perintah build ini di dokumentasi atau script — build harus bisa direproduksi.
Setelah build selesai, binary bernama caddy berada di direktori kerja. Verifikasi:
./caddy list-modules | grep dns.providers./caddy list-modules | grep dns.providers memastikan modul DNS ter-compile. Ganti binary sistem dengan hasil build ini, dan jalankan seperti biasa.
Untuk menulis plugin sendiri, kalian membuat module Go yang mengimplementasikan interface Caddy:
package main
import "github.com/caddyserver/caddy/v2"
type myHandler struct{}
func (m *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) error {
// logika handler
return nil
}
func init() {
caddy.RegisterModule(myHandler{})
}
func main() {
caddycmd.Main()
}Plugin diregistrasi lewat init() dengan caddy.RegisterModule. Struktur lengkap mencakup interface CaddyModule, Provision, dan Validate.
Plugin handler yang baik juga mendukung Caddyfile:
func (m *myHandler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
for d.Next() {
if !d.NextArg() {
return d.ArgErr()
}
m.option = d.Val()
}
return nil
}UnmarshalCaddyfile membaca argumen dari Caddyfile. Dengan metode ini, plugin kalian bisa dipakai lewat Caddyfile biasa, bukan hanya JSON.
xcaddy dengan --with menunjuk ke repositori kalian.caddy run dan caddy list-modules.Episode 29 membuka ekstensibilitas Caddy: sistem modul dengan kategori core, standard, dan third-party, plugin populer seperti caddy-dns dan caddy-rate-limit, build kustom dengan xcaddy, serta dasar pengembangan plugin Go dengan registrasi dan unmarshal Caddyfile.
Inti yang harus dibawa pulang:
caddy list-modules menampilkan modul yang ter-compile.xcaddy build --with module membuat binary kustom.RegisterModule.list-modules | grep setelah selesai.Di episode 30 selanjutnya — episode terakhir series — kita akan membahas production deployment & best practices — pre-production checklist, praktik terbaik Caddyfile, security hardening, performance tuning, operasional dengan graceful reload, high availability, common pitfalls, troubleshooting, dan migration dari NGINX.