Backup Blog

Selain menggabung sekian blog jadi satu, kemarin saya juga memindahkan tempat si blog berada. Sebelumnya, 3 dari 4 blog yang saya gabung ada di Dreamhost namun blog ini ada di sebuah VPS mungil murah meriah 😀 Satu hal yang jujur saja saya khawatirkan adalah masalah realibilitas dari si VPS sehingga kali ini saya memikirkan mengenai backup. Sebelumnya saya cukup percaya sama om Google dan Dreamhost tuk menjaga data saya.

Setelah memikirkan beberapa strategi backup, akhirnya saya memilih tuk membackup data saya ke layanan lain yang mudah2an bisa saya percayai: BitBucket! 😀

Ada dua hal dari blog ini yang saya rasa perlu saya backup: database yang dipakai dan juga instalasi WordPress (termasuk berkas-berkas yang saya upload via WordPress). Strategi backup saya adalah dengan memasukkan semuanya ke dalam repositori Git dan mengirimnya ke BitBucket. Untung saja BitBucket menyediakan repositori privat yang gratis dan dapat memiliki kapasitas tak terbatas. Klop!

Strategi sudah dipilih, sekarang saatnya membuat langkah konkrit. Untuk database, saya dapat menjalankan mysqldump agar isi database disimpan ke berkas. Saya juga menggunakan opsi --skip-extended-insert agar satu buah record ditulis menjadi satu baris. Andai opsi ini tidak dimasukkan, maka satu baris dalam berkas SQL yang dihasilkan dapat mengandung banyak data sekaligus. Dengan membuat satu entry satu baris, ukuran berkas SQL yang dihasilkan memang bertambah besar namun Git akan dapat melacak perubahan dengan lebih efisien. Untuk berkas instalasi, tidak ada perlakuan khusus agar Git dapat memasukkan semuanya dengan baik.

Setelah coba-coba, inilah kira2 skrip yang saya pakai. Saya jalankan skrip berikut di direktori induk dari direktori instalasi WordPress, secara berkala melalui crontab.

#!/bin/sh

set -x

cd `dirname $0`

mysqldump -h HOST -u USER --password=PASSWORD \
          --skip-extended-insert DATABASE > data.sql

git add data.sql
git commit -m "Database backup"

git add www
git commit -m "WordPress backup"

git push origin master

Tentunya sebelum ini saya sudah persiapkan direktori kerja lokal Git dan juga repositori Git di BitBucket. Kunci SSH tanpa password juga saya gunakan agar operasi push dapat bekerja di belakang layar.

Backup data dg DVCS

Sejak bbrp hari yang lalu saya nyari2 cara tuk membackup data (er.. foto sih tepatnya =D) dg mudah di harddisk eksternal. Berhubung saya jg pengen ada fasilitas versioning, cara backup dg rsync tidak bisa diambil mentah2.

Aplikasi selanjutnya yg terpikir adalah Time Machine yg ada di Mac OS X. Namun setelah baca2, Time Machine tidak bisa melakukan backup secara selektif dalam artian hanya direktori yg dipilih saya yang dibackup, akhirnya Time Machine juga tidak jadi dipilih. Time Machine hanya bisa diatur untuk mengecualikan direktori yg dipilih dan bukan sebaliknya. Kalau begini kondisinya, sudah tentu harddisk eksternal saya akan cepat penuh berhubung Time Machine akan melakukan backup sistem secara keseluruhan.

Sempat mikir juga tuk menggunakan DVCS seperti Git. Namun sejak ingat Git dan DVCS lain akan menduplikasi data yg ada di harddisk internal ke dalam repositori lokalnya juga, pemborosan harddisk akan tetap terjadi. Walau Git melakukan kompresi data, tapi untuk data binari seperti foto rasanya tidak akan begitu berpengaruh. Jadi kalau kita punya foto sebanyak 10GB, maka Git akan menyalinnya ke repositori lokal sehingga total data yg kita simpan bisa mencapai 20GB. Saya jadi ragu tuk menggunakan DVCS tuk membackup data foto.

Loh kok jadi kontradiksi dengan judul?

Tidak, karena tulisan ini belum selesai =P Kekhawatiran tadi akhirnya bisa diakalin sehingga tidak akan terjadi duplikasi data pada harddisk yg sama. Harddisk internet dan eksternal masing-masing akan menyimpan 1 salinan data saja, jadi sangat efisien. Bagaimana caranya?

Caranya adalah dengan meletakkan repositori lokal yang seharusnya ada pada harddisk internal ke harddisk eksternal!

Agar repositori lokal tersebut tetap bisa diakses dari harddisk internal, sebuah symlink digunakan untuk menunjuk direktori repositori lokal yg ada di harddisk eksternal tersebut. Teknik menggunakan symlink ini belum tentu bisa digunakan di seluruh DVCS. Saya sudah mencoba dengan Git dan Bzr dan ternyata keduanya bisa melakukan seluruh skenario yg saya inginkan butuhkan, yang akan saya tunjukkan berikut ini.

Katakanlah direktori yg ingin dibackup adalah ~/Foto/ dan harddisk eksternal ada di /eksternal/

  1. Menginisialisasi repositori

    $ cd Foto
    $ git init
    $ mv .git /eksternal/Foto.git
    $ ln -s /eksternal/Foto.git .git
    
  2. Backup data yang ada

    $ git add .
    $ git commit -a -m "backup"
    

    Proses ini bisa saja dilakukan secara terjadwal. Jangan lupa mengecek dulu apakah harddisk external tsb sedang dipasang atau tidak.

  3. Mengembalikan data dari direktori backup.

     $ mkdir FotoBaru
     $ cd FotoBaru
     $ ln -s /eksternal/Foto.git .git
     $ git checkout HEAD -- .
    

    Selain pake cara di atas, bisa jg lgs git clone direktori /eksternal/Foto.git namun direktori baru yg terbentuk akan membengkak 2x lipat karena berisi repositori lokal dan juga salinan lokal.

    Jika menggunakan Bzr, perintah terakhir diganti menjadi bzr revert

  4. Mengembalikan file tertentu dari sebuah revisi tertentu.

     $ git checkout [revisi] -- [nama/file]
    

    jika menggunakan Bzr, maka perintah di atas menjadi seperti berikut.

     $ bzr revert -r[revisi] [nama/file]
    

Kira-kira seperti itu saja =D ada yang mau mencoba dg DVCS lainnya?

Oh ya.. direktori backup yang ada di harddisk eksternal tidak bisa dibuka begitu saja dengan untuk melihat data-data didalamnya karena data tersimpan dalam format repositori DVCS yang digunakan. Untuk melihatnya tentu saja harus dikembalikan dulu ke salinan lokal dg aplikasi DVCS yang digunakan. Cara ini memang sepertinya hanya ditujukan bagi yang ingin menjadikan harddisk eksternal tsb hanya sebagai tempat backup, bukan tempat berbagi data jg dg orang lain. Asumsinya kalau untuk berbagi data, maka isi harddisk dapat dilihat scr langsung tanpa bantuan aplikasi backup yg dipakai.