Việc sao lưu dữ liệu website là việc thường phải làm với các webmaster. Khi bạn sử dụng shared hosting thì việc backup đã được các hosting provider tự động thực hiện, tuy nhiên với VPS thì khác. Bạn sẽ phải tự thực hiện backup bằng tay. Trong bài viết này mình sẽ hướng dẫn các bạn thực hiện quá trình tự động sao lưu toàn bộ dữ liệu của VPS thông qua Duplicity.

Duplicity là một công cụ hữu ích để có thể thực hiện remoted backup tự động. Một số ưu điểm của duplicity như:

  • Có chế độ Incremental backups (chỉ backup những file mới so với lần trước đó)
  • Có nhiều chế độ lưu trữ (SSH, rsync, FTP, Amazon S3, IMAP, Google Drive…)
  • Tích hợp chức năng mã hóa.
  • Dễ dàng cài đặt và sử dụng.

Trong bài viết này mình sẽ hướng dẫn các bạn backup web https://canhme.com chạy trên VPS CentOS của Cloudzin và lưu trên một VPS khác chuyên chứa dữ liệu (mình sử dụng Ramnode, chỉ cần 128MB RAM (14.48$/năm) là đủ) thông qua ssh, những cái khác các bạn có thể tìm hiểu trên mạng.

Quá trình backup được thực hiện từ động mỗi ngày 1 lần vào 24h đêm.

Cấu trúc dữ liệu

– Toàn bộ dữ liệu được nén và lưu theo ngày trong thư mục /var/backups/. Điều này đảm bảo tốc độ tối ưu nhất và dễ dàng quản lý. Ví dụ:

  • /var/backups/2014-03-23/
    • db_2014-03-23.sql.gz
    • files_2014-03-23.zip

– Trên backup VPS cũng lưu theo ngày trong thư mục /var/backups/domain/. Ví dụ:

  • /var/backups/chiasecoupon.com/2014-03-23/
    • db_2014-03-23.sql.gz
    • files_2014-03-23.zip

Các bạn có thể tự sắp xếp dữ liệu phù hợp với nhu cầu bản thân và add thêm domain tùy ý.

Quy trình tự động sao lưu

  1. Sử dụng mysqldump để sao lưu database
  2. Dùng zip nén toàn bộ file lại
  3. Duplicity chuyển dữ liệu lên backup VPS

Chuẩn bị

– Tạo folder backup trên server và folder ngày hiện tại (mục đích để test, sau này quá trình tự động):

mkdir /var/backups/
mkdir /var/backups/2014-03-23/

– Tạo folder lưu trữ dữ liệu trên backup VPS

mkdir /var/backups/
mkdir /var/backups/chiasecoupon.com/
mkdir /var/backups/chiasecoupon.com/2014-03-23/

Giờ thì hãy tiến hành theo các bước sau, chú ý trong các lệnh mình hard code folder là /2014-03-23/ để các bạn dễ dàng thực hiện theo. Ở bash script cuối cùng thì folder sẽ tự động được tạo theo như thời gian hiện tại của VPS.

Cài đặt duplicity

Sử dụng lệnh sau:

sudo yum install duplicity

Sao lưu MySQL

Sử dụng mysqldump:

mysqldump --single-transaction --routines --triggers --add-drop-table --extended-insert -u TaiKhoan -pMatKhauCuaBan Database | gzip -9 > /var/backups/2014-03-23/db_2014-03-23.sql.gz

Xem thêm Backup và Restore MySQL Database bằng dòng lệnh

Zip dữ liệu

zip -r /var/backups/2014-03-23/files_2014-03-23.zip  /home/chiasecoupon.com/public_html/ -q -x /home/chiasecoupon.com/public_html/wp-content/cache/**\*

Trong ví dụ trên mình không nén folder cache, nếu các bạn không muốn thì có thể bỏ đoạn -x /home/chiasecoupon.com/public_html/wp-content/cache/**\* đi.

Chú ý chỉnh lại đường dẫn chứa website của bạn cho phù hợp.

Nếu như báo lỗi -bash: zip: command not found thì bạn cần chạy yum install zip trước.

Duplicity

Ở đây mình dùng một VPS bảo mật chỉ chuyên chứa dữ liệu thôi, duplicity sẽ dùng ssh để gửi lên. Nếu các bạn muốn dùng Amazon S3 hoặc Google Drive thì hãy tìm hiểu trên mạng nhé, cấu trúc dòng lệnh cũng tương tự.

Đầu tiên cần tạo ssh key để kết nối với ssh-keygen

ssh-keygen -C 'Duplicity Backup Key'

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/backup_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/backup_rsa.
Your public key has been saved in /root/.ssh/backup_rsa.pub.

Chú ý bước này bạn không điền passphrase nhé, để trống.

Giờ sẽ tiến hành copy key này lên backup VPS.

ssh-copy-id -i /root/.ssh/backup_rsa.pub "-p root@22 12.34.56.78"

Và test lại xem bạn có thể login với key này hay không

ssh -i /root/.ssh/backup_rsa -p 22 root@12.34.56.78

Nếu kết nối thành công, chạy exit để thoát khỏi backup VPS và tiếp tục cài đặt.

duplicity full --no-encryption --volsize 100 --ssh-options="-oProtocol=2 -oIdentityFile=/root/.ssh/backup_rsa" /var/backups/2014-03-23/ scp://root@12.34.56.78//var/backups/chiasecoupon.com/2014-03-23/

Ở đây mình chọn chế độ backup full chứ không phải incremental. Và tự động split file 100MB nếu dung lượng quá lớn.

Nếu bạn muốn add thêm folder, hãy sử dụng option --include="/path/to/folder"

Nếu toàn bộ quá trình trên bạn thực hiện thành công, giờ hãy gộp tất cả lại vào 1 file bash script và chạy cronjob hàng ngày.

Tạo file script nano /root/backup.sh với nội dung như bên dưới của mình:

#!/bin/bash
{
    printf "subject:Chia Se Coupon Backup Report\nfrom:admin@chiasecoupon.com\n\n"
    rm -rf /var/backups/*
    mkdir /var/backups/$(date +"%Y-%m-%d")/
    echo "Starting backup database..."
    mysqldump --single-transaction --routines --triggers --add-drop-table --extended-insert -u TaiKhoan -pMatKhauCuaBan Database | gzip -9 > /var/backups/$(date +"%Y-%m-%d")/db_$(date +"%H:%M_%d-%m-%Y").sql.gz
    echo "Starting backup files..."
    zip -r /var/backups/$(date +"%Y-%m-%d")/files_$(date +"%H:%M_%d-%m-%Y").zip /home/chiasecoupon.com/public_html/ -q -x /home/chiasecoupon.com/public_html/wp-content/cache/**\*
    echo "Starting duplicity..."
    duplicity full --no-encryption --volsize 100 --ssh-options="-oProtocol=2 -oIdentityFile=/root/.ssh/backup_rsa" /var/backups/$(date +"%Y-%m-%d")/ scp://root@12.34.56.78//var/backups/chiasecoupon.com/$(date +"%Y-%m-%d")/
} | /usr/sbin/sendmail "admin@chiasecoupon.com"

Như các bạn thấy trong script trên, mình có add thêm lệnh gửi thông báo qua email sau khi chạy backup thành công.

Sau đó lưu file này lại, thêm quyền executive chmod +x /root/backup.sh, test một lần nữa xem toàn bộ quá trình sao lưu này thành công hay chưa với lệnh /root/backup.sh

Cronjob

Mình sẽ để tác vụ backup tự động thực hiện mỗi ngày bằng cách add thêm vào crontab. Ở đây mình quen sử dụng editor nano nên sẽ sử dụng thay cho vim mặc định.

EDITOR=nano crontab -e

Thêm dòng mới với nội dung:

0 3 * * * /root/backup.sh >/dev/null 2>&1

Đoạn bên trên qui định cứ 3h sáng mỗi ngày sẽ thực hiện backup 1 lần, nếu bạn muốn thay đổi thời gian thì tham khảo thêm bài viết về crontab.

Cuối cùng nhấn Ctrl + O để lưu lại và Ctrl + X để thoát.

Như vậy là toàn bộ quá trình sao lưu dữ liệu lên backup VPS server đã được thực hiện tự động.

Lưu ý: có thể bạn cần thay đổi lại timezone thì cronjob mới hoạt động chính xác được.

Restore

Giờ thì chúng ta đã có những bản backup hàng ngày rồi, tuy nhiên làm thế nào để khôi phục lại website khi có vấn đề?

Đầu tiên bạn cần truy cập vào backup VPS server, đến thư mục chứa file backup sẽ thấy rất nhiều file kiểu như sau:

duplicity-full-signatures.20140322T142037Z.sigtar.gz
duplicity-full.20140322T142037Z.manifest
duplicity-full.20140322T142037Z.vol1.difftar.gz
duplicity-full.20140322T142037Z.vol2.difftar.gz
duplicity-full.20140322T142037Z.vol3.difftar.gz

Đó là cấu trúc dữ liệu của duplicity, để khôi phục lại như file nén db và files như ban đầu, hãy sử dụng lệnh:

duplicity restore --no-encryption --file-to-restore / file:///var/backups/chiasecoupon.com/2014-03-23 /var/backups/chiasecoupon.com/extract

Synchronizing remote metadata to local cache...
Copying duplicity-full-signatures.20140322T142037Z.sigtar.gz to local cache.
Copying duplicity-full.20140322T142037Z.manifest to local cache.
Last full backup date: Sat Mar 22 21:20:37 2014
GnuPG passphrase:

Truy cập vào folder /var/backups/chiasecoupon.com/extract bạn sẽ thấy toàn bộ dữ liệu đã được giải nén.

Chúc các bạn thực hiện thành công!

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.