Sao lưu dữ liệu bằng Borg Backup Docker

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. Hiện nay có rất nhiều nhà cung cấp dịch vụ lưu trữ trực tuyến (cloud storage), trong đó phải kể đến Hetzner là nhà cung cấp tại Châu Âu, khá uy tín và có giá rất rẻ. Tại thời điểm mình viết bài này thì gói rẻ nhất cho 1 TB lưu trữ có giá 3.2 DEN / tháng (khoảng 45,000 VND). 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.

1. Điều kiện tiên quyết

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 Tạo SSH Keys

Để máy khách có thể kết nối với máy chủ không cần sử dụng mật khẩu, mình cần tạo một cặp SSH Key dùng để đăng nhập bằng lệnh sau:

# ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_rsa
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:I7dugbwFAYXGiIYn7onHlu2bE64SQfqL+EWLYnScGNM ubuntu@dell-ubuntu
The key's randomart image is:
+---[RSA 3072]----+
|.. o.+.          |
|+o+ + .          |
|== E   .         |
|o.= . .          |
|o*.*...oS        |
|+oBoo.oooo       |
|o*.+o. o..       |
|=...+....        |
| oo.oo ..        |
+----[SHA256]-----+

Sao chép file ssh private key lên máy client đang chạy WordPress

# scp ~/.ssh/id_rsa Username@VPS_IP:~/borg-private-key
  • Username: tên đăng nhập máy chủ chạy WordPress
  • VPS_IP: địa chỉ IP máy chủ chạy WordPress

2.2 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/borg-server.git
# cd borg-server

Sau đó thực hiện lệnh sau để tạo file authorized_keys

# cat ~/.ssh/id_rsa.pub >> ssh/authorized_keys

Tiếp tục cấu hình file docker-compose.yml bằng lệnh sau:

# nano docker-compose.yml
services:
  borg-server:
    restart: always
    image: workleast/borg-server
    container_name: borg-server
    volumes:
      - path/to/repository:/backups # thay đổi đến đường dẫn chứa bản sao lưu   
      - ./ssh/authorized_keys:/home/borg/.ssh/authorized_keys
    ports:
      - "2222:22"
    environment:
      TZ: "Asia/Ho_Chi_Minh"

Trong đó, path/to/repository: là đường dẫn đến thư mục chứa các bản sao lưu, ví dụ mình muốn lưu vào thư mục ~/backups thì mình sẽ thực hiện như sau:

# mkdir ~/backups 

Sau đó khai báo trong file docker-compose.yml là

volumes:
- ~/backups:/backups

Cuối cùng chạy Borg Server Docker bằng lệnh

# docker compose up -d

2.3 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 2222 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 2222 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

Ở phần trên mình đã sao chép file “borg-private-key” từ Borg Server lên Borg Client, bây giờ mình sẽ chuyển file này vào thư mực cấu hình của Borgmatic bằng lệnh sau:

# mkdir data/.ssh
# mv ~/borg-private-key data/.ssh/

3.2 Cấu hình Borgmatic Docker

Tiếp theo là các bước cấu hình Borgmatic Docker. Bước này yêu cầu phải cấu hình ở nhiều file khác nhau nên có chút phức tạp cho người lần đầu sử dụng. Tuy nhiên sau khi mình làm 1 lần thì thấy nó cũng khá dễ. Phần này mình chủ yếu tham khảo từ trang này

3.2.1 Cấu hình file data/borgmatic.d/config.yml

Thực hiện lệnh sau:

# nano data/borgmatic.d/config.yml
source_directories:
    - /root

# Paths of local or remote repositories to backup to.
repositories:
    - path: ssh://workleast/backups
      label: workleast

archive_name_format: 'workleast-{now}'

keep_daily: 7
keep_weekly: 4
keep_monthly: 6

checks:
  - name: repository
  - name: archives
    frequency: 2 weeks

Trong đó:

  • source_directories: là đường dẫn đến thư mục muốn sao lưu dữ liệu. Vì trang WordPress của mình được lưu tại đường dẫn “/root” nên mình muốn sao lưu toàn bộ dữ liệu trong thư mục này.
  • repositories: là địa chỉ đến máy chủ Borg Server, ở đây mình sử dụng tên workleast là tên mình sẽ đặt cho kết nối SSH ở bước kế tiếp.
  • 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

3.2.2 Cấu hình file data/.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
    #CheckHostIP no
    User borg
    Port 2222
    IdentityFile ~/.ssh/borg-private-key

Trong đó:

  • Host: đặt tên cho kết nối SSH, tên này sẽ được sử dụng trong file data/borgmatic.d/config.yml
  • 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_host 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.

3.2.3 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.2.4 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.2.5 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}

Cuối cùng chạy Borgmatic Docker bằng lệnh sau:

# 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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *