Episode ini membahas admin API: endpoint konfigurasi, memuat dan mengganti konfigurasi JSON, hot reload tanpa downtime, perbedaan JSON dan Caddyfile, serta otomasi CI/CD dan multi-tenant dengan API.

Caddyfile adalah pintu utama, tapi ada jalan lain: admin API. Melalui HTTP di port 2019, kalian bisa membaca, mengganti, dan mem-patch konfigurasi Caddy saat berjalan — tanpa restart, tanpa downtime. Episode 23 membuka kekuatan dynamic configuration ini.
Admin API tersedia di localhost:2019 secara default. Endpoint utamanya:
GET /config/ — baca konfigurasi saat ini.POST /load — muat konfigurasi baru sepenuhnya.PATCH /config/... — ubah sebagian konfigurasi.POST /stop — hentikan Caddy secara mulus.GET /pki/... — info sertifikat.GET /metrics — metrics Prometheus (episode 22).Contoh membaca konfigurasi:
curl http://localhost:2019/config/curl http://localhost:2019/config/ mengembalikan JSON lengkap konfigurasi yang sedang berjalan.
Secara default admin API hanya mendengarkan di localhost. Jika harus diakses jarak jauh, batasi akses:
{
admin 127.0.0.1:2019
}
example.com {
root * /var/www
file_server
}Caddy memahami JSON secara native. Konfigurasi minimum:
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [":8080"],
"routes": [
{
"handle": [
{
"handler": "static_response",
"body": "Halo dari JSON"
}
]
}
]
}
}
}
}
}JSON ini melayani respons statis di port 8080. Struktur JSON jauh lebih verbose dari Caddyfile — karena itu Caddyfile tetap pilihan utama untuk manusia.
Kirim konfigurasi JSON ke Caddy:
curl -X POST -H 'Content-Type: application/json' \
-d @config.json \
http://localhost:2019/loadcurl -X POST -d @config.json memuat konfigurasi baru. Perubahan langsung berlaku — ini adalah hot reload.
Dua pola mengubah konfigurasi:
Contoh patch menambah reverse proxy:
curl -X PATCH -H 'Content-Type: application/json' \
-d '{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:8080"}]}' \
http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0PATCH menargetkan path JSON tertentu dan mengganti hanya bagian itu. Koneksi yang sedang aktif tidak terputus — Caddy menangani transisi secara mulus.
Untuk kemudahan, kirim Caddyfile dan biarkan Caddy mengadaptasinya:
curl -X POST -H 'Content-Type: text/caddyfile' \
--data-binary @Caddyfile \
http://localhost:2019/load--data-binary @Caddyfile dengan content type text/caddyfile memberi tahu Caddy untuk mengadaptasi Caddyfile ke JSON dulu, lalu memuatnya. Keduanya valid — pilih sesuai kebutuhan.
Kalian bisa melihat JSON hasil konversi Caddyfile:
caddy adapt --config Caddyfile --prettycaddy adapt --pretty mencetak JSON yang mudah dibaca. Ini cara terbaik mempelajari struktur JSON dari Caddyfile yang sudah kalian kenal.
Admin API cocok untuk pipeline deployment:
Skenario nyata: service mesh mendaftarkan backend baru secara dinamis:
curl -X POST -H 'Content-Type: application/json' \
-d '{"dial": "service-b:8081"}' \
http://localhost:2019/config/apps/http/servers/srv0/routes/0/handle/0/upstreamsEndpoint PATCH/POST per-upstream memungkinkan menambah dan menghapus backend tanpa menyentuh seluruh konfigurasi. Ini fondasi service discovery dinamis yang dipakai di orchestration.
Gabungkan Caddyfile (version control) dan admin API (runtime) untuk Infrastructure as Code yang lengkap: konfigurasi versi terkontrol di repositori, perubahan runtime dilakukan lewat API yang terdokumentasi, dan state akhir bisa dibaca ulang lewat GET /config/.
Episode 23 membuka admin API: endpoint konfigurasi dan metrics, memuat serta mengganti JSON dengan POST /load dan PATCH, hot reload tanpa downtime, perbandingan JSON vs Caddyfile dengan adapter, dan skenario otomasi CI/CD, dynamic backend, serta multi-tenant.
Inti yang harus dibawa pulang:
POST /load mengganti konfigurasi, PATCH mengubah sebagian.caddy adapt --pretty mengubah Caddyfile menjadi JSON.Di episode 24 selanjutnya kita akan membahas PHP-FPM integration — directive php_fastcgi, koneksi via Unix socket dan TCP, setup PHP-FPM dengan pool, pola WordPress, Laravel, dan Symfony dengan try_files, serta optimasi OPcache dan FPM process management.