1. Menu Kita Hari Ini & Alat yang Perlu Disiapkan
Pernahkah Anda berurusan dengan server production yang mendadak tumbang karena sertifikat SSL-nya expired, atau pusing tujuh keliling saat harus memperbarui wildcard SSL di belasan instance backend secara manual? Di lapangan, urusan lalu lintas web, mulai dari terminating koneksi TLS, load balancing, caching di edge, hingga mitigasi serangan DDoS, sering kali menjadi momok yang memecah konsentrasi tim developer dari fokus utamanya: merakit fitur aplikasi.
Dalam 15 menit ke depan, kita akan merakit stack modern dari nol sampai berjalan mulus. Kita tidak akan membuang waktu membahas teori abstrak, melainkan langsung membangun benteng edge routing berperforma tinggi menggunakan kombinasi Cloudflare sebagai garda terdepan dan Caddy Server sebagai reverse proxy cerdas di sisi origin yang menangani otomatisasi Let's Encrypt Wildcard Certificate via DNS API secara seamless.
Sebelum kita mulai menyalakan kompor, pastikan bahan-bahan di dapur Anda sudah lengkap:
- Sebuah VPS Linux (Ubuntu 22.04 LTS sangat disarankan) yang bertindak sebagai origin server.
- Domain aktif yang nameserver-nya sudah diarahkan ke Cloudflare.
- Akses API Token Cloudflare dengan hak akses Edit Zone DNS.
- Caddy Server (versi 2+) yang sudah terinstal di VPS.
[!TIP] Pastikan port 80 dan 443 di firewall VPS Anda (UFW atau cloud security group) sudah terbuka lebar untuk menerima traffic HTTP dan HTTPS dari seluruh dunia.
Mari kita bedah peta perjalanan kita agar Anda memiliki gambaran utuh bagaimana semua komponen ini saling mengunci dengan sempurna.
2. Peta Jalan Singkat: Apa yang Sedang Kita Rakit
Bayangkan arsitektur kita seperti sebuah gedung perkantoran super ketat. Cloudflare bertindak sebagai satpam di gerbang depan (edge) yang menyaring tamu, mengenakan enkripsi SSL, menahan serangan brute-force dengan WAF, dan melayani static asset langsung dari cache terdekat dari lokasi user.
Begitu request lolos dari gerbang Cloudflare, traffic tersebut meluncur melalui terowongan aman menuju Caddy Server di server origin kita. Caddy tidak hanya bertindak sebagai reverse proxy yang mendistribusikan beban ke backend service (entah itu PHP-FPM, Node.js, atau Go binary), tapi ia juga secara diam-diam di belakang layar terus memperbarui sertifikat SSL wildcard menggunakan modul DNS challenge Cloudflare tanpa membuat service downsedetik pun.
[!IMPORTANT] Kita akan menggunakan pendekatan "Full (Strict)" SSL/TLS mode di Cloudflare. Artinya, enkripsi end-to-end terjamin dari browser user ke Cloudflare, dan dari Cloudflare ke Caddy server kita menggunakan sertifikat valid.
Tanpa berlama-lama lagi, mari kita singkap lengan baju dan mulai meracik fondasi lingkungan kerja kita di langkah pertama.
3. Langkah 1: Mempersiapkan Fondasi & Environment
Hal pertama yang harus kita bereskan adalah memastikan Caddy memiliki kemampuan untuk berbicara dengan Cloudflare API guna melakukan validasi DNS-01 saat menerbitkan sertifikat Let's Encrypt Wildcard (*.domainanda.com). Kenapa DNS-01? Karena ini satu-satunya cara elegan untuk mendapatkan wildcard certificate tanpa harus membuka port HTTP secara sembarangan.
Karena Caddy versi bawaan repository Ubuntu tidak menyertakan modul DNS Cloudflare secara default, kita perlu merakit ulang binary Caddy menggunakan xcaddy, utilitas resmi dari tim Caddy untuk mengompilasi plugin pihak ketiga.
Masuk ke terminal VPS Anda, lalu jalankan perintah kilat ini untuk menginstal dependensi dan merakit Caddy:
# Instal Go compiler yang dibutuhkan oleh xcaddy
sudo apt update && sudo apt install -y golang-go debian-keyring debian-archive-keyring apt-transport-https
# Instal xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
# Tambahkan path Go ke environment global
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc
source ~/.bashrc
# Rakit Caddy dengan modul DNS Cloudflare
xcaddy build --with github.com/caddy-dns/cloudflare
Perhatikan respons di terminal Anda. Proses kompilasi ini hanya memakan waktu belasan detik. Jika berhasil, Anda akan melihat file binary caddy baru di direktori kerja Anda. Pindahkan binary tersebut ke /usr/bin/caddy agar bisa dieksekusi secara global oleh sistem:
sudo mv caddy /usr/bin/caddy
sudo chmod +x /usr/bin/caddy
Verifikasi bahwa Caddy sudah siap tempur dengan memanggil versinya beserta modul yang terpasang:
caddy version
Jika terminal memuntahkan informasi versi beserta modul dns.providers.cloudflare, itu tanda bahwa fondasi pertama kita sudah berdiri kokoh. Sekarang, kita butuh tempat untuk menyimpan kredensial Cloudflare API secara aman sebelum meracik konfigurasi inti.
4. Langkah 2: Meracik Konfigurasi Inti Tanpa Basa-basi
Di dunia nyata, meletakkan API token secara mentah di dalam file konfigurasi utama adalah tindakan bunuh diri secara administratif. Kita akan menyimpannya sebagai environment variable yang hanya bisa dibaca oleh service Caddy.
Buat file environment khusus di /etc/caddy/.env:
sudo mkdir -p /etc/caddy
sudo nano /etc/caddy/.env
Masukkan token API Cloudflare Anda ke dalam file tersebut:
CLOUDFLARE_API_TOKEN=masukkan_token_api_cloudflare_anda_di_sini
Simpan dan amankan izin akses filenya agar tidak bisa dibaca oleh user sembarangan:
sudo chmod 600 /etc/caddy/.env
Sekarang, mari kita tulis mahakarya kita: file konfigurasi Caddy (Caddyfile). Buka file konfigurasinya:
sudo nano /etc/caddy/Caddyfile
Salin dan tempel blok konfigurasi bersih berikut ini. Perhatikan bagaimana kita menyisipkan modul DNS Cloudflare untuk mengurus sertifikat wildcard secara otomatis:
{
# Global options
email admin@domainanda.com
# Konfigurasi Issuer menggunakan Let's Encrypt dengan DNS Challenge Cloudflare
acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
# Blok untuk domain utama dan wildcard subdomain
*.domainanda.com, domainanda.com {
# Otomatis redirect HTTP ke HTTPS
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
# Routing cerdas berdasarkan header atau path
handle /api/* {
# Meneruskan traffic ke backend Node.js atau Go di port internal
reverse_proxy localhost:4000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
handle {
# Default handler meneruskan ke frontend web server (misal: Nginx/Static atau PHP-FPM)
reverse_proxy localhost:8080 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
# Logging standar untuk audit trail
log {
output file /var/log/caddy/access.log
format json
}
}
[!TIP] Perhatikan baris
reverse_proxy. Caddy secara otomatis melakukan load balancing round-robin jika Anda mendefinisikan beberapa upstream host di dalam blok tersebut (misal:localhost:4000 localhost:4001).
Agar Caddy berjalan otomatis saat server di-reboot, kita pasang systemd service file-nya. Caddy biasanya menyediakan skrip ini secara otomatis, namun mari kita pastikan environment file terpanggil dengan benar:
sudo systemctl edit caddy
Tambahkan snippet konfigurasi systemd berikut di editor yang terbuka:
[Service]
EnvironmentFile=/etc/caddy/.env
Simpan, lalu restart service Caddy untuk merayakan racikan baru kita:
sudo systemctl daemon-reload
sudo systemctl restart caddy
sudo systemctl enable caddy
5. Langkah 3: Sentuhan Akhir Keamanan & Optimasi
Konfigurasi di origin sudah rapi, sekarang saatnya menyeberang ke dashboard Cloudflare untuk memastikan benteng di sisi edge selaras dengan server kita. Pengaturan DNS dan Proxy di Cloudflare adalah kunci penentu performa.
Masuk ke dashboard Cloudflare, pilih domain Anda, lalu arahkan ke menu DNS -> Records. Pastikan Anda menyiapkan konfigurasi record berikut:
| Type | Name | Target / Content | Proxy Status |
|---|---|---|---|
| A | @ |
IP_PUBLIC_VPS_ANDA |
Proxied (Orange Cloud) |
| A | * |
IP_PUBLIC_VPS_ANDA |
Proxied (Orange Cloud) |
| A | app |
IP_PUBLIC_VPS_ANDA |
Proxied (Orange Cloud) |
[!IMPORTANT] Pastikan ikon awan berwarna Orange (Proxied). Ini mengaktifkan seluruh fitur unggulan Cloudflare seperti CDN caching, DDoS mitigation, dan Flexible/Full SSL.
Selanjutnya, buka menu SSL/TLS, dan setel mode enkripsi ke Full (Strict). Jangan pernah menggunakan mode Flexible jika Anda menggunakan Caddy dengan sertifikat valid di origin, karena hal itu akan memicuinfinite redirect loop yang menyebalkan.
Terakhir, di menu SSL/TLS -> Edge Certificates, aktifkan:
- Always Use HTTPS: ON
- Minimum TLS Version: TLS 1.2 (atau TLS 1.3 jika seluruh klien Anda sudah mendukungnya)
- Automatic HTTPS Rewrites: ON
Dengan konfigurasi ini, Cloudflare akan membungkus setiap request masuk dengan aman sebelum menyerahkannya ke Caddy di origin server kita. Mari kita buktikan racikan ini dengan melakukan uji coba lapangan.
6. Tes Rasa: Memastikan Semuanya Berjalan Sempurna
Sebuah resep tidak akan lengkap tanpa tahap icip-icip. Kita perlu memverifikasi apakah Caddy berhasil menerbitkan sertifikat wildcard dan apakah traffic dari Cloudflare mengalir lancar ke backend.
Pertama, pantau log Caddy secara real-time di terminal VPS Anda untuk melihat proses negosiasi SSL dengan Let's Encrypt:
sudo journalctl -u caddy -f
Jika Anda melihat baris log seperti certificate obtained successfully dan serving initial configuration, ucapkan selamat pada diri sendiriโvalidasi DNS-01 Cloudflare berjalan mulus tanpa halangan!
Sekarang, uji dari mesin lokal Anda menggunakan curl untuk melihat header respons dari edge Cloudflare hingga origin Caddy:
curl -I https://app.domainanda.com
Perhatikan respons header yang dikembalikan:
- Anda akan melihat
Server: cloudflareyang menandakan traffic disaring dengan baik di edge. - Anda juga akan melihat status HTTP
200 OKatau kode routing backend Anda.
Coba lakukan pengujian failover sederhana: matikan service backend di port 4000 Anda sejenak, lalu akses endpoint API. Caddy akan memberikan respons error yang bersih tanpa membocorkan stack trace internal aplikasi Anda. Nyalakan kembali backend, dan system langsung pulih seketika.
7. Pertolongan Pertama: Jika Terjadi Kendala Kecil
Bahkan koki berbintang Michelin pun terkadang menemui garam yang tumpah. Di lapangan, ada beberapa kendala klasik yang sering muncul saat pertama kali merangkai Caddy dan Cloudflare:
Kendala 1: Error 522 / 523 Connection Timed Out di Browser
Penyebab utamanya biasanya firewall VPS (seperti UFW) memblokir IP range Cloudflare, atau Caddy belum berjalan di port 443.
Solusi: Pastikan port 443 terbuka (sudo ufw allow 443/tcp), dan cek status service Caddy dengan sudo systemctl status caddy.
Kendala 2: Let's Encrypt Gagal Melakukan Validasi DNS (DNS-01 Challenge Failed)
Penyebabnya hampir selalu salah ketik pada Cloudflare API Token atau token tersebut kurang hak akses Zone:DNS:Edit.
Solusi: Buat ulang API Token di dashboard Cloudflare dengan template Edit zone DNS, pastikan zona domain yang dipilih sudah benar, lalu perbarui file /etc/caddy/.env dan restart Caddy.
Kendala 3: Infinite Redirect Loop (Too many redirects) Penyebabnya adalah ketidakcocokan mode SSL di Cloudflare (misalnya Anda memilih Flexible padahal Caddy memaksa HTTPS). Solusi: Ubah mode SSL/TLS di dashboard Cloudflare menjadi Full (Strict).
Dengan stack ini di tangan, infrastruktur edge routing Anda kini siap menghadapi lonjakan traffic jutaan request harian dengan kepala dingin dan performa maksimal. Selamat bekerja!