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