Hướng dẫn Backup DB với Laravel + Dropbox API

  1. Lập trình

  2. Công nghệ thông tin

Hi anh em, lại là mình đây. Chắc hẳn ae làm web ( đặc biệt là WordPress) thường xuyên sẽ phải backup lại CSDL để tránh việc 1 ngày nào đó web server bị hack, hoặc lỗ hổng gì đó dẫn tới việc mất dữ liệu. Giao diện web thì có thể dựng lại được chứ mất dữ liệu thì khốn khổ 🙁 Cái tính năng backup CSDL này mình dùng với blog này luôn :)) phòng trường hợp có ngày bị hacker viếng thăm. Hix

https://cdn.noron.vn/2021/04/27/2571215882310345-1619497578_1024.png

Có khá nhiều cách để có thể làm công việc này, ban đầu mình định sử dụng api put file của slack nhưng thấy hơi loằng ngoằng. Sau đó tìm ra ông Dropbox này vừa tiện vừa cho free nên mình dùng luôn. Framework php mình sử dụng là Laravel.

Laravel là 1 framework php & hỗ trợ rất nhiều công cụ có sẵn cho lập trình viên. Còn Dropbox là 1 dịch vụ lưu trữ cloud, với tài khoản free mình có thể có 2GB dữ liệu, ae tha hồ mà backup nhé :)) Không dài dòng nữa, mình xin bắt đầu vào vấn đề

1) Khởi tạo dropbox

Bước 1: ae lên ngay dropbox.com và đăng ký 1 tài khoản với google/facebook .

Bước 2: truy cập vào địa chỉ developer của dropbox tại

đây
. Ae tạo 1 ứng dụng bằng cách click vào Create apps. Giao diện sẽ hiện ra như bên dưới. Ae tick vào phần phân quyền cho ứng dụng & đặt tên nhé

https://cdn.noron.vn/2021/04/27/capture-2-1619497612_1024.png

Bước 3: sau khi tạo xong, ae kéo xuống dưới của tab Setttings và tạo access token, cứ để no expiration nhé ae.

https://cdn.noron.vn/2021/04/27/image-1-1619497648_1024.png

Bước 4: Chuyển sang tab permission và chọn quyền ghi tệp cho ứng dụng.

https://cdn.noron.vn/2021/04/27/image-2-1619497648_1024.png

Ngon rồi, vậy là mình đã xong các bước cơ bản cho việc setting quyền của Dropbox. Giờ code thôi nào

2) Backup data với Laravel

Tương tự như các framework khác, phần docs của Laravel cũng viết khá đầy đủ và chi tiết về phần cài đặt, mình xin phép không đi sâu vào cái này. Ae có thể tham khảo thêm tại

đây
.

Sau khi tạo project, mình sẽ tạo 1 command để backup dữ liệu bằng lệnh artisan

 php artisan make:command DailyBackupDb 

Oke sau đó mình sẽ cài mysqldump để export data ra sql. Ví dụ lệnh export db là:

 mysqldump -u nampth -p123456 --all-databases > storage/app/all_db_backup.sql 

Lệnh này thực hiện việc export tất cả database ở localhost với username là nampth và password là 123456 và sẽ lưu ra file all_db_backup.sql ở thư mục storage/app => vậy là đã có file CSDL rồi. tiếp theo mình sẽ thực hiện đoạn code để đẩy lên Dropbox

Đoạn code sau trong hàm handle của Command nhé ae.

shell_exec('mysqldump -u nampth -p123456 --all-databases > storage/app/all_db_backup.sql');
$content = file_get_contents(storage_path('app/all_db_backup.sql'));

$ch = curl_init();
$fileName = date('Y-m-d') . "-all_db_backup.sql";

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . env('DROPBOX_ACCESS_TOKEN'),
    'Content-Type: application/octet-stream',
    "Dropbox-API-Arg: {\"path\": \"/$fileName\",\"mode\": \"overwrite\",\"autorename\": false,\"mute\": false,\"strict_conflict\": false}"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
curl_setopt($ch, CURLOPT_URL, API_UPLOAD_FILE);

$result = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

Đoạn code trên đơn giản là chỉ dùng hàm shell_exec để dump DB ra & curl để đẩy file lên dropbox thôi. Ngoài ra có 1 số constant mình sử dụng là dropbox access token chính là token bên trên các bạn lấy từ dropbox, và API upload file thì mình sử dụng api này.

Ngon rồi. Chạy test thử thấy ok và mình sẽ set thời gian chạy hàng ngày cho Command này bằng việc setting trong file Kernel.php như sau

$schedule->command('db:backup')    
->timezone('Asia/Ho_Chi_Minh')    
->runInBackground()    
->daily()    
->evenInMaintenanceMode();

Okkkk. Sau đó deploy ném lên server thôi

3) Triển khai & sử dụng

Phần code trên khá đơn giản phải không ae. Sau khi đóng gói lại và ném lên server, ae nhớ setup cho server chạy lệnh của mình bằng việc thêm dòng sau vào file crontab

 * * * * cd /path/to/yourfolder && php artisan schedule:run >> /dev/null 2>&1 

Sau đó, hàng ngày các bạn sẽ thấy trên thư mục dropbox của mình các file CSDL như bên dưới. Khá ngon ae nhỉ & cũng dễ dùng nữa. Nếu cần mình chỉ việc lấy theo ngày về và import lại là được.

https://cdn.noron.vn/2021/04/27/image-3-1619497842_1024.png

Ngoài ra để đảm bảo việc backup chạy mượt mà & dễ theo dõi thì ae có thể thêm 1 cái webhook bắn notification cho slack để xem có chạy backup có vấn đề gì không nhé. Ae chỉ việc đăng ký 1 workspace với slack, tạo 1 channel, webhook và bắn message vào thôi. Trông nó sẽ thế này, tiện mình monitor luôn 😀 Mấy cái free này cứ thế mà dùng thôi ae :)) đừng ngại

https://cdn.noron.vn/2021/04/27/image-4-1619497863_1024.png

Phần hướng dẫn của mình đã hết. Cảm ơn mọi người đã đọc bài 😀

Từ khóa: 

lập trình

,

công nghệ thông tin