[ ← BACK TO ARTICLES ]
ESSAY // 2026.08.15

Cara Setup Cloudflare Tunnel untuk Home Server Tanpa Port Forwarding

Di artikel sebelumnya, kita sudah bahas kenapa Cloudflare Tunnel itu menarik untuk home server. Sekarang kita coba praktekin — step by step, dari nol sampai jalan.

Begini alurnya secara sederhana:

Internet
Cloudflare
   │ Cloudflare Tunnel
cloudflared
(Home Server)
Local Service
192.168.1.10:8080

cloudflared bikin koneksi keluar dari server kita ke Cloudflare. Karena koneksi dimulai dari dalam, kita ga perlu buka port dari luar. Request masuk dari internet → Cloudflare → tunnel → server lokal.


Yang Dibutuhkan

  • Domain yang udah pakai DNS Cloudflare
  • Akun Cloudflare
  • Home server yang terkoneksi internet
  • Docker dan Docker Compose
  • Service lokal yang mau di-expose

Sebagai contoh, kita punya app di http://192.168.1.10:8080 dan ingin akses lewat https://app.example.com.

Domain yang mau dipakai harus udah ditambahkan ke Cloudflare dulu sebelum bisa jadi Published Application di tunnel.


1. Buat Cloudflare Tunnel

Masuk ke Cloudflare Dashboard:

Networking → Tunnels → Create a tunnel

Beri nama tunnel. Misalnya home-server. Nama ini cuma buat identifikasi, jadi bebas.

Cloudflare bakal generate token — ini yang dipake cloudflared buat terhubung ke Cloudflare.


2. Jalankan cloudflared dengan Docker

Buat folder:

mkdir -p ~/cloudflared
cd ~/cloudflared

Buat docker-compose.yml:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ***}

Buat file .env:

TUNNEL_TOKEN=token-dari-cloudflare

Jalankan:

docker compose up -d

Cek:

docker compose ps
docker compose logs -f cloudflared

Kalau sukses, tunnel bakal keliatan Connected di dashboard Cloudflare.

Penting: Jangan pernah simpan atau share tunnel token ke repo publik.


3. Tambahkan Domain ke Tunnel

Buka kembali Cloudflare Dashboard:

Networking → Tunnels → home-server → Routes → Add route → Published application

Isi hostname:

Subdomain : app
Domain    : example.com

Untuk Service, pilih HTTP dan isi:

http://192.168.1.10:8080

Konfigurasi concept-nya:

app.example.com
Cloudflare
Cloudflare Tunnel
192.168.1.10:8080

Simpan, lalu buka https://app.example.com. Kalau bener, app yang tadinya cuma bisa diakses dari local network sekarang udah bisa dari mana aja.


4. Satu Tunnel, Banyak Aplikasi

Ga perlu bikin satu tunnel per app. Satu tunnel bisa serve banyak sekaligus.

Misalnya di satu server:

                    ┌── Nextcloud (8080)
Internet            ├── Portainer (9443)
   │                │
   ▼                ├── Uptime Kuma (3001)
Cloudflare ─ Tunnel ┤
                    ├── Immich (2283)
                    └── Home Assistant (8123)

Tinggal tambahin route satu-satu:

cloud.example.com       → http://192.168.1.10:8080
portainer.example.com   → https://192.168.1.10:9443
uptime.example.com      → http://192.168.1.10:3001
photos.example.com      → http://192.168.1.10:2283
home.example.com        → http://192.168.1.10:8123

Semua hostname lewat tunnel yang sama.


5. Soal HTTPS

User akses app lewat https://app.example.com — Cloudflare handle HTTPS-nya. Dari cloudflared ke server lokal bisa HTTP biasa:

Browser ←─ HTTPS ─→ Cloudflare ←─ HTTP ─→ cloudflared ←─ HTTP ─→ 192.168.1.10:8080

Service lokal ga harus punya SSL certificate sendiri. Tapi kalau mau, tetep bisa pakai HTTPS di origin juga — Cloudflare Tunnel support keduanya.


6. Ga Perlu Port Forwarding

Setup tradisional:

Internet → Public IP → Router → Port Forwarding → Server

Dengan Cloudflare Tunnel:

Home Server ──outbound──→ Cloudflare ──→ Internet

cloudflared cuma bikin koneksi keluar. Ga ada port yang dibuka dari luar.

Ini juga berguna kalau ISP kamu pakai CGNAT atau ga kasih IP Public.


7. Troubleshooting

Kalau domain ga bisa dibuka:

Container ga jalan?

docker compose ps
docker compose logs -f cloudflared

Service lokal ga bisa diakses?

curl http://192.168.1.10:8080

Kalau dari lokal aja ga bisa, Cloudflare Tunnel juga ga bakal bisa.

Error DNS sudah ada?

Cloudflare bilang record udah ada untuk hostname itu? Buka menu DNS, hapus record yang bentrok, atau pakai hostname lain.

Tunnel ga connected?

Pastikan server bisa akses internet. Firewall ketat? Pastikan port 7844 kebuka untuk koneksi ke Cloudflare.


Catatan Keamanan

Cloudflare Tunnel bikin kita ga perlu expose IP rumah atau buka port di router. Tapi:

Tunnel ≠ otomatis private.

Kalau kita bikin portainer.example.com sebagai Published Application tanpa autentikasi tambahan, hostname itu bisa diakses siapa aja yang tau alamatnya.

Untuk app sensitif (Portainer, Grafana, dashboard internal), tambahin proteksi — misalnya pakai Cloudflare Access.

Kita bahas ini di Part 3.


Kesimpulan

Dengan Cloudflare Tunnel:

http://192.168.1.10:8080

menjadi:

https://app.example.com

Tanpa harus:

✗ Beli IP Public
✗ Buka port 80/443 di router
✗ Port forwarding
✗ Ubah konfigurasi NAT

Cukup: Domain + Cloudflare + cloudflared + Home Server.

Menurutku ini salah satu cara paling praktis untuk expose home server ke internet. Tapi begitu app bisa diakses dari internet, muncul pertanyaan selanjutnya: bagaimana memastikan cuma kita yang bisa buka?

Di Part 3, kita akan coba amankan app home server pakai Cloudflare Access.

COMMENTS & DISCUSSION