# Optimasi Traffic Routing dan Load Balancing di Edge dengan Caddy dan Cloudflare

> Diterbitkan oleh Literally Web ID pada 20 Oct 2026
> Sumber: https://literally.web.id/articles/optimasi-traffic-routing-dan-load-balancing-di-edge-dengan-caddy-dan-cloudflare

---

## 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:

```bash
# 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:

```bash
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:

```bash
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`:

```bash
sudo mkdir -p /etc/caddy
sudo nano /etc/caddy/.env
```

Masukkan token API Cloudflare Anda ke dalam file tersebut:

```env
CLOUDFLARE_API_TOKEN=masukkan_token_api_cloudflare_anda_di_sini
```

Simpan dan amankan izin akses filenya agar tidak bisa dibaca oleh user sembarangan:

```bash
sudo chmod 600 /etc/caddy/.env
```

Sekarang, mari kita tulis mahakarya kita: file konfigurasi Caddy (`Caddyfile`). Buka file konfigurasinya:

```bash
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:

```caddyfile
{
    # 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:

```bash
sudo systemctl edit caddy
```

Tambahkan snippet konfigurasi systemd berikut di editor yang terbuka:

```ini
[Service]
EnvironmentFile=/etc/caddy/.env
```

Simpan, lalu restart service Caddy untuk merayakan racikan baru kita:

```bash
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:

```bash
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:

```bash
curl -I https://app.domainanda.com
```

Perhatikan respons header yang dikembalikan:
- Anda akan melihat `Server: cloudflare` yang menandakan traffic disaring dengan baik di edge.
- Anda juga akan melihat status HTTP `200 OK` atau 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!