Cloudflare Cache Temizleme: Manuel ve Otomatik Yöntemler

Cloudflare kullanan bir sistemin cache sorunuyla karşılaştığınızda, saatlerce neden eski içerik göründüğünü araştırmak yerine doğru araçları bilmek hayat kurtarıcı olabilir. Özellikle production ortamında acil bir deployment yaptınız, kritik bir bug’ı düzelttiniz ama ziyaretçiler hala eski versiyonu görüyorsa, cache temizleme tam anlamıyla bir kurtarma operasyonuna dönüşür. Bu yazıda Cloudflare cache temizlemenin tüm yöntemlerini, hem dashboard üzerinden manuel işlemlerden tam otomatik CI/CD entegrasyonlarına kadar, gerçek dünya senaryolarıyla ele alacağız.

Cloudflare Cache Nasıl Çalışır?

Cache temizlemeye geçmeden önce Cloudflare’in cache mekanizmasını anlamak gerekiyor. Cloudflare, dünyanın farklı lokasyonlarında bulunan edge sunucularında içeriklerinizi önbellekler. Bir ziyaretçi sitenize girdiğinde, istek önce Cloudflare’in o bölgedeki edge node’una ulaşır. Eğer içerik cache’de varsa, origin sunucunuza hiç ulaşmadan direkt döner.

Bu mimari performans açısından harika ama içerik güncellemelerinde sorun yaratır. Cloudflare varsayılan olarak statik dosyaları (CSS, JS, resimler) Cache-Control veya Expires header’larına göre önbellekler. Eğer sitenizde bu header’lar yoksa ya da yanlış yapılandırılmışsa, Cloudflare kendi varsayılan TTL değerlerini kullanır.

Cache temizleme işlemi yapıldığında, bu işlem Cloudflare’in tüm edge lokasyonlarını etkiler. Yani İstanbul’dan, Frankfurt’tan, New York’tan gelen ziyaretçiler bir sonraki isteklerinde güncel içeriği göreceklerdir.

Manuel Cache Temizleme: Dashboard Üzerinden

En hızlı yöntem Cloudflare dashboard’unu kullanmak. Acil bir durumda birkaç tıklamayla işi halledersiniz.

Tüm Cache’i Temizleme

Dashboard üzerinden şu adımları izleyin:

  • Cloudflare hesabınıza giriş yapın
  • İlgili domain’i seçin
  • Sol menüden Caching bölümüne gidin
  • Configuration sekmesine tıklayın
  • Purge Everything butonuna basın
  • Açılan onay penceresinde Purge Everything ile işlemi onaylayın

Bu işlem tüm önbelleklenmiş içeriği temizler. Sonraki istekler origin sunucunuza gidecek, bu da kısa süreliğine yük artışına neden olabilir. Büyük sitelerde bu durum sunucunuzu zorlayabilir, bu yüzden tüm cache temizlemeyi mümkün olduğunca seçici kullanın.

Belirli URL’lerin Cache’ini Temizleme

Daha akıllıca bir yaklaşım, sadece değişen dosyaların cache’ini temizlemek. Dashboard’da Custom Purge seçeneğiyle URL listesi girebilirsiniz:

  • Her satıra bir URL yazın
  • En fazla 30 URL girebilirsiniz
  • Tam URL yazmanız gerekir (örnek: https://example.com/style.css)

Bu yöntem özellikle tek bir sayfayı veya birkaç statik dosyayı güncellediğinizde idealdir.

API ile Cache Temizleme

Cloudflare API’si, cache temizleme işlemini otomatize etmenin temel yolu. Önce API token’ınızı almanız gerekiyor.

API Token Oluşturma

  • Cloudflare dashboard’unda My Profile > API Tokens bölümüne gidin
  • Create Token butonuna tıklayın
  • Cache Purge template’ini seçin ya da özel izinlerle oluşturun
  • Zone > Cache Purge > Purge iznini ekleyin
  • İlgili zone’u seçin ve token’ı oluşturun

Zone ID’nizi bulmak için domain’inizin Overview sayfasının sağ tarafına bakın.

Curl ile Tüm Cache Temizleme

curl -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}'

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

{
  "result": {
    "id": "72d4c3f7fb23c06843d4a5f6"
  },
  "success": true,
  "errors": [],
  "messages": []
}

Belirli Dosyaların Cache’ini API ile Temizleme

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" 
     -H "Authorization: Bearer API_TOKEN" 
     -H "Content-Type: application/json" 
     --data '{
       "files": [
         "https://example.com/css/style.css",
         "https://example.com/js/app.js",
         "https://example.com/images/logo.png"
       ]
     }'

Cache Tag ile Temizleme (Enterprise)

Eğer Cloudflare Enterprise planındaysanız, cache tag özelliğini kullanabilirsiniz. Origin sunucunuzdan dönen response’lara Cache-Tag header’ı ekleyerek gruplama yapabilirsiniz:

# Origin sunucunuzun döndürdüğü header örneği
Cache-Tag: product-list, category-electronics, homepage

Sonra bu tag’e göre toplu temizleme yapabilirsiniz:

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" 
     -H "Authorization: Bearer API_TOKEN" 
     -H "Content-Type: application/json" 
     --data '{"tags": ["product-list", "homepage"]}'

Bu yöntem büyük e-ticaret sitelerinde çok işe yarıyor. Bir ürün kategorisi güncellendiğinde, o kategoriye ait tüm sayfaları tek bir tag ile temizleyebilirsiniz.

Bash Script ile Otomatik Cache Temizleme

Deployment sürecinize entegre edebileceğiniz pratik bir bash scripti yazalım. Bu script hem loglama yapar hem de hata kontrolü içerir.

#!/bin/bash
# cloudflare-purge.sh
# Cloudflare cache temizleme scripti

set -euo pipefail

# Konfigürasyon
CF_API_TOKEN="${CF_API_TOKEN:-}"
CF_ZONE_ID="${CF_ZONE_ID:-}"
LOG_FILE="/var/log/cf-purge.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Renk kodlari
RED='33[0;31m'
GREEN='33[0;32m'
YELLOW='33[1;33m'
NC='33[0m'

log_message() {
    echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE"
}

check_dependencies() {
    for cmd in curl jq; do
        if ! command -v "$cmd" &> /dev/null; then
            echo -e "${RED}Hata: $cmd kurulu degil${NC}"
            exit 1
        fi
    done
}

purge_everything() {
    log_message "Tum cache temizleniyor..."
    
    RESPONSE=$(curl -s -X POST 
        "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" 
        -H "Authorization: Bearer ${CF_API_TOKEN}" 
        -H "Content-Type: application/json" 
        --data '{"purge_everything":true}')
    
    SUCCESS=$(echo "$RESPONSE" | jq -r '.success')
    
    if [ "$SUCCESS" = "true" ]; then
        log_message "Cache basariyla temizlendi"
        echo -e "${GREEN}Basarili!${NC}"
    else
        ERROR=$(echo "$RESPONSE" | jq -r '.errors[0].message // "Bilinmeyen hata"')
        log_message "HATA: $ERROR"
        echo -e "${RED}Hata: $ERROR${NC}"
        exit 1
    fi
}

purge_urls() {
    local urls_file="$1"
    
    if [ ! -f "$urls_file" ]; then
        echo -e "${RED}URL dosyasi bulunamadi: $urls_file${NC}"
        exit 1
    fi
    
    # Dosyadan URL listesi olustur
    URL_JSON=$(jq -R -s -c 'split("n") | map(select(length > 0))' "$urls_file")
    
    log_message "Secili URL'ler temizleniyor: $urls_file"
    
    RESPONSE=$(curl -s -X POST 
        "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" 
        -H "Authorization: Bearer ${CF_API_TOKEN}" 
        -H "Content-Type: application/json" 
        --data "{"files": $URL_JSON}")
    
    SUCCESS=$(echo "$RESPONSE" | jq -r '.success')
    
    if [ "$SUCCESS" = "true" ]; then
        log_message "URL cache'leri basariyla temizlendi"
        echo -e "${GREEN}Basarili!${NC}"
    else
        ERROR=$(echo "$RESPONSE" | jq -r '.errors[0].message // "Bilinmeyen hata"')
        log_message "HATA: $ERROR"
        echo -e "${RED}Hata: $ERROR${NC}"
        exit 1
    fi
}

# Ana program
check_dependencies

if [ -z "$CF_API_TOKEN" ] || [ -z "$CF_ZONE_ID" ]; then
    echo -e "${RED}CF_API_TOKEN ve CF_ZONE_ID ortam degiskenlerini tanimlayiniz${NC}"
    exit 1
fi

case "${1:-}" in
    "all")
        purge_everything
        ;;
    "urls")
        purge_urls "${2:-urls.txt}"
        ;;
    *)
        echo "Kullanim: $0 [all|urls] [url_dosyasi]"
        exit 1
        ;;
esac

Bu scripti çalıştırmak için:

# Ortam degiskenlerini ayarla
export CF_API_TOKEN="your_api_token_here"
export CF_ZONE_ID="your_zone_id_here"

# Tum cache temizle
chmod +x cloudflare-purge.sh
./cloudflare-purge.sh all

# Belirli URL'leri temizle (urls.txt dosyasından okur)
./cloudflare-purge.sh urls /path/to/urls.txt

GitHub Actions ile CI/CD Entegrasyonu

Modern deployment workflow’larında cache temizleme, deployment sürecinin bir parçası olmalı. GitHub Actions ile bu entegrasyonu nasıl yapacağınızı görelim.

Önce GitHub repository ayarlarında Secrets bölümüne şu değerleri ekleyin:

  • CF_API_TOKEN: Cloudflare API token’ınız
  • CF_ZONE_ID: Zone ID’niz

Sonra .github/workflows/deploy.yml dosyasını oluşturun:

name: Deploy ve Cache Temizle

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Kodu cek
        uses: actions/checkout@v3
      
      - name: Node.js kur
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: Bagimliliklari yukle ve build al
        run: |
          npm ci
          npm run build
      
      - name: Dosyalari sunucuya yukle
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
        run: |
          rsync -avz --delete dist/ user@server:/var/www/html/
      
      - name: Cloudflare cache temizle
        env:
          CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
          CF_ZONE_ID: ${{ secrets.CF_ZONE_ID }}
        run: |
          RESPONSE=$(curl -s -X POST 
            "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" 
            -H "Authorization: Bearer ${CF_API_TOKEN}" 
            -H "Content-Type: application/json" 
            --data '{"purge_everything":true}')
          
          if echo "$RESPONSE" | grep -q '"success":true'; then
            echo "Cache basariyla temizlendi"
          else
            echo "Cache temizleme hatasi: $RESPONSE"
            exit 1
          fi
      
      - name: Deployment bildirimi gonder
        if: success()
        run: |
          echo "Deployment tamamlandi, cache temizlendi"

WordPress ile Cloudflare Cache Yönetimi

WordPress kullanan sysadminler için Cloudflare cache yönetimi biraz farklı bir boyut kazanıyor. Post yayınlandığında veya güncellendiğinde otomatik cache temizleme yapmak için wp-config.php dosyanıza eklenti olmadan da basit bir çözüm uygulayabilirsiniz.

WordPress’e özel bir functions.php hook’u:

<?php
// functions.php dosyasina ekleyin
add_action('save_post', 'purge_cloudflare_on_save', 10, 2);

function purge_cloudflare_on_save($post_id, $post) {
    if (wp_is_post_revision($post_id) || $post->post_status !== 'publish') {
        return;
    }
    
    $api_token = defined('CF_API_TOKEN') ? CF_API_TOKEN : '';
    $zone_id   = defined('CF_ZONE_ID') ? CF_ZONE_ID : '';
    
    if (empty($api_token) || empty($zone_id)) {
        error_log('Cloudflare cache temizleme: API bilgileri eksik');
        return;
    }
    
    $post_url    = get_permalink($post_id);
    $home_url    = home_url('/');
    
    $urls = array($post_url, $home_url);
    
    $response = wp_remote_post(
        "https://api.cloudflare.com/client/v4/zones/{$zone_id}/purge_cache",
        array(
            'headers' => array(
                'Authorization' => "Bearer {$api_token}",
                'Content-Type'  => 'application/json',
            ),
            'body'    => json_encode(array('files' => $urls)),
            'timeout' => 15,
        )
    );
    
    if (is_wp_error($response)) {
        error_log('Cloudflare purge hatasi: ' . $response->get_error_message());
    } else {
        error_log('Cloudflare cache temizlendi: ' . $post_url);
    }
}

Ardından wp-config.php dosyasına sabit olarak ekleyin:

define('CF_API_TOKEN', 'your_api_token_here');
define('CF_ZONE_ID', 'your_zone_id_here');

Cron Job ile Periyodik Cache Temizleme

Bazı senaryolarda belirli aralıklarla cache temizlemek mantıklı olabilir. Özellikle dinamik içerik çeken statik siteler veya haber siteleri için geceleri otomatik cache temizleme yapılabilir.

# /etc/cron.d/cloudflare-purge dosyasi olusturun
# Her gece saat 03:00'da tum cache temizle
0 3 * * * www-data CF_API_TOKEN="TOKEN" CF_ZONE_ID="ZONE_ID" /usr/local/bin/cloudflare-purge.sh all >> /var/log/cf-purge-cron.log 2>&1

Cron için daha güvenli bir yaklaşım, değişkenleri bir .env dosyasında tutmak:

#!/bin/bash
# /usr/local/bin/cf-scheduled-purge.sh

# .env dosyasini yukle
if [ -f "/etc/cloudflare/purge.env" ]; then
    source /etc/cloudflare/purge.env
else
    echo "Konfigurasyon dosyasi bulunamadi: /etc/cloudflare/purge.env"
    exit 1
fi

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOG_FILE="/var/log/cf-purge.log"

# Rate limiting kontrolu - son 1 saat icinde kac istek yapildi?
RECENT_PURGES=$(grep -c "basariyla temizlendi" "$LOG_FILE" 2>/dev/null | tail -1 || echo "0")

echo "[$TIMESTAMP] Zamanlanmis cache temizleme baslatildi" >> "$LOG_FILE"

curl -s -X POST 
    "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" 
    -H "Authorization: Bearer ${CF_API_TOKEN}" 
    -H "Content-Type: application/json" 
    --data '{"purge_everything":true}' 
    >> "$LOG_FILE" 2>&1

echo "[$TIMESTAMP] Zamanlanmis cache temizleme tamamlandi" >> "$LOG_FILE"

/etc/cloudflare/purge.env dosyası:

export CF_API_TOKEN="your_token_here"
export CF_ZONE_ID="your_zone_id_here"

Dosya izinlerini güvenli tutun:

chmod 600 /etc/cloudflare/purge.env
chown root:root /etc/cloudflare/purge.env

Gerçek Dünya Senaryoları ve Sorun Giderme

Senaryo 1: Acil Hotfix Deployment

Canlı sistemde kritik bir bug var, düzelttiniz ve deploy ettiniz ama ziyaretçiler eski JavaScript dosyasını görüyor. Yapmanız gereken:

# Sadece degisen JS dosyasini temizle
curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" 
     -H "Authorization: Bearer API_TOKEN" 
     -H "Content-Type: application/json" 
     --data '{
       "files": [
         "https://example.com/js/app.min.js",
         "https://example.com/js/vendor.min.js"
       ]
     }'

Senaryo 2: Cache Temizleme Sonrası Doğrulama

Cache temizledikten sonra gerçekten temizlenip temizlenmediğini kontrol edin:

# CF-Cache-Status header'ini kontrol et
curl -I "https://example.com/js/app.min.js" 2>/dev/null | grep -i "cf-cache-status"

# HIT: Cache'den geliyor (henuz temizlenmemis veya yeniden cache'e alindi)
# MISS: Origin'den geldi, cache temizleme calisti
# EXPIRED: Cache suresi doldu
# DYNAMIC: Cache'lenmemis, her seferinde origin'den geliyor

Senaryo 3: Rate Limit Sorunu

Cloudflare API’si cache temizleme için rate limit uygular. Çok sık çağrı yaparsanız 429 Too Many Requests alırsınız. Bu durumda exponential backoff uygulamanız gerekir:

#!/bin/bash
# Rate limit ile basa cikan purge scripti

purge_with_retry() {
    local max_attempts=3
    local attempt=1
    local wait_time=5
    
    while [ $attempt -le $max_attempts ]; do
        RESPONSE=$(curl -s -w "n%{http_code}" -X POST 
            "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/purge_cache" 
            -H "Authorization: Bearer ${CF_API_TOKEN}" 
            -H "Content-Type: application/json" 
            --data '{"purge_everything":true}')
        
        HTTP_CODE=$(echo "$RESPONSE" | tail -1)
        BODY=$(echo "$RESPONSE" | head -1)
        
        if [ "$HTTP_CODE" = "200" ]; then
            echo "Basarili (deneme: $attempt)"
            return 0
        elif [ "$HTTP_CODE" = "429" ]; then
            echo "Rate limit asimi, ${wait_time}s bekleniyor... (deneme: $attempt)"
            sleep $wait_time
            wait_time=$((wait_time * 2))
            attempt=$((attempt + 1))
        else
            echo "Hata: HTTP $HTTP_CODE - $BODY"
            return 1
        fi
    done
    
    echo "Maksimum deneme sayisina ulasildi"
    return 1
}

purge_with_retry

Cache Temizleme Stratejileri

Hangi durumlarda hangi yöntemi kullanmalısınız:

Purge Everything kullanın:

  • Major site yenilemelerinde
  • CDN konfigürasyon değişikliklerinde
  • Güvenlik yamalarından sonra

URL bazlı temizleme yapın:

  • Belirli bir sayfayı veya dosyayı güncellediğinizde
  • Blog yazısı yayınladığınızda
  • Logo veya favicon değişikliklerinde

Otomatik temizleme kurun:

  • Düzenli deployment yapılan projelerde
  • CMS tabanlı sitelerde içerik güncellemelerinde
  • CI/CD pipeline’ına entegre sistemlerde

Cache temizleme sıklığını da dengelemek önemli. Her deployment’ta tüm cache’i silmek origin sunucunuza gereksiz yük bindirirken, hiç temizlememek de eski içeriklerin gösterilmesine neden olur. İdeal yaklaşım, dosya bazlı seçici temizleme ile deployment sürecinizi entegre etmek.

Sonuç

Cloudflare cache temizleme, yüzeysel bakıldığında basit bir işlem gibi görünse de production ortamında doğru stratejiyle yapılmadığında ciddi sorunlara yol açabilir. Dashboard üzerinden manuel temizleme acil durumlar için hızlı çözüm sunarken, API entegrasyonu ve CI/CD otomasyonu uzun vadede gerçek tasarruf sağlar.

Bu yazıda anlattıklarımı özetlemek gerekirse: API token güvenliğini ciddiye alın, token’ları environment variable olarak saklayın ve asla kod içine yazmayın. Purge işlemlerini loglayın, hangi zaman hangi cache temizlenmiş görebilmek ileride hata ayıklamada büyük kolaylık sağlar. Seçici temizleme yapın, her şeyi silmek yerine sadece değişen dosyaları hedefleyin. Ve son olarak, cache temizleme adımını deployment pipeline’ınızın ayrılmaz bir parçası haline getirin ki unutan olduğunda production sorunları yaşamayasınız.

Herhangi bir soruyla karşılaşırsanız Cloudflare’in API dokümantasyonu oldukça kapsamlı ve güncel tutuluyor. Ayrıca CF-Cache-Status header’ını izlemek, sistemin doğru çalışıp çalışmadığını anlamak için en hızlı yöntem olmaya devam ediyor.

Bir yanıt yazın

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