Bu sitenin arkasında pahalı bir sunucu yok. Odanın köşesinde, kapağı kapalı duran bir dizüstü bilgisayar var; üzerinde Ubuntu çalışıyor ve aylardır kapanmadı. Site kendisi orada durmuyor — statik dosyalar Cloudflare’de barınıyor — ama otomasyonları çalıştıran n8n orada, ve dışarıdan erişilebilmesi gerekiyordu. Bu yazı o erişimi kurarken verdiğim kararların hikâyesi.
İşin başında bir engel vardı: internet servis sağlayıcım bana gerçek bir genel IP adresi vermiyor. Buna CGNAT deniyor; kabaca aynı genel adresi düzinelerce abone paylaşıyor. Bunun pratik sonucu şu: modemin yönetim ekranından port yönlendirme yapamazsın, çünkü yönlendirecek bir kapın yok. Uzun süre bunun bir ayar hatası olduğunu sandım, sonra traceroute çıktısına baktım ve ilk üç sıçramanın da özel adres aralığında olduğunu gördüm.
Kapıyı dışarıdan açmak yerine içeriden uzatmak
CGNAT arkasındaysan çözüm, dışarıdan içeri bir kapı açmaya çalışmayı bırakıp içeriden dışarı kalıcı bir bağlantı kurmaktan geçiyor. Cloudflare Tunnel tam olarak bunu yapıyor: makinede küçük bir program çalışıyor, Cloudflare’in ağına giden bir bağlantı açıyor ve o bağlantı hep açık kalıyor. Dışarıdan gelen istek önce Cloudflare’e, oradan bu hazır bağlantı üzerinden makineye iniyor.
Kurulumun tamamı şu kadar — makinede bir servis, Cloudflare tarafında bir DNS kaydı:
tunnel: ev-sunucusu
credentials-file: /home/yigit/.cloudflared/ev-sunucusu.json
ingress:
- hostname: n8n.yigittenekeci.com
service: http://localhost:5678
- service: http_status:404
Son satır önemli: listede eşleşmeyen her istek 404 alıyor. Yani yanlışlıkla başka bir servisi dünyaya açma ihtimalin kalmıyor. Makinede Grafana, Zabbix, Syncthing, Ollama gibi bir sürü şey çalışıyor ve hiçbirinin internete çıkmasını istemiyorum.
Yeşil ışıklı ölü sistem
Tünel ayağa kalktıktan sonra n8n’in önüne Cloudflare Access koydum: adrese giren herkes önce e-postasına gelen tek kullanımlık kodu giriyor. Webhook adresleri bundan muaf, yoksa dış servislerin gönderdiği istekler giriş ekranına çarpardı.
Burada ince bir tuzak var ve neredeyse ona düşüyordum. Sistemin ayakta olup olmadığını anlamak için adresi düzenli olarak yoklamak istedim. Ama Access giriş ekranını Cloudflare kendi tarafında üretiyor — yani tünel tamamen ölüyken bile o adres sana kibarca bir giriş formu ve 200 OK döndürüyor. Kontrol yeşil yanıyor, sistem ölü. İzlemenin en sinsi hatası bu: yanlış şeyi ölçüp kendini güvende sanmak.
Çözüm, yoklamanın gerçekten zincirin sonuna kadar gitmesini sağlamaktı:
- n8n’de iki düğümlük bir akış: gelen isteğe
okdönüyor, başka hiçbir şey yapmıyor. - Bu akışın adresi webhook yolunda olduğu için Access’i baypas ediyor.
- Yoklama bu adrese gidiyor: DNS, Cloudflare, tünel, konteyner ve n8n’in akış motoru — hepsi tek istekte sınanıyor.
Artık cevabı n8n’in kendisi üretiyor. Zincirin herhangi bir halkası koparsa yoklama sessiz kalıyor ve telefonuma bildirim düşüyor. Mükemmel bir izleme değil; makine tamamen kapanırsa onu haber verecek olan da kapanmış oluyor. Ama hedefim zaten kesintisiz çalışma değildi — bir şeyin günlerce sessizce ölü kalmasını engellemekti.
