Hướng dẫn Backup DB với Laravel + Dropbox API
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
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
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.
Bước 4: Chuyển sang tab permission và chọn quyền ghi tệp cho ứng dụng.
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
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.
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
Phần hướng dẫn của mình đã hết. Cảm ơn mọi người đã đọc bài 😀