Web Sitenizin Yedeğini Cronjob ile Alıp Dropbox’a Yükleme

Bir projeyi oluşuturup sürdürülebilir hale getirmek ne kadar zahmetliyse, o projenin yedeğini alıp kötü günler için saklamak da o kadar önemlidir. Bu sadece projeler için değil önemli dökümanlarımız için de geçerlidir elbet. Özellikle bir sabah hard diskinizin çalışmadığını gördüğünüzde bu durumun önemini yedeğiniz yok ise acı şekilde deneyimleyebilirsiniz.

Söz konusu web sitesi ise yedek almanızı gerektirecek sebepler çoğalıyor elbet. Sunucudaki problemler, olası hack durumu vs. diye uzar gider bu liste.

Bu yazıda yedek nasıl alınır sorusundan çok alınan yedeği nasıl başka bir yere taşıyabiliriz konusunda yardımcı olmaya çalışacağım. cpanel kullananlar bilir ki, hala otomatik bir backup sistemi yok. En azından ben yok diye biliyorum, varsa bile kullandığım sistem gayet stabil olduğu için yakın bir zamanda değişiklik yapmayı da düşünmüyorum.

İnternette çeşitli dosya ve veritabanı yedekleme scriptleri mevcut ancak bunların birçoğu yedeği sunucuda tutuyor. Yukarıda dediğim gibi hack durumunda bu yedeği sunucuda tutmanın hiçbir mantığı yok. O yüzden yedeği bir şekilde başka bir yere taşımalıyız, ama nereye?

Dropbox benim için uygun seçenek. Premium ile 2 TB’ya kadar depolama hakkı tanıyor. “Kalsın, ben projemi el alemin sunucularına yüklemem” derseniz bu yedekleme işini lokal bilgisayarınıza yapabileceğiniz bir yazıyı da yazmayı düşünüyorum ileride. Ama şimdilik Dropbox… 🙂

Belirtmem gerekir ki, veritabanı ve dosya yedeği aldığım scripti seneler önce GitHub üzerinden bulmuştum ne yazık ki nereden bulduğumu hatırlamıyorum. O yüzden script sahibi kişi bu yazıyı okursa (-ki sanmam ama) kusura bakmasın.

Çok uzattım biliyorum, işe koyulalım…

Öncelikle Dropbox Developer sayfasından bir API oluşturmamız gerekiyor.

Aşağıdaki resimde görüldüğü üzere çok basit şekilde API’mizi oluşturuyoruz.

 

Daha sonra API’miz için Access Token oluşturuyoruz ve bu Token’i kimselerle paylaşmıyoruz. Öyle ki; token ve keyleri php scriptinin içine koymak yerine CronJob oluştururken Get parametresiyle yolluyoruz. Bunun sebebi, olası hack durumlarında kötü niyetli kişilerin Access Token’ımıza erişip, depoladığımız diğer yedek ve dosyalarımıza erişememesi içindir. Ha, zaten cpanel şifresini de karşı tarafa kaptırdıysanız dükkanı kapatabilirsiniz :\

 

API’yi oluşturduktan sonra Dropbox klasör listenizde API’nizin isminde bir klasörün otomatik oluştuğunu göreceksiniz. Tüm yedekler işte bu mükemmel klasörün içine otomatik şekilde yüklenecek.

 

Gelelim kod kısmına;

Dediğim gibi yazının amacı yedek nasıl alınır sorusuna cevap vermek değil, yedeği nasıl yükleriz sorusuna cevap vermektir. Dropbox API V2 kullanmanız gerekiyor. V1 zaten artık kullanımda değil. Dropbox V2’de PHP için resmi bir SDK yayımlamamış. Bu yüzden GitHub üzerinden bulduğum resmi olmayan ama iş gören bir SDK paylaşacağım. Bu arkadaşın SDK’sını kullanacağız.

Zaten SDK üzerinde kullanacağımız çok fazla metod yok. Upload, listfolder ve delete metodları yeterli. listfolder ve delete metodlarını Dropbox klasörümüz zamanla şiştiğinde x günden eski yedekleri silmek için kullanacağız ama ben 2 TB kotayı 500 senede ancak doldururum gibi görünüyor.

Kodun çalışma mantığını anlatmam gerekirse, 2 adet php scripti var: db.php ve file-backup.php

Klasörde bir “backup” adında klasör ve “lib” klasör içine konmuş compose edilmiş Dropbox kütüphanesi olmalı. Yedek dosyası geçici olarak “backup” klasörüne oluşturuluyor. Yedekleme ve Dropbox’a yükleme tamamlanınca bu dosyalar siliniyor. Ancak sebebini çözemediğim bazı nedenlerden ötürü bazen arkasında yedek dosyası bırakıyor. Bunu da script çalışırken “backup” içindeki .zip uzantılı tüm dosyaları silerek çözdüm. Zip demişken; php zip kütüphanenizin aktif olması gerek. Cpanel üzerinden php yapılandırma ayarlarından bu ayarı aktif edebilirsiniz, böyle bir seçenek yok ise sunucu yetkililerine durumu iletmenizi öneririm.

 

db.php

Scriptin işleyişi aslında çok basit, eskiden bulduğum ve sahibini hatırlayamadığım script önce sql uzantısında bir veritabanı dosyası yaratıyor. Biz bunu zipliyoruz ve $dropbox->upload ile tanımlı klasöre yüklüyoruz.

 

file-backup.php

db.php’den farkı veritabanı yerine dosyaları recursive şekilde tarıyor, içindeki tüm dosyaları klasör yapısını bozmadan zipliyor ve yine $dropbox->upload ile tanımlı klasöre yüklüyoruz. Burada ufak bir istisna olarak; sunucumuzda bazı klasörleri es geçmek isteyebiliriz. Bu klasörleri de Cronjob’u tanımlarken parametre ile belirtebiliyoruz.

 

İki dosyada da  $dayslimit = 60 * 60 * 24 * 20; // 20 gün  diye bir kod göreceksiniz. Bunun anlamı o günden eski yedeklerin silineceğidir. Yani 20 rakamını 30 yaparsanız son 30 güne ait yedekler silinmez. Unutmayın; rakam son yedek sayısını değil gün sayısını dikkate alır.

Ben küçük-orta boy projelerde veritabanını günde bir kez, dosyaları ise 2 günde 1 kez almayı tercih ediyorum. Karar sizin; isterseniz Cronjob ile veritabanınızı her saat başı yedekleyin.

 

Gelelim Cronjob kısmına

2 adet Cronjob oluşturmalıyız. Hem veritabanı hem de dosya yedeği için. Aşağıdaki yerleri kendinize göre uyarlamalısınız.

 

Dosya yedeği için;

php /home/xxx/public_html/ozelklasor/file-backup.php token=token dropboxfolder=nasilanlatsam-backup exceptfolders=uploads

 

Veritabanı yedeği için;

php /home/xxx/public_html/ozelklasor/db.php token=token dropboxfolder=nasilanlatsam-backup

 

NOTLAR

  • xxx yerine cpanel kullanıcı adınız gelmeli
  • ozelklasor yerine klasör yeri tahmin edilmesi zor bir isim gelmeli
  • token kısmına API’yı oluştururken edindiğimiz tokeni yazmalısınız
  • dropboxfolder kısmına API’yi oluştururken yazdığımız klasör adı gelmeli
  • exceptfolders kısmına yedeğinin alınmasını İSTEMEDİĞİNİZ klasörü yazmalısınız. Birden fazla klasörü , ile ayırabilirsiniz.
  • Parametreler arasında boşluk olmalı. Yani tarayıcıdaki gibi & karakteri olmamalı

 

 

 

KEYFİNİ ÇIKARIN 😉

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir