Cloudflare Development Mode: Test Ortamı Kullanım Rehberi

Cloudflare kullanan herkesin başına gelmiştir: Sitenizde bir değişiklik yapıyorsunuz, tarayıcıyı yeniliyorsunuz ama eski cache’lenmiş içerik gelmeye devam ediyor. Development Mode tam olarak bu sorunu çözmek için var. Ama çoğu sysadmin bu özelliği ya yanlış kullanıyor ya da ne zaman devreye alması gerektiğini bilmiyor. Bu yazıda Development Mode’u derinlemesine inceleyeceğiz, gerçek dünya senaryolarıyla nasıl kullanmanız gerektiğini anlatacağız.

Development Mode Nedir?

Cloudflare’in sunduğu en temel özelliklerden biri içerik önbellekleme (caching) mekanizmasıdır. Sitenize gelen istekler Cloudflare’in edge sunucularından cache’lenerek servis edilir. Bu performans açısından mükemmeldir ama aktif geliştirme yaparken canınızı sıkabilir.

Development Mode devreye alındığında Cloudflare şu işlemleri duraklatır:

  • CSS, JavaScript ve görsel dosyaları için caching: Bu dosyalar artık doğrudan origin sunucunuzdan gelir
  • Minification: Cloudflare’in otomatik minification özelliği devre dışı kalır
  • Rocket Loader: JavaScript optimizasyonu geçici olarak durur
  • Polish: Görsel optimizasyon işlemleri atlanır
  • Mirage: Mobil görsel optimizasyonu kapatılır

Önemli bir nokta: Development Mode DDoS korumasını veya DNS çözümlemesini etkilemez. Güvenlik katmanı aktif kalmaya devam eder, sadece cache ve optimizasyon katmanları devre dışı bırakılır.

Development Mode varsayılan olarak 3 saat sonra otomatik kapanır. Bu aslında akıllıca bir tasarım kararı, çünkü insanlar açık bırakıp unutabiliyor.

Neden Development Mode Kullanmalısınız?

Statik Dosya Güncellemeleri

Diyelim ki production ortamında bir CSS güncellemesi yaptınız. Normal şartlarda Cloudflare bu dosyayı cache’lemiş durumda olacak ve değişiklikleriniz hemen yansımayacak. Cache TTL’niz 4 saat ise 4 saat boyunca eski tasarımı görmeye devam edebilirsiniz.

Development Mode ile bu sorun ortadan kalkar. Cloudflare doğrudan origin’e gider ve her request için taze içerik çeker.

JavaScript Debug İşlemleri

Minification açık olduğunda hata mesajları anlamsız satır ve sütun numaralarına işaret eder. Development Mode ile minification kapandığı için browser console’unda gerçek dosya adlarını ve satır numaralarını görürsünüz. Bu debugging sürecini ciddi ölçüde hızlandırır.

Görsel Değişiklikler

Hero image’ı değiştirdiniz ama hala eski görsel geliyor. Polish ve Mirage özellikleri görsel dosyalarını cache’ler ve dönüştürür. Development Mode bunları kapatarak orijinal dosyaları serveder.

A/B Test Senaryoları

Birden fazla versiyon arasında geçiş yapıp test ediyorsanız, cache’in araya girmemesi için Development Mode idealdir.

Cloudflare API ile Development Mode Yönetimi

Panelden tek tıkla Development Mode açabilirsiniz ama gerçek bir sysadmin için API üzerinden yönetmek çok daha pratik. Özellikle birden fazla zone’unuz varsa veya deployment pipeline’ınıza entegre etmek istiyorsanız API şart.

API Token Alma

Önce Cloudflare API token’ınıza ihtiyaçnız var. Cloudflare Dashboard’dan My Profile > API Tokens bölümüne gidin ve Zone Settings:Edit iznine sahip bir token oluşturun.

Zone ID Öğrenme

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" 
  -H "Authorization: Bearer YOUR_API_TOKEN" 
  -H "Content-Type: application/json" | jq '.result[0].id'

Bu komut domain’inize ait Zone ID’yi döndürür. Bunu bir değişkene atayın:

ZONE_ID="your_zone_id_here"
API_TOKEN="your_api_token_here"

Development Mode Açma

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json" 
  --data '{"value":"on"}'

Başarılı bir yanıt şöyle görünür:

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "id": "development_mode",
    "value": "on",
    "editable": true,
    "modified_on": "2024-01-15T10:30:00.000000Z"
  }
}

Development Mode Kapatma

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json" 
  --data '{"value":"off"}'

Mevcut Durumu Kontrol Etme

curl -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json"

Deployment Pipeline’a Entegrasyon

Gerçek dünya senaryosunda Development Mode’u her seferinde elle açıp kapatmak pratik değil. Bunu CI/CD pipeline’ınıza entegre etmek çok daha mantıklı.

Basit Bash Deployment Script’i

#!/bin/bash
# deploy.sh - Cloudflare Development Mode ile deployment script

ZONE_ID="your_zone_id"
API_TOKEN="your_api_token"
DEPLOY_DIR="/var/www/html"
BACKUP_DIR="/var/backups/web"

# Renkli output için
RED='33[0;31m'
GREEN='33[0;32m'
YELLOW='33[1;33m'
NC='33[0m'

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

enable_dev_mode() {
    log_info "Development Mode aktif ediliyor..."
    RESPONSE=$(curl -s -X PATCH 
        "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
        -H "Authorization: Bearer ${API_TOKEN}" 
        -H "Content-Type: application/json" 
        --data '{"value":"on"}')
    
    if echo "$RESPONSE" | jq -e '.success' > /dev/null 2>&1; then
        log_info "Development Mode aktif."
    else
        log_error "Development Mode aktif edilemedi!"
        echo "$RESPONSE"
        exit 1
    fi
}

disable_dev_mode() {
    log_info "Development Mode kapatiliyor..."
    curl -s -X PATCH 
        "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
        -H "Authorization: Bearer ${API_TOKEN}" 
        -H "Content-Type: application/json" 
        --data '{"value":"off"}' > /dev/null
    log_info "Development Mode kapatildi."
}

# Deployment basliyor
log_info "Deployment basliyor: $(date)"

# Development Mode ac
enable_dev_mode

# Hata durumunda Development Mode'u kapatmak icin trap
trap disable_dev_mode EXIT

# Mevcut dosyalari yedekle
log_info "Mevcut dosyalar yedekleniyor..."
BACKUP_FILE="${BACKUP_DIR}/backup_$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "$BACKUP_FILE" -C "$DEPLOY_DIR" . 2>/dev/null
log_info "Yedek olusturuldu: $BACKUP_FILE"

# Yeni dosyalari deploy et
log_info "Yeni dosyalar kopyalaniyor..."
rsync -av --delete /path/to/new/files/ "$DEPLOY_DIR/"

# Nginx'i yeniden yukle (gerekiyorsa)
if systemctl is-active --quiet nginx; then
    log_info "Nginx yeniden yukleniyor..."
    systemctl reload nginx
fi

log_info "Deployment tamamlandi: $(date)"
log_warn "Development Mode 3 saat sonra otomatik kapanacak."
log_warn "Manuel kapatmak icin: $0 --disable-dev"

# Trap'i temizle (basarili deployment)
trap - EXIT

Bu script’i çalıştırdığınızda deployment sırasında otomatik olarak Development Mode devreye girer, bir hata oluşursa trap mekanizması sayesinde kapanır.

GitHub Actions ile Entegrasyon

Modern bir setup’ta deployment GitHub Actions veya benzeri bir CI/CD aracıyla yapılır. İşte bunu Cloudflare Development Mode ile nasıl entegre edeceğinizi gösteren bir örnek:

# .github/workflows/deploy.yml
name: Production Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Enable Cloudflare Development Mode
        run: |
          curl -s -X PATCH 
            "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/settings/development_mode" 
            -H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" 
            -H "Content-Type: application/json" 
            --data '{"value":"on"}'

      - name: Deploy Application
        run: |
          # Deployment adimlariniz buraya
          npm run build
          rsync -avz dist/ user@server:/var/www/html/

      - name: Purge Cloudflare Cache
        run: |
          curl -s -X POST 
            "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/purge_cache" 
            -H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" 
            -H "Content-Type: application/json" 
            --data '{"purge_everything":true}'

      - name: Disable Cloudflare Development Mode
        if: always()
        run: |
          curl -s -X PATCH 
            "https://api.cloudflare.com/client/v4/zones/${{ secrets.CF_ZONE_ID }}/settings/development_mode" 
            -H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" 
            -H "Content-Type: application/json" 
            --data '{"value":"off"}'

if: always() direktifi sayesinde önceki adımlar başarısız olsa bile Development Mode kapatılır. Bu önemli çünkü açık kalan Development Mode performans sorunlarına yol açar.

Development Mode ile Cache Purge’ün Farkı

Bu ikisi sıklıkla karıştırılır. Aralarındaki temel fark şu:

Development Mode:

  • Cache’i tamamen bypass eder
  • Her request origin’e gider
  • 3 saat sonra otomatik kapanır
  • Minification ve optimizasyonları da kapatır
  • Aktif geliştirme sırasında kullanılır

Cache Purge:

  • Mevcut cache’i temizler
  • Yeni içerik bir kez çekilir ve tekrar cache’lenir
  • Kalıcı bir işlemdir
  • Minification ve optimizasyonlar devam eder
  • Tek seferlik güncellemeler için kullanılır

Deployment yapıyorsanız genellikle ikisini birlikte kullanmanız mantıklı: Deployment sırasında Development Mode açık, deployment bittikten sonra cache purge yapıp Development Mode’u kapatın.

Cache Purge Script’i

#!/bin/bash
# Hem Development Mode'u kapat hem de cache'i temizle

ZONE_ID="your_zone_id"
API_TOKEN="your_api_token"

# Tum cache'i temizle
echo "Cache temizleniyor..."
curl -s -X POST 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/purge_cache" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"purge_everything":true}'

# Development Mode'u kapat
echo "Development Mode kapatiliyor..."
curl -s -X PATCH 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"value":"off"}'

echo "Tamamlandi."

Development Mode’un Limitasyonleri

Her araç gibi Development Mode’un da limitleri var. Bunları bilmeden kullanırsanız beklenmedik durumlarla karşılaşabilirsiniz.

Performans etkisi büyük olabilir: Her request origin’e gittiği için sunucunuzun yükü artar. Yüksek trafikli bir sitede açık bırakırsanız sunucunuz ezilir. Bu yüzden production’da Development Mode’u asla uzun süre açık bırakmayın.

3 saatlik otomatik kapanma: Bu genellikle yeterli ama uzun süren deployment veya test çalışmaları için yetmeyebilir. Bu durumda monitoring ekleyin veya script’inize otomatik yenileme ekleyin.

Tüm cache’i etkilemez: Development Mode sadece statik asset cache’ini etkiler. Cloudflare Workers veya Cache Rules ile oluşturduğunuz özel cache kuralları farklı davranabilir.

Free plan kısıtlamaları: Free plan kullanıyorsanız API erişimi dahil tüm özellikler çalışır ama daha fazla API rate limit ile karşılaşabilirsiniz.

Gerçek Dünya Senaryosu: E-ticaret Sitesi Güncellemesi

Diyelim ki bir e-ticaret sitesi yönetiyorsunuz ve haftalık olarak tema güncellemesi yapıyorsunuz. İşte tipik bir senaryo:

Pazartesi sabahı 02:00’de maintenance window’u açıyorsunuz. Yapılacaklar: yeni CSS dosyaları, güncellenmiş JavaScript bundle’lar ve ürün sayfası şablonu değişikliği.

Bu durumda şu akışı izlersiniz:

#!/bin/bash
# e-commerce-deploy.sh

ZONE_ID="your_zone_id"
API_TOKEN="your_api_token"
SITE_URL="https://yourstore.com"

echo "=== E-ticaret Deployment Basliyor ==="
echo "Zaman: $(date)"

# 1. Development Mode ac
echo "[1/5] Development Mode aktif ediliyor..."
curl -s -X PATCH 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"value":"on"}' | jq '.success'

# 2. Dosyalari guncelle
echo "[2/5] Dosyalar guncelleniyor..."
cd /var/www/store
git pull origin main
composer install --no-dev --optimize-autoloader
npm run build:production

# 3. Cache temizle (tum sayfalari)
echo "[3/5] Cache temizleniyor..."
curl -s -X POST 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/purge_cache" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"purge_everything":true}' | jq '.success'

# 4. Smoke test
echo "[4/5] Smoke test yapiliyor..."
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$SITE_URL")
if [ "$HTTP_STATUS" != "200" ]; then
    echo "HATA: Site cevap vermiyor! HTTP Status: $HTTP_STATUS"
    echo "Development Mode acik birakiliyor, inceleme gerekiyor."
    exit 1
fi
echo "Site normal cevap veriyor. HTTP Status: $HTTP_STATUS"

# 5. Development Mode kapat
echo "[5/5] Development Mode kapatiliyor..."
curl -s -X PATCH 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"value":"off"}' | jq '.success'

echo "=== Deployment Tamamlandi ==="
echo "Zaman: $(date)"

Bu script’in güzel yanı smoke test aşamasında. Eğer site cevap vermiyorsa Development Mode açık kalıyor ve siz soruşturabiliyorsunuz. Manuel müdahale gerekiyor ama bu doğru davranış, problem varken cache’i kapatıp kullanıcıları boş ekranla karşılamak istemezsiniz.

Monitoring ve Alerting

Development Mode’un beklenmedik şekilde açık kalması büyük sorun yaratır. Bunu monitor etmek için basit bir cron job kurabilirsiniz:

#!/bin/bash
# check_dev_mode.sh - Development Mode kontrolu

ZONE_ID="your_zone_id"
API_TOKEN="your_api_token"
ALERT_EMAIL="[email protected]"

STATUS=$(curl -s -X GET 
    "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/settings/development_mode" 
    -H "Authorization: Bearer ${API_TOKEN}" 
    -H "Content-Type: application/json" | jq -r '.result.value')

if [ "$STATUS" = "on" ]; then
    echo "UYARI: Cloudflare Development Mode ACIK!" | 
    mail -s "[ALERT] Cloudflare Dev Mode Aktif" "$ALERT_EMAIL"
    echo "$(date): Development Mode ACIK - Alert gonderildi" >> /var/log/cloudflare-monitor.log
else
    echo "$(date): Development Mode kapali - OK" >> /var/log/cloudflare-monitor.log
fi

Bu script’i crontab’a ekleyin:

# Her 30 dakikada bir kontrol et
*/30 * * * * /usr/local/bin/check_dev_mode.sh

Eğer Development Mode kazara açık kalırsa 30 dakika içinde email alırsınız. Kritik bir site yönetiyorsanız bu tür kontrolleri ihmal etmeyin.

Terraform ile Infrastructure as Code

Modern ortamlarda Cloudflare ayarlarını Terraform ile yönetmek giderek yaygınlaşıyor. Development Mode da bu kapsamda yönetilebilir:

# cloudflare.tf
resource "cloudflare_zone_settings_override" "example_settings" {
  zone_id = var.zone_id

  settings {
    development_mode = "off"
    
    # Diger ayarlar
    ssl                      = "full"
    always_use_https         = "on"
    minify {
      css  = "on"
      js   = "on"
      html = "on"
    }
  }
}

Terraform ile Production’da Development Mode’un her zaman off olduğundan emin olabilirsiniz. Birisi panel üzerinden açarsa Terraform plan çalıştırıldığında bu değişiklik tespit edilir ve düzeltilir.

Sık Yapılan Hatalar

1. Development Mode’u açık bırakmak En yaygın hata. 3 saatlik otomatik kapanma bir güvenlik ağı olsa da deployment sonrası Cloudflare açık kalmışsa sorun çıkabilir. Her deployment script’ine mutlaka disable adımı ekleyin.

2. Cache purge yapmadan Development Mode kapatmak Development Mode kapandığında Cloudflare tekrar cache’lemeye başlar. Ama eski cache hala orada olabilir. Development Mode kapatmadan önce mutlaka cache purge yapın.

3. Sadece Development Mode’a güvenmek Development Mode browser cache’ini temizlemez. Cloudflare cache’ini bypass eder ama tarayıcınızda eski CSS hala olabilir. Test ederken tarayıcıda incognito modu kullanın veya hard refresh yapın (Ctrl+Shift+R).

4. Free API token izinleri Zone Settings:Read izni olan token ile Development Mode açamazsınız. Token’ın Zone Settings:Edit iznine sahip olması şart.

Sonuç

Development Mode basit görünen ama doğru kullanıldığında deployment süreçlerini çok daha sağlıklı hale getiren bir araç. Önemli olan noktaları özetleyelim:

  • Development Mode’u sadece gerçekten ihtiyaç duyduğunuzda ve kısa süreliğine açın
  • Her deployment script’ine açma ve kapama adımlarını ekleyin
  • if: always() veya trap mekanizmalarıyla hata durumunda da kapanmasını garantileyin
  • Development Mode kapanırken mutlaka cache purge yapın
  • Monitoring ile beklenmedik açık kalma durumlarını tespit edin
  • Terraform veya benzeri IaC araçlarıyla production’da kapalı kalmasını enforce edin

API entegrasyonu biraz iş gerektiriyor ama bir kez kurduğunuzda deployment sürecinizdeki “neden değişiklik görünmüyor?” sorularından kurtuluyorsunuz. Özellikle birden fazla siteyi yöneten sysadminler için bu otomasyonu kurmak kesinlikle zamanına değer.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir