Trước đây mình có giới thiệu qua cách mình sao lưu dữ liệu trang WordPress của mình bằng plugin UpdraftPlus. Mặc dù UpdraftPlus rất dễ sử dụng và hiệu quả nhưng có 2 điểm mình chưa thật sự hài lòng đó là:
- Mỗi bản sao lưu mới đều chứa toàn bộ dữ liệu cho dù so với bản sao lưu trước đó không có nhiều thay đổi, việc này gây lãng phí dung lượng lưu trữ cũng như thời gian sao lưu.
- Mỗi khi mình thay đổi host (máy chủ VPS) thì phải cài đặt lại mọi thứ, từ webserver, database, WordPress… tất tần tật rồi mới có thể sử dụng UpdraftPlus để phục hồi dữ liệu.
Để khắc phục 2 nhược điểm trên, mình đã chuyển qua sử dụng Borg Backup và mình cảm thấy khá hài lòng với những lợi ích mà Borg Backup đã mang lại. Borg Backup là một ứng dụng mã nguồn mở, hỗ trợ chạy trên hệ điều hành Linux và macOS (hoặc Windows thông qua WLS hoặc máy ảo Linux). Điểm mạnh của Borg Backup là tính năng chống trùng lập (deduplication) và tính năng nén dữ liệu (compression) giúp tối ưu hoá kích thước các bản sao lưu, từ đó giúp tiết kiệm dung lượng cũng như thời gian lưu trữ.
Borg Backup hoạt động theo mô hình client-server, tức là để sử dụng được nó mình cần phải có một máy chủ đóng vài trò là Borg Server để lưu trữ dữ liệu. Thông thường thì người ta sẽ thuê hẳn một máy chủ lưu trữ (storage box) để làm Borg Server, các nhà cung cấp dịch vụ phổ biến phải kể đến là Hetzner hay GreenCloudVPS. Tuy nhiên, do trang WordPress của mình hiện còn khá đơn giản, không có quá nhiều thay đổi hằng ngày nên để tiết kiệm tối đa chi phí mình đã không mua dịch vụ lưu trữ của Hetzner mà đã tự tạo một Borg Server từ máy tính cá nhân của mình. Sau đây mình sẽ chia sẻ lại cách mình đã cài đặt và cấu hình Borg Server và Borg Client để sao lưu dữ liệu cho trang WordPress của mình.
Ngoài ra mình cũng có bài hướng dẫn cách sử dụng Borg Pull Docker để sao lưu dữ liệu mà không cần phải mở port (cổng) hoặc sử dung DDNS trên máy tính cá nhân, xin tham khảo thêm bài sau:
1. Điều kiện tiên quyết
- Máy chủ VPS đang chạy trang WordPress
- Máy chủ / máy ảo chạy hệ điều hành Ubuntu (hoặc Linux khác) dùng để chứa dữ liệu sao lưu
- Có quyền quản trị (admin) để mở port (port forwarding) trên router. Nếu không thì có thể sử dụng Borg Pull Docker để sao lưu dữ liệu.
- (Tuỳ chọn) sử dụng dịch vụ DDNS để cập nhật IP động cho máy chủ chứa dữ liệu sao lưu
- Đã cài đặt Docker Compose
- Đã cài đặt git (sudo apt install git)
2. Cài đặt Borg Server bằng Docker
Borg Server là máy chủ chứa dữ liệu sao lưu. Mình sẽ sử dụng chính máy tính cá nhân của mình để làm Borg Server luôn vì hằng ngày mình đều sử dụng máy tính này để làm việc trong một khoản thời gian dài nhất định. Do máy tính của mình đang sử dụng hệ điều hành Windows nên mình đã chạy Borg Server Docker trên máy ảo Ubuntu thông qua Multipass.
2.1 Cài đặt Borg Server Docker
Trước hết, tải Borg Server về máy chủ bằng lệnh sau:
# git clone https://github.com/workleast/borgserver-docker.git
# cd borgserver-docker
2.2 Cấu hình file docker-compose.yml
# nano docker-compose.yml
services:
borgserver:
restart: always
image: workleast/borgserver
container_name: borgserver
volumes:
- ${REPO_DIR}:/backups
- ${SSH_DIR}:/home/borg/.ssh
ports:
- "2022:22"
File này thì mình cũng không cần chỉnh sửa gì trừ khi muốn thay đổi port hoặc network interface.
2.3 Cấu hình file .env
# nano .env
TZ=Asia/Ho_Chi_Minh
# thay đổi REPO_DIR đến đường dẫn chứa bản sao lưu
REPO_DIR=/path/to/your/repo
SSH_DIR=${PWD}/ssh
- TZ: thay đổi múi giờ cho phù hợp
- REPO_DIR: là đường dẫn đến thư mục chứa các bản sao lưu
- SSH_DIR: là đường dẫn đến thư mục chứa file cấu hình ssh
2.4 Cấu hình file ssh/authorized_keys
Nếu trước đó bạn đã có sẵn SSH keys và muốn sử dụng lại thì có thể bổ sung public key vào file “ssh/authorized_keys”, hoặc có thể sử dụng công cụ tạo SSH keys theo hướng dẫn bên dưới.
Để đảm bảo an toàn và bảo mật cho máy chủ, mình khuyến cáo không nên sử dụng lại SSH keys cũ mà nên tạo SSH keys mới để sử dụng riêng cho Borgbackup
2.5 Chạy Borg Server Docker
# docker compose up -d
2.6 Sửa lỗi phân quyền
Borg Server Docker sử dụng user ‘borg’ với uid(1000): gid(1000) để đăng nhập và ghi dữ liệu vào thư mục REPO_DIR trên máy host. Vì mỗi hệ thống khác nhau thường sử dụng uid:gid khác nhau cho các tài khoản người dùng nên mình đã tạo một công cụ giúp đồng bộ lại phân quyền của của các thư mực và tập tin có liên quan để không bị báo lỗi.
Lưu ý: nếu bạn sử dụng lại thư mục đang chứa các bản sao lưu cũ của Borg thì cũng cần phải chạy công cụ này
Sau khi chạy Borg Server Docker, thực hiện lệnh sau:
# docker exec -it borgserver fix-permission.sh
2.7 Tạo SSH keys
Để thuận tiện, mình cũng đã bổ sung thêm công cụ tạo SSH keys vào Borg Server Docker.
Sau khi chạy Borg Server Docker, thực hiện lệnh sau:
# docker exec -it borgserver gen-sshkey.sh
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAmo6kJEYg40zVwzPG8Au2v+40JgBwaVSmTncgeCM8neFFZJFy9T1g
...
zTR0M7bQZe6dpBtMB9EMAOx46MHAfMeKnmjTcKbo/nQjcUuhLdjOIISV9cZd3SnSse6qou
ft7ojwzAoLV38AAAARYm9yZ0AzZGY3OGYwODgxOWQBAg==
-----END OPENSSH PRIVATE KEY-----
Lệnh này sẽ tự động tạo ra 3 file “id_rsa”, “id_rsa.pub” và “authorized_keys” trong thư mục “ssh”. Sau khi tạo xong nó sẽ xuất ra màn hình nội dung của private key (id_rsa). Lúc này mình sao chép toàn bộ nội dung trên màn hình và dán nó vào Notepad.
2.8 Mở cổng (port) cho Borg Server
Trong file “docker-compose.yml” ở trên mình đã cấu hình Borg Server Docker chạy ở cổng 2022 do đó mình cần mở port trên router bằng cách chuyển tiếp các kết nối đến cổng 2022 về IP của máy ảo. Chi tiết xin tham khảo bài sau:
3. Cài đặt Borg Client bằng Docker
Borg Client sẽ được chạy trên máy chủ Ubuntu đang chạy trang WordPress của mình. Để tiện cho việc cấu hình và quản lý mình sẽ sử dụng container Borgmatic.
3.1 Cài đặt Borgmatic Docker
Đầu tiên, tải Borgmatic docker bằng lệnh sau:
# git clone https://github.com/borgmatic-collective/docker-borgmatic.git
# cd docker-borgmatic
3.2 Cấu hình SSH
Ở phần 2 mình đã sao chép private key (id_rsa) của Borg Server vào Notepad, bây giờ mình sẽ dán nó vào Borgmatic bằng lệnh sau:
# mkdir data/.ssh
# touch data/.ssh/borg-private-key
# nano data/.ssh/borg-private-key
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAmo6kJEYg40zVwzPG8Au2v+40JgBwaVSmTncgeCM8neFFZJFy9T1g
...
zTR0M7bQZe6dpBtMB9EMAOx46MHAfMeKnmjTcKbo/nQjcUuhLdjOIISV9cZd3SnSse6qou
ft7ojwzAoLV38AAAARYm9yZ0AzZGY3OGYwODgxOWQBAg==
-----END OPENSSH PRIVATE KEY-----
Sau đó tạo file SSH config
# nano data/.ssh/config
Host workleast
HostName <IP/HOST> # thay đổi, ví dụ: backup.workleast.com
HostKeyAlias <HOST> # thay đổi, ví dụ: backup.workleast.com
StrictHostKeyChecking no
CheckHostIP no
User borg
Port 2022
IdentityFile ~/.ssh/borg-private-key
Trong đó:
- Host: đặt tên cho kết nối SSH
- HostName: khai báo IP hoặc tên miền trỏ đến IP của máy Borg Server. Vì mạng internet ở nhà mình đang sử dụng có IP động (thay đổi mỗi khi router khởi động lại) nên mình đã phải sử dụng thêm dịch vụ DDNS của ChangeIP để tự động cập nhật lại IP mỗi khi có sự thay đổi.
- HostKeyAlias: cái này dùng để không bị báo lỗi khi Borg Client kết nối đến Borg Server mỗi khi IP bị thay đổi. Lý do là vì mỗi khi kết nối thì SSH sẽ lưu IP của Borg Server vào file known_hosts và sẽ chặn kết nối nếu phát hiện IP không giống với IP đã lưu. Khai báo HostKeyAlias sẽ yêu cầu SSH sử dụng giá trị này thay vì IP.
Cuối cùng thực hiện lệnh sau:
# sudo chown -R root:root data/.ssh
# sudo chmod 600 data/.ssh/*
3.3 Cấu hình file data/borgmatic.d/config.yml
# nano data/borgmatic.d/config.yml
source_directories:
- /mnt/source
# Paths of local or remote repositories to backup to.
repositories:
- path: ssh://workleast/backups
label: workleast
# Un-comment below line to backup to local repo
# - path: /mnt/borg-repository
archive_name_format: 'workleast-{now}'
exclude_patterns:
- '*.log'
# Un-comment below line if you relocate your repo
# relocated_repo_access_is_ok: true
keep_daily: 7
keep_weekly: 4
keep_monthly: 6
checks:
- name: repository
- name: archives
frequency: 2 weeks
Trong đó:
- repositories: là địa chỉ đến máy chủ Borg Server, ở đây mình sử dụng tên workleast đã thiết lập ở bước cấu hình SSH phía trên
- archive_name_format: định dạng tên tập tin sao lưu
- keep_daily, keep_weekly, keep_monthly: số bản sao lưu mình muốn giữ lại cho mỗi ngày, mỗi tuần và mỗi tháng
- checks: thời gian sẽ chạy trình kiểm tra các bản sao lưu để đảm bảo các bản sao lưu không bị lỗi
Phần này mình chủ yếu tham khảo từ trang này
3.4 Cấu hình file .env
# cp .env.template .env
# nano .env
TZ=Asia/Ho_Chi_Minh
BORG_PASSPHRASE=changeyourpasshere # thay đổi borg passphrase tại đây
VOLUME_SOURCE=/root # thay đổi đến thư mục cần sao lưu
VOLUME_TARGET=./data/repository
VOLUME_ETC_BORGMATIC=./data/borgmatic.d
VOLUME_BORG_CONFIG=./data/.config/borg
VOLUME_SSH=./data/.ssh
VOLUME_BORG_CACHE=./data/.cache/borg
#BACKUP_CRON=0 1 * * *
#RUN_ON_STARTUP=true
#BORG_RSH="ssh -i /root/.ssh/borg-private-key"
#BORG_HEALTHCHECK_URL=
BORG_PASSPHRASE: là mật khẩu để truy cập vào các bản sao lưu. Nếu bản sao lưu không sử dụng mật khẩu thì cũng cần khai báo biến này.
VOLUME_SOURCE: là đường dẫn đến thư mục cần sao lưu dữ liệu.
3.5 Cấu hình file data/borgmatic.d/crontab.txt
Bước này cho phép mình cấu hình tự động hoá việc sao lưu dữ liệu từ Borg Client đến Borg Server. Vì hằng ngày mình đều sử dụng máy tính (Borg Server) vào lúc 13:30 nên mình sẽ cấu hình Borg Client tự động sao lưu dữ liệu vào thời điểm này bằng lệnh sau:
# nano data/borgmatic.d/crontab.txt
# at 13:30 everyday
0 30 13 * * * /usr/local/bin/borgmatic --verbosity -1 --syslog-verbosity 1
3.6 Cấu hình file docker-compose.yml
File này thì mình chỉ để mặc định chứ cũng không thay đổi gì trừ khi có thêm yêu cầu đặt biệt như muốn thay đổi tên container, network…
# nano docker-compose.yml
services:
borgmatic:
image: ghcr.io/borgmatic-collective/borgmatic
container_name: borgmatic
restart: always
volumes:
- ${VOLUME_SOURCE}:/mnt/source:ro # backup source
- ${VOLUME_TARGET}:/mnt/borg-repository # backup target
- ${VOLUME_ETC_BORGMATIC}:/etc/borgmatic.d/ # borgmatic config file(s) +>
- ${VOLUME_BORG_CONFIG}:/root/.config/borg # config and keyfiles
- ${VOLUME_SSH}:/root/.ssh # ssh key for remote reposit>
- ${VOLUME_BORG_CACHE}:/root/.cache/borg # checksums used for dedupli>
environment:
- TZ=${TZ}
- BORG_PASSPHRASE=${BORG_PASSPHRASE}
3.7 Chạy Borgmatic Docker
# docker compose up -d
4. Khởi tạo và quản lý các bản sao lưu
4.1 Khởi tạo kho lưu trữ các bản sao lưu (repository)
Bước này chỉ thực hiện ở lần đầu tiên để khởi tạo thư mục chứa các bản sao lưu.
# docker exec -it borgmatic borgmatic init --encryption none --make-parent-dirs
4.2 Tạo bản sao lưu
Lệnh này cho phép tạo 1 bản sao lưu tại thời điểm thực hiện lệnh. Lệnh này mình cũng chỉ làm 1 lần để đảm bảo Borg đã hoạt động tốt. Các lần sao lưu sau sẽ được tự động thực hiện vào thời gian đã quy định trong crontab.
# docker exec -it borgmatic borgmatic --verbosity 1 --list --stats
4.3 Liệt kê tất cả các bản sao lưu
# docker exec -it borgmatic borgmatic list
4.4 Xoá một bản sao lưu cụ thể
# docker exec -it borgmatic borgmatic delete --archive <NAME>
5. Xử lý sự cố
Sự cố duy nhất mà mình gặp phải đó là khi mình thay đổi Borg Server (khi mình xoá và cài đặt lại Borg Server) thì Borg Client không cho phép mình kết nối mặc dù mọi thông số cài đặt trên Borg Server mới đều không thay đổi. Để có thể kết nối lại được mình phải thực hiện lệnh sau để xoá file known_hosts trên Borg Client:
# docker exec -it borgmatic rm ~/.ssh/known_hosts