Membuat Cloudflare Tunnel ke Server Lokal: Cara Aman & Gratis Buka Akses ke Proyekmu Tanpa IP Publik

Pernahkah kamu menyelesaikan proyek backend lokal — misalnya API Express.js atau dashboard admin Laravel — lalu bingung bagaimana cara menunjukkannya ke klien atau tim tanpa harus repot buka port di router, ubah pengaturan firewall, atau bahkan beli VPS hanya untuk uji coba? Nah, itulah momen tepat kamu mengenal Cloudflare Tunnel.

Bayangkan: kamu bisa mengakses https://dev-api.kerjaku.id dari mana saja — padahal servernya berjalan di laptopmu di kafe, di rumah, atau bahkan di Raspberry Pi di rak buku — tanpa satu pun IP publik, tanpa port forwarding, dan tanpa membuka celah keamanan. Itu bukan mimpi. Itu Cloudflare Tunnel — dan hari ini, kita bikin bersama, langkah demi langkah, tanpa skip satu pun detail penting.


Apa Itu Cloudflare Tunnel — dan Kenapa Kamu Harus Menggunakannya Sekarang?

Cloudflare Tunnel (dulu dikenal sebagai Argo Tunnel) adalah layanan gratis dari Cloudflare yang membuat *tunnel terenkripsi* dari server lokalmu ke jaringan global Cloudflare. Alih-alih memperlihatkan IP publikmu ke dunia (dan membuka risiko serangan langsung), traffic masuk lewat Cloudflare dulu — baru dialihkan ke perangkatmu melalui koneksi outbound aman.

“Tidak ada port yang dibuka. Tidak ada IP yang terekspos. Tidak ada konfigurasi router yang berantakan.”

Ini bukan sekadar ‘cara gampang’ — ini pendekatan keamanan modern. Bayangkan seperti memberi akses ke rumahmu lewat penjaga pintu (Cloudflare) yang tahu persis siapa boleh masuk, bukan dengan memasang plang besar “RUMAH JONI — MASUK LEWAT BELAKANG” di jalan raya.


Persiapan Awal: Apa Saja yang Kamu Butuhkan?

Tidak perlu kartu kredit, tidak perlu akun berbayar. Cukup 5 menit dan 3 hal berikut:

  • Akun Cloudflare (gratis — daftar di dash.cloudflare.com)
  • Domain yang sudah ditambahkan ke Cloudflare (bisa domain murah seperti .xyz, .dev, atau bahkan subdomain gratis dari pages.dev jika pakai Workers)
  • Server lokal yang berjalan di port tertentu — contoh: http://localhost:3000 (Next.js), http://127.0.0.1:8000 (Laravel Valet), atau http://localhost:5000 (Flask)

Catatan kecil: Pastikan domainmu sudah *fully proxied* (ikon awan berwarna oranye) di DNS Cloudflare. Kalau masih abu-abu, klik ikonnya sampai berubah oranye — itu artinya traffic akan melewati jaringan Cloudflare, bukan langsung ke IP-mu.


Langkah 1: Instal cloudflared di Mesin Lokalmu

cloudflared adalah binary CLI resmi dari Cloudflare yang bertugas menjalankan tunnel. Ini bukan aplikasi berat — ukurannya kurang dari 20 MB, dan berjalan ringan di latar belakang.

Untuk macOS (via Homebrew)

Buka Terminal dan jalankan:

brew install cloudflare/cloudflare/cloudflared

Untuk Windows (via PowerShell sebagai Admin)

Jalankan:

choco install cloudflared

Atau unduh manual dari halaman rilis GitHub, lalu tambahkan ke PATH.

Untuk Linux (Ubuntu/Debian)

curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb && sudo dpkg -i cloudflared.deb

Verifikasi instalasi:

cloudflared --version

Jika muncul versi (misal: 2024.5.1), kamu siap lanjut.


Langkah 2: Autentikasi & Buat Tunnel Baru

Buka terminal, lalu jalankan:

cloudflared tunnel login

Perintah ini akan membuka browser otomatis, meminta izin akses ke akun Cloudflare-mu. Pilih domain tempat kamu ingin membuat tunnel (misalnya kerjaku.id). Setelah sukses, cloudflared akan menyimpan file konfigurasi di ~/.cloudflared/cert.pem.

Sekarang, buat tunnel bernama — misalnya dev-api:

cloudflared tunnel create dev-api

Outputnya akan menampilkan ID tunnel (seperti abcd1234-ef56-gh78-ij90-klmnopqrstuv) dan file konfigurasi otomatis di ~/.cloudflared/. Catat ID-nya — kita butuh nanti.


Langkah 3: Konfigurasi Tunnel & Routing ke Server Lokal

Kita tidak akan pakai perintah satu-baris terus-menerus. Kita buat file konfigurasi yang rapi dan bisa di-reuse — namanya config.yml.

Buat file ~/.cloudflared/config.yml (atau di folder proyekmu), lalu isi dengan:

tunnel: abcd1234-ef56-gh78-ij90-klmnopqrstuv
credentials-file: /Users/nama-kamu/.cloudflared/abcd1234-ef56-gh78-ij90-klmnopqrstuv.json

ingress:
  - hostname: dev-api.kerjaku.id
    service: http://localhost:3000
  - service: http_status:404

💡 Ganti dev-api.kerjaku.id dengan subdomain pilihanmu, dan http://localhost:3000 dengan alamat server lokal yang benar. Pastikan port-nya sesuai — kalau kamu pakai Laravel Valet, mungkin http://localhost:8000; kalau Flask, bisa http://127.0.0.1:5000.

Baris terakhir (http_status:404) adalah fallback: kalau ada request ke subdomain lain di domain yang sama, Cloudflare akan kembalikan 404 — bukan error internal atau leak info.


Langkah 4: Buat DNS Record di Cloudflare

Buka Cloudflare Dashboard → pilih domainmu → tab DNS.

Klik Add record, lalu isi:

  • Type: CNAME
  • Name: dev-api (atau nama subdomainmu)
  • Target: abcd1234-ef56-gh78-ij90-klmnopqrstuv.cfargotunnel.com (ganti dengan ID tunnel-mu + .cfargotunnel.com)
  • Proxy status: aktif (awan oranye)

Klik Save. Tidak perlu tunggu lama — biasanya langsung aktif dalam hitungan detik.


Langkah 5: Jalankan Tunnel & Uji Akses

Kembali ke terminal, pastikan server lokalmu sudah berjalan (misal: npm run dev atau php artisan serve), lalu jalankan:

cloudflared tunnel --config ~/.cloudflared/config.yml run

Jika berhasil, kamu akan lihat log seperti:

INFO[0000] Connected to tunnel endpoint
INFO[0000] Registered tunnel with id: abcd1234-...
INFO[0000] Updated DNS record for dev-api.kerjaku.id

Sekarang buka browser, ketik https://dev-api.kerjaku.id. Jika muncul halaman proyekmu — selamat! Tunnelmu hidup. Dan ya, itu HTTPS otomatis — sertifikat SSL dari Cloudflare sudah aktif tanpa setup manual.


Opsional Tapi Sangat Berguna: Jalankan sebagai Service (Auto-Start)

Agar tunnel tetap jalan saat laptop restart atau kamu tutup terminal, kita buat sebagai sistem service.

Di macOS (launchd)

Buat file: ~/Library/LaunchAgents/com.cloudflare.tunnel.dev-api.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.cloudflare.tunnel.dev-api</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/cloudflared</string>
    <string>tunnel</string>
    <string>--config</string>
    <string>/Users/nama-kamu/.cloudflared/config.yml</string>
    <string>run</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
</dict>
</plist>

Lalu jalankan:

launchctl load ~/Library/LaunchAgents/com.cloudflare.tunnel.dev-api.plist
launchctl start com.cloudflare.tunnel.dev-api

Selesai. Tunnel akan hidup otomatis setiap kali kamu login.


Kenapa Ini Lebih Baik daripada ngoprek Router atau Ngewebhook Manual?

  • Aman: Tidak ada port yang dibuka ke internet — semua koneksi keluar dari localmu, bukan masuk.
  • Gratis: Versi dasar sudah cukup untuk development, staging, bahkan small production — tanpa batas bandwidth harian.
  • HTTPS otomatis: Tidak perlu generate sertifikat, renew, atau konfigurasi Nginx/Apache.
  • Skalabel: Bisa tambah banyak subdomain & routing dalam satu config — misalnya admin.kerjaku.id ke localhost:8080, api.kerjaku.id ke localhost:3001.

Yang paling keren? Kamu bisa pakai fitur keamanan Cloudflare langsung: blokir negara tertentu, aktifkan WAF untuk endpoint tertentu, atau bahkan batasi akses hanya untuk email timmu — semua lewat dashboard, tanpa ubah kode.


Kesimpulan: Tunnel Bukan Hanya untuk “Nampilin”, Tapi untuk Berkembang

Membuat Cloudflare Tunnel bukan soal teknis semata — ini soal *menghilangkan hambatan*. Hambatan untuk berbagi ide, menguji integrasi, menunjukkan progress ke stakeholder, atau bahkan deploy cepat tanpa infrastruktur kompleks.

Saya sendiri pakai tunnel ini tiap kali ngembangin tool internal — dari dashboard monitoring sederhana hingga API mock untuk frontend team. Dan setiap kali, rasanya seperti punya infrastruktur enterprise, tapi cuma pakai laptop dan koneksi WiFi kafe.

Jadi, jangan tunda lagi. Coba hari ini. Buat satu tunnel. Lihat URL HTTPS-nya muncul. Rasakan bedanya — bukan cuma lebih aman, tapi juga lebih ringan, lebih cepat, dan lebih… manusiawi.

Ada kendala di langkah tertentu? Tulis di kolom komentar — saya baca dan bantu satu per satu. Karena di dunia developer, tidak ada “stupid question”. Yang ada cuma pertanyaan yang belum dijawab dengan cukup baik.

hyvercode

Leave a Reply

Your email address will not be published. Required fields are marked *