Skip to content
Thuan Bui's Blog
Go back

Sao lưu dữ liệu bằng Borg Backup lên Hetzner Storage Box

Nhiều năm qua, công cụ sao lưu dữ liệu website yêu thích của mình là UpdraftPlus. Tất cả các website WordPress của mình đều không thể thiếu plugin UpdraftPlus để sao lưu dữ liệu và database.

Ưu điểm của UpdraftPlus là dễ sử dụng, dễ tùy biến, setup 1 lần rồi quên luôn. Bao giờ có biến mới cần đụng đến.

Tuy nhiên, UpdraftPlus có khá nhiều nhược điểm:

Do đó, mình phải nghiên cứu một công cụ backup khác để phục vụ cho nhu cầu sử dụng trong tương lai. Yêu cầu phải đáp ứng các tiêu chí: hoạt động nhanh, ổn định, có tính năng deduplication (chống trùng lặp), và nếu miễn phí thì càng tốt.

Một trong các công cụ thỏa mãn các tiêu chí vừa kể là Borg Backup. Mình đã nghe danh Borg từ lâu, nhưng gần đây mới dành thời gian học cách sử dụng.

I. Borg là gì?

BorgBackup, hay thường gọi tắt là borg, là một công cụ sao lưu dữ liệu được tối ưu hóa nhờ áp dụng công nghệ deduplication.

Một số tính năng độc đáo của borg:

Khi sử dụng Borg, có 2 thuật ngữ quan trọng cần phải nhớ:

Trong bài viết này mình sẽ hướng dẫn cách sao lưu dữ liệu của blog thuanbui này từ VPS lên Storage Box của Hetzner sử dụng công cụ Borg Backup.

II. Cài đặt Borg

Cài đặt Borg trên Server và Client bằng một trong các lệnh sau

Ubuntu / Debian

Terminal window
sudo apt install borgbackup -y

Fedora, RHEL, CentOS, AlmaLinux and Rocky Linux

Terminal window
sudo dnf install borgbackup

Arch / EndavourOS

Terminal window
sudo pacman -S borg

Storage Box của Hetzner đã tích hợp sẵn SSH và Borg, nên mình chỉ cần cài lên VPS đang chạy website.

III. Tạo SSH key cho Storage Box

Tiếp theo, để VPS có thể ssh tự động vào Storage Box mà không cần nhập password, mình cần tạo SSH Key và copy qua Storage Box để xác thực.

Truy cập vào VPS và tạo SSH Key mới bằng lệnh

Terminal window
ssh-keygen

SSH Key sẽ được lưu trong thư mục /root/.ssh/

Terminal window
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:11C4qBgfpxxxxxxxxxxxxxxxxkQhpDEfhZA root@GreenCloud.1665799540
The key's randomart image is:
+---[RSA 3072]----+
| . ++o+o |
| . . E23o. |
| odsa ..oo . |
| = = + oo.. |
| Xxxcs..= |
| o = +.=o.. o |
| o =.. + |
| . + .... |
| +oo... |
+----[SHA256]-----+

Copy SSH Key vừa tạo lên Storage Box thông qua giao thức SSH

Terminal window
cat ~/.ssh/id_rsa.pub | ssh -p23 uxxxx@uxxxx.your-storagebox.de install-ssh-key

Cần nhập password của Storage Box để xác thực. Sau đó SSH Key sẽ được copy qua.

Terminal window
The authenticity of host '[uxxxxxx.your-storagebox.de]:23 ([168.xxx.xxx.181]:23)' can't be established.
ECDSA key fingerprint is SHA256:oDHZqKXxcsdsssdcuFez28roaEuFcfwyg8O5c.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[uxxxxxx.your-storagebox.de]:23,[168.xxx.xxx.181]:23' (ECDSA) to the list of known hosts.
uxxxxxx@uxxxxxx.your-storagebox.de's password:
Key No. 1 (ssh-rsa root@GreenCloud.1665799540) was installed in RFC4716 format
Key No. 1 (ssh-rsa root@GreenCloud.1665799540) was installed in OpenSSH format

Kiểm tra thử SSH Key hoạt động ổn chưa bằng cách ssh vào Storage Box. Nó sẽ tự động kết nối thành công mà không cần nhập password.

Terminal window
ssh -p23 uxxxxx@uxxxxxx.your-storagebox.de
+------------------------------------------------------------------+
| Welcome to your Storage Box. |
| |
| Please note that this is only a restricted shell environment and |
| therefore some shell features like pipes and redirects are not |
| supported. |
+------------------------------------------------------------------+

Mọi thao tác đều được thực hiện trên Borg client - VPS đang chứa dữ liệu.

IV. Khởi tạo Repository

Tạo thư mục mới trên Storage Box dùng làm Repository cho Borg

Terminal window
ssh -p23 uxxxxx@uxxxxxx.your-storagebox.de mkdir -p ./Backup/website/thuanbui.me/data

Khởi tọa repository bằng lệnh borg init. Mình không sử dụng mã hóa nên phần --encryption chọn none. Bạn nào quan tâm về mã hóa có thể tham khảo thêm ở đây: https://borgbackup.readthedocs.io/en/stable/quickstart.html#repository-encryption

Terminal window
borg init --encryption=none ssh://uxxxxxx@uxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data

V. Sao lưu dữ liệu lên Repository

Tạo backup đầu tiên lên repository

Terminal window
borg create --stats --progress ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::'{now:%Y-%m-%d_%H:%M}' /home/ols-docker-env/sites/thuanbui.me/html/

Thời gian backup mất gần 2 phút cho 1.4 GB dữ liệu

Terminal window
------------------------------------------------------------------------------
Archive name: 2024-01-08_13:38
Archive fingerprint: c30dee52fa104c6057f1819312f5dc1c88c17a0a6e5d3c3fb8343cc657ae8b92
Time (start): Mon, 2024-01-08 13:38:30
Time (end): Mon, 2024-01-08 13:40:19
Duration: 1 minutes 49.00 seconds
Number of files: 28879
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 1.62 GB 1.40 GB 1.39 GB
All archives: 1.62 GB 1.40 GB 1.39 GB
Unique chunks Total chunks
Chunk index: 27792 29140
------------------------------------------------------------------------------

Sau vài tiếng, mình chạy thêm 1 lệnh backup thêm 1 lần nữa

Terminal window
borg create --stats --progress ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::'{now:%Y-%m-%d_%H:%M}' /home/ols-docker-env/sites/thuanbui.me/html/

Nhờ Borg sử dụng công nghệ deduplication (chống trùng lặp), chỉ sao lưu những thay đổi so với lần backup gần nhất nên lần này thời gian thao tác chỉ mất 3 giây. Tổng dung lượng lưu trữ vẫn giữ nguyên 1.4 GB.

Terminal window
------------------------------------------------------------------------------
Archive name: 2024-01-08_20:42
Archive fingerprint: 531574ac71b574d9ce7884389765f96d0e90567c30e991ce770cfe784726ce96
Time (start): Mon, 2024-01-08 20:42:11
Time (end): Mon, 2024-01-08 20:42:14
Duration: 2.94 seconds
Number of files: 28874
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 1.02 GB 835.14 MB 365.82 kB
All archives: 2.65 GB 2.24 GB 1.39 GB
Unique chunks Total chunks
Chunk index: 27802 58064
------------------------------------------------------------------------------

Nếu backup theo cách thông thường, không có deduplication thì chắc chắn sẽ tốn gấp đôi dung lượng: 2.8 GB.

VI. Xem thông tin bản sao lưu

Để liệt kê các bản sao lưu đang có trong repository, dùng lệnh borg list

Terminal window
borg list ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data
Terminal window
2024-01-08_13:38 Mon, 2024-01-08 20:38:30 [c30dee52fa104c6057f1819312f5dc1c88c17a0a6e5d3c3fb8343cc657ae8b92]
2024-01-08_20:42 Mon, 2024-01-08 20:42:11 [531574ac71b574d9ce7884389765f96d0e90567c30e991ce770cfe784726ce96]

Xem thông tin chi tiết của từng bản sao lưu bằng lệnh borg info

Terminal window
borg info ssh://uxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_20:42

Kết quả trả về

Terminal window
Utilization of maximum supported archive size: 0%
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 1.02 GB 832.96 MB 365.82 kB
All archives: 2.65 GB 2.24 GB 1.39 GB
Unique chunks Total chunks
Chunk index: 27802 58064

Để xem các file có trong từng bản sao lưu, dùng lệnh borg list

Terminal window
borg list ssh://uxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_20:42

Kết quả trả về tương tự như bên dưới

Terminal window
-rw-r--r-- 1000 1000 1693 Sun, 2022-11-06 13:24:09 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-new-menu-section.php
-rw-r--r-- 1000 1000 716 Sun, 2022-11-06 13:24:09 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-nav-menu-section.php
-rw-r--r-- 1000 1000 11889 Sun, 2023-11-12 12:18:56 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-theme-control.php
-rw-r--r-- 1000 1000 8054 Sun, 2023-11-12 12:18:56 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-header-image-control.php
-rw-r--r-- 1000 1000 10568 Sun, 2022-11-06 13:24:09 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-partial.php
-rw-r--r-- 1000 1000 6993 Sun, 2022-11-06 13:24:09 home/ols-docker-env/sites/thuanbui.me/html/wp-includes/customize/class-wp-customize-nav-menu-item-control.php

VII. So sánh 2 bản sao lưu

Sử dụng lệnh borg diff để so sánh sự khác nhau giữa 2 bản sao lưu

Terminal window
borg diff ssh://uxxxxx@uxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_13:38 2024-01-08_20:42

Kết quả trả về cho thấy bản backup lúc 20:42 đã xóa đi 5 file so với bản backup lúc 13:38

Terminal window
removed 99.27 MB home/ols-docker-env/sites/thuanbui.me/html/wp-content/updraft/backup_2023-09-10-1726_Thun_Bi_0779a30ec59c-plugins.zip
removed 5.81 MB home/ols-docker-env/sites/thuanbui.me/html/wp-content/updraft/backup_2023-09-10-1726_Thun_Bi_0779a30ec59c-themes.zip
removed 415.27 MB home/ols-docker-env/sites/thuanbui.me/html/wp-content/updraft/backup_2023-09-10-1726_Thun_Bi_0779a30ec59c-uploads.zip
removed 10.29 MB home/ols-docker-env/sites/thuanbui.me/html/wp-content/updraft/backup_2023-09-10-1726_Thun_Bi_0779a30ec59c-others.zip
removed 66.68 MB home/ols-docker-env/sites/thuanbui.me/html/wp-content/updraft/backup_2023-09-10-1726_Thun_Bi_0779a30ec59c-uploads2.zip

VIII. Phục hồi bản sao lưu

Để phục hồi bản sao lưu, sử dụng lệnh borg extract. Borg sẽ phục hồi dữ liệu ra thư mục hiện tại.

Terminal window
borg extract -v --list ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_20:42

Nếu chỉ muốn phục hồi một vài thư mục hoặc file nhất định trong bản sao lưu, chúng ta cần bổ sung thêm vào phần cuối của dòng lệnh. Ví dụ: mình chỉ muốn phục hồi thư mục plugins thì sẽ dùng lệnh sau

Terminal window
borg extract -v --list ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_20:42 home/ols-docker-env/sites/thuanbui.me/html/wp-content/plugins

IX. Mount bản sao lưu vào thư mục

Trong trường hợp chỉ muốn copy vài file bất kỳ từ bản sao lưu ra ngoài, chúng ta có thể mount bản sao lưu vào thư mục trên VPS.

Tạo thư mục mới để mount

Terminal window
mkdir /tmp/borg/

Mount bản sao lưu vào thư mục vừa tạo

Terminal window
borg mount ssh://uxxxxx@uxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::2024-01-08_20:42 /tmp/borg

Sau đó, mình có thể truy cập vào thư mục /tmp/borg để thao tác file như bình thường (copy, rsync, cat,…)

Để unmount bản backup ra khỏi VPS, dùng lệnh borg unmount

Terminal window
borg umount /tmp/borg

X. Sao lưu tự động bằng cron

Tạo thư mục để lưu log

Terminal window
mkdir -p /var/log/borg

Tạo file bash thuanbui_backup.sh với nội dung sau

#!/usr/bin/env bash
##
## Set some variables
##
LOG='/var/log/borg/backup.log'
export BACKUP_USER='uxxxxxx'
export REPOSITORY_DIR='Backup/website/thuanbui.me/data'
## Tip: If using with a Backup Space you have to use
## 'your-storagebox.de' instead of 'your-backup.de'
export REPOSITORY="ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./${REPOSITORY_DIR}"
##
## Output to a logfile
##
exec > >(tee -i ${LOG})
exec 2>&1
echo "###### Backup started: $(date) ######"
##
## At this place you could perform different tasks
## that will take place before the backup, e.g.
##
## - Create a list of installed software
## - Create a database dump
##
##
## Transfer the files into the repository.
## In this example the folders root, etc,
## var/www and home will be saved.
## In addition you find a list of excludes that should not
## be in a backup and are excluded by default.
##
echo "Transfer files ..."
borg create -v --stats \
$REPOSITORY::'{now:%Y-%m-%d_%H:%M}' \
/home/ols-docker-env/sites/thuanbui.me/html
echo "###### Backup ended: $(date) ######"

Cho chạy thử

Terminal window
chmod u+x thuanbui_backup.sh
./thuanbui_backup.sh

Backup chạy thành công

Terminal window
###### Backup started: Tue Jan 9 12:47:34 +07 2024 ######
Transfer files ...
Creating archive at "ssh://uxxxxxx8@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::{now:%Y-%m-%d_%H:%M}"
Remote: compaction freed about 593 B repository space.
------------------------------------------------------------------------------
Archive name: 2024-01-09_12:47
Archive fingerprint: 9d8914a8857cbc320d5703a02042951e2e1b2dcf76b9d0d5b05e4887bf998b44
Time (start): Tue, 2024-01-09 12:47:41
Time (end): Tue, 2024-01-09 12:47:44
Duration: 3.26 seconds
Number of files: 28874
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 1.02 GB 835.14 MB 2.20 MB
All archives: 3.67 GB 3.07 GB 1.39 GB
Unique chunks Total chunks
Chunk index: 27856 86985
------------------------------------------------------------------------------
###### Backup ended: Tue Jan 9 12:47:46 +07 2024 ######

Xem lại log sao lưu bằng lệnh sau

Terminal window
cat /var/log/borg/backup.log
Terminal window
###### Backup started: Tue Jan 9 12:47:34 +07 2024 ######
Transfer files ...
Creating archive at "ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::{now:%Y-%m-%d_%H:%M}"
Remote: compaction freed about 593 B repository space.
------------------------------------------------------------------------------
Archive name: 2024-01-09_12:47
Archive fingerprint: 9d8914a8857cbc320d5703a02042951e2e1b2dcf76b9d0d5b05e4887bf998b44
Time (start): Tue, 2024-01-09 12:47:41
Time (end): Tue, 2024-01-09 12:47:44
Duration: 3.26 seconds
Number of files: 28874
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
This archive: 1.02 GB 835.14 MB 2.20 MB
All archives: 3.67 GB 3.07 GB 1.39 GB
Unique chunks Total chunks
Chunk index: 27856 86985
------------------------------------------------------------------------------
###### Backup ended: Tue Jan 9 12:47:46 +07 2024 ######

Tiếp theo, tạo cronjob để tự động sao lưu mỗi ngày

Terminal window
crontab -e

Bổ sung vào nội dung sau ở cuối file và lưu lại.

Terminal window
0 0 * * * /home/thuanbui_backup.sh > /dev/null 2>&1

Mình sẽ cho scrip backup này chạy vào lúc 00:00 mỗi ngày.

Để hạn chế số lượng bản sao lưu trên repository, bạn có thể bổ sung thêm lệnh borg prune vào file bash trên. Tuy nhiên, lệnh này sẽ xóa archives ra khỏi repository, do đó không khuyến khích sử dụng nếu chưa nghiên cứu kỹ hướng dẫn của borg ở đây.

Hướng dẫn này chỉ mới thực hiện sao lưu dữ liệu của website, chưa sao lưu database. Bạn nào muốn sao lưu thêm database thì có thể dùng lệnh wp db export để export database ra thư mục nào đó rồi tạo thêm repository cho database.

Chúc bạn mò borg vui vẻ!

Tham khảo: Hetnzer, OSTechnix


Share this post on:

Previous Post
Điều chỉnh timezone cho máy chủ Linux và Crontab
Next Post
Hướng dẫn cài đặt Docker, Docker Compose trên Linux (Ubuntu / Arch / Debian ...)