Gereksinimler ve Ön Hazırlık
Sürdürülebilir bir sistem kurmak için öncelikle ortamınızın hazır olması gerekir. Laravel 11 veya 12 sürümleri ile uyumlu, PHP 8.3+ yüklü bir sunucunuzun olması şarttır. Ayrıca, veritabanı yedeklerini dış bir depolama alanına (AWS S3, Google Cloud Storage veya yerel bir disk) gönderecek yapılandırmayı yapmalıyız.
- PHP 8.3 veya üzeri sürüm.
- Laravel 11+ kurulu bir proje.
- Veritabanı erişim yetkileri (mysqldump veya pg_dump çalıştırabilen bir kullanıcı).
- Yedeklerin saklanacağı güvenli bir depolama alanı.
Spatie Backup Paketinin Kurulumu
Laravel ekosisteminde "tekerleği yeniden icat etmemek" en önemli kuraldır. Veritabanı yedekleme işlemleri için topluluk tarafından en çok kabul gören ve sürdürülebilirliği kanıtlanmış olan spatie/laravel-backup paketini kullanacağız. Bu paket, dosya ve veritabanı yedekleme işlemlerini otomatize eder.
composer require spatie/laravel-backup
Paketi yükledikten sonra, yapılandırma dosyasını yayınlamanız gerekir. Bu dosya, yedekleme sıklığınızı ve nelerin yedekleneceğini belirlemenizi sağlar.
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" --tag="config"
Yedekleme Stratejisi ve Yapılandırma
config/backup.php dosyası, sisteminizin beynidir. Burada yedeklenecek veritabanı bağlantılarını ve yedeklerin nerede saklanacağını tanımlarsınız. Sürdürülebilir bir sistem için "yerel disk" yerine "uzak depolama" kullanmanızı öneririm.
// config/backup.php içerisinde veritabanı ayarları
'backup' => [
'source' => [
'databases' => [
'mysql',
],
],
'destination' => [
'disks' => [
's3', // AWS S3 veya benzeri bir bulut depolama
],
],
],
Bu yapılandırma, veritabanınızın bir kopyasını alıp belirttiğiniz S3 bucket'ına güvenli bir şekilde aktarılmasını sağlar. s3 diskinin filesystems.php dosyasında doğru yapılandırıldığından emin olun.
Otomatik Yedekleme Zamanlayıcısı Oluşturma
Sürdürülebilirlik, insan müdahalesi gerektirmeyen sistemler demektir. Laravel'in app/Console/Kernel.php (veya Laravel 11+ ile routes/console.php) dosyasını kullanarak yedekleme işlemini zamanlanmış bir görev (cron job) haline getirmeliyiz. Her gün gece saat 03:00'te yedek almak, kullanıcı trafiğinin en düşük olduğu zamanı seçmek açısından en mantıklı yaklaşımdır.
// routes/console.php
use Illuminate\Support\Facades\Schedule;
Schedule::command('backup:clean')->daily()->at('01:00');
Schedule::command('backup:run')->daily()->at('03:00');
backup:clean komutu, eski yedekleri temizleyerek depolama alanınızın dolmasını engeller. backup:run ise yeni yedekleme sürecini başlatır.
Yedekleme Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, farklı yedekleme yaklaşımlarının sürdürülebilirlik açısından değerlendirmesini sunmaktadır:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Manuel SQL Dump | Basit ve hızlı | Hata payı yüksek, unutulabilir |
| Spatie Backup (Otomatik) | Güvenli, raporlanabilir, ölçeklenebilir | Ek paket bağımlılığı |
| Sunucu Seviyesi Snapshot | Tam sistem yedeği | Veritabanı tutarlılığı (consistency) zor |
Güvenlik ve Felaket Senaryoları
Kritik Uyarı: Yedekleriniz şifrelenmemişse, depolama alanına erişen herhangi biri veritabanı içeriğinizi okuyabilir.
spatie/laravel-backuppaketinde yedekleri şifrelemek içinGPGkullanabilirsiniz. Ayrıca, yedekleme dosyalarınızı asla web erişimine açık (public) klasörlerde tutmayın.
Yedekleme sisteminizin çalıştığını test etmek için en iyi yol, bir "felaket simülasyonu" yapmaktır. Geliştirme ortamınızda php artisan backup:run komutunu çalıştırın ve ardından S3 bucket'ınızda dosyanın oluşup oluşmadığını kontrol edin.
// Yedekleme işlemini manuel tetikleyerek test etme
php artisan backup:run --only-db
Bu komut, sadece veritabanı yedeğini alır. Eğer hata alırsanız, storage/logs/laravel.log dosyasını inceleyerek veritabanı bağlantı hatalarını debug edebilirsiniz.
Sıkça Sorulan Sorular
Yedekleme işlemi sırasında veritabanı kilitlenir mi?
Laravel'in kullandığı mysqldump, varsayılan olarak --single-transaction bayrağını kullanır. Bu, InnoDB tabloları için veritabanını kilitlemeden yedek almayı sağlar, dolayısıyla uygulamanız kesintisiz çalışmaya devam eder.
Yedeklerimin bozuk olup olmadığını nasıl anlarım?
Spatie paketi içerisinde yer alan backup:monitor komutunu kullanarak yedeklerinizin boyutunu ve geçerliliğini takip edebilirsiniz. Ayrıca, yedekleme sonrası bildirimleri (Slack, Discord veya Mail) yapılandırarak süreçten haberdar olabilirsiniz.
Yedek dosyalarını ne kadar süre saklamalıyım?
Sürdürülebilir bir sistemde "3-2-1 kuralı" uygulanır: 3 kopya veri, 2 farklı ortam, 1 adet çevrimdışı kopya. Saklama süresi yasal yükümlülüklerinize göre değişse de, en az 30 günlük bir saklama döngüsü önerilir.
Veritabanı yedeğini geri yüklemek için hangi komutu kullanmalıyım?
Geri yükleme işlemi genellikle manuel bir süreçtir. Önce backup:list ile yedeklerinizi listeleyin, ardından ilgili SQL dosyasını indirip mysql -u kullanıcı -p veritabanı_adı < yedek.sql komutuyla içe aktarın.
Neden sunucu seviyesinde yedekleme yerine Laravel paketini tercih etmeliyim?
Laravel tabanlı yedekleme, veritabanı seviyesinde (transactional) tutarlılık sağlar. Sunucu snapshot'ları bazen veritabanı yazma işlemi sürerken alındığında bozuk (corrupted) dosya oluşturabilir.
Yedekleme Süreçlerinde Performans Optimizasyonu
Büyük ölçekli veritabanlarında yedekleme işlemi, sunucu kaynaklarını (CPU ve RAM) yoğun bir şekilde tüketebilir. Özellikle mysqldump veya pg_dump süreçleri sırasında veritabanı üzerindeki okuma/yazma yükü, kullanıcı deneyimini olumsuz etkileyebilir. Bu durumu yönetmek için aşağıdaki stratejileri uygulayabilirsiniz:
- Düşük Öncelikli İşlemler: Yedekleme komutlarını
niceveionicekomutları ile çalıştırarak sistemin ana süreçlerine öncelik tanıyın. - Tablo Bazlı Yedekleme: Eğer veritabanınızda çok büyük ve statik (log tabloları gibi) veriler varsa, bunları yedekleme kapsamı dışında bırakarak dosya boyutunu küçültün.
- Zamanlama: Yedekleme işlemlerini trafiğin en düşük olduğu gece saatlerine planlayın.
Spatie Backup paketinde belirli tabloları hariç tutmak için config/backup.php dosyasındaki only_tables veya except_tables ayarlarını şu şekilde yapılandırabilirsiniz:
'backup' => [
'database' => [
'connection' => 'mysql',
'only_tables' => [],
'except_tables' => [
'sessions',
'cache',
'failed_jobs',
'logs'
],
],
],
Yedekleme Hata Ayıklama ve İzleme (Monitoring)
Otomatik yedekleme sistemleri bazen sessizce başarısız olabilir. Örneğin, disk kotası dolduğunda veya uzak depolama (S3 gibi) kimlik bilgileri değiştiğinde sistem yedek almayı durdurur. Bu tür durumları tespit etmek için Laravel'in Event sistemini kullanmalısınız.
App\Providers\EventServiceProvider içerisinde yedekleme olaylarını dinleyerek, başarısızlık durumunda Slack veya e-posta üzerinden bildirim alabilirsiniz:
use Spatie\Backup\Events\BackupFailed;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;
public function boot()
{
Event::listen(BackupFailed::class, function ($event) {
// Hata loglarını kaydet
Log::error('Yedekleme başarısız oldu: ' . $event->exception->getMessage());
// Buraya Slack veya Telegram bildirim entegrasyonu ekleyebilirsiniz
});
}
İleri Düzey İpuçları: "Dry Run" Testleri
Sisteminizi canlıya almadan önce veya yapılandırma değişikliklerinden sonra yedekleme komutunun doğru çalışıp çalışmadığını doğrulamak için --dry-run benzeri bir kontrol mekanizması kurgulayın. Ayrıca, yedekleme dosyalarınızın şifrelendiğinden emin olmak için GPG anahtarlarınızı düzenli olarak rotasyona sokun.
Profesyonel Tavsiye: Yedekleme dosyalarınızı asla sadece sunucunun kendi diskinde tutmayın. 3-2-1 kuralını uygulayın: Verilerinizin en az 3 kopyası olsun, 2 farklı medya türünde saklayın ve 1 tanesini mutlaka farklı bir coğrafi lokasyonda (örneğin farklı bir AWS bölgesi veya farklı bir bulut sağlayıcısı) bulundurun.
Sonuç
Laravel ile sürdürülebilir bir veritabanı yedekleme sistemi kurmak, projenizin geleceğini güvence altına almanın en profesyonel yoludur. Otomatikleştirilmiş, şifrelenmiş ve düzenli olarak izlenen bir yedekleme yapısı, olası veri kayıplarında yaşayacağınız stresi minimize eder. Bir sonraki adım olarak, yedekleme dosyalarınızın bütünlüğünü düzenli olarak test eden bir "Restore Test" otomasyonu yazmayı düşünebilirsiniz.
Yasal Sorumluluk Reddi: Bu rehberdeki kodlar ve yöntemler genel eğitim amaçlıdır. Veritabanı yedekleme ve geri yükleme işlemleri sırasında oluşabilecek veri kayıplarından veya sunucu hatalarından kullanıcı sorumludur. Kritik verileriniz için her zaman birden fazla lokasyonda yedekleme yapın.


Yorumlar (0)
Yorum Yaz