Restic: sao lưu với mã hóa và lịch sử
Cách thiết lập sao lưu với mã hóa đầu cuối, khử trùng lặp, và các snapshot theo ngày, tự động hóa chúng, và xác minh tính toàn vẹn.
Cập nhật 23 tháng 8, 2026
Restic giải quyết những gì rsync không làm được: nó mã hóa dữ liệu trước khi gửi, lưu lịch sử snapshot, không sao chép trùng các khối dữ liệu, và có thể lưu bản sao lưu trên bộ nhớ tương thích S3. Một chương trình duy nhất, không phụ thuộc.
Cài đặt và repository đầu tiên
sudo apt install -y restic
restic version
Repository là nơi lưu các bản sao lưu của bạn. Nó có thể là một thư mục, một máy qua SFTP, hoặc bộ nhớ đối tượng:
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
head -c 32 /dev/urandom | base64 > /root/.restic-pass
chmod 600 /root/.restic-pass
restic init
Mật khẩu repository không thể khôi phục. Nếu bạn quên nó, dữ liệu của bạn sẽ mất — không có hỗ trợ nào ở đây, đó là thiết kế cố ý. Hãy lưu nó tách biệt khỏi máy: trong trình quản lý mật khẩu, trên giấy, bất cứ đâu — nhưng đừng chỉ lưu trong tệp
/root/.restic-passtrên chính máy bạn đang sao lưu.
Tạo bản sao lưu
restic backup /var/www /etc/nginx /opt/myapp \
--exclude-file=/root/restic-exclude.txt \
--tag daily
restic snapshots
restic ls latest
restic stats
Lần chạy thứ hai và các lần sau rất nhanh: chỉ những khối dữ liệu mới được truyền đi.
Khôi phục
restic restore latest --target /restore
restic restore <snapshot-id> --target /restore --include /var/www/uploads
Tiện hơn nữa là xem nội dung mà không cần giải nén toàn bộ:
mkdir /mnt/snapshots
restic mount /mnt/snapshots
Thư mục hiển thị tất cả snapshot theo ngày dưới dạng các thư mục thông thường. Đây là cách tốt nhất để lấy ra một tệp vô tình bị xóa.
Lên lịch và dọn dẹp
Script /usr/local/bin/backup.sh:
#!/bin/bash
set -euo pipefail
export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass
docker compose -f /opt/myapp/compose.yaml exec -T db \
pg_dump -U postgres app | gzip > /var/backups/db.sql.gz
restic backup /var/www /etc/nginx /opt/myapp /var/backups --tag daily
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
chmod 700 /usr/local/bin/backup.sh
Tiếp theo là một systemd timer, xem tác vụ theo lịch. forget --prune xóa các snapshot dư thừa và giải phóng dung lượng; nếu không có --prune, snapshot biến mất khỏi danh sách nhưng dữ liệu vẫn còn.
Kiểm tra tính toàn vẹn
restic check
restic check --read-data-subset=5%
Lệnh đầu tiên kiểm tra cấu trúc, lệnh thứ hai đọc một phần dữ liệu và xác minh checksum. Hãy chạy lệnh thứ hai mỗi tháng một lần: nó tải ổ đĩa và băng thông, nhưng chính nó phát hiện lỗi hỏng âm thầm.
Kiểm tra cấu trúc không thay thế được việc khôi phục thực tế — xem diễn tập khôi phục.
Tài nguyên
Restic giữ một chỉ mục trong bộ nhớ: với tập dữ liệu lớn, đó là hàng trăm megabyte. Trên VDS-1 với 2 GB RAM, việc sao lưu hàng chục gigabyte có thể thiếu — hãy giới hạn song song hoặc chuyển các bản sao lưu nặng lên một tier cao hơn. Tải ổ đĩa khá rõ, nên hãy lên lịch vào ban đêm: xem tốc độ ổ đĩa.
Lỗi thường gặp
- Mật khẩu chỉ được lưu trên chính máy đang sao lưu. Kinh điển: máy mất cùng với chìa khóa của các bản sao lưu.
forgetkhông có--prune. Dung lượng không được giải phóng và repository cứ lớn dần.- Sao lưu vào cùng thư mục trên cùng ổ đĩa. Bạn sẽ không có chỗ nào để khôi phục — xem sao lưu ở vị trí khác.
- Không loại trừ cache và
/var/lib/docker. Bản sao lưu phình to gấp bốn mà chẳng ích gì; danh sách những gì cần đưa vào nằm trong bài cần sao lưu những gì. - Chạy song song. Lần chạy thứ hai sẽ gặp khóa repository. Hãy bọc lệnh gọi trong
flock.