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()veyatrapmekanizmaları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.
