WP CLI ile WordPress Bakım Modu Yönetimi: wp maintenance-mode Kullanımı

WordPress sitenizi güncellerken ya da büyük bir değişiklik yaparken ziyaretçilerin yarım kalmış bir sayfayla karşılaşması kadar sinir bozucu bir şey yoktur. İşte tam bu noktada bakım modu devreye girer. WP-CLI’nin wp maintenance-mode komutu, bu süreci terminal üzerinden hızlı ve güvenilir bir şekilde yönetmenizi sağlar. Özellikle birden fazla WordPress sitesi yönetiyorsanız ya da otomatik deployment pipeline’larınız varsa, bakım modunu manuel olarak açıp kapatmak yerine script’lerle otomatikleştirmek hem zaman kazandırır hem de insan hatasını ortadan kaldırır.

Bakım Modu Nasıl Çalışır?

WordPress’in bakım modu aslında son derece basit bir mekanizmaya dayanır. WordPress kök dizininde .maintenance adında gizli bir dosya oluşturulduğunda, site ziyaretçilere otomatik olarak “Briefly unavailable for scheduled maintenance. Check back in a minute.” mesajını gösterir ve HTTP 503 yanıt kodu döner.

WP-CLI bu dosyayı sizin adınıza yönetir. wp maintenance-mode komutu sayesinde bakım modunu aktifleştirmek, devre dışı bırakmak ve mevcut durumu sorgulamak için tek bir araç noktanız olur.

Bakım modunun devreye girmesini tetikleyen şey şudur: WordPress wp-load.php dosyasını yüklerken .maintenance dosyasının varlığını kontrol eder. Eğer bu dosya mevcutsa ve içindeki $upgrading değişkeni 600 saniyeden daha yeni bir zaman damgası taşıyorsa, kullanıcıya bakım mesajı gösterilir.

# .maintenance dosyasının içeriğine bakmak isterseniz
cat /var/www/html/wordpress/.maintenance

Tipik olarak şuna benzer bir içerik görürsünüz:

<?php $upgrading = 1703875200; ?>

Temel Kullanım

Bakım Modunu Aktifleştirmek

wp maintenance-mode activate

Bu komutu çalıştırdığınızda WP-CLI, WordPress kök dizininde .maintenance dosyasını oluşturur. Komut başarıyla çalışırsa terminalde şu çıktıyı görürsünüz:

Enabling Maintenance mode...
Success: Activated Maintenance mode.

Bakım Modunu Devre Dışı Bırakmak

wp maintenance-mode deactivate

Bu komut .maintenance dosyasını silerek siteyi tekrar ziyaretçilere açar.

Mevcut Durumu Sorgulamak

wp maintenance-mode status

Bu komut size şu iki çıktıdan birini verir:

  • Maintenance mode is active.
  • Maintenance mode is not active.

Bu durum sorgulama özelliği, özellikle otomatik script’lerde koşullu işlem yaparken çok işe yarar.

–path Parametresiyle Farklı WordPress Kurulumlarını Yönetmek

Sunucunuzda birden fazla WordPress sitesi barındırıyorsanız, her komuta --path parametresi ekleyerek hangi kurulumu hedeflediğinizi belirtmeniz gerekir.

# Belirli bir WordPress kurulumu için bakım modunu aktifleştir
wp maintenance-mode activate --path=/var/www/sitem.com/public_html

# Başka bir site
wp maintenance-mode activate --path=/var/www/digersite.com/public_html

# Durum kontrolü
wp maintenance-mode status --path=/var/www/sitem.com/public_html

Eğer WP-CLI’yi doğrudan ilgili dizinde çalıştırıyorsanız --path parametresine gerek yoktur:

cd /var/www/sitem.com/public_html
wp maintenance-mode activate

Gerçek Dünya Senaryoları

Senaryo 1: WooCommerce Mağazası Güncellemesi

Bir e-ticaret sitesinde eklenti güncellemesi yaparken sitenin aktif olması, müşterilerin yarım kalmış bir ödeme süreciyle karşılaşmasına yol açabilir. İşte bu tür durumlarda kullanabileceğiniz güvenli bir güncelleme akışı:

#!/bin/bash
SITE_PATH="/var/www/magazam.com/public_html"
LOG_FILE="/var/log/wp-update.log"

echo "[$(date)] Güncelleme başlıyor..." >> $LOG_FILE

# Bakım modunu aç
wp maintenance-mode activate --path=$SITE_PATH
echo "[$(date)] Bakım modu aktifleştirildi." >> $LOG_FILE

# Tüm eklentileri güncelle
wp plugin update --all --path=$SITE_PATH >> $LOG_FILE 2>&1

# WooCommerce veritabanı güncellemelerini çalıştır
wp wc update --path=$SITE_PATH >> $LOG_FILE 2>&1

# Bakım modunu kapat
wp maintenance-mode deactivate --path=$SITE_PATH
echo "[$(date)] Bakım modu kapatıldı, site yayında." >> $LOG_FILE

Bu script’i cron job olarak düşük trafikli saatlerde çalıştırabilirsiniz. Gece 03:00 gibi bir zamanlama idealdir:

0 3 * * 1 /bin/bash /root/scripts/wp-update.sh

Senaryo 2: Tema Geliştirme ve Deploy Süreci

Yerel geliştirme ortamından canlı sunucuya tema dosyası taşırken bakım modunu deployment script’ine entegre etmek standart bir uygulama haline gelmelidir.

#!/bin/bash
SITE_PATH="/var/www/kurumsal.com/public_html"
THEME_NAME="ozel-tema"
BACKUP_DIR="/var/backups/themes"

# Mevcut temayı yedekle
echo "Mevcut tema yedekleniyor..."
tar -czf "$BACKUP_DIR/${THEME_NAME}-$(date +%Y%m%d%H%M%S).tar.gz" 
    "$SITE_PATH/wp-content/themes/$THEME_NAME"

# Bakım modunu aç
wp maintenance-mode activate --path=$SITE_PATH

# Yeni tema dosyalarını kopyala
rsync -avz --delete 
    /tmp/yeni-tema/ 
    "$SITE_PATH/wp-content/themes/$THEME_NAME/"

# Dosya izinlerini düzenle
find "$SITE_PATH/wp-content/themes/$THEME_NAME" -type f -exec chmod 644 {} ;
find "$SITE_PATH/wp-content/themes/$THEME_NAME" -type d -exec chmod 755 {} ;

# WordPress önbelleğini temizle
wp cache flush --path=$SITE_PATH

# Bakım modunu kapat
wp maintenance-mode deactivate --path=$SITE_PATH

echo "Tema başarıyla güncellendi."

Senaryo 3: Hata Durumunda Otomatik Kurtarma

Güncelleme sırasında bir şeyler ters gidebilir. Bu yüzden script’lerinize hata yakalama mekanizması eklemek şarttır. Bakım modunu açtıktan sonra bir hata oluşursa mod kapalı kalmasa bile site erişilemez olur. Trap kullanarak bu durumu yönetin:

#!/bin/bash
SITE_PATH="/var/www/sitem.com/public_html"

# Hata durumunda bakım modunu otomatik kapat
cleanup() {
    echo "Hata oluştu! Bakım modu kapatılıyor..."
    wp maintenance-mode deactivate --path=$SITE_PATH
    exit 1
}

trap cleanup ERR

# Bakım modunu aç
wp maintenance-mode activate --path=$SITE_PATH

# Veritabanı yedeği al
wp db export /tmp/backup-$(date +%Y%m%d).sql --path=$SITE_PATH

# WordPress çekirdeğini güncelle
wp core update --path=$SITE_PATH

# Veritabanını güncelle
wp core update-db --path=$SITE_PATH

# Bakım modu kapat
wp maintenance-mode deactivate --path=$SITE_PATH
echo "Güncelleme tamamlandı."

trap cleanup ERR satırı sayesinde herhangi bir komut hata döndürdüğünde cleanup fonksiyonu tetiklenir ve bakım modu otomatik olarak kapatılır.

Durum Kontrolüyle Koşullu Script Yazma

wp maintenance-mode status komutunun çıktısını kullanarak koşullu mantık kurabilirsiniz. Bu özellikle birden fazla işin paralel çalıştığı ortamlarda çakışmaları önlemek için kullanışlıdır.

#!/bin/bash
SITE_PATH="/var/www/sitem.com/public_html"

# Bakım modu zaten aktif mi kontrol et
STATUS=$(wp maintenance-mode status --path=$SITE_PATH 2>&1)

if echo "$STATUS" | grep -q "active"; then
    echo "Site zaten bakım modunda. Başka bir işlem devam ediyor olabilir."
    echo "Lütfen daha sonra tekrar deneyin."
    exit 1
fi

echo "Bakım modu aktif değil, güncelleme başlatılıyor..."
wp maintenance-mode activate --path=$SITE_PATH

# İşlemleri buraya ekleyin
wp plugin update --all --path=$SITE_PATH

wp maintenance-mode deactivate --path=$SITE_PATH
echo "Tamamlandı."

Çoklu Site (Multisite) Ortamında Kullanım

WordPress Multisite kurulumlarında her alt site için ayrı ayrı bakım modu yönetimi yapabilirsiniz. Ancak burada dikkat edilmesi gereken nokta şudur: multisite kurulumunda .maintenance dosyası ana WordPress kök dizininde yer alır ve tüm ağı etkiler.

# Multisite ağının tamamını bakım moduna al
wp maintenance-mode activate --path=/var/www/ana-site.com/public_html

# Tüm alt sitelerdeki eklentileri güncelle
wp plugin update --all --network --path=/var/www/ana-site.com/public_html

# Bakım modunu kapat
wp maintenance-mode deactivate --path=/var/www/ana-site.com/public_html

Multisite ortamında belirli bir alt siteyi etkileyen bir değişiklik yapıyorsanız ve diğer siteleri etkilemek istemiyorsanız, bu durumu WordPress’in native bakım modu ile değil, özel bir eklenti veya .htaccess kuralıyla yönetmeniz gerekir. Ancak genel site güncellemeleri için wp maintenance-mode yeterlidir.

Özel Bakım Modu Sayfası Oluşturma

WP-CLI bakım modunun varsayılan mesajı oldukça sade ve İngilizce’dir. Ziyaretçilerinize daha iyi bir deneyim sunmak için özel bir bakım modu sayfası oluşturabilirsiniz.

WordPress, wp-content dizininde maintenance.php dosyası varsa bu dosyayı varsayılan mesaj yerine kullanır. Önce bu dosyayı oluşturun:

cat > /var/www/sitem.com/public_html/wp-content/maintenance.php << 'EOF'
<?php
// Doğrudan erişimi engelle
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

http_response_code(503);
header('Retry-After: 3600');
?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Bakım Çalışması</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #f0f0f0; }
        h1 { color: #333; }
        p { color: #666; font-size: 18px; }
    </style>
</head>
<body>
    <h1>Kısa Süreli Bakım Çalışması</h1>
    <p>Sitemiz şu anda bakım çalışması nedeniyle geçici olarak kapalıdır.</p>
    <p>En kısa sürede geri döneceğiz. Anlayışınız için teşekkür ederiz.</p>
</body>
</html>
EOF

Bu dosya oluştuktan sonra WP-CLI ile bakım modunu aktifleştirdiğinizde ziyaretçiler özelleştirilmiş sayfanızı görür.

Birden Fazla Siteyi Toplu Yönetme

Yönettiğiniz onlarca WordPress sitesi varsa, hepsini tek tek yönetmek yerine toplu işlem yapan bir script hazırlayabilirsiniz.

#!/bin/bash
# Tüm WordPress sitelerini bakım moduna al ve güncelle

SITES=(
    "/var/www/site1.com/public_html"
    "/var/www/site2.com/public_html"
    "/var/www/site3.com/public_html"
    "/var/www/site4.com/public_html"
)

LOG="/var/log/toplu-guncelleme-$(date +%Y%m%d).log"

for SITE in "${SITES[@]}"; do
    SITE_NAME=$(basename $(dirname $SITE))
    echo "========================================" >> $LOG
    echo "Site: $SITE_NAME - $(date)" >> $LOG
    echo "========================================" >> $LOG

    # Bakım modunu aç
    wp maintenance-mode activate --path=$SITE >> $LOG 2>&1

    # Önce yedek al
    wp db export "/tmp/${SITE_NAME}-backup.sql" --path=$SITE >> $LOG 2>&1

    # Güncelle
    wp core update --path=$SITE >> $LOG 2>&1
    wp plugin update --all --path=$SITE >> $LOG 2>&1
    wp theme update --all --path=$SITE >> $LOG 2>&1

    # Önbelleği temizle
    wp cache flush --path=$SITE >> $LOG 2>&1

    # Bakım modunu kapat
    wp maintenance-mode deactivate --path=$SITE >> $LOG 2>&1

    echo "$SITE_NAME güncelleme tamamlandı." >> $LOG
    echo "" >> $LOG

    # Siteler arası kısa bekleme
    sleep 5
done

echo "Tüm siteler güncellendi. Log: $LOG"

Ansible ile Entegrasyon

Büyük ölçekli altyapı yönetiminde Ansible kullanıyorsanız, WP-CLI komutlarını Ansible playbook’larınıza entegre edebilirsiniz.

---
- name: WordPress Güvenli Güncelleme
  hosts: wordpress_servers
  become: yes

  tasks:
    - name: Bakım modunu aktifleştir
      command: wp maintenance-mode activate
      args:
        chdir: /var/www/html

    - name: WordPress çekirdeğini güncelle
      command: wp core update
      args:
        chdir: /var/www/html

    - name: Eklentileri güncelle
      command: wp plugin update --all
      args:
        chdir: /var/www/html

    - name: Bakım modunu kapat
      command: wp maintenance-mode deactivate
      args:
        chdir: /var/www/html
      when: always

Sık Karşılaşılan Sorunlar ve Çözümleri

Bakım modu kapanmıyor:

Bazen WP-CLI komutu çalıştırıldıktan sonra bile bakım modunun aktif kalmaya devam ettiğini görebilirsiniz. Bu genellikle dosya izin sorunlarından kaynaklanır. Manuel olarak silebilirsiniz:

# .maintenance dosyasını kontrol et
ls -la /var/www/sitem.com/public_html/.maintenance

# Manuel sil
rm /var/www/sitem.com/public_html/.maintenance

# Doğrula
wp maintenance-mode status --path=/var/www/sitem.com/public_html

WP-CLI’nin bakım modunu görmemesi:

Eğer WordPress dosyaları farklı bir kullanıcı tarafından oluşturulduysa, WP-CLI çalıştırdığınız kullanıcının bu dosyayı okuma izni olmayabilir. Bu durumda --allow-root kullanabilir ya da ilgili kullanıcıya geçiş yapabilirsiniz:

# www-data kullanıcısı olarak çalıştır
sudo -u www-data wp maintenance-mode status --path=/var/www/sitem.com/public_html

# Ya da doğrudan root ile (güvenli ortamlarda)
wp maintenance-mode activate --path=/var/www/sitem.com/public_html --allow-root

Önbellek sistemi bakım modunu geçersiz kılıyor:

Nginx FastCGI Cache, Varnish veya bir CDN kullanıyorsanız, bakım modunu aktifleştirmenize rağmen bazı ziyaretçiler önbellekten hizmet almaya devam edebilir. Bu durumda önbelleği de temizlemeniz gerekir:

wp maintenance-mode activate --path=$SITE_PATH

# Nginx FastCGI önbelleğini temizle
rm -rf /var/cache/nginx/*

# Ya da WP Rocket gibi eklentiler üzerinden
wp cache flush --path=$SITE_PATH

Monitoring ve Bildirim Entegrasyonu

Kritik güncelleme işlemlerinde bakım modunun başladığını ve bittiğini ekip üyelerine bildirmek için Slack veya e-posta entegrasyonu ekleyebilirsiniz.

#!/bin/bash
SITE_PATH="/var/www/sitem.com/public_html"
SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"

bildir() {
    curl -s -X POST -H 'Content-type: application/json' 
        --data "{"text":"$1"}" 
        $SLACK_WEBHOOK
}

bildir ":construction: sitem.com bakım moduna alındı. Güncelleme başlıyor..."
wp maintenance-mode activate --path=$SITE_PATH

wp plugin update --all --path=$SITE_PATH
wp core update --path=$SITE_PATH

wp maintenance-mode deactivate --path=$SITE_PATH
bildir ":white_check_mark: sitem.com güncelleme tamamlandı, site yayında."

Sonuç

wp maintenance-mode komutu görünürde basit bir araç gibi görünse de, doğru bir şekilde script’lere entegre edildiğinde production ortamında son derece güçlü bir güvenlik ağı işlevi görür. Bakım modunu her zaman güncelleme işlemlerinizin bir parçası olarak kullanmak, hem ziyaretçi deneyimini korur hem de yarım kalan işlemlerden kaynaklanabilecek tutarsızlıkları önler.

Özellikle şu noktaların altını çizmek gerekir: trap ile hata yakalama mekanizması kurmak, bakım modunun yanlışlıkla açık kalmasını engeller. Önbellek sistemleriyle entegrasyon, bakım modunun gerçekten etkili olmasını sağlar. Toplu site yönetimi için döngü bazlı script’ler ise onlarca siteyi yönetirken hayat kurtarır.

WP-CLI’nin bu komutu, WordPress yönetimini terminale taşıma yolculuğunuzda küçük ama kritik bir yapı taşıdır. Bir sonraki güncelleme işleminizde mutlaka kullanın, farkı hemen hissedeceksiniz.

Bir yanıt yazın

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