Django projelerinde veritabanı yedekleme, özellikle cookiecutter-django gibi yapılandırılmış projelerde, genellikle zahmetli bir süreçtir. Her yedekleme için SSH ile sunucuya bağlanmak, Docker container'ına girip dumpdata çalıştırmak, dosyayı kopyalamak ve manuel olarak S3'e yüklemek, hem zaman kaybına hem de hata riskine yol açar. Bu yazıda, tüm bu adımları tek bir yerel komutta birleştirerek nasıl otomatikleştirebileceğinizi anlatacağım.
Öncelikle, doğru dumpdata komutunu oluşturmak kritik. Naif bir `manage.py dumpdata > data.json` tüm tabloları dökümler, ancak bu taşınabilir bir yedek için uygun değildir. Özellikle `auth.permission`, `contenttypes`, `admin.logentry` ve `sessions.session` gibi tablolar, yeni bir ortamda otomatik oluşturuldukları için yedeğe dahil edilmemeli. Ayrıca, `--natural-foreign` ve `--natural-primary` flag'leri, birincil anahtarları doğal referanslarla değiştirerek farklı ortamlarda veri bütünlüğünü korur. `--indent 2` ise yedek dosyasını okunabilir kılar ve sürüm kontrolünde diff almayı kolaylaştırır.
Container ortamında dumpdata çalıştırırken dikkat edilmesi gereken bir diğer nokta TTY ayarıdır. Komutunuzu `docker compose exec -T` ile çalıştırmalısınız, aksi halde `-T` olmadan bir pseudo-terminal tahsis edilir ve bu, script içinde çalıştırıldığında çıktıya gereksiz `\r` karakterleri ekleyerek JSON'u bozabilir. Ayrıca, yönlendirmeyi (`>`) komutun dışında yapmak, dosyanın container dışında oluşmasını sağlar. Örnek komut şöyle olabilir: `docker compose -f docker-compose.production.yml exec -T django python manage.py dumpdata --natural-foreign --natural-primary --exclude auth.permission --exclude contenttypes --exclude admin.logentry --exclude sessions.session --indent 2 > data.json`
Detaylar ve Etkileri
Şimdi, bu komutu yerel makinenizden çalıştırmak için SSH ile birleştirin. `ssh user@host "docker compose -f ... exec -T django ... > data.json"` şeklinde bir komut, tüm işlemi sunucuda yapar ve çıktıyı yerel dosyaya yönlendirir. Ancak bu, dosyayı sunucuda bırakır. Bunun yerine, SSH ile komutu çalıştırıp çıktıyı doğrudan yerel dosyaya almak için şu yapıyı kullanabilirsiniz: `ssh user@host "docker compose -f ... exec -T django ..." > data.json`. Bu sayede yedek dosyası yerel makinenize gelir.
Gelecekte Ne Bekleniyor?
Son adım, yerel dosyayı S3'e yüklemek. Bunun için AWS CLI veya boto3 kullanabilirsiniz. Basit bir `aws s3 cp data.json s3://bucket-name/backups/` komutu iş görür. Tüm bu adımları tek bir shell script'inde birleştirerek, her yedekleme ihtiyacınızda tek bir komut çalıştırmanız yeterli olur. Script'i cron job olarak da ayarlayarak periyodik yedeklemeleri otomatikleştirebilirsiniz.
Önemli Gelişmeler
Bu yöntem, manuel adımları ortadan kaldırarak hem zaman kazandırır hem de hata riskini azaltır. Özellikle şema değişiklikleri veya riskli migrasyonlar öncesinde hızlıca yedek almak için idealdir. Ayrıca, yedeklerinizi S3'te saklayarak, sunucu arızası durumunda veri kaybına karşı güvence altına alırsınız. Bu otomasyonu kendi projelerinize uyarlamak için tek yapmanız gereken, container ve S3 bucket bilgilerinizi script'e eklemek.
Kaynak: dev.to