Kembali ke blog
Agustus 19, 2026Panduan

Cara Menginstal Server Web Caddy dengan HTTPS Otomatis

Instal Caddy di Ubuntu dari repositori resmi, tulis Caddyfile untuk situs statis dan reverse proxy, pahami sertifikat otomatis, systemd, log, dan kesalahan umum saat bermigrasi dari Nginx.

Cara Menginstal Server Web Caddy dengan HTTPS Otomatis

Caddy adalah server web yang memperoleh dan memperbarui sertifikat TLS secara default. Untuk VPS kecil yang meng-host satu atau dua domain, itu menghapus seluruh kelas timer Certbot dan berkas snippet Nginx. Bahasa konfigurasi (Caddyfile) pendek. Reverse proxy, gzip, dan HTTP/2 adalah fitur biasa, bukan akhir pekan modul tambahan.

Nginx masih pilihan yang tepat untuk beberapa toko: Anda sudah punya konfigurasi yang teruji, atau butuh modul yang sangat spesifik. Panduan ini untuk kasus umum lainnya — Anda ingin HTTPS yang bekerja di VPS Hiddence baru tanpa menghafal snippet include. Kita akan menginstal Caddy dari repo apt resmi, menjelaskan bagaimana ia berbicara dengan Let's Encrypt, menyajikan situs statis, memproksi aplikasi lokal, meng-host beberapa domain, melihat log, dan menangani perebutan port 80 dengan Apache atau Nginx lama.

Kapan Caddy cocok

HTTPS otomatis adalah judul, tetapi kemenangan harian adalah lebih sedikit bagian yang bergerak. Caddy mendengar di 80 dan 443, mengalihkan HTTP ke HTTPS, dan menyimpan sertifikat di direktori datanya. Anda masih butuh domain yang mengarah ke VPS. Anda masih perlu tidak merusak ACME (firewall 80/tcp, tidak ada proses lain yang mencuri :80). Sertifikat wildcard membutuhkan modul penyedia DNS — itu jalur lebih panjang daripada sertifikat satu host.

  • HTTP→HTTPS otomatis dan pembaruan sertifikat
  • Caddyfile yang dapat dibaca alih-alih blok server yang panjang
  • Reverse proxy yang mampu untuk Node, Python, PHP-FPM lewat konfigurasi tambahan, atau backend Docker
  • HTTP/2 dan default TLS modern tanpa spreadsheet cipher
  • Unit systemd dari paket resmi

Persyaratan

Domain harus meresolusi ke VPS ini sebelum Caddy dapat membuktikan ACME HTTP-01. Jika DNS masih menyebar, Caddy akan gagal menerbitkan dan mencoba lagi; itu terlihat seperti 'Caddy rusak' padahal hanya DNS. Hentikan Apache atau Nginx dulu jika mereka memiliki 80/443.

  • Ubuntu 22.04 atau 24.04
  • Rekaman A domain ke IP VPS (dan AAAA jika Anda memakai IPv6)
  • Port 80 dan 443 kosong dan diizinkan di firewall
  • Root atau sudo

Langkah 1: Instal Caddy dari repositori resmi

Jangan instal Caddy lama acak dari universe Ubuntu default jika Anda ingin perilaku TLS dan ACME terkini. Proyek Caddy mendokumentasikan sumber apt. Setelah instal, pengguna caddy ada dan layanan diaktifkan.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install debian-keyring debian-archive-keyring apt-transport-https curl gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

apt update
apt -y install caddy

caddy version
systemctl status caddy --no-pager

Langkah 2: Caddyfile pertama — situs statis

Caddyfile default adalah /etc/caddy/Caddyfile. Ganti dengan domain Anda. Caddy akan mencoba mendapatkan sertifikat segera setelah konfigurasi dimuat jika nama host bukan localhost. Taruh berkas situs di direktori yang dapat dibaca pengguna caddy (sering izin bergaya www-data, tetapi paket memakai pengguna caddy).

bash
mkdir -p /var/www/example
echo '<h1>It works</h1>' > /var/www/example/index.html
chown -R caddy:caddy /var/www/example

cat >/etc/caddy/Caddyfile <<'EOF'
example.com {
    root * /var/www/example
    file_server
    encode gzip
}
EOF

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

# Watch issuance:
journalctl -u caddy -f

Langkah 3: Reverse proxy aplikasi lokal

Jika Gunicorn, Node, atau Docker mendengar di 127.0.0.1:8000, Caddy seharusnya satu-satunya proses publik. Direktif reverse_proxy meneruskan Host dan X-Forwarded-* dengan cara yang masuk akal untuk sebagian besar aplikasi. Jika aplikasi menghasilkan URL HTTP absolut, atur flag proksi tepercaya / HTTPS di aplikasi (Django SECURE_PROXY_SSL_HEADER, Express trust proxy, dan seterusnya).

bash
app.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8000
}

# Several hosts in one file are normal:
# blog.example.com {
#     root * /var/www/blog
#     file_server
# }

Langkah 4: Firewall dan systemd

Izinkan 80 dan 443. Unit Caddy adalah caddy.service; reload cukup setelah suntingan Caddyfile jika proses sehat. Jika Anda mengubah variabel lingkungan untuk plugin DNS, restart penuh lebih jelas. Sertifikat hidup di bawah /var/lib/caddy/.local/share/caddy/ secara default — sertakan jalur itu dalam cadangan jika Anda peduli batas laju saat instal ulang.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

systemctl enable --now caddy
systemctl reload caddy

# Backup cert storage (path may vary slightly by version):
ls -la /var/lib/caddy/

Langkah 5: Log, kompresi, dan header

Log akses membantu ketika bot menghantam sebuah jalur atau ketika Anda men-debug 404. Anda dapat mencatat per situs. Tambahkan header keamanan jika Anda meng-host aplikasi peramban; jangan menyalin paket header besar tanpa memahami HSTS (begitu Anda menetapkan max-age yang panjang, peramban mengingatnya).

bash
example.com {
    root * /var/www/example
    file_server
    encode gzip
    log {
        output file /var/log/caddy/example.log
    }
    header {
        X-Content-Type-Options nosniff
        Referrer-Policy no-referrer-when-downgrade
        -Server
    }
}

mkdir -p /var/log/caddy
chown caddy:caddy /var/log/caddy
systemctl reload caddy

Langkah 6: PHP dan tambahan lain

Caddy dapat berbicara dengan PHP-FPM dengan direktif php_fastcgi. Itu cukup untuk banyak host WordPress atau Laravel, tetapi Anda masih butuh php-fpm terpasang dan jalur soket yang cocok. Jika Anda sudah punya konfigurasi Nginx PHP yang sempurna, migrasi dalam satu malam bersifat opsional — Caddy lebih bersinar pada reverse proxy + statis + TLS otomatis.

bash
example.com {
    root * /var/www/example
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}

# Confirm FPM is running:
systemctl status php8.3-fpm

Bermigrasi dari Nginx tanpa kejutan downtime

Hentikan Nginx sebelum memulai Caddy atau mereka akan berebut 80/443. Turunkan TTL DNS sehari sebelumnya jika Anda juga memindahkan IP. Uji dengan curl --resolve agar Anda bisa mengenai VPS baru sebelum mengganti rekaman A. Simpan konfigurasi Nginx di git selama seminggu jika Anda perlu rollback.

  • systemctl stop nginx && systemctl disable nginx
  • Instal Caddy, validasi Caddyfile, mulai Caddy
  • curl -I --resolve example.com:443:NEW_IP https://example.com
  • Baru kemudian ubah DNS jika IP baru
  • Penerbitan ulang otomatis; jangan juga jalankan Certbot terhadap nama host yang sama

Pemecahan masalah

Kegagalan ACME hampir selalu DNS, firewall, atau layanan lain di port 80. Baris log Caddy menyebut tls.obtain. Jika situs bekerja di HTTP tetapi tidak HTTPS, penerbitan tidak pernah selesai. Jika Anda melihat terlalu banyak sertifikat, Anda menabrak batas laju Let's Encrypt — gunakan CA staging saat menguji, bukan produksi.

  • validate gagal: sintaks Caddyfile, kurung hilang
  • permission denied di root: chown caddy untuk direktori situs
  • bind: address already in use — ss -tulpn | grep -E ':80|:443'
  • timeout sertifikat: dig +short domain dari VPS, ufw allow 80
  • 502 reverse_proxy: backend mati, atau Anda memproksi ke localhost dari jaringan kontainer secara salah

Catatan keamanan

Default TLS Caddy bersifat konservatif. Tugas Anda adalah keamanan aplikasi dan SSH. Jangan aktifkan API admin Caddy di antarmuka publik. Titik akhir admin default bersifat lokal; biarkan begitu. Jika Anda memakai Caddyfile dari internet, baca setiap matcher — snippet yang reverse_proxy /* ke IP internal dapat menjadi proksi terbuka.

  • Jangan paparkan API admin
  • Jaga paket tetap diperbarui
  • HSTS hanya setelah Anda yakin HTTPS bekerja untuk semua nama host
  • Pisahkan nama host uji dan produksi untuk melindungi batas laju ACME

Tips

  • caddy fmt --overwrite /etc/caddy/Caddyfile menjaga berkas tetap dapat dibaca
  • Gunakan snippet import ketika Anda punya banyak situs serupa
  • Untuk Docker, image caddy:alpine dengan Caddyfile yang dipasang umum
  • Sertifikat wildcard butuh modul DNS dan token API — lindungi token itu
  • Baca journalctl -u caddy sebelum Anda menulis ulang seluruh berkas

Caddy di VPS adalah: paket resmi, Caddyfile pendek, port 80/443 terbuka, DNS sudah mengarah ke server, dan systemd reload setelah suntingan. Pakai sebagai server berkas statis atau sebagai reverse proxy di depan Gunicorn, Node, atau Docker. HTTPS otomatis bekerja ketika ACME dapat menjawab di port 80; jika penerbitan gagal, perbaiki DNS dan konflik port sebelum menyalahkan Caddy. Cadangkan /var/lib/caddy jika Anda sering menginstal ulang.