Hướng Dẫn Backup VPS Ubuntu Bằng Restic Lên S3-Compatible

Hướng dẫn backup VPS Ubuntu bằng Restic lên S3-compatible: cài Restic, tạo repository, mã hóa dữ liệu, backup thư mục, snapshot, retention, prune, check và restore thử.

Restic là công cụ backup mã nguồn mở tập trung vào tính đơn giản, mã hóa và khả năng lưu trữ tới nhiều backend như local disk, SFTP hoặc S3-compatible object storage. Với VPS Ubuntu, Restic phù hợp để sao lưu source code, file upload, cấu hình và một số loại dữ liệu tĩnh ra nơi lưu trữ độc lập với chính VPS. Điểm quan trọng là repository Restic được mã hóa bằng password; nếu làm mất password thì không thể khôi phục dữ liệu. Bài viết này hướng dẫn cách cài Restic, khởi tạo repository S3-compatible, quản lý credential an toàn, tạo snapshot đầu tiên, tự động backup, áp dụng retention bằng `forget`, thu hồi dữ liệu không còn dùng bằng `prune`, kiểm tra repository bằng `check` và quan trọng nhất: thực hiện một lần restore thử để chắc chắn backup có thể dùng khi sự cố xảy ra.

Điểm quan trọng Hãy lựa chọn dịch vụ dựa trên nhu cầu sử dụng thực tế và theo dõi tài nguyên thường xuyên để có hiệu quả tốt nhất.

Một VPS Ubuntu có thể gặp nhiều loại sự cố: xóa nhầm file, lỗi update, hỏng filesystem, bị malware, cấu hình sai hoặc cả máy chủ bị mất dữ liệu. Nếu toàn bộ backup chỉ nằm trên cùng VPS, khi disk hoặc tài khoản bị sự cố thì bản backup có thể mất theo.

Một cách tốt hơn là đưa backup ra object storage độc lập, chẳng hạn dịch vụ tương thích S3. Restic là công cụ phù hợp cho nhu cầu này vì hỗ trợ mã hóa phía client, snapshot, deduplication và nhiều backend lưu trữ.

Bài viết này hướng dẫn quy trình thực tế trên Ubuntu: cài Restic, tạo repository S3-compatible, backup thư mục, giữ secret an toàn, áp dụng retention, kiểm tra repository và restore thử.

Nếu bạn đang cần một VPS Linux để chạy website hoặc ứng dụng, có thể tham khảo VPS tại HUONG CLOUD. Nếu cần chuyển website giữa hai máy chủ, xem thêm bài Chuyển website sang VPS mới với downtime tối thiểu.

1. Restic là gì?

Restic là công cụ backup dòng lệnh có các đặc điểm quan trọng:

  • mã hóa dữ liệu trước khi gửi tới repository;
  • snapshot theo thời điểm;
  • deduplication để giảm dữ liệu trùng;
  • backup incremental về mặt lưu trữ;
  • hỗ trợ nhiều backend;
  • kiểm tra repository;
  • restore theo snapshot.

Với object storage S3-compatible, Restic có thể gửi dữ liệu ra ngoài VPS qua API tương thích S3.

2. Backup khác snapshot VPS thế nào?

Snapshot VPS thường chụp trạng thái block disk ở lớp hạ tầng.

Restic backup ở cấp file/repository.

Hai cách bổ sung cho nhau:

  • snapshot giúp rollback nhanh toàn máy;
  • Restic giúp lưu bản sao độc lập, chọn file và retention linh hoạt.

Không nên chỉ dựa vào một lớp duy nhất cho dữ liệu quan trọng.

3. S3-compatible là gì?

Nhiều object storage cung cấp API tương thích Amazon S3.

Thông thường bạn sẽ có:

  • endpoint;
  • bucket;
  • access key;
  • secret key;
  • region hoặc thông tin tương đương.

Restic không cần object storage phải là AWS S3; chỉ cần backend tương thích theo cấu hình được hỗ trợ.

4. Chuẩn bị trước khi backup

Bạn cần:

  • Ubuntu Server;
  • quyền sudo;
  • Restic;
  • bucket S3-compatible;
  • access key/secret key;
  • endpoint;
  • password cho Restic repository;
  • danh sách dữ liệu cần backup.

5. Xác định dữ liệu nào cần backup

Một website thường có:

/var/www/example.com
/etc/nginx
/etc/systemd/system
/etc/letsencrypt

Nhưng database không nên chỉ backup bằng cách copy raw data directory khi database đang chạy.

Với PostgreSQL/MySQL, nên tạo logical dump hoặc physical backup đúng công cụ rồi đưa file backup đó vào Restic.

6. Cài Restic trên Ubuntu

Cách đơn giản:

sudo apt update
sudo apt install restic -y

Kiểm tra:

restic version

Nếu bạn cần phiên bản mới hơn repository Ubuntu, hãy dùng phương thức chính thức của dự án và xác minh binary/checksum theo tài liệu Restic.

7. Tạo user backup riêng có cần không?

Không bắt buộc, nhưng production nên cân nhắc user riêng để giảm quyền.

Ví dụ:

sudo adduser --system --group backupuser

Tuy nhiên user backup phải có quyền đọc những file cần sao lưu.

Không nên cấp root nếu không cần; với /etc, certificate hoặc dữ liệu nhiều user, có thể cần sudo hoặc ACL riêng.

8. Các biến môi trường S3

Restic hỗ trợ backend S3 với credential qua biến môi trường.

Ví dụ:

export AWS_ACCESS_KEY_ID='ACCESS_KEY'
export AWS_SECRET_ACCESS_KEY='SECRET_KEY'

Không ghi credential thật vào shell history nếu có thể.

9. Khai báo repository

Ví dụ backend:

export RESTIC_REPOSITORY='s3:https://s3.example.com/my-backup-bucket/vps01'

Cú pháp chính xác phụ thuộc endpoint S3-compatible.

Với một số provider, endpoint và region có thể cần option riêng.

10. Password Restic cực kỳ quan trọng

Restic dùng password để bảo vệ repository.

Nếu mất password, bạn không thể giải mã backup.

Không lưu password trong:

  • Git public;
  • file text world-readable;
  • chat nhóm;
  • source code ứng dụng.

11. Dùng password file

Tạo:

sudo mkdir -p /etc/restic
sudo nano /etc/restic/password

Ghi một password dài, riêng biệt.

Đặt quyền:

sudo chmod 600 /etc/restic/password
sudo chown root:root /etc/restic/password

Khai báo:

export RESTIC_PASSWORD_FILE=/etc/restic/password

12. Khởi tạo repository

Sau khi khai báo endpoint/credential/password:

restic init

Nếu thành công, Restic tạo repository metadata đã mã hóa trong bucket.

13. Kiểm tra repository

restic snapshots

Lúc mới init sẽ chưa có snapshot.

14. Backup thư mục đầu tiên

Ví dụ:

restic backup /var/www/example.com

Sau khi hoàn tất, Restic hiển thị snapshot ID và thống kê dữ liệu.

15. Backup nhiều đường dẫn

restic backup \
  /var/www/example.com \
  /etc/nginx \
  /etc/systemd/system

Chỉ thêm dữ liệu bạn thật sự cần.

16. Exclude cache và file tạm

Có thể dùng:

restic backup /var/www/example.com \
  --exclude='cache' \
  --exclude='tmp'

Hoặc dùng exclude file.

Không backup file có thể tái tạo nếu chúng rất lớn và không có giá trị phục hồi.

17. Dùng exclude file

Tạo:

/etc/restic/excludes.txt

Ví dụ:

node_modules
.cache
/tmp
*.log

Sau đó:

restic backup /var/www/example.com --exclude-file=/etc/restic/excludes.txt

18. Backup database đúng cách

Ví dụ PostgreSQL:

pg_dump -Fc appdb -f /var/backups/appdb.dump

Sau đó:

restic backup /var/backups/appdb.dump

Với MySQL:

mysqldump --single-transaction appdb > /var/backups/appdb.sql

Sau đó đưa file dump vào Restic.

19. Xóa file dump sau khi backup có được không?

Có nếu file chỉ là bản trung gian và Restic backup đã hoàn tất.

Nhưng bạn nên chỉ xóa sau khi command backup trả về thành công.

Trong script, cần xử lý exit code đúng cách.

20. Xem snapshot

restic snapshots

Bạn sẽ thấy:

  • ID;
  • thời gian;
  • hostname;
  • đường dẫn;
  • tag.

21. Dùng tag cho snapshot

Ví dụ:

restic backup /var/www/example.com --tag website

Database:

restic backup /var/backups/appdb.dump --tag database

Tag giúp retention theo nhóm workload dễ hơn.

22. Kiểm tra nội dung snapshot

restic ls latest

Hoặc snapshot cụ thể:

restic ls SNAPSHOT_ID

23. Restore snapshot

Restore toàn bộ latest snapshot vào thư mục test:

sudo mkdir -p /restore-test
restic restore latest --target /restore-test

Kiểm tra:

ls -la /restore-test

24. Restore một đường dẫn cụ thể

Có thể dùng include:

restic restore latest \
  --target /restore-test \
  --include /var/www/example.com

Cú pháp path cần khớp với snapshot.

25. Vì sao phải restore thử?

Backup command thành công chưa chắc quy trình khôi phục đã đúng.

Restore test giúp phát hiện:

  • thiếu file;
  • sai exclude;
  • credential không còn dùng được;
  • permission không được lưu như mong đợi;
  • database dump lỗi;
  • password repository bị thất lạc.

26. Kiểm tra repository bằng restic check

restic check

Restic sẽ kiểm tra cấu trúc repository và metadata.

Đây là bước nên chạy định kỳ.

27. forget là gì?

Snapshot sẽ tích lũy theo thời gian.

restic forget cho phép áp dụng retention policy.

Ví dụ:

restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6

Lệnh này chọn snapshot cần quên theo policy.

28. prune là gì?

Khi snapshot bị forget, dữ liệu không còn được snapshot nào tham chiếu vẫn có thể tồn tại trong repository cho tới khi prune.

Dùng:

restic prune

Prune có thể tốn nhiều I/O và thời gian trên repository lớn.

29. forget --prune

Có thể gộp:

restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --prune

Với repository lớn, nên cân nhắc chạy prune ít thường xuyên hơn backup.

30. Retention nên giữ bao lâu?

Không có công thức chung.

Một ví dụ:

  • 7 daily;
  • 4 weekly;
  • 6 monthly.

Nhưng hệ thống quan trọng có thể cần dài hơn theo yêu cầu kinh doanh/pháp lý.

31. Tự động backup bằng script

Tạo:

sudo nano /usr/local/sbin/restic-backup.sh

Ví dụ:

#!/usr/bin/env bash
set -euo pipefail

export RESTIC_REPOSITORY='s3:https://s3.example.com/bucket/vps01'
export RESTIC_PASSWORD_FILE='/etc/restic/password'
export AWS_ACCESS_KEY_ID='...'
export AWS_SECRET_ACCESS_KEY='...'

restic backup /var/www/example.com /etc/nginx
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6

Cảnh báo

Không nên để access key/secret key trực tiếp trong script world-readable.

32. Tách credential khỏi script

Có thể dùng environment file:

/etc/restic/restic.env

Đặt quyền:

sudo chmod 600 /etc/restic/restic.env

Script source file này trước khi chạy.

33. Dùng systemd timer thay cron

Bạn có thể tạo systemd service + timer để chạy backup định kỳ.

Ưu điểm:

  • log bằng journalctl;
  • trạng thái service rõ;
  • scheduling có cấu trúc.

Nếu chưa quen systemd, xem bài Tạo systemd service trên VPS Ubuntu.

34. Tạo backup service

Ví dụ:

[Unit]
Description=Restic Backup

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/restic-backup.sh

Lưu ở:

/etc/systemd/system/restic-backup.service

35. Tạo timer

[Unit]
Description=Run Restic Backup Daily

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

Lưu:

/etc/systemd/system/restic-backup.timer

36. Bật timer

sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer

Kiểm tra:

systemctl list-timers | grep restic

37. Xem log backup

sudo journalctl -u restic-backup.service

100 dòng cuối:

sudo journalctl -u restic-backup.service -n 100

38. Backup thất bại có cảnh báo không?

Systemd log lỗi nhưng không tự gửi thông báo cho bạn.

Nên kết hợp:

  • monitoring;
  • email/webhook alert;
  • script kiểm tra exit code;
  • Uptime Kuma push monitor hoặc công cụ tương đương.

39. Restic lock

Restic dùng lock để tránh thao tác repository xung đột.

Nếu process bị crash, có thể còn stale lock.

Kiểm tra:

restic list locks

Unlock khi chắc chắn không có process Restic đang chạy:

restic unlock

40. Không chạy backup và prune cùng lúc

Nên tránh nhiều job cùng thao tác repository nếu không hiểu lock/concurrency.

Đặt lịch backup và maintenance repository riêng nếu cần.

41. Repository password có thể đổi không?

Restic hỗ trợ quản lý key/repository key.

Nhưng đừng nhầm việc đổi password/key wrapper với việc dữ liệu được mã hóa lại toàn bộ.

Luôn giữ ít nhất một credential hợp lệ đã được backup an toàn.

42. Nếu access key S3 bị lộ

Hãy:

  1. rotate/revoke key tại provider;
  2. cập nhật credential trên VPS;
  3. kiểm tra access log/object history nếu provider hỗ trợ;
  4. xác minh repository bằng restic check.

43. Object lock / immutable backup

Nếu provider hỗ trợ object lock/versioning, có thể tăng khả năng chống ransomware/xóa nhầm.

Tuy nhiên, Restic có hành vi tạo/xóa object khi prune; immutable policy có thể ảnh hưởng maintenance repository.

Hãy kiểm tra compatibility trước khi bật retention lock cứng.

44. Backup từ cùng VPS có đủ an toàn không?

Restic chạy trên VPS và gửi backup ra ngoài tốt hơn backup cùng disk, nhưng nếu VPS bị chiếm root, attacker có thể đọc credential S3 và password file.

Để tăng an toàn:

  • dùng key chỉ có quyền bucket cần thiết;
  • versioning/object lock nếu phù hợp;
  • credential rotate;
  • backup thêm ở nơi thứ hai;
  • giám sát delete activity.

45. Áp dụng quy tắc 3-2-1

Một nguyên tắc phổ biến:

  • ít nhất 3 bản dữ liệu;
  • 2 loại storage khác nhau;
  • 1 bản ngoài hạ tầng chính.

Restic lên object storage có thể là một thành phần trong chiến lược này.

46. Backup toàn bộ / có nên không?

Có thể nhưng không phải lúc nào cũng hợp lý.

Bạn thường không cần backup:

  • /proc;
  • /sys;
  • /dev;
  • /run;
  • /tmp;
  • cache;
  • Docker image có thể pull lại.

Tốt hơn là chọn dữ liệu/config quan trọng và có tài liệu rebuild VPS.

47. Backup Docker

Nên backup:

  • Compose file;
  • .env/secret theo cách an toàn;
  • bind mount;
  • database dump;
  • volume data cần giữ.

Không cần backup image nếu có thể pull lại từ registry, trừ khi image không còn nguồn khác.

48. Backup PostgreSQL bằng Restic

Quy trình tốt:

  1. chạy pg_dump/backup phù hợp;
  2. đợi hoàn tất;
  3. Restic backup file dump;
  4. xóa dump local nếu muốn;
  5. định kỳ restore test.

Không chỉ copy /var/lib/postgresql khi database đang chạy mà không có chiến lược consistency.

49. Backup certificate Let's Encrypt

Bạn có thể backup:

/etc/letsencrypt

nhưng thư mục chứa private key TLS.

Repository Restic đã mã hóa, nhưng vẫn cần bảo vệ password repository.

50. Tình huống thực tế: backup website hằng ngày

Một quy trình có thể là:

02:45  dump database
03:00  Restic backup
03:20  forget retention
Chủ nhật  prune/check

Không nhất thiết chạy prune mỗi ngày.

51. Tình huống thực tế: VPS bị xóa nhầm

Bạn tạo VPS Ubuntu mới, cài Restic, khai báo cùng repository và password rồi:

restic snapshots

Sau đó:

restic restore latest --target /restore

Tiếp theo khôi phục Nginx/app/database theo runbook.

Đây là lý do cần lưu credential Restic ở nơi độc lập với VPS cũ.

52. Checklist Restic production cơ bản

  • Restic đã cài.
  • Bucket S3-compatible riêng.
  • Access key quyền tối thiểu.
  • Password repository mạnh.
  • Credential file permission 600.
  • Repository init thành công.
  • Backup đầu tiên thành công.
  • Snapshot thấy được.
  • Restore test thành công.
  • Retention được cấu hình.
  • restic check định kỳ.
  • Monitoring backup job.
  • Credential có bản sao an toàn ngoài VPS.

53. FAQ về Restic backup VPS Ubuntu

Restic có mã hóa backup không?

Có. Restic mã hóa dữ liệu repository và cần password/key để truy cập.

Có backup lên S3-compatible được không?

Có. Restic hỗ trợ S3 và nhiều dịch vụ tương thích.

Có nên chạy prune mỗi ngày không?

Không bắt buộc. Prune có thể tốn I/O; retention và prune nên lên lịch phù hợp quy mô repository.

forget có xóa dữ liệu ngay không?

Forget loại snapshot khỏi retention; dữ liệu unreferenced được thu hồi khi prune.

Backup thành công có cần restore test không?

Có. Restore test là cách xác minh quy trình khôi phục thực sự dùng được.

Mất password Restic có khôi phục được không?

Không nếu không còn key/password hợp lệ. Vì vậy phải lưu credential an toàn ngoài VPS.

Có nên backup database bằng cách copy thư mục data?

Không khi database đang chạy nếu không có phương thức backup consistent. Nên dùng công cụ backup chính thức của database.

Kết luận

Backup VPS Ubuntu bằng Restic lên S3-compatible là một cách tốt để đưa bản sao dữ liệu ra khỏi máy chủ chính, đồng thời giữ repository được mã hóa và quản lý snapshot rõ ràng.

Quy trình tốt không dừng ở restic backup. Bạn cần thêm retention, check, monitoring và quan trọng nhất là restore thử định kỳ. Một bản backup chưa từng được restore thử vẫn là một rủi ro.

Nếu bạn đang vận hành website, PostgreSQL, Redis hoặc ứng dụng trên VPS Ubuntu tại HUONG CLOUD, hãy xây backup offsite ngay từ đầu thay vì chờ tới lúc storage gặp sự cố mới tìm phương án khôi phục.

Nguồn tham khảo

Kết luận

Nếu chưa chắc cấu hình hoặc loại dịch vụ nào phù hợp, hãy gửi nhu cầu thực tế để đội ngũ hỗ trợ tư vấn trước khi mua.

Chưa biết nên chọn gói nào?

Xem bảng giá VPS hoặc liên hệ đội ngũ hỗ trợ để chọn cấu hình phù hợp.

Xem bảng giá VPS →