Restic Multi-Cloud Backup Manager – sao lưu và phục hồi dữ liệu qua Restic và Rclone

Restic Multi-Cloud Backup Manager là một bash script được viết theo các ý tưởng từ bài giới thiệu Restic kết hợp Rclone, giúp chạy các lệnh sao lưu và phục hồi dữ liệu trên 2 công cụ Restic và Rclone đơn giản hơn, bổ xung thêm phần thông báo lỗi qua Telegram

Ban đầu Restic Multi-Cloud Backup Manager chỉ có tính năng sao lưu (backup) qua 3 lệnh chính backup, check, forget bổ xung thêm 1 số tùy chỉnh nhỏ để chạy tự động trong nhiều trường hợp, phiên bản hiện tại đã bổ xung thêm tính năng phục hồi dữ liệu (restore), đáng dùng hơn rồi

Tính năng chính

  • Sao lưu tự động:
    • Sao lưu các thư mục và file được chỉ định trực tiếp lên đám mây thông qua Restic và Rclone.
    • Hỗ trợ khởi tạo repository nếu chưa tồn tại.
  • Sao lưu dự phòng:
    • Hỗ trợ đồng bộ dữ liệu bản sao lưu chính sang các dịch vụ lưu trữ đám mây khác, hạn chế tình huống chỉ lưu trữ ở 1 nơi
    • Khi có nhiều remote được cấu hình, hỗ trợ đồng bộ cùng lúc, cải thiện thời gian sao lưu tổng thể xuống nhanh hơn (1 chút)
  • Dọn dẹp bản sao lưu cũ:
    • Tự động xóa các bản sao lưu cũ theo chính sách lưu trữ (giữ lại theo giờ, ngày, tháng tùy chọn).
  • Kiểm tra toàn vẹn dữ liệu:
    • Tự động kiểm tra toàn vẹn dữ liệu định kỳ để giảm thiểu khả năng dữ liệu sao lưu gặp vấn đề.
  • Phục hồi dữ liệu:
    • Hỗ trợ phục hồi toàn bộ hoặc từng phần dữ liệu từ các bản sao lưu cũ.
    • Cho phép chọn kho lưu trữ chính hoặc dự phòng để phục hồi.
    • Cung cấp menu phục hồi trực quan, dễ sử dụng.
  • Thông báo lỗi qua Telegram:
    • Gửi thông báo chi tiết qua Telegram khi có lỗi xảy ra trong quá trình cài đặt, sao lưu hoặc phục hồi.
    • Ghi log chi tiết vào file backup.log để tiện theo dõi.
  • Tối ưu hóa hiệu suất:
    • Giảm độ ưu tiên CPU và I/O khi sao lưu hoặc phục hồi dữ liệu để không ảnh hưởng đến các ứng dụng khác đang chạy
    • Đảm bảo duy nhất chỉ một tiến trình sao lưu hoặc phục hồi chạy tại một thời điểm.
  • Dễ sử dụng:
    • Hỗ trợ tạo alias backuprestore, dễ dàng gọi chạy thủ công mà không cần nhớ quá nhiều câu lệnh

Cài đặt

  • Cài đặt Restic: cài đặt Restic là đủ, không cần thực hiện thêm bước nào khác.
  • Với Rclone: cấu hình ít nhất một dịch vụ cloud storage cho Restic, mếu muốn sử dụng nhiều dịch vụ cloud storage dự phòng, tạo thêm các cấu hình Rclone khác
    • Khuyến nghị: sử dụng các dịch vụ cloud object storage như Amazon S3 hoặc Cloudflare R2 để đạt hiệu quả cao về tốc độ và độ ổn định.
    • Nếu không có: sử dụng Google Drive, tốc độ không nhanh bằng các dịch vụ cloud object storage, nhưng tiện lợi vì hầu hết người dùng đều có sẵn tài khoản Google.
  • Thông báo Telegram: lấy BOT_API_KEY và CHAT_ID để nhận tin nhắn thông báo lỗi

Mọi source code liên quan tới Restic Multi-Cloud Backup Manager đều được công khai trên Github, bạn nào thích có thể lấy về sửa chữa, nâng cấp tùy thích

  • Toàn bộ các lệnh đều viết trên nhiều hệ điều hành chạy Linux, nhưng không chắc tình huống cụ thể làm sao, do mình chỉ dùng trực tiếp Ubuntu hoặc Debian
  • Nên giữ đúng tên thư mục, tên file như cấu hình gốc /restic/restic_backup_manager.sh để thuận tiện cho sử dụng
sudo mkdir -p /restic && sudo wget https://go.bibica.net/restic -O /restic/restic_backup_manager.sh && sudo chmod +x /restic/restic_backup_manager.sh

Cấu hình

  • Mở file cấu hình:
nano /restic/restic_backup_manager.sh
  • Cấu hình Telegram Bot
# Cấu hình Telegram
BOT_API_KEY="xxxxxxxx:xxxxxxxxxxxxx"
CHAT_ID="xxxxxxxxx"
  • BOT_API_KEY: khóa API của Telegram bot mà bạn sẽ sử dụng để gửi thông báo
  • CHAT_ID: ID của nhóm hoặc người nhận tin nhắn trên Telegram.

Góc độ cá nhân mình vẫn khuyết khích mọi người nhận thông báo qua Telegram, bất kể Việt Nam đứt cáp ra làm sao, chưa thấy chậm bao giờ, hạn chế dần các thông báo qua email, vì thư rác nhiều, dễ nhầm sót lắm

  • Cấu hình Restic
export RESTIC_REPOSITORY="rclone:cloudflare-free:bibica-net"
export RESTIC_PASSWORD="your-secure-password"
  • RESTIC_REPOSITORY: nơi lưu trữ các bản sao lưu chính, rclone giúp kết nối tới các dịch vụ đám mây khác nhau (Google Drive, Cloudflare R2 …)
    Ví dụ: cloudflare-free tên của remote đã cấu hình trong Rclone
    /restic-backup/bibica-net đường dẫn thư mục trên cloudflare-free
  • RESTIC_PASSWORD: mật khẩu sử dụng để mã hóa các bản sao lưu
    your-secure-password thay thế bằng mật khẩu khác mà bạn thích

Trên repository chính nên ưu tiên dùng cloud object storage dạng Amazon S3, Cloudflare R2, tốc độ nhanh, ổn định

  • Thư mục và file cần sao lưu
BACKUP_DIR="/home /var/spool/cron/crontabs/root"
  • BACKUP_DIR: danh sách đường dẫn các thư mục hoặc tệp muốn sao lưu, ở ví dụ có sẵn là đường dẫn tới thư mục home và file cron của root
  • Các đường dẫn bắt đầu bằng /
  • Các thư mục hoặc file phân cách nhau bởi dấu cách (khoảng trắng)

Không hỗ trợ các thư mục, tệp có kí tự lạ, khoảng trắng, đừng đặt tên file, thư mục dạng /bố thích đặt tên làm sao thì kệ bố là được

  • Chính sách giữ backup
KEEP_HOURLY=24
KEEP_DAILY=31
KEEP_MONTHLY=12
  • KEEP_HOURLY=24 giữ lại 24 bản snapshot (1 bản mỗi giờ trong 24 giờ gần nhất)
  • KEEP_DAILY=31 giữ lại 31 bản snapshot (1 bản mỗi ngày trong 31 ngày gần nhất)
  • KEEP_MONTHLY=12 giữ lại 12 bản snapshot (1 bản mỗi tháng trong 12 tháng gần nhất)

Cấu hình như bên trên tối đa giữ lại 67 bản trong 12 tháng gần nhất, trong thường hợp chỉ muốn 1 ngày lưu 1 bản snapshots thì sửa lại KEEP_HOURLY=0

  • Chính sách kiểm tra toàn vẹn dữ liệu
VERIFY_HOUR=4
  • Để tránh tình huống chạy nhiều tháng, nhiều năm, đôi khi vì nhiều nguyên nhân, khi sao lưu gặp lỗi, mỗi ngày sẽ kiểm tra đầy đủ toàn bộ 1 lần mọi dữ liệu lưu trữ, mặc định lúc 4h sáng mỗi ngày (giờ mà thường VPS sẽ không hoạt động gì), muốn chạy kiểm tra lúc 3h chiều thì sửa VERIFY_HOUR=15

Sau khi cài đặt lần đầu, có thể script sẽ chạy ngay lập tức hành động này, không chính xác 4h sáng như trong cấu hình, vấn đề này là bình thường, từ ngày tiếp theo nó sẽ chạy chính xác vào 4h sáng

  • Cấu hình Secondary Backup
SECONDARY_REMOTE=""
  • Mặc định để trống là bỏ qua không dùng backup dự phòng

Các cloud storage thêm vào theo cú pháp của rclone, ví dụ cloudflare-r2:bibica-net, thư mục sau tên của remote điền tùy thích

Muốn thêm nhiều cloud storage, mỗi cloud storage cách nhau bởi khoảng trắng

Ví dụ dùng thêm 2 cloud dự phòng, thêm vào như sau

SECONDARY_REMOTE="google-drive-api:restic-backup/bibica-net cloudflare-r2:bibica-net"
  • Các cấu hình khác để mặc định là đủ

Làm xong xuôi hết các bước thì Ctrl+O -> Enter -> Ctrl+X để save và exit.

Chạy Script

  • Chay script thủ công lần đầu để kiểm tra xem các cấu hình điền chính xác chưa?
/restic/restic_backup_manager.sh
  • Các lỗi đều sẽ hiện thẳng ra màn hình shell, file log và thông báo trực tiếp tới Telegram giúp bước cấu hình ban đầu kiểm tra lỗi dễ hơn
  • Cấu hình xong xuôi, chạy mượt, có thể check Telegram Bot bằng cách sửa BACKUP_DIR, điền bừa 1 giá trị không có thực, sẽ thấy tin nhắn báo lỗi gửi về Telegram bot

Các log set mặc định nằm cùng thư mục chạy script, là /restic, xem log cũng tiện hơn

  • Cấu hình Cron để chạy tự động:

Mặc định, khi chay trực tiếp qua màn hình shell, Restic Multi-Cloud Backup Manager sẽ kiểm tra xem bản thân nó đã được chạy qua cron chưa? đề xuất mặc định là 1h chạy 1 lần

Bạn sẽ thấy 1 thông báo tương tự như thế nếu chưa cấu hình cron, copy sẵn lệnh bên dưới chạy là được

* Restic Multi-Cloud Backup Manager chưa được cấu hình để chạy qua cron.
* Bạn có thể chạy lệnh bên dưới để thêm nó vào cron:
(crontab -l 2>/dev/null; echo "0 * * * * /root/restic/restic_backup_manager.sh") | crontab -

Phần này mình bổ xung thêm vào, vì khi cài đặt rất hay quên bật tắt cron, có thông báo hiện ra, cũng đỡ nhầm hơn

Cài đặt alias

  • Cài đặt với tùy chọn install
/restic/restic_backup_manager.sh install

Chỉ cần chạy 1 lần với install, sau này nếu vì lý do nào đó, đổi tên file, hoặc vị trí đường dẫn cũ, chạy lại install để cập nhập lại đường dẫn cho alias

  • backup là chạy trực tiếp /restic/restic_backup_manager.sh để tạo backup
  • restore là chạy trực tiếp /restic/restic_backup_manager.sh restore, dùng để khôi phục dữ liệu với giao diện tùy chọn

Khôi phục dữ liệu

Ở phiên bản này do đã tích hợp thẳng restore vào, nên có thể gọi trực tiếp bằng phím tắt restore mà vẫn đảm bảo chỉ duy nhất một tiến trình sao lưu hoặc phục hồi chạy tại một thời điểmsẽ an toàn hơn cho các thao tác sao lưu và khôi phục

Gọi trực tiếp bằng phím tắt restore, làm theo từng bước hiện ra, chọn repository, chọn snapshots, chọn 1 trong 2 tùy chọn phục hồi …

  • Chọn repository từ danh sách (ấn phím 1,2,3 hoặc 0 để thoát, rồi enter)
=== CHỌN KHO LƯU TRỮ ĐỂ PHỤC HỒI ===
1) Sao lưu chính - google-drive-api:bibica-net
2) Sao lưu dự phòng - cloudflare-free:bibica-net
3) Sao lưu dự phòng - cloudflare-r2:bibica-net
0) Thoát
  • Chọn snapshots trong danh sách hiện ra, copy trực tiếp ID vào (phần này có check lại dữ liệu nhập vào, không lo điền sai ID)
13a43a96  2025-01-27 23:38:47  bibica-net              /home                          2.336 GiB
                                                       /root/.config/rclone
                                                       /var/spool/cron/crontabs/root
25 snapshots

📋 Nhập ID bản sao lưu để phục hồi (hoặc 'back' để quay lại): 13a43a96
  • Chọn 1 trong 2 chế độ phục hồi (ấn phím 1,2 hoặc 0 rồi enter)
=== TÙY CHỌN PHỤC HỒI ===
1) Phục hồi toàn bộ bản sao lưu
2) Phục hồi một phần (thư mục/tập tin cụ thể)
0) Quay lại
Nhập lựa chọn của bạn: 1
  • Nhập đường dẫn để phục hồi (nơi dữ liệu giải nén vào) gõ trực tiếp đường dẫn vào (đường dẫn luôn phải bắt đầu bằng /)
📂 Nhập đường dẫn để phục hồi (nơi dữ liệu giải nén vào).
   Ví dụ: /home/user (dữ liệu trên cloud storage sẽ giải nén vào /home/user):
   Ví dụ: / (dữ liệu trên cloud storage sẽ tự động giải nén vào đường dẫn như ban đầu):
> /restore/test
  • Kiểm tra lại thông tin, xác nhận lại: gõ 1 (nhập sai đường dẫn, gõ 2 để sửa lại) rồi enter
=== XÁC NHẬN PHỤC HỒI ===
📦 Kho lưu trữ: rclone:cloudflare-free:bibica-net
📋 ID bản sao lưu: 13a43a96
📂 Đường dẫn phục hồi (nơi dữ liệu giải nén vào): /restore/test

1) Thực hiện phục hồi
2) Sửa lại đường dẫn
0) Trở về menu chính

Nhập lựa chọn của bạn: 1
  • Tiến trình hiện ra trên màn hình, tương tự khi chạy các lệnh restic restore trực tiếp
Nhập lựa chọn của bạn: 1
repository 5db6f8b8 opened (version 2, compression level auto)
[0:00] 100.00%  1 / 1 index files loaded
restoring snapshot 13a43a96 of [/home /var/spool/cron/crontabs/root /root/.config/rclone] at 2025-01-27 23:38:47.10658907 +0700 +07 by root@bibica-net to /restore/test
Summary: Restored 37153 files/dirs (2.336 GiB) in 0:15
  • Chế độ phục hồi một phần (thư mục/tập tin cụ thể)

Ban đầu không quá thích tính năng này của Restic, cá nhân không dùng tới, kiểu restore tất cả dữ liệu đang dùng tầm 10-15s, restore 1 file 1 kb cũng mất 3-4s, cảm giác không cần thiết vì phải nhớ thêm nhiều lệnh mệt người

Có điều nếu dữ liệu của bạn nhiều, thậm chí quản lý vài trăm trang web hay dữ liệu tính theo TB trở lên, cần phục hồi 1 trang hay 1-2 file nào đó, phải giải nén toàn bộ dữ liệu thì đúng là mệt mỏi, có thể phục hồi cụ thể 1 file, 1 thư mục nào như này thì hiệu quả hơn thật

=== XÁC NHẬN PHỤC HỒI ===
📦 Kho lưu trữ: rclone:cloudflare-free:bibica-net
📋 ID bản sao lưu: 13a43a96
📂 Đường dẫn phục hồi (nơi dữ liệu giải nén vào): /test03
📂 Đường dẫn thư mục/tập tin trong bản sao lưu muốn phục hồi: /home/backup

1) Thực hiện phục hồi
2) Sửa lại đường dẫn phục hồi (nơi dữ liệu giải nén vào)
3) Sửa lại đường dẫn thư mục/tập tin trong bản sao lưu muốn phục hồi
0) Trở về menu chính

Nhập lựa chọn của bạn: 1
repository 5db6f8b8 opened (version 2, compression level auto)
[0:00] 100.00%  1 / 1 index files loaded
restoring snapshot 13a43a96 of [/home /var/spool/cron/crontabs/root /root/.config/rclone] at 2025-01-27 23:38:47.10658907 +0700 +07 by root@bibica-net to /test03
Summary: Restored 23 / 22 files/dirs (96.020 KiB / 96.020 KiB) in 0:01

Tự cập nhập biến cấu hình Restic trên shell

Giải pháp nghe khá phức tạp, là tạo alias có tên là restic,  alias này khi chạy sẽ tự gọi ra 2 trị trị RESTIC_REPOSITORY, RESTIC_PASSWORD được lấy tự động trong file restic_backup_manager.sh ban đầu

  • Download file setup_restic_wrapper.sh về cùng thư mục chứa file restic_backup_manager.sh, chạy 1 lần là được
sudo mkdir -p /restic && sudo wget https://go.bibica.net/setup_restic_wrapper -O /restic/setup_restic_wrapper.sh && sudo chmod +x /restic/setup_restic_wrapper.sh && /restic/setup_restic_wrapper.sh

Kết quả là hiện tại, bất cứ khi nào bạn sửa nội repository từ restic_backup_manager.sh, khi dùng shell để gõ các lệnh trực tiếp, đều đã có sẵn cấu hình repository gốc, đỡ phải nhớ hay gõ tay các đường dẫn vào

Hiệu năng

Thử nghiệm chạy Restic Multi-Cloud Backup Manager trên UpCloud cấu hình thấp nhất

CPU Cores Memory Storage Price / Month
1 core 1 GB 10 GB €3.00
  • Thời gian khi chạy backup loanh quanh 30-45s, không tệ vì Restic Multi-Cloud Backup Manager phải cân đối xem CPU lúc đó có đang dùng không
  • Trên Oracle 4 core ARM và dùng các repository trên cloud object storage, thời gian backup có thể xuống 10-15s

Tổng thể theo mình là ổn, không có gì phàn nàn, thực tế sau khi cấu hình xong, đa phần chúng ta sẽ chạy ngầm và thường quên luôn vấn đề này

Kết luận

Ban đầu bài này khá dài dòng và nhiều thứ râu ria, cá nhân đọc vào cũng thấy mệt, kiểu theo góc độ người vào đọc sẽ cảm giác ” teo đang muốn coi bài hướng dẫn cấu hình, mài cứ ngồi lải nhải vấn đề xử lý chỗ này, xử lý chỗ kia làm đéo gì 😀 teo đọc cũng có hiểu đéo gì đâu” =))

Vâng, khi xem bài hướng dẫn của người khác là mình toàn nghĩ thế á, đâm ra cố gắng viết ngắn nhất có thể, giải thích cái gì cần thôi, các bước có thể chạy auto được thì đưa hết nó vào script, đỡ phải viết thêm vào bài

Dù Restic chạy rất an toàn và hiệu quả, mình dùng vài ngày, mà vẫn chưa thấy bất cứ thông báo lỗi nào, có điều nên dùng thêm 1 hình thức backup truyền thống, nén mọi thứ sang dạng .zip, phòng ngừa mọi tình huống xấu nhất có thể xảy ra 🖖 sao lưu này nọ thì nói nhanh là không tin bố con thèng nào hết, đừng chờ tới lúc gặp vấn đề mới ngồi xử lý thì không nổi đâu


Related Posts

Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.

• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.

✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!