Hai! Sebelum kamu scroll ke bawah, saya mau tanya dulu.
Pernah gak sih, tengah malam tiba-tiba website kamu down cuma gara-gara sertifikat SSL expired? Padahal kamu yakin banget udah setup auto-renewal Certbot. Terus pas dicek, ternyata cron job-nya gak jalan entah sejak kapan. Atau mungkin kamu punya 5 aplikasi Docker di VPS, masing-masing butuh domain sendiri dengan HTTPS – berarti kamu harus bikin 5 file config Nginx, jalanin Certbot 5 kali, dan berdoa semua renewal-nya gak bentrok satu sama lain. Capek gak sih?
Nah, gimana kalau saya bilang, semua config Nginx + Certbot yang biasanya kamu tulis 20 baris itu bisa diganti jadi cuma 3 baris? Dan HTTPS-nya otomatis, tanpa Certbot, tanpa cron job, tanpa drama renewal tengah malam. Kedengeran terlalu bagus? Yuk buktiin bareng-bareng di artikel ini.
Coba lihat dua potongan config ini dulu. Ini config Nginx buat expose satu aplikasi lewat HTTPS:
server {
listen 443 ssl;
server_name app.domainmu.com;
ssl_certificate /etc/letsencrypt/live/app.domainmu.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.domainmu.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
}
}
Itu belum termasuk install Certbot terpisah buat ngurus sertifikatnya. Belum lagi cron job buat auto-renewal, reload service tiap sertifikat baru terbit, dan debugging kalau tiba-tiba renewal gagal tengah malam.
Sekarang bandingin sama Caddy buat kasus yang sama persis:
app.domainmu.com {
reverse_proxy localhost:3000
}
Tiga baris, selesai. Sertifikat HTTPS-nya otomatis diurus di belakang layar, gak perlu ketik satu command Certbot pun.
Ini bukan gimmick marketing. Caddy emang didesain dari awal dengan asumsi HTTPS itu default, bukan fitur tambahan yang harus disetup manual kayak stack Nginx plus Certbot yang selama ini jadi standar.
Di artikel ini, saya bakal bahas tuntas cara setup Caddy di VPS pakai Docker Compose, mulai dari instalasi, konfigurasi reverse proxy ke banyak domain, sampai troubleshooting error yang paling sering muncul. Semua langkahnya detail dan bisa diikuti bahkan kalau kamu baru pertama kali nyentuh reverse proxy.
Apa Itu Caddy? (Penjelasan untuk Pemula)
Caddy adalah web server dan reverse proxy open-source yang punya satu keunggulan utama: automatic HTTPS. Artinya, begitu kamu kasih tau Caddy nama domain yang mau dilayani, dia langsung otomatis minta sertifikat SSL/TLS dari Let’s Encrypt (atau ZeroSSL), pasang sertifikatnya, dan ngurus perpanjangan (renewal) tanpa kamu perlu ngapa-ngapain.

Cara Kerja Caddy Secara Sederhana
Bayangin Caddy itu kayak resepsionis hotel yang super efisien:
- Tamu datang (request dari browser) – Caddy terima di pintu depan (port 80/443)
- Cek reservasi (baca Caddyfile) – Caddy liat domain mana yang diminta, terus arahin ke “kamar” yang bener (container/service yang sesuai)
- Kasih kunci kamar (HTTPS) – Caddy otomatis pastiin semua komunikasi terenkripsi, tanpa kamu harus nyiapin kuncinya manual
Secara teknis, Caddy bertindak sebagai reverse proxy – dia duduk di depan aplikasi-aplikasi kamu dan meneruskan traffic ke service yang tepat berdasarkan nama domain.
Keunggulan Utama Caddy
- Auto HTTPS tanpa config – Sertifikat SSL/TLS di-generate, dipasang, dan di-renew otomatis
- Config super ringkas – Caddyfile jauh lebih pendek dan mudah dibaca dibanding Nginx config
- Graceful reload – Update config tanpa downtime, dan kalau ada typo, config lama tetap jalan
- HTTP/2 dan HTTP/3 default – Performa modern tanpa perlu setting tambahan
- Single binary – Satu file executable, gak ada dependency chain yang ribet
Kapan Sebaiknya Pakai Caddy?
Pakai Caddy kalau:
- Kamu punya beberapa aplikasi Docker yang perlu di-expose lewat domain berbeda
- Kamu capek ngurusin Certbot dan renewal sertifikat manual
- Kamu mau config yang simpel dan gampang di-maintain
- Server kamu isinya banyak service kecil-kecil yang sering ganti
Pertimbangkan alternatif kalau:
- Kamu butuh konfigurasi Nginx yang sangat spesifik (misal custom module, advanced caching rules)
- Kamu udah punya setup Nginx yang stabil dan gak mau diganggu
- Kamu butuh fitur load balancing yang sangat advanced untuk traffic skala besar
Perbandingan Caddy dengan Alternatif Lain
Sebelum mulai instalasi, ada baiknya kamu tau posisi Caddy dibanding reverse proxy lain yang populer. Biar gak salah pilih tool.
Caddy vs Nginx vs Traefik vs Nginx Proxy Manager
| Fitur | Caddy | Nginx + Certbot | Traefik | Nginx Proxy Manager |
|---|---|---|---|---|
| Auto HTTPS | Otomatis, zero config | Manual via Certbot | Otomatis via label Docker | Otomatis via GUI |
| Format Config | Caddyfile (simpel) | nginx.conf (verbose) | YAML + Docker labels | GUI (web interface) |
| Learning Curve | Rendah | Sedang-Tinggi | Sedang | Rendah |
| Reload Tanpa Downtime | Ya, built-in | Ya, tapi manual | Ya, otomatis | Ya, via GUI |
| HTTP/3 Support | Default aktif | Perlu compile module | Eksperimental | Tidak |
| Resource Usage | Ringan | Sangat ringan | Sedang | Sedang |
| Cocok Untuk | Multi-domain VPS | High-traffic production | Kubernetes/Docker Swarm | Pemula yang suka GUI |
Kapan Tetap Pilih Alternatif?
- Nginx – Kalau kamu butuh performa raw tertinggi untuk static file serving atau punya config Nginx yang udah sangat mature dan stabil
- Traefik – Kalau kamu pakai Docker Swarm atau Kubernetes dan butuh service discovery otomatis lewat label
- Nginx Proxy Manager – Kalau kamu lebih nyaman manage semuanya lewat GUI dan gak mau sentuh file config sama sekali
Buat kebanyakan use case VPS pribadi atau small team yang isinya beberapa container Docker, Caddy itu sweet spot antara kemudahan dan fleksibilitas.
Prerequisites (Prasyarat)
Sebelum mulai instalasi, pastiin semua prasyarat ini udah terpenuhi. Saya sertakan juga cara verifikasinya biar kamu gak stuck di tengah jalan.
VPS dengan Akses Root/Sudo
Kamu butuh VPS yang udah jalan dengan OS Linux (Ubuntu 20.04+ direkomendasikan). Pastiin kamu punya akses SSH dengan privilege root atau sudo.
Cara verifikasi:
ssh user@ip-vps-kamu
sudo whoami
Output yang diharapkan: root
Docker dan Docker Compose Sudah Terinstall
Caddy akan kita jalankan lewat Docker, jadi Docker Engine dan Docker Compose plugin harus udah ada di VPS.
Cara verifikasi:
docker --version
docker compose version
Output yang diharapkan: versi Docker (minimal 20.x) dan Docker Compose (minimal v2.x).
Kalau belum terinstall, ikuti panduan lengkap cara install Docker di Ubuntu VPS dulu sebelum lanjut.
Domain yang Sudah Diarahkan ke IP VPS
Caddy butuh domain yang DNS-nya udah ngarah ke IP VPS kamu. Ini wajib karena Let’s Encrypt bakal validasi kepemilikan domain lewat HTTP-01 challenge – artinya Let’s Encrypt bakal coba akses domain kamu di port 80, dan kalau gak resolve ke server tempat Caddy jalan, sertifikat gak bakal terbit.
Cara verifikasi:
dig +short domainmu.com
Output yang diharapkan: IP address VPS kamu (misal 103.xxx.xxx.xxx).
Kalau pakai subdomain, pastiin juga A record untuk subdomain itu udah dibuat di DNS provider kamu (Cloudflare, Namecheap, dll).
Port 80 dan 443 Belum Dipakai Service Lain
Caddy butuh port 80 (HTTP) dan 443 (HTTPS) yang bebas. Kalau ada Nginx, Apache, atau reverse proxy lain yang masih jalan di host, harus dimatiin dulu.
Cara verifikasi:
sudo lsof -i :80
sudo lsof -i :443
Kalau output kosong, berarti port-nya available. Kalau ada service yang nge-bind, matiin dulu:
sudo systemctl stop nginx
sudo systemctl disable nginx
Firewall Mengizinkan Port 80 dan 443
Kalau kamu pakai UFW atau firewall lain, pastiin port 80 dan 443 udah dibuka.
Cara verifikasi dan buka port:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status
Checklist Prerequisites
- VPS aktif dengan akses SSH root/sudo
- Docker Engine terinstall (minimal v20.x)
- Docker Compose plugin terinstall (minimal v2.x)
- Domain/subdomain sudah pointing ke IP VPS
- Port 80 dan 443 available (tidak dipakai service lain)
- Firewall sudah mengizinkan port 80 dan 443
Kalau semua checklist di atas udah centang, kita lanjut ke instalasi.
Step-by-Step Instalasi Caddy di VPS Pakai Docker Compose

Step 1: Buat Folder Project untuk Caddy
Apa yang dilakukan: Bikin folder khusus buat nyimpen semua file konfigurasi Caddy.
Kenapa perlu: Memisahkan file Caddy dari service lain bikin management lebih rapi. Kalau suatu saat perlu backup atau migrasi, tinggal copy satu folder ini aja.
mkdir -p /opt/caddy
cd /opt/caddy
Penjelasan parameter:
mkdir -p– Buat folder baru. Flag-partinya kalau folder parent-nya belum ada, ikut dibuatin juga (gak error)/opt/caddy– Lokasi folder./optadalah direktori standar di Linux buat software tambahan. Kamu bisa pakai lokasi lain, tapi/optudah jadi konvensi umum
Step 2: Buat File docker-compose.yml
Apa yang dilakukan: Bikin file Docker Compose yang mendefinisikan container Caddy beserta konfigurasinya.
Kenapa perlu: Docker Compose memungkinkan kamu mendefinisikan, menjalankan, dan mengelola container lewat satu file YAML. Lebih praktis daripada ketik command docker run panjang-panjang setiap kali.
nano /opt/caddy/docker-compose.yml
Isi dengan konfigurasi berikut:
services:
caddy:
image: caddy:2.10
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
Penjelasan setiap parameter:
image: caddy:2.10– Pakai image resmi Caddy versi 2.10 dari Docker Hub. Selalu pin ke versi spesifik, jangan pakailatest, biar gak kena breaking change pas updaterestart: unless-stopped– Container otomatis restart kalau crash atau VPS reboot, kecuali kamu sengaja stop manual"80:80"– Map port 80 host ke port 80 container. Ini buat HTTP dan juga buat Let’s Encrypt HTTP-01 challenge"443:443"– Map port 443 host ke port 443 container. Ini buat HTTPS (TCP)"443:443/udp"– Map port 443 UDP buat HTTP/3 (QUIC). Protokol HTTP/3 pakai UDP, bukan TCP. Ini yang bikin Caddy bisa serve HTTP/3 out of the box./Caddyfile:/etc/caddy/Caddyfile– Mount file Caddyfile dari host ke dalam container. Ini config utama Caddycaddy_data:/data– Volume paling penting! Di sinilah Caddy nyimpen sertifikat SSL yang udah di-generate. Kalau volume ini hilang, Caddy harus minta sertifikat baru lagicaddy_config:/config– Tempat Caddy nyimpen konfigurasi runtime. Termasuk auto-saved config dan state internal
Kenapa volume caddy_data dan caddy_config wajib ada?
Ini bagian yang paling sering keskip pas orang baru migrasi dari Nginx Proxy Manager. Volume caddy_data itu tempat Caddy nyimpen sertifikat yang udah di-generate. Kalau volume ini gak di-mount dengan bener, tiap kali container di-restart Caddy bakal minta sertifikat baru lagi ke Let’s Encrypt.
Masalahnya, Let’s Encrypt punya rate limit – kamu cuma boleh minta maksimal 5 sertifikat duplikat per domain per minggu. Kena limit itu artinya domain kamu bisa gak dapet HTTPS sampai limitnya reset. Jadi pastiin kedua volume itu persistent, bukan cuma folder sementara di dalam container.
Step 3: Buat File Caddyfile
Apa yang dilakukan: Bikin file konfigurasi utama Caddy yang menentukan domain mana aja yang dilayani dan kemana traffic-nya diarahkan.
Kenapa perlu: Caddyfile adalah “otak” dari Caddy. Tanpa file ini, Caddy gak tau harus ngapain sama traffic yang masuk.
nano /opt/caddy/Caddyfile
Isi dengan konfigurasi dasar:
app.domainmu.com {
reverse_proxy localhost:3000
}
Penjelasan:
app.domainmu.com– Nama domain yang mau dilayani. Ganti dengan domain asli kamu{ }– Block konfigurasi untuk domain tersebutreverse_proxy localhost:3000– Teruskan semua traffic ke aplikasi yang jalan di port 3000. Ganti port sesuai aplikasi kamu
Tips keamanan: Jangan pernah pakai IP address langsung di Caddyfile untuk production. Selalu pakai domain name, karena Caddy butuh domain buat generate sertifikat HTTPS.
Step 4: Jalankan Caddy dengan Docker Compose
Apa yang dilakukan: Start container Caddy di background.
Kenapa perlu: Ini langkah yang beneran menjalankan Caddy. Begitu container up, Caddy langsung mulai listen di port 80/443 dan otomatis generate sertifikat HTTPS.
cd /opt/caddy
docker compose up -d
Penjelasan parameter:
docker compose up– Buat dan jalankan container sesuai definisi didocker-compose.yml-d– Flag “detached mode”. Container jalan di background, jadi terminal kamu gak ke-lock
Expected output:
[+] Running 2/2
✔ Network caddy_default Created
✔ Container caddy-caddy-1 Started
Step 5: Verifikasi Container Berjalan
Apa yang dilakukan: Cek apakah container Caddy udah running dan gak ada error.
docker compose ps
Expected output:
NAME IMAGE COMMAND SERVICE STATUS
caddy-caddy-1 caddy:2.10 "caddy run --config…" caddy Up 30 seconds
Status harus Up, bukan Restarting atau Exited.
Step 6: Cek Log untuk Memastikan Sertifikat Ter-generate
Apa yang dilakukan: Lihat log Caddy untuk memastikan sertifikat HTTPS berhasil di-generate.
Kenapa perlu: Ini cara paling cepat buat tau apakah semuanya berjalan lancar atau ada error yang perlu di-fix.
docker compose logs -f caddy
Penjelasan parameter:
logs– Tampilkan log dari container-f– Flag “follow”. Log terus di-stream real-time. TekanCtrl+Cbuat keluarcaddy– Nama service yang mau dilihat log-nya
Output yang diharapkan (kalau sukses):
caddy | {"level":"info","msg":"obtained certificate","identifier":"app.domainmu.com"}
caddy | {"level":"info","msg":"certificate obtained successfully"}
caddy | {"level":"info","msg":"serving initial configuration"}
Kalau kamu lihat pesan obtained certificate, berarti HTTPS udah aktif dan siap dipakai.
Konfigurasi dan Setup Lanjutan
Setelah Caddy jalan dengan satu domain, sekarang waktunya konfigurasi lebih lanjut sesuai kebutuhan server kamu.
Reverse Proxy ke Container Lain dalam Satu Docker Network
Kalau kamu punya beberapa aplikasi Docker (misal Nextcloud, Immich, Vaultwarden), kamu bisa arahkan semuanya lewat Caddy. Caranya, pastiin Caddy dan aplikasi target ada di Docker network yang sama.
Penting: Kalau target-nya container Docker lain, pakai nama service di Caddyfile, bukan localhost. Karena localhost di dalam container Caddy merujuk ke container Caddy itu sendiri, bukan ke host atau container lain.
Contoh Caddyfile multi-domain:
cloud.domainmu.com {
reverse_proxy nextcloud:80
}
photos.domainmu.com {
reverse_proxy immich-server:2283
}
vault.domainmu.com {
reverse_proxy vaultwarden:80
}
Penjelasan:
nextcloud:80–nextcloudadalah nama service Docker,80adalah port internal container-nya- Setiap block domain otomatis dapet HTTPS sendiri-sendiri
- Satu Caddyfile bisa nampung banyak domain sekaligus. Tinggal tempel block baru di bawahnya
Cara setup Docker network yang sama:
Tambahkan network di docker-compose.yml:
services:
caddy:
image: caddy:2.10
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- caddy_net
volumes:
caddy_data:
caddy_config:
networks:
caddy_net:
external: true
Lalu buat network-nya:
docker network create caddy_net
Dan di docker-compose.yml aplikasi lain (misal Nextcloud), tambahkan network yang sama:
networks:
caddy_net:
external: true
Nambahin Domain Baru? Tinggal Tempel Block Baru
Ini yang bikin Caddy kepake buat server yang isinya banyak service kecil-kecil. Setiap ada aplikasi baru yang mau di-expose, tinggal nambah satu block domain baru di Caddyfile. Save, terus reload, kelar.
Gak perlu bikin file vhost baru kayak di Nginx, gak perlu ngatur symlink dari sites-available ke sites-enabled. Urutan include yang kadang bikin bingung di Nginx pun gak jadi masalah di sini.
Reload Config Tanpa Downtime
Salah satu hal yang paling kepake dari Caddy adalah cara dia reload config. Daripada restart penuh yang bikin koneksi aktif kepotong, Caddy punya mekanisme graceful reload. Config baru diterapkan sambil tetep ngelayanin request yang lagi jalan.
docker compose exec -w /etc/caddy caddy caddy reload
Penjelasan parameter:
docker compose exec– Jalankan command di dalam container yang udah running-w /etc/caddy– Set working directory ke/etc/caddydi dalam containercaddy(pertama) – Nama service di docker-compose.ymlcaddy reload(kedua) – Command Caddy untuk reload konfigurasi
Yang terjadi di balik layar:
- Caddy baca Caddyfile yang baru
- Validasi syntax dulu – kalau ada error, reload ditolak dan config lama tetap jalan
- Kalau valid, config baru diterapkan tanpa memutus koneksi yang sedang aktif
Ini beda jauh sama pengalaman salah edit nginx.conf terus lupa jalanin nginx -t dulu. Di Nginx, ujung-ujungnya seluruh web server bisa mati total sampai errornya ketemu. Di Caddy, worst case cuma reload-nya gagal, tapi service tetap jalan normal.
Integrasi dengan CrowdSec dan Cloudflare Tunnel
Di server yang udah production dan udah dilapisin CrowdSec plus Cloudflare Tunnel, nambahin reverse proxy baru itu sering bikin was-was. Takut ganggu layer keamanan yang udah jalan.
Untungnya Caddy cuma megang urusan routing dan TLS di layer aplikasi. Dia gak bentrok sama CrowdSec yang kerja di layer jaringan lewat bouncer, dan tetep jalan normal di belakang Cloudflare Tunnel tanpa perlu ubah setting apapun di kedua sisi.
Yang perlu diperhatiin:
Pastiin mode SSL/TLS di Cloudflare diset ke Full atau Full (Strict). Kalau dibiarin di Flexible, bakal ada redirect loop antara Cloudflare dan Caddy yang sama-sama nyoba maksa HTTPS.
Tips dari pengalaman: Kalau kamu mau migrasi dari Nginx ke Caddy di server yang udah production, pindahin domain satu per satu. Jauh lebih aman daripada migrasi sekaligus dalam satu malam.
Testing dan Verifikasi
Setelah instalasi dan konfigurasi selesai, waktunya mastiin semuanya berjalan dengan bener.
Test Akses HTTPS di Browser
Buka domain kamu di browser:
https://app.domainmu.com
Yang harus kamu lihat:
- Ikon gembok (lock icon) di address bar
- Tidak ada warning “Your connection is not private”
- Aplikasi kamu tampil dengan normal
Cek Detail Sertifikat SSL
Klik ikon gembok di browser, lalu lihat detail sertifikat. Pastiin:
- Issued to: domain kamu
- Issued by: Let’s Encrypt (atau ZeroSSL)
- Valid until: sekitar 90 hari dari sekarang
Test Pakai curl dari Terminal
curl -I https://app.domainmu.com
Penjelasan: Flag -I artinya cuma ambil header response, bukan seluruh body. Lebih cepat buat verifikasi.
Output yang diharapkan:
HTTP/2 200
server: Caddy
content-type: text/html; charset=utf-8
Yang perlu diperhatiin:
HTTP/2 200– Koneksi pakai HTTP/2 dan status OKserver: Caddy– Konfirmasi traffic lewat Caddy
Test SSL Pakai Tools Online
Buka SSL Labs dan masukkan domain kamu. Target yang harus dicapai:
- Rating A atau A+ – Ini standar minimum buat production
- Certificate chain complete – Sertifikat lengkap dari root sampai leaf
- No warnings – Gak ada peringatan soal weak cipher atau protocol lama
Caddy secara default udah dikonfigurasi dengan cipher suite modern, jadi biasanya langsung dapet rating A tanpa perlu tuning tambahan.
Test HTTP/3 (Opsional)
Kalau kamu udah map port 443/udp di docker-compose.yml, kamu bisa test HTTP/3:
curl --http3 -I https://app.domainmu.com
Output yang diharapkan:
HTTP/3 200
server: Caddy
alt-svc: h3=":443"; ma=2592000
Catatan: Tidak semua versi curl support HTTP/3. Kalau command di atas error, bisa juga test lewat browser Chrome di chrome://flags dengan enable QUIC protocol.
Troubleshooting
Ada beberapa error yang lumayan sering muncul pas awal-awal pakai Caddy. Untungnya kebanyakan solusinya sederhana kalau udah tau akar masalahnya.
Port 80 dan 443 Udah Dipake Service Lain
Gejala: Container Caddy langsung exit atau restart loop setelah di-start.
Penyebab: Apache, Nginx, atau reverse proxy lain masih jalan di host dan nge-bind port 80/443.
Solusi:
# Cek siapa yang pakai port
sudo lsof -i :80
sudo lsof -i :443
# Matiin service yang nge-bind
sudo systemctl stop nginx
sudo systemctl stop apache2
# Disable biar gak auto-start pas reboot
sudo systemctl disable nginx
sudo systemctl disable apache2
Verifikasi: Jalankan ulang docker compose up -d dan cek log.
Sertifikat Gagal Di-generate
Gejala: Log Caddy menunjukkan error acme: error atau challenge failed.
Penyebab umum:
- DNS domain belum ngarah ke IP VPS
- Port 80 diblokir firewall (Let’s Encrypt butuh akses HTTP-01 challenge di port 80)
- Kalau pakai Cloudflare, proxy (orange cloud) aktif tapi SSL mode bukan Full
Solusi:
# Cek DNS resolution
dig +short domainmu.com
# Pastiin hasilnya IP VPS kamu, bukan IP Cloudflare
# Kalau pakai Cloudflare, coba matiin proxy dulu (grey cloud) sampai sertifikat terbit
# Cek firewall
sudo ufw status
sudo ufw allow 80/tcp
Caddyfile Ditolak Pas Reload
Gejala: Command caddy reload return error dan config baru gak diterapkan.
Penyebab: Biasanya syntax error – kurang kurung kurawal, salah indentasi, atau typo di directive.
Solusi:
# Validasi Caddyfile tanpa apply
docker compose exec caddy caddy validate --config /etc/caddy/Caddyfile
Command ini bakal kasih tau baris mana yang error, lengkap sama pesan error-nya. Fix error-nya, terus coba reload lagi.
Reverse Proxy Return 502 Bad Gateway
Gejala: Domain bisa diakses (HTTPS aktif), tapi isinya cuma halaman error “502 Bad Gateway”.
Penyebab umum:
- Container target belum running
- Caddy dan container target beda Docker network
- Port yang ditulis di Caddyfile salah (gak sesuai port internal container target)
Solusi:
# Cek container target udah running
docker ps | grep nama-container
# Cek network
docker network inspect caddy_net
# Pastiin container target ada di network yang sama
Redirect Loop (ERR_TOO_MANY_REDIRECTS)
Gejala: Browser nunjukin error “too many redirects” dan halaman gak pernah load.
Penyebab: Biasanya karena Cloudflare SSL mode diset ke Flexible. Cloudflare kirim traffic HTTP ke server, Caddy redirect ke HTTPS, Cloudflare terima HTTPS tapi kirim lagi sebagai HTTP, dan seterusnya – loop tanpa akhir.
Solusi: Di dashboard Cloudflare, buka SSL/TLS dan ubah mode ke Full atau Full (Strict).
Resource Tambahan
Kesimpulan
Kalau kamu udah ikutin semua langkah di atas, sekarang kamu punya:
- Caddy yang jalan di Docker dengan auto HTTPS
- Reverse proxy yang bisa ngarahin traffic ke banyak container sekaligus
- Config yang gampang di-maintain – tinggal tempel block baru buat domain baru
- Graceful reload – update config tanpa downtime
Maintenance Jangka Panjang
Beberapa hal yang perlu kamu perhatiin setelah Caddy jalan:
- Update image Caddy secara berkala – Cek release baru di Docker Hub Caddy. Update dengan ubah versi di
docker-compose.yml, laludocker compose pull && docker compose up -d - Backup volume caddy_data – Ini berisi sertifikat SSL kamu. Backup berkala biar gak perlu request ulang kalau ada masalah
- Monitor log – Sesekali cek
docker compose logs caddybuat mastiin gak ada error renewal sertifikat - Jangan lupa firewall – Kombinasiin Caddy sama UFW biar server tetep terkunci rapi
Kalau Caddy Gak Cocok Buat Kamu
Gak semua situasi cocok pakai Caddy. Kalau kamu butuh:
- GUI buat manage reverse proxy – coba Nginx Proxy Manager
- Service discovery otomatis di Docker Swarm/Kubernetes – coba Traefik
- Performa raw tertinggi buat static file serving – tetep pakai Nginx
Buat server yang udah kepenuhan config Nginx bertahun-tahun, pindah ke Caddy gak harus buru-buru sekaligus. Mulai aja dari satu dua domain yang paling jarang diutak-atik dulu, biar dampaknya kecil kalau ada yang meleset. Setelah ngerasa nyaman, baru pindahin domain-domain penting lainnya satu per satu.


























