Kalau kamu mau satu server menangani subdomain tanpa batas, setup wildcard subdomain dengan Caddy dan DigitalOcean adalah cara paling rapi.
Detail pentingnya: wildcard certificate (*.example.com) wajib pakai DNS challenge, jadi Caddy harus di-build dengan DNS provider module untuk DigitalOcean.
Kenapa wildcard HTTPS harus pakai DNS challenge
HTTP challenge cocok untuk domain biasa, tapi wildcard cert beda. Certificate authority hanya mengeluarkan wildcard cert lewat validasi DNS (ACME DNS-01 challenge).
Artinya Caddy butuh izin untuk membuat record TXT sementara di DNS zone kamu. Di DigitalOcean DNS, ini dilakukan lewat API token.
Prasyarat
- Domain kamu dikelola di DigitalOcean DNS
- Droplet (atau server lain) dengan IP publik
Arecord untuk*yang mengarah ke IP server- Caddy 2 berjalan di server
- Personal access token DigitalOcean dengan akses write ke DNS
Kalau kamu juga mau domain apex (example.com) aktif, tambahkan A record untuk @.
1. Buat DNS record di DigitalOcean
Di pengaturan DNS domain kamu, tambahkan:
Type: A
Host: *
Value: <ip-server-kamu>
TTL: 3600
Opsional untuk domain apex:
Type: A
Host: @
Value: <ip-server-kamu>
TTL: 3600
Wildcard record ini yang bikin app.example.com, api.example.com, dan subdomain lain resolve ke server yang sama.
2. Build Caddy dengan DigitalOcean DNS module
Binary Caddy bawaan tidak selalu menyertakan semua DNS provider module. Kamu perlu module DNS DigitalOcean.
Install xcaddy lalu build Caddy:
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
xcaddy build \
--with github.com/caddy-dns/digitalocean
Perintah ini menghasilkan binary caddy lokal yang sudah punya dukungan DNS DigitalOcean.
Pindahkan binary ke lokasi final (contoh Linux):
sudo mv ./caddy /usr/local/bin/caddy
sudo setcap cap_net_bind_service=+ep /usr/local/bin/caddy
3. Konfigurasi Caddyfile untuk wildcard subdomain
Set token kamu sebagai environment variable:
export DO_AUTH_TOKEN="dop_v1_xxxxxxxxxxxxxxxxx"
Lalu buat Caddyfile seperti ini:
*.example.com {
tls {
dns digitalocean {env.DO_AUTH_TOKEN}
}
@api host api.example.com
handle @api {
reverse_proxy 127.0.0.1:4000
}
handle {
reverse_proxy 127.0.0.1:3000
}
}
Yang terjadi di sini:
- Caddy request wildcard cert lewat DNS challenge ke DigitalOcean
- HTTPS di-handle otomatis
api.example.comdiarahkan ke upstream tertentu, subdomain lain ke upstream berbeda
Kalau apex domain juga perlu aktif, tambahkan site block terpisah:
example.com {
tls {
dns digitalocean {env.DO_AUTH_TOKEN}
}
reverse_proxy 127.0.0.1:3000
}
Wildcard tidak otomatis mencakup apex domain.
4. Validasi dan jalankan Caddy
Validasi config:
caddy validate --config /etc/caddy/Caddyfile
Jalankan atau reload:
sudo systemctl reload caddy
# atau kalau tidak pakai systemd:
caddy run --config /etc/caddy/Caddyfile
Tes DNS dan HTTPS:
dig app.example.com +short
curl -I https://app.example.com
dig harus mengembalikan IP server kamu, dan curl harus dapat response HTTPS.
Kesalahan yang sering terjadi
Caddy belum punya DNS module
Kalau log Caddy menampilkan error DNS provider/module tidak dikenal, berarti binary kamu belum di-build dengan github.com/caddy-dns/digitalocean.
Token tidak tersedia saat service jalan
Kalau DO_AUTH_TOKEN hanya di-export di shell aktif, service systemd tidak akan melihatnya. Simpan token di environment file service.
Wildcard DNS record belum ada
Kalau tidak ada record *, subdomain tidak resolve. Akibatnya sertifikat gagal dibuat dan request gagal sebelum aplikasi kamu disentuh.
Mengira wildcard mencakup apex
*.example.com mencakup foo.example.com, bukan example.com.
Kesimpulan
Untuk setup wildcard subdomain dengan Caddy dan DigitalOcean, arahkan DNS * ke server kamu, pakai Caddy build yang menyertakan module DNS DigitalOcean, lalu set TLS dengan dns digitalocean. Setelah itu Caddy bisa issue dan renew wildcard HTTPS certificate otomatis.