Amankan Homelab Kamu dengan SSL Gratis — Tanpa Perlu Buka Port 80 #
Tanda “Not Secure” berwarna merah di sebelah URL dashboard homelab kamu bukan sekadar jelek dipandang — itu adalah risiko nyata. Kredensial (seperti username dan password) yang dikirimkan lewat koneksi HTTP biasa akan berjalan tanpa enkripsi, dan perangkat mana pun di jaringan LAN kamu berpotensi menyadapnya. Tapi solusi standarnya malah punya masalah sendiri: proses Let’s Encrypt berbasis HTTP-01 challenge mengharuskan Port 80 terbuka penuh ke internet, padahal mayoritas ISP rumahan memblokir port tersebut sejak awal. Walaupun ISP kamu tidak memblokirnya, melubangi sistem keamanan firewall demi ini jelas bukan pengorbanan yang sepadan.
Ada jalan yang jauh lebih baik. Metode DNS-01 challenge mampu membuktikan kepemilikan domain melalui record TXT di sisi DNS — tanpa perlu membuka port masuk apa pun, dan tanpa perlu mengekspos koneksi HTTP. Dengan mengombinasikannya bersama Traefik sebagai reverse proxy dan Cloudflare sebagai penyedia DNS, kamu bisa mendapakan proses penerbitan sekaligus pembaruan sertifikat SSL secara otomatis tanpa perlu repot menjalankan skrip Certbot manual.
Begini cara setup lengkapnya dari nol.
Apa yang Kamu Butuhkan? #
| Kebutuhan | Alasannya |
|---|---|
| Server ter-install Docker & Docker Compose | Untuk menjalankan Traefik dan layanan aplikasi kamu |
Domain pribadi (contoh: contoh.com) di Cloudflare |
Metode DNS-01 butuh API Cloudflare untuk bikin TXT record otomatis |
| API Token Cloudflare dengan izin Zone → DNS → Edit | Traefik menggunakan token ini agar challenge-nya berjalan mandiri |
| (Opsional) Pi-hole atau resolver DNS lokal | Agar domain lokal teresolusi ke IP lokal, tidak perlu berputar lewat internet publik |
Kenapa DNS-01 Lebih Jago dari HTTP-01 untuk Urusan Homelab #
Alur Let’s Encrypt standar (HTTP-01):
- Let’s Encrypt menyuruh kamu menyediakan sebuah token di
http://namadomain/.well-known/acme-challenge/... - CA (Otoritas Sertifikat) Let’s Encrypt akan mencoba mengakses langsung IP publik kamu lewat Port 80 untuk memverifikasinya.
- Sertifikat baru berhasil diterbitkan.
Tiga hal yang bikin HTTP-01 nggak cocok buat homelab:
- ISP ngeblokir Port 80 — mayoritas jaringan internet rumahan melakukan ini.
- Port forwarding akan memaksa servis internal terekspos ke seluruh jagat internet.
- CGNAT — batas translasi dari operator bikin port forwarding tidak ada gunanya sama sekali.
Alur DNS-01:
- Let’s Encrypt menyuruh kamu me-mublikasikan sebuah record TXT di
_acme-challenge.namadomain. - CA mereka lantas ngebaca record dari DNS Cloudflare — sama sekali nggak ada koneksi ke server rumah kamu.
- Sertifikat baru berhasil diterbitkan.
Tanpa harus buka port. Tanpa lalu-lintas asing yang masuk ke router. Bisa tembus CGNAT. Bisa tembus NAT ganda (double NAT). Benar-benar jalan di mana saja.
Langkah 1 — Buat File Penyimpanan ACME #
Traefik bakal menyimpan private keys milik Let’s Encrypt di file bernama acme.json. File ini wajib dibuat lebih dulu sebelum servis berjalan dan harus dikunci sangat ketat:
mkdir -p /opt/traefik
touch /opt/traefik/acme.json
chmod 600 /opt/traefik/acme.jsonPermission 600 itu membatasi akses baca dan tulis (read/write) cuma buat si pemilik file. Kunci privat SSL (SSL private keys) kamu ngumpul di sini — maka perlakukan layaknya sebuah rahasia negara.
Langkah 2 — Nulis Konfigurasi Docker Compose Traefik #
Bikin file baru di /opt/traefik/docker-compose.yml:
version: "3.8"
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80" # Pintu masuk HTTP (cuma buat ngeredirect ke internal)
- "443:443" # Pintu masuk utama HTTPS
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./acme.json:/acme.json
environment:
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare"
- "--certificatesresolvers.letsencrypt.acme.email=email.kamu@contoh.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/acme.json"Penjelasan tiap baris kuncinya:
| Baris Perintah | Fungsinya |
|---|---|
docker.sock:ro |
Bikin Traefik bisa otomatis nyari kontainer lain (pastiin statusnya read-only — ini biar aman) |
CF_DNS_API_TOKEN |
Token API dari Cloudflare yang khusus ngeberesin PR record TXT otomatis |
dnschallenge=true |
Mode pengalihan khusus buat nge-trigger DNS-01, ketimbang HTTP-01 / TLS-ALPN-01 |
provider=cloudflare |
Nunjukin ke sistem ACME buat milih pakai plugin pihak keberapa |
storage=/acme.json |
Menyimpan cert/key biar kalau Traefik di-restart, settingannya nggak ilang |
web → websecure redirect |
Maksain segala koneksi yang mencoba mengakses lewat HTTP dilarikan ke HTTPS |
Taruh token rahasia kamu di dalam file .env di sebelah file compose:
echo 'CF_DNS_API_TOKEN=token_api_cloudflare_kamu_di_sini' > /opt/traefik/.envNyalakan Traefik-nya:
docker compose up -dLangkah 3 — Pasang SSL ke Aplikasi-aplikasi Kamu #
Traefik menggunakan label (Docker labels) untuk mengidentifikasi kontainer mana saja yang wajib diberi TLS. Tinggal tambahkan empat baris label ini ke service mana saja yang ingin kamu amankan:
services:
homer:
image: b4bz/homer:latest
container_name: homer
labels:
- "traefik.enable=true"
- "traefik.http.routers.homer.rule=Host(`dash.contoh.com`)"
- "traefik.http.routers.homer.entrypoints=websecure"
- "traefik.http.routers.homer.tls.certresolver=letsencrypt"
networks:
- proxy
networks:
proxy:
external: truePembedahan maknanya:
traefik.enable=true— bikin kontainer ini mau diarahkan oleh aturan rutinitas milik Traefik.Host(...)— perintah buat menyesuaikan respons bila ada kunjungan ke URLdash.contoh.com.entrypoints=websecure— bakal merespons lalu-lintas jaringan melalui HTTPS (Port 443).tls.certresolver=letsencrypt— menjadi pemicu penerbitan sertifikat anyar melewati opsiletsencrypt.
Request atau kunjungan pertama kali ke https://dash.contoh.com biasanya akan loading sedikit lama selagi Let’s Encrypt melegalkan sertifikatnya. Sesudahnya, proses tersebut akan berlangsung instan. Traefik juga otomatis melakukan pembaruan masa aktif (renewals) sekitar hari ke-30 menjelang tanggal kedaluwarsa — tanpa urusan cron job, nggak perlu lagi mengetik certbot renew.
Tiap aplikasi tambahan cuma butuh empat konfigurasi label ini saja. Inilah letak kehebatan manajemen cert yang tersentralisasi di satu kendali Traefik.
Langkah 4 — (Opsional) DNS Resolution Lokal #
Sampai di titik ini, domain dash.contoh.com sebenarnya mengarahkan request ke IP publik milik si Cloudflare, padahal kalau buat akses jaringan lokal malah muter nggak karuan. Berikut ada dua solusinya:
Pilihan A — Local DNS via Pi-hole #
Tambahkan rekaman data Local DNS Record ke menu konfigurasi Pi-hole:
- Domain:
dash.contoh.com - IP:
192.168.x.x(IP LAN milik server kamu)
Pilihan B — Override Manual /etc/hosts #
Kamu bisa mengatur pengalihan manual khusus client (seperti laptop):
echo '192.168.x.x dash.contoh.com' | sudo tee -a /etc/hostsApa pun pilihannya, peramban internet (browser) pada jaringan LAN pasti bisa mendarat mulus seraya memajang gembok hijau penanda sertifikat SSL valid — kombinasi paling win-win.
Troubleshooting Cepat #
| Gejala | Penyebabnya | Solusi |
|---|---|---|
| 502 Bad Gateway | Kontainer aplikasi dan milik si Traefik berada di network Docker yang beda | Sambungkan keduanya supaya nangkring di network Docker bernama proxy |
| Sertifikat tidak mau terbit | API token dari Cloudflare kurang beres | Cek kembali apakah izin Zone → DNS → Edit token-nya valid; usut lewat docker logs traefik |
| Batas waktu challenge habis | Masa rambat (propagasi) Cloudflare telat (jarang banget kejadian) | Sabar menunggu kira-kira 1-2 menitan terus reload ulang halamannya |
| Status “Not Secure” nongol lagi | Nyangkut di sisa cache koneksi peramban | Paksain hapus cache atau eksekusi Hard-refresh (tekan tombol Ctrl+Shift+R barengan) |
FAQ (Tanya Jawab) #
Apakah metode DNS-01 tetap berfungsi jika server yang saya pakai tidak punya IP publik? Benar! Karena model pembuktian data Let’s Encrypt diproses mentah-mentah via DNS Cloudflare. Pihak otoritas sertifikat ini tidak akan pernah berusaha terhubung sama server internal kamu. Sangat cocok diterapkan pada masalah klasik seperti batasan CGNAT, double-NAT, serta skema tertutup model air-gapped.
Jadi, saya tidak butuh fitur forwarding di router buat Port 443?
Nggak butuh sama sekali! Tulisan pemetaan Port 443 dalam baris konfigurasi file Docker Compose itu diperuntukkan sebatas akses intranet lokal — browser laptop kamu mengontak via IP lokal ke alur https://dash.contoh.com:443. Nah, kalau suatu masa nanti kamu berencana membongkarnya jadi wujud area akses publik (contohnya, pakai Tunnel besutan Cloudflare), keberadaan sistem buka port tetep gak lagi diperluin.
Apa yang harus saya lakukan saat masa tenggat kedaluwarsanya sertifikat itu mepet? Nggak perlu ada rutinitas apa pun secara manual. Traefik udah pintar kok! Segala seluk-beluk sinkronisasi dengan ACME sudah terprogram secara otomatis buat nge-kebut perpanjang sekitar sebulan penuh sebelum kadaluarsa. Singkatnya, kalau kontainer Traefik menyala normal 24/7, pembaruan dijamin kelar dengan sendirinya.
Apakah mungkin dikawinkan dengan provider DNS yang lain?
Pasti bisa — Traefik sudah secara sah menampung bejibun vendor ternama melewati lego: Mulai dari Amazon Route53, layanan DigitalOcean, barisan Google Cloud DNS, opsi Hetzner, dan segunung daftarnya. Cukup sunting nama di samping perintah provider=cloudflare beserta setelan variabel pada Environment-nya.
Kenapa repot-repot, bukannya mending langsung comot sertifikat origin dari Cloudflare aja? Sayangnya, perlindungan dari pihak origin Cloudflare cuma diizinkan sah bagi lingkup proxy Cloudflare doang. Sekalinya kamu nekat melanggar jalur dengan mengklik domain lewat koneksi bypass DNS lokal, seketika muncul penolakan keras oleh browser. Sebaliknya, SSL racikan orisinal Let’s Encrypt dipercaya seumur hidup sama mayoritas peramban apa pun secara mulus.