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.
