npm Kurmadan Cloudflare Pages'e Deploy: nix run ile Sıfır Kalıntı

Her şey oldukça sıradan başlamıştı. Yeni hazırladığım Ungoogled Chromium vs Chromium yazımı yayına almak için terminali açtım ve klasik bash deploy.sh komutumu çalıştırdım. Yıllardır sorunsuz işleyen lftp betiğim bu kez terminalde 530 Login incorrect hatasıyla patladı. Sorunun bende mi yoksa sunucuda mı olduğunu anlamak için siteyi tarayıcıda açtığımda ise o malum 403 Forbidden ekranıyla karşılaştım.

Sorunun kaynağını bulmak için Hostinger paneline girdiğimde tablonun tamamı ortaya çıktı. Aboneliğimin süresi dolmuştu! Terminaldeki 530 hatası Hostinger’ın FTP erişimimi kapatmasından kaynaklanıyordu. Tarayıcıdaki 403 ise sunucunun web dosyalarına erişimi reddettiğini gösteriyordu. İkisi de aslında aynı kök nedenin farklı yüzleriydi. Benden yıllık 4775 TL yenileme ücreti talep ediliyordu. Sadece statik dosyalardan oluşan basit bir blog için kullanmadığım PHP ve cPanel altyapılarına bu parayı ödemek devasa bir israftı.

O an kesin kararı verdim. Hostinger’ı tamamen terk edecektim. Sitemi doğrudan dosya yükleme mantığıyla çalışan, ücretsiz Cloudflare Pages ağına taşıyacaktım.

Eski Nesil lftp’den Modern CLI Mimarisine Geçiş

Öncelikle krizin patlak verdiği deploy.sh dosyamın eski haline bir bakalım. Dosyaları sunucuya göndermek için lftp kullanan, içinde şifrelerin ve sunucu IP’lerinin döndüğü hantal bir yapıydı:

#!/usr/bin/env bash
# Eski Hostinger lftp deploy betiği (Artık Çöp)
HOST="ftp.eski-sunucu.com"
USER="u123456789"
PASS="gizli_sifre_123"
LOCAL_DIR="./dist"
REMOTE_DIR="/public_html"

lftp -f "
open $HOST
user $USER $PASS
mirror -R $LOCAL_DIR $REMOTE_DIR
bye
"

Cloudflare Pages’e geçiş bu hantal yapıyı tamamen çöpe atmamı sağladı. Ancak burada kritik bir karar vermem gerekiyordu. Cloudflare’in resmi dokümanları deploy işlemi için Node.js ve NPM kurulu olmasını öneriyor. Ardından da şu komutun çalıştırılmasını istiyordu: npx wrangler pages deploy.

Bir NixOS kullanıcısı ve açık kaynak meraklısı olarak sistemime global bir NPM pakedi kurmaktan kaçındım. Node.js bağımlılıklarıyla uğraşmak istemedim. NPM depolarındaki tedarik zinciri risklerini almak bana mantıklı gelmedi.

Çözüm NixOS’un eşsiz geçici kabuk yapısındaydı. deploy.sh dosyamı şu tek satırlık zarif koda indirdim:

#!/usr/bin/env bash
# Yeni, İzole ve Güvenli NixOS Deploy Betiği
nix run nixpkgs#wrangler -- pages deploy ./dist --project-name proje-adiniz

Bu komut sayesinde sistemimde kalıcı hiçbir NPM pakedi bulunmuyor. nix run komutu çalıştırıldığında resmi nixpkgs deposundan Wrangler aracını güvenle çekiyor. Onu izole bir sanal alanda çalıştırıp dosyaları Cloudflare’e fırlatıyor ve işi bitince sistemden tamamen siliyor. Temiz, güvenli ve sıfır kalıntı!

Cloudflare Pages Göçünde Karşılaşılan Hatalar ve Çözümleri

Göç kararı verdiğim an ile SSL sertifikalı sitemin yayına girmesi arasında geçen tüm süreç tam 77 dakika sürdü. Kısa bir süre olsa da Cloudflare ekosistemine özgü birkaç pürüzle karşılaştım. Karşılaştığım hata kodları ve deneyimlediğim pratik çözümler şu şekilde:

1. Cloudflare Error 8000000: API Üzerinden Proje Oluşturma Engeli

Yeni kodumu yazıp ilk deploy.sh denememi yaptığımda Wrangler başarısız oldu. Terminalde 8000000 hata kodunu barındıran ve API üzerinden proje oluşturmamı engelleyen bir hata mesajı gördüm. Tam metnini anın sıcağıyla kopyalamadım. Ancak bu mesaj temel olarak bir yetki ve sunucu engeline işaret ediyordu.

Deneyimim ve Çözümü: Bu hata Cloudflare sistemlerinde genellikle geçici bir backend veya yetki sorununa işaret ediyor. Kendi deneyimimde yeni açılmış bir hesapla ilk projemi arayüze hiç girmeden doğrudan terminalin sunduğu API üzerinden oluşturmaya çalıştım. Sistem bu yüzden isteğimi reddetti. Çözümü gayet pratik oldu:

  1. Cloudflare Dashboard’a girin.
  2. Sol menüden Workers & Pages sekmesine tıklayın.
  3. Create application -> Pages -> Upload assets adımlarını izleyerek terminalde belirttiğiniz proje adını manuel olarak oluşturun. Proje arayüzde oluştuktan sonra terminaldeki komutunuz sorunsuz çalışacaktır.

2. Kök Alan Adı (Apex Domain) İçin DNS Aktarım Zorunluluğu

Proje yüklendikten sonra sitemi proje-adiniz.pages.dev gibi geçici bir adres yerine doğrudan asıl alan adım üzerinden yayınlamak istedim. Ancak Cloudflare www içermeyen kök alan adları için harici CNAME yönlendirmesine doğrudan izin vermiyor.

Çözümü: Tüm DNS yönetimini Cloudflare’e devretmek zorundasınız. Hostinger paneline girdim ve ns1.dns-parking.com olan isim sunucularını Cloudflare’in bana atadığı ken.ns.cloudflare.com ve melissa.ns.cloudflare.com adresleriyle değiştirdim. Bu işlem aslında bir dezavantaj değil. Dünyanın en hızlı DNS sunucusuna bedavaya geçmiş oldum.

3. Error 1000: DNS Points to Prohibited IP

DNS yönlendirmesini yaptıktan kısa bir süre sonra asıl alan adıma girdiğimde Error 1000: DNS points to prohibited IP hatasını aldım.

Gözlemlenen Davranış ve Çözüm: Cloudflare resmi dokümanlarına göre bu hata genellikle DNS kayıtlarının çakışması durumlarında çıkıyor. Yanlış bir Cloudflare IP’sine yönlendirme yapmak buna en iyi örnek. Ancak kendi senaryomda Cloudflare üzerindeki Pages projemin bu alan adından henüz haberdar edilmediği sonucunu çıkardım. Bu elbette o anki teknik bir tahmindi. Çünkü Hostinger isim sunucularını değiştirmiş olsam da içeride domain eşleşmesini tamamlamamıştım. Şu adımı atınca hata anında kayboldu:

  1. Cloudflare panelinde Workers & Pages altındaki projenize girin.
  2. Custom Domains sekmesine tıklayın.
  3. Kendi alan adınızı yazıp Activate domain butonuna basın. Cloudflare içeride kendi DNS düzleştirme işlemini yapacak ve hata anında düzelecektir.

Terminalimde beliren 530 Login incorrect hatası ve ardından gelen 403 krizi tüm mimarimi modernleştirmeme vesile oldu. Yıllık 4775 TL masraftan kurtuldum. Artık sıfır maliyetle dünyanın her yerinden ışık hızında açılan bir bloga sahibim. Dağıtım sürecim NixOS izolasyonu sayesinde tamamen özgür ve kusursuz çalışıyor. Sistemin yüzünüze kapattığı o kapı bazen sizi çok daha iyi bir altyapıya götüren en kestirme yoldur.

Kaynaklar

İlgili Yazılar

EOF.