Episode ini membedah sintaks Caddyfile dari nol: struktur dasar, komentar, indentasi, dan environment variables. Kalian juga belajar variasi site blocks dan directive esensial seperti root, file_server, respond, reverse_proxy, redir, dan encode.

Caddyfile adalah file konfigurasi utama Caddy — dan mungkin alasan terbesar kenapa banyak developer jatuh cinta pada Caddy. Formatnya yang dekat dengan bahasa manusia membuat tugas yang rumit di web server lain menjadi sangat ringkas. Episode 4 adalah fondasi: sintaks, site blocks, dan directive esensial.
Kalian akan belajar membaca dan menulis Caddyfile dengan percaya diri. Mulai dari struktur file, cara menulis komentar, indentasi yang benar, sampai penggunaan environment variables agar konfigurasi tidak berisi data sensitif secara mentah-mentah.
Di akhir episode, kalian akan punya kumpulan blok Caddyfile yang siap dipakai: static site, respons sederhana, reverse proxy, dan multi-situs dalam satu file. Ini bekal wajib sebelum masuk ke materi lanjutan.
Caddyfile tersusun dari global options di atas, diikuti site blocks. Komentar ditulis dengan # dan diabaikan oleh parser:
# Global options
email admin@example.com
# Site block
example.com {
root * /var/www/example
file_server
}Indentasi memakai spasi atau tab secara konsisten. Caddy menoleransi keduanya selama konsisten di dalam satu blok. Baris kosong tidak masalah dan justru membuat file lebih mudah dibaca.
Caddyfile bisa membaca environment variables dengan sintaks {$NAMA} — cara yang tepat untuk menyimpan secret dan nilai yang berbeda antar environment:
{$SITE_DOMAIN} {
reverse_proxy localhost:{$APP_PORT}
}Ganti placeholder {$SITE_DOMAIN} dengan nilai environment saat menjalankan Caddy:
SITE_DOMAIN=app.example.com APP_PORT=8080 caddy run --config CaddyfileSatu Caddyfile bisa berisi banyak site blocks — satu per alamat:
a.example.com {
respond "Situs A"
}
b.example.com {
respond "Situs B"
}
localhost:8080 {
respond "Lokal"
}Jika ada beberapa alamat yang memakai konfigurasi sama, tulis alamat terpisah dengan koma:
example.com, www.example.com {
root * /var/www
file_server
}Site address bisa berupa wildcard subdomain. Untuk pengembangan lokal, tentukan port secara eksplisit:
*.example.com {
respond "Subdomain apapun"
}
localhost:3000 {
reverse_proxy 127.0.0.1:8080
}Perhatikan: alamat berupa localhost atau IP tidak akan memicu automatic HTTPS, hanya nama domain publik yang akan mendapatkan sertifikat.
respond mengembalikan respons statis. Untuk melayani file, setel root lalu nyalakan file_server:
localhost {
respond "Selamat datang di Caddy!"
respond /health 200 "OK"
}
localhost {
root * /var/www/mysite
file_server
}root * /var/www/mysite menentukan direktori dokumen untuk semua path (ditandai bintang), dan file_server melayani file dari direktori itu. Detail file serving ada di episode 5.
Reverse proxy meneruskan request ke aplikasi lain; redirect memindahkan request; encode mengompresi respons:
api.example.com {
reverse_proxy localhost:8080
}
old.example.com {
redir https://new.example.com{uri} permanent
}
example.com {
encode zstd gzip
root * /var/www
file_server
}redir ... dengan status permanent menghasilkan HTTP 301 — penting untuk SEO saat pindah domain. encode zstd gzip mengompresi respons sesuai kemampuan browser. Detail masing-masing ada di episode 6, 13, dan 21.
Global options ditulis sebelum site block, tanpa indentasi:
{
email admin@example.com
admin 127.0.0.1:2019
servers {
trusted_proxies static 10.0.0.0/8
}
}
example.com {
root * /var/www
file_server
}email dipakai untuk notifikasi ACME (episode 7).admin menentukan alamat admin API, default localhost:2019.servers berisi pengaturan HTTP server global, termasuk trusted proxies (episode 19).Blok global dibuka dengan tanda kurung kurawal kosong di baris pertama. Opsi ini memengaruhi seluruh situs dalam satu process Caddy.
Episode 4 melengkapi kalian dengan fondasi Caddyfile: sintaks dasar dengan komentar dan indentasi, environment variables untuk nilai dinamis, variasi site blocks mulai dari single site hingga wildcard, directive esensial seperti respond, root, file_server, reverse_proxy, redir, dan encode, plus global options.
Inti yang harus dibawa pulang:
#, indentasi harus konsisten.{$NAMA} untuk nilai dinamis.file_server butuh root; respond untuk respons statis.redir ... permanent menghasilkan HTTP 301.Di episode 5 selanjutnya kita akan masuk ke static file serving — directive file_server dan root secara mendalam, directory browsing, index files, try_files untuk SPA routing, hingga precompressed files dan ETags. Kalian akan bisa melayani situs statis production-ready.