Cara Setup Caddy di VPS: Reverse Proxy Auto HTTPS Tanpa Config Ribet

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.

Caddy reverse proxy vps architecture

Cara Kerja Caddy Secara Sederhana

Bayangin Caddy itu kayak resepsionis hotel yang super efisien:

  1. Tamu datang (request dari browser) – Caddy terima di pintu depan (port 80/443)
  2. Cek reservasi (baca Caddyfile) – Caddy liat domain mana yang diminta, terus arahin ke “kamar” yang bener (container/service yang sesuai)
  3. 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

FiturCaddyNginx + CertbotTraefikNginx Proxy Manager
Auto HTTPSOtomatis, zero configManual via CertbotOtomatis via label DockerOtomatis via GUI
Format ConfigCaddyfile (simpel)nginx.conf (verbose)YAML + Docker labelsGUI (web interface)
Learning CurveRendahSedang-TinggiSedangRendah
Reload Tanpa DowntimeYa, built-inYa, tapi manualYa, otomatisYa, via GUI
HTTP/3 SupportDefault aktifPerlu compile moduleEksperimentalTidak
Resource UsageRinganSangat ringanSedangSedang
Cocok UntukMulti-domain VPSHigh-traffic productionKubernetes/Docker SwarmPemula 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

Caddy reverse proxy installation flow

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 -p artinya kalau folder parent-nya belum ada, ikut dibuatin juga (gak error)
  • /opt/caddy – Lokasi folder. /opt adalah direktori standar di Linux buat software tambahan. Kamu bisa pakai lokasi lain, tapi /opt udah 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 pakai latest, biar gak kena breaking change pas update
  • restart: 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 Caddy
  • caddy_data:/data – Volume paling penting! Di sinilah Caddy nyimpen sertifikat SSL yang udah di-generate. Kalau volume ini hilang, Caddy harus minta sertifikat baru lagi
  • caddy_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 tersebut
  • reverse_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 di docker-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. Tekan Ctrl+C buat keluar
  • caddy – 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 – nextcloud adalah nama service Docker, 80 adalah 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/caddy di dalam container
  • caddy (pertama) – Nama service di docker-compose.yml
  • caddy reload (kedua) – Command Caddy untuk reload konfigurasi

Yang terjadi di balik layar:

  1. Caddy baca Caddyfile yang baru
  2. Validasi syntax dulu – kalau ada error, reload ditolak dan config lama tetap jalan
  3. 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 OK
  • server: 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, lalu docker 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 caddy buat 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.

Jundi Husni Mubaraq

Jundi Husni Mubaraq

Saya seorang software engineer yang sejak awal 2026 megang penuh (sendirian) tanggung jawab infrastruktur server di tempat saya kerja: deploy dan maintain server Linux Ubuntu on-premises, bangun keamanan berlapis pakai CrowdSec dan Cloudflare, kelola job scheduling dan monitoring pakai Cronicle, deploy aplikasi containerized pakai Docker, sampai ngurusin mail server korporat dari nol. Sebelumnya saya 3+ tahun jadi Software Engineer/Fullstack Developer di beberapa perusahaan, termasuk proyek skala internasional (EUDR compliance system buat Lindt & Sprungli) dan sistem rumah sakit (SIMRS, rekam medis elektronik, integrasi BPJS Kesehatan) di RS PKU Muhammadiyah Surakarta. jundi.hm ini tempat saya dokumentasiin apa yang beneran saya kerjain dan pelajarin di lapangan, bukan sekadar riset teori, S.Kom dari Universitas Duta Bangsa Surakarta jadi bekal awal, tapi yang nulis di sini adalah pengalaman langsung ngelola server production sehari-hari. Selengkapnya: https://iam.jundi.hm

Lihat Juga Nih

Selanjutnya Nih

Kasih Komentar

Email kamu gak bakal ditampilin ke publik. Kalau ada tanda ini artinya wajib diisi ya *

Rekomendasi.

Lagi Viral.