Halo Sobat Online! Pernah merasa lelah mengurus sertifikat SSL? Pasang Nginx, pasang Certbot, atur cron renewal, lalu deg-degan tiap 90 hari takut sertifikat kedaluwarsa. Nah, ada kabar baik: Caddy reverse proxy menghapus semua drama itu. Cukup tulis 2 baris konfigurasi, dan HTTPS aktif sendiri — termasuk perpanjangannya.
Kalau artikel sebelumnya kita membahas Nginx + Certbot secara manual, kali ini kita naik level ke cara yang lebih santai. Ibaratnya, kalau Nginx itu mobil manual yang tangguh tapi harus oper gigi sendiri, Caddy itu mobil matic: injak gas, jalan, urusan persneling beres sendiri. Yuk, kita pasang di VPS!
Apa Itu Caddy dan Kenapa Layak Dicoba?
Caddy adalah web server open-source yang ditulis dengan bahasa Go. Fungsi yang paling populer adalah sebagai reverse proxy, yaitu “pintu depan” yang menerima semua trafik dari internet lalu meneruskannya ke aplikasi di belakangnya (n8n, Uptime Kuma, Next.js, dan lain-lain).
Keunggulan yang bikin Caddy istimewa dibanding Nginx:
- HTTPS otomatis — sertifikat Let’s Encrypt diminta, dipasang, dan diperpanjang sendiri. Tidak ada Certbot, tidak ada cron renewal.
- Konfigurasi super ringkas — yang di Nginx butuh 30 baris blok
server, di Caddy cukup 3 baris. - HTTP/3 bawaan — protokol terbaru langsung aktif tanpa kompilasi khusus.
- Ringan — image Docker sekitar belasan MB, memori idle kecil, cocok untuk VPS murah 1 GB RAM.
- Reload tanpa putus koneksi — ubah konfigurasi tanpa restart, pengunjung tidak merasakan apa-apa.
Satu catatan jujur: Caddy bukan pengganti Nginx untuk semua kasus. Kalau butuh konfigurasi super kompleks, Nginx masih juaranya. Tapi untuk 90% kebutuhan self-hosting — meneruskan beberapa subdomain ke beberapa aplikasi dengan HTTPS — Caddy jauh lebih gampang.
Syarat Sebelum Mulai
Sebelum ngoprek, pastikan tiga hal ini beres. Khususnya nomor 1 dan 2 — tanpa keduanya, sertifikat tidak akan terbit:
- VPS dengan Docker dan Docker Compose sudah terinstal.
- Domain dengan A record yang mengarah ke IP VPS. Contoh:
app.namadomain.com→ IP VPS kamu. Caddy membuktikan kepemilikan domain lewat tantangan ACME di port 80, jadi DNS harus benar dulu sebelum Caddy dijalankan. - Port 80 dan 443 terbuka ke internet. Keduanya wajib: port 80 untuk validasi sertifikat dan redirect otomatis ke HTTPS, port 443 untuk layanan HTTPS-nya. Kalau pakai UFW:
sudo ufw allow 80
sudo ufw allow 443
Langkah 1: Siapkan Folder dan Docker Compose
Buat folder kerja dan file compose.yaml di dalamnya:
mkdir -p ~/caddy && cd ~/caddy- Buat
compose.yamldengan isi berikut:
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Perhatikan volume caddy_data — di sinilah Caddy menyimpan sertifikat dan private key. Dokumentasi resmi menegaskan folder /data bukan cache yang boleh dihapus sembarangan. Kalau volume ini hilang, Caddy menerbitkan ulang semua sertifikat dari nol dan kamu bisa kena batas rate limit Let’s Encrypt. Jadi jangan pernah hapus volume itu!
Port 443/udp dibutuhkan untuk HTTP/3, bonus kecepatan yang aktif otomatis.
Langkah 2: Tulis Caddyfile Pertama
Inilah bagian paling memuaskan. Buat file bernama Caddyfile (tanpa ekstensi) di folder yang sama:
{
email [email protected]
}
app.namadomain.com {
reverse_proxy localhost:3000
}
Ganti app.namadomain.com dengan subdomain kamu dan localhost:3000 dengan alamat aplikasimu. Selesai! Dua baris itu artinya: “Caddy, tolong layani domain ini, urus sertifikatnya, redirect HTTP ke HTTPS, dan teruskan semua trafik ke aplikasi di port 3000.”
Email di blok global dipakai untuk akun ACME (pemberitahuan kedaluwarsa dari Let’s Encrypt), jadi isi dengan email aktif.
Jalankan dengan:
docker compose up -ddocker compose logs caddy
Buka https://app.namadomain.com di browser — gembok hijau sudah menyala. Sertifikat biasanya terbit dalam hitungan detik pada request pertama.
Langkah 3: Tambah Aplikasi Lain? Tinggal Tambah Blok
Punya aplikasi kedua, misalnya Uptime Kuma di port 3001? Tambahkan blok baru di bawahnya:
status.namadomain.com {
reverse_proxy localhost:3001
}
Lalu reload tanpa restart:
docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
Setiap subdomain dapat sertifikatnya sendiri-sendiri, otomatis. Inilah pola yang dipakai untuk menampung n8n, Gitea, Umami, dan aplikasi self-hosted lain di satu VPS — satu Caddy di depan, semua aplikasi aman di belakang.
Kalau Caddy berjalan dalam satu network Docker Compose dengan aplikasinya, ganti localhost:port dengan nama service-nya, misalnya reverse_proxy n8n:5678. Itu kesalahan paling umum: localhost di dalam container menunjuk ke container itu sendiri, bukan ke VPS!
Langkah 4: Tambahkan Header Keamanan Sekali Tulis, Pakai di Mana-mana
Caddy punya fitur snippet: tulis sekali, pakai di semua situs dengan perintah import. Tambahkan ini di atas Caddyfile:
(keamanan) {
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
}
app.namadomain.com {
import keamanan
reverse_proxy localhost:3000
}
Snippet keamanan di atas mengaktifkan HSTS (paksa HTTPS setahun penuh), memblokir MIME sniffing dan clickjacking, serta menyembunyikan identitas server dari penyerang. Satu blok, semua subdomain terlindungi.
Troubleshooting: Kalau Ada yang Nyangkut
Tenang, hampir semua masalah Caddy berasal dari tiga hal yang sama. Cek daftar ini:
- Error obtaining certificate / ACME error — DNS belum mengarah ke VPS atau port 80 terblokir. Pastikan A record benar dan firewall membuka port 80, lalu tunggu propagasi DNS.
- 502 Bad Gateway — backend tidak jalan atau alamatnya salah. Cek dengan
docker compose ps, dan ingat aturan nama service vslocalhostdi atas. - Situs terbuka tapi masih HTTP — redirect HTTP ke HTTPS itu otomatis, jadi kemungkinan kamu justru mem-proxy ke port 80 sendiri atau ada layer lain di depan. Cek dengan
curl -sI http://subdomain-kamudan pastikan ada headerlocation: https://.... - Sertifikat tidak diperpanjang — port 443 terblokir atau DNS berubah. Caddy mencoba ulang otomatis; baca log dengan
docker compose logs caddyuntuk melihat error ACME-nya. - Ubah Caddyfile tapi tidak berpengaruh — lupa reload! Jalankan perintah
caddy reloaddi atas, atau restart container-nya.
Caddy vs Nginx + Certbot: Mana yang Dipilih?
Biar gampang, ini panduan cepatnya:
- Pilih Caddy kalau mau HTTPS otomatis tanpa mikir, konfigurasi pendek, dan mengelola beberapa aplikasi self-hosted di satu VPS.
- Pilih Nginx + Certbot (seperti artikel kita sebelumnya) kalau butuh kontrol super detail, rewrite rule kompleks, atau mengikuti standar yang dipakai mayoritas perusahaan.
- Keduanya bisa hidup berdampingan — banyak admin memakai Caddy di depan untuk TLS otomatis dan Nginx di belakang untuk aplikasi spesifik.
Tidak ada jawaban salah, Sobat Online. Yang penting aplikasimu online, aman, dan kamu paham cara merawatnya.
Kesimpulan: Saatnya Pensiun Mengurus Sertifikat Manual
Dengan Caddy reverse proxy, urusan HTTPS di VPS berubah dari “pekerjaan rutin tiap 3 bulan” menjadi “tulis sekali, lupakan selamanya”. Caddyfile 5 baris, sertifikat otomatis, reload tanpa downtime — semua dengan image Docker yang ringan dan gratis.
Jadi, tunggu apa lagi? Malam ini juga coba pasang Caddy di depan satu aplikasimu — misalnya Uptime Kuma atau n8n yang sudah jalan. Rasakan sendiri bedanya, dan tulis di kolom komentar aplikasi apa yang kamu amankan pertama kali. Selamat ngoprek, Sobat Online — server yang aman itu server yang bikin tidur nyenyak!

