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.
