❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
Server chạy ngon lành cả năm trời, rồi một ngày đẹp trời ổ cứng chết. Hoặc bạn chạy nhầm rm -rf ở sai thư mục. Hoặc bị hack và toàn bộ database bị xoá sạch. Lúc đó mà không có backup thì chỉ còn cách ngồi khóc.

Bài này mình sẽ đi từ gốc: tại sao cần backup, chiến lược backup chuẩn, rồi đến thực hành với tar, rsync, backup database, viết script tự động, và cả cách restore khi cần. Mục tiêu là cuối bài bạn có một hệ thống backup hoàn chỉnh chạy tự động mỗi đêm.
Tại sao cần backup VPS?
Câu trả lời ngắn: vì mất data là mất tất cả. Nhưng nhiều người vẫn chủ quan cho đến khi gặp sự cố thật.
Một vài tình huống thực tế mình từng thấy:
- Ổ cứng hỏng: VPS dùng SSD cũng chết, đặc biệt các nhà cung cấp giá rẻ dùng phần cứng đời cũ. Không backup = mất sạch.
- Lỗi người dùng: Chạy
rm -rf /var/wwwnhầm thư mục, xoá nhầm database, update config sai rồi service không start được. - Bị hack: Attacker vào được server, encrypt toàn bộ data đòi tiền chuộc (ransomware). Hoặc đơn giản là xoá sạch rồi bỏ đi.
- Provider gặp sự cố: Datacenter cháy, nhà cung cấp phá sản, xoá account nhầm. Chuyện này đã xảy ra nhiều lần trên thế giới.
- Update hỏng hệ thống: Upgrade kernel hoặc package quan trọng mà không tương thích, server không boot được.
Nhiều VPS provider có tính năng snapshot hoặc backup, nhưng đừng phụ thuộc hoàn toàn vào đó. Snapshot của provider nằm cùng datacenter với VPS. Datacenter gặp sự cố thì snapshot cũng mất theo.
Quy tắc đơn giản: nếu data quan trọng với bạn, bạn phải tự backup. Không ai chịu trách nhiệm data của bạn ngoài chính bạn.
Chiến lược backup 3-2-1
Trước khi nhảy vào command line, bạn cần hiểu chiến lược backup chuẩn. Không phải cứ copy file ra một chỗ là xong.
Quy tắc 3-2-1 là chuẩn được dùng rộng rãi trong ngành:
- 3 bản copy của data (bản gốc + 2 bản backup)
- 2 loại storage khác nhau (ví dụ: SSD trên VPS + object storage như S3)
- 1 bản offsite (ở vị trí địa lý khác, khác datacenter, khác provider)
Ví dụ áp dụng cho VPS:
- Bản 1: Data gốc trên VPS
- Bản 2: Backup nén lưu trên VPS (thư mục
/backup) - Bản 3: Đồng bộ bản backup ra server khác hoặc cloud storage (S3, Google Drive)
Như vậy kể cả VPS chết hoàn toàn, bạn vẫn có bản backup ở nơi khác để khôi phục.
tar: đóng gói và nén backup
tar là công cụ đóng gói (archive) kinh điển trên Linux. Nó gom nhiều file và thư mục thành một file duy nhất, kết hợp nén để giảm dung lượng.
Tạo archive nén
Cú pháp cơ bản nhất để tạo backup nén:
tar czf backup.tar.gz /đường/dẫn/cần/backup
Giải thích các option:
c, create, tạo archive mớiz, nén bằng gzipf, chỉ định tên file output
Ví dụ backup thư mục web:
# Backup toàn bộ thư mục web
tar czf /backup/web-2025-03-15.tar.gz /var/www
# Backup thư mục home
tar czf /backup/home-2025-03-15.tar.gz /home
Xem nội dung archive
Trước khi giải nén, bạn nên kiểm tra xem bên trong có gì:
# Liệt kê nội dung (verbose)
tar tzvf backup.tar.gz
# Chỉ liệt kê, không giải nén
# t = list, z = gzip, v = verbose, f = file
Output sẽ hiển thị danh sách file kèm quyền, owner, kích thước và ngày tháng. Rất hữu ích để xác nhận backup có đầy đủ hay không.
Giải nén archive
# Giải nén vào thư mục hiện tại
tar xzf backup.tar.gz
# Giải nén vào thư mục cụ thể
tar xzf backup.tar.gz -C /tmp/restore
# x = extract, z = gzip, f = file
Exclude: loại bỏ file không cần backup
Không phải file nào cũng cần backup. Cache, log cũ, file tạm thì bỏ qua để giảm dung lượng:
# Exclude từng pattern
tar czf backup.tar.gz /var/www \
--exclude='*.log' \
--exclude='cache/*' \
--exclude='node_modules' \
--exclude='.git'
# Hoặc dùng file chứa danh sách exclude
tar czf backup.tar.gz /var/www --exclude-from=exclude-list.txt
File exclude-list.txt mỗi dòng một pattern:
*.log
cache/*
node_modules
.git
tmp/*
Nén bằng thuật toán khác
Ngoài gzip (z), bạn có thể dùng các thuật toán nén khác:
# bzip2 — nén tốt hơn gzip nhưng chậm hơn
tar cjf backup.tar.bz2 /var/www
# xz — nén tốt nhất nhưng chậm nhất
tar cJf backup.tar.xz /var/www
# zstd — nhanh và nén tốt (cần cài zstd)
tar --zstd -cf backup.tar.zst /var/www
Với backup hàng ngày, gzip là đủ tốt. Nếu muốn tiết kiệm dung lượng lưu trữ dài hạn, xz hoặc zstd là lựa chọn tốt hơn.
rsync: đồng bộ thông minh
Nếu tar là “đóng gói mọi thứ mỗi lần”, thì rsync thông minh hơn: nó chỉ copy những file thay đổi. Lần đầu chạy sẽ copy tất cả, nhưng những lần sau chỉ đồng bộ phần khác biệt. Nhanh hơn rất nhiều.
Cú pháp cơ bản
rsync -avz /nguồn/ /đích/
Các option quan trọng:
-a(archive), giữ nguyên quyền, owner, symlink, timestamp. Gần như luôn cần option này.-v(verbose), hiển thị tiến trình-z(compress), nén data khi truyền, hữu ích khi rsync qua mạng
Lưu ý dấu / cuối đường dẫn nguồn rất quan trọng. /var/www/ (có dấu /) sẽ copy nội dung bên trong. /var/www (không có dấu /) sẽ copy cả thư mục www. Cái này hay gây nhầm lẫn nên bạn cần nhớ kỹ.
Đồng bộ local
# Backup thư mục web sang ổ backup
rsync -avz /var/www/ /backup/www/
# Lần đầu: copy tất cả
# Lần sau: chỉ copy file thay đổi → nhanh hơn rất nhiều
rsync qua SSH (remote)
Đây là cách phổ biến nhất để backup ra server khác:
# Push: đẩy backup từ VPS sang server backup
rsync -avz /var/www/ user@backup-server:/backup/vps1/www/
# Pull: kéo data từ VPS về server backup
rsync -avz user@vps-ip:/var/www/ /backup/vps1/www/
# Chỉ định port SSH khác
rsync -avz -e 'ssh -p 2222' /var/www/ user@backup-server:/backup/www/
–delete: tạo mirror chính xác
Mặc định rsync chỉ thêm file mới và cập nhật file thay đổi. File đã xoá ở nguồn vẫn còn ở đích. Nếu muốn đích giống hệt nguồn (mirror), dùng --delete:
# Mirror: đích sẽ giống hệt nguồn
# File ở đích mà không có ở nguồn sẽ bị xoá
rsync -avz --delete /var/www/ /backup/www/
Cẩn thận với --delete. Nếu bạn nhầm nguồn và đích, hoặc nguồn bị trống (do mount lỗi chẳng hạn), rsync sẽ xoá sạch phía đích. Luôn chạy --dry-run trước khi dùng --delete.
–dry-run: chạy thử trước
# Chạy thử — chỉ hiển thị những gì SẼ làm, không thực sự copy/xoá gì
rsync -avz --delete --dry-run /var/www/ /backup/www/
# Xem output, nếu OK thì bỏ --dry-run để chạy thật
–exclude: loại bỏ file không cần
rsync -avz /var/www/ /backup/www/ \
--exclude='cache/' \
--exclude='*.log' \
--exclude='node_modules/' \
--exclude='.git/'
Một số option hữu ích khác
# --progress: hiển thị tiến trình từng file
rsync -avz --progress /var/www/ /backup/www/
# --bwlimit: giới hạn bandwidth (KB/s), tránh ảnh hưởng traffic VPS
rsync -avz --bwlimit=5000 /var/www/ user@backup-server:/backup/www/
# --partial: giữ file truyền dở, tiếp tục lần sau thay vì truyền lại từ đầu
rsync -avz --partial /var/www/ user@backup-server:/backup/www/
Backup database
Backup file thôi chưa đủ. Hầu hết ứng dụng web đều có database, và database không thể backup bằng cách copy file trực tiếp (vì data đang được ghi liên tục, copy giữa chừng sẽ bị corrupt).
Cách đúng là dùng công cụ dump của từng loại database. Nó sẽ xuất ra file SQL mà bạn có thể import lại sau.
MySQL / MariaDB
# Backup một database
mysqldump -u root -p my_database > my_database.sql
# Backup tất cả database
mysqldump -u root -p --all-databases > all-databases.sql
# Backup kèm nén (tiết kiệm dung lượng đáng kể)
mysqldump -u root -p my_database | gzip > my_database.sql.gz
# Backup với các option an toàn
mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
my_database | gzip > my_database.sql.gz
Option --single-transaction quan trọng cho InnoDB: nó đảm bảo backup nhất quán mà không cần lock bảng, website vẫn chạy bình thường trong lúc backup.
PostgreSQL
# Backup một database
pg_dump my_database > my_database.sql
# Backup kèm nén
pg_dump my_database | gzip > my_database.sql.gz
# Backup tất cả database
pg_dumpall > all-databases.sql
# Custom format (nén sẵn, hỗ trợ restore chọn lọc)
pg_dump -Fc my_database > my_database.dump
Ví dụ thực tế: backup WordPress
Một site WordPress điển hình cần backup 2 thứ: file (theme, plugin, upload) và database.
# Backup database WordPress
mysqldump -u wp_user -p'password' wordpress_db | gzip > /backup/wp-db-$(date +%Y%m%d).sql.gz
# Backup file WordPress
tar czf /backup/wp-files-$(date +%Y%m%d).tar.gz /var/www/wordpress \
--exclude='cache/*'
Script backup tự động + Cron
Backup thủ công thì sớm muộn cũng quên. Giải pháp là viết script rồi cho cron chạy tự động mỗi đêm.
Script backup hoàn chỉnh
Tạo file /usr/local/bin/backup.sh:
#!/bin/bash
# Script backup VPS — chạy hàng đêm qua cron
# === CẤU HÌNH ===
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
KEEP_DAYS=7
# Thư mục cần backup
WEB_DIR="/var/www"
# Database
DB_USER="root"
DB_PASS="your_password"
DB_NAME="wordpress_db"
# === TẠO THƯ MỤC ===
mkdir -p "$BACKUP_DIR"
# === BACKUP DATABASE ===
echo "[$(date)] Bắt đầu backup database..."
mysqldump -u "$DB_USER" -p"$DB_PASS" \
--single-transaction \
--routines \
"$DB_NAME" | gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
if [ $? -eq 0 ]; then
echo "[$(date)] Backup database OK"
else
echo "[$(date)] LỖI: Backup database thất bại!"
fi
# === BACKUP FILES ===
echo "[$(date)] Bắt đầu backup files..."
tar czf "$BACKUP_DIR/web-$DATE.tar.gz" "$WEB_DIR" \
--exclude='cache/*' \
--exclude='*.log' \
--exclude='node_modules' \
2>/dev/null
if [ $? -eq 0 ]; then
echo "[$(date)] Backup files OK"
else
echo "[$(date)] LỖI: Backup files thất bại!"
fi
# === XOÁ BACKUP CŨ ===
echo "[$(date)] Xoá backup cũ hơn $KEEP_DAYS ngày..."
find "$BACKUP_DIR" -name "db-*.sql.gz" -mtime +$KEEP_DAYS -delete
find "$BACKUP_DIR" -name "web-*.tar.gz" -mtime +$KEEP_DAYS -delete
# === TỔNG KẾT ===
echo "[$(date)] Backup hoàn tất. Danh sách file:"
ls -lh "$BACKUP_DIR"
Phân quyền cho script:
chmod +x /usr/local/bin/backup.sh
Chạy thử trước
Trước khi đưa vào cron, hãy chạy tay một lần để đảm bảo mọi thứ hoạt động:
# Chạy thử
sudo /usr/local/bin/backup.sh
# Kiểm tra kết quả
ls -lh /backup/
Đặt lịch cron
# Mở crontab của root
sudo crontab -e
Thêm dòng sau:
# Backup hàng đêm lúc 2 giờ sáng, ghi log
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Giải thích: 0 2 * * * nghĩa là chạy lúc 2:00 AM mỗi ngày. Output và lỗi đều ghi vào /var/log/backup.log để bạn có thể kiểm tra sau.
Script này sẽ giữ 7 ngày backup gần nhất. Cũ hơn thì tự động xoá. Như vậy ổ đĩa không bị đầy mà bạn vẫn có đủ bản backup để khôi phục nếu cần.
Backup ra server khác (offsite)
Backup nằm trên cùng VPS thì chưa an toàn. VPS chết là mất cả data lẫn backup. Bạn cần đẩy backup ra nơi khác.
rsync qua SSH
Cách đơn giản nhất nếu bạn có thêm một VPS hoặc server khác:
# Đẩy thư mục backup sang server khác
rsync -avz /backup/ user@backup-server:/backup/vps1/
# Dùng SSH key để không cần nhập password (bắt buộc cho cron)
# Xem lại bài SSH để biết cách setup SSH key
Thêm vào cuối script backup:
# === ĐỒNG BỘ RA SERVER BACKUP ===
echo "[$(date)] Đồng bộ ra backup server..."
rsync -avz --delete /backup/ user@backup-server:/backup/vps1/ 2>&1
if [ $? -eq 0 ]; then
echo "[$(date)] Đồng bộ offsite OK"
else
echo "[$(date)] LỖI: Đồng bộ offsite thất bại!"
fi
rclone: backup lên cloud storage
Nếu không có server thứ hai, bạn có thể dùng rclone để đẩy backup lên các dịch vụ cloud storage như Amazon S3, Google Drive, Backblaze B2, hoặc bất kỳ dịch vụ nào hỗ trợ.
Cài đặt rclone:
# Ubuntu/Debian
sudo apt install rclone
# RHEL/Alma/Rocky
sudo dnf install rclone
Cấu hình remote (chạy một lần):
# Wizard cấu hình — chọn provider, nhập credentials
rclone config
Sau khi cấu hình xong, đồng bộ backup lên cloud:
# Đẩy lên S3 (hoặc S3-compatible như Backblaze B2)
rclone sync /backup/ s3-remote:my-backup-bucket/vps1/
# Đẩy lên Google Drive
rclone sync /backup/ gdrive:VPS-Backup/vps1/
# Với bandwidth limit
rclone sync /backup/ s3-remote:my-backup-bucket/vps1/ --bwlimit 10M
rclone sync giống rsync --delete: nó sẽ xoá file ở đích mà không có ở nguồn. Nếu muốn chỉ thêm mà không xoá, dùng rclone copy thay thế.
Restore: khôi phục khi cần
Backup mà không biết cách restore thì cũng như không. Phần này mình hướng dẫn cách khôi phục từ từng loại backup.
Restore từ tar
# Xem nội dung trước khi giải nén
tar tzvf /backup/web-20250315.tar.gz | head -20
# Giải nén vào thư mục tạm để kiểm tra
mkdir /tmp/restore
tar xzf /backup/web-20250315.tar.gz -C /tmp/restore
# Kiểm tra OK rồi thì copy về đúng vị trí
# Hoặc giải nén trực tiếp (ghi đè file hiện tại)
cd /
tar xzf /backup/web-20250315.tar.gz
Restore từ rsync
# Từ backup local
rsync -avz /backup/www/ /var/www/
# Từ backup server
rsync -avz user@backup-server:/backup/vps1/www/ /var/www/
# Dry-run trước cho chắc
rsync -avz --dry-run user@backup-server:/backup/vps1/www/ /var/www/
Restore database
# MySQL/MariaDB — từ file .sql
mysql -u root -p my_database < my_database.sql
# MySQL/MariaDB — từ file nén .sql.gz
gunzip < /backup/db-20250315.sql.gz | mysql -u root -p my_database
# PostgreSQL — từ file .sql
psql my_database < my_database.sql
# PostgreSQL — từ custom format (.dump)
pg_restore -d my_database my_database.dump
Quy trình restore hoàn chỉnh cho WordPress
Ví dụ bạn cần restore một site WordPress trên VPS mới:
# 1. Cài web server và MySQL trên VPS mới (nginx, php, mysql)
# 2. Tạo database
mysql -u root -p -e "CREATE DATABASE wordpress_db;"
# 3. Restore database
gunzip < /backup/db-20250315.sql.gz | mysql -u root -p wordpress_db
# 4. Restore files
tar xzf /backup/web-20250315.tar.gz -C /
# 5. Kiểm tra quyền file
chown -R www-data:www-data /var/www/wordpress # Ubuntu/Debian
chown -R nginx:nginx /var/www/wordpress # RHEL/Alma/Rocky
# 6. Restart services
systemctl restart nginx php-fpm mysql
Test restore: bước quan trọng nhất
Đây là điều mà rất nhiều người bỏ qua: backup mà không test restore thì coi như không có backup.
Mình đã thấy nhiều trường hợp: backup chạy đều đặn mỗi đêm, nhưng khi cần restore mới phát hiện file backup bị lỗi, script backup thiếu thư mục quan trọng, hoặc database dump bị rỗng vì password thay đổi mà không ai cập nhật script.
Cách test đơn giản:
# 1. Kiểm tra file backup có đủ và hợp lệ không
ls -lh /backup/
# File có dung lượng hợp lý? File 0 byte = backup lỗi
# 2. Test giải nén archive
tar tzvf /backup/web-20250315.tar.gz > /dev/null
echo $? # 0 = OK, khác 0 = file bị corrupt
# 3. Test database dump
gunzip < /backup/db-20250315.sql.gz | head -5
# Phải thấy header SQL, không phải file rỗng hoặc lỗi
# 4. Restore thử vào thư mục tạm
mkdir -p /tmp/restore-test
tar xzf /backup/web-20250315.tar.gz -C /tmp/restore-test
ls -la /tmp/restore-test/var/www/
# Dọn dẹp sau khi test
rm -rf /tmp/restore-test
Nếu muốn nghiêm túc hơn, bạn có thể thêm phần kiểm tra vào script backup:
# Thêm vào cuối backup.sh
# === KIỂM TRA BACKUP ===
echo "[$(date)] Kiểm tra backup..."
# Check file size (backup phải > 1KB)
DB_SIZE=$(stat -c%s "$BACKUP_DIR/db-$DATE.sql.gz" 2>/dev/null || echo 0)
WEB_SIZE=$(stat -c%s "$BACKUP_DIR/web-$DATE.tar.gz" 2>/dev/null || echo 0)
if [ "$DB_SIZE" -lt 1024 ]; then
echo "[$(date)] CẢNH BÁO: Database backup quá nhỏ ($DB_SIZE bytes)!"
fi
if [ "$WEB_SIZE" -lt 1024 ]; then
echo "[$(date)] CẢNH BÁO: Web backup quá nhỏ ($WEB_SIZE bytes)!"
fi
# Test tar integrity
tar tzvf "$BACKUP_DIR/web-$DATE.tar.gz" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[$(date)] CẢNH BÁO: File tar bị corrupt!"
fi
Lịch test restore khuyến nghị:
- Hàng ngày: Script tự kiểm tra file size và integrity (tự động)
- Hàng tháng: Thử restore lên VPS test hoặc Docker container
- Mỗi quý: Full disaster recovery test, restore toàn bộ lên VPS mới từ đầu
Tools nâng cao: restic và borgbackup
Với tar và rsync, bạn có thể làm được hầu hết mọi thứ. Nhưng nếu cần backup incremental (chỉ lưu phần thay đổi), mã hoá (encryption), hoặc deduplicate (loại bỏ data trùng lặp), thì có hai công cụ mạnh hơn đáng để tìm hiểu.
restic
restic là tool backup hiện đại, hỗ trợ incremental backup, mã hoá mặc định, và backup trực tiếp lên nhiều loại storage (local, S3, SFTP, Backblaze B2, ...).
# Cài đặt
# Ubuntu/Debian
sudo apt install restic
# RHEL/Alma/Rocky
sudo dnf install restic
# Khởi tạo repository (chạy một lần)
restic -r /backup/restic-repo init
# Nhập password — password này dùng để mã hoá, mất password = mất backup
# Tạo backup
restic -r /backup/restic-repo backup /var/www /etc
# Backup lên S3
export AWS_ACCESS_KEY_ID="your-key"
export AWS_SECRET_ACCESS_KEY="your-secret"
restic -r s3:s3.amazonaws.com/my-backup-bucket backup /var/www
# Liệt kê các bản snapshot
restic -r /backup/restic-repo snapshots
# Restore
restic -r /backup/restic-repo restore latest --target /tmp/restore
# Xoá snapshot cũ, giữ 7 ngày gần nhất
restic -r /backup/restic-repo forget --keep-daily 7 --prune
Điểm mạnh của restic:
- Incremental: lần backup sau chỉ lưu phần thay đổi, tiết kiệm dung lượng đáng kể
- Mã hoá mặc định: data được encrypt trước khi lưu
- Deduplicate: file trùng lặp chỉ lưu một lần
- Hỗ trợ nhiều backend storage
borgbackup
borgbackup (hay borg) cũng là tool backup incremental + mã hoá, tương tự restic nhưng ra đời trước và có cộng đồng lớn.
# Cài đặt
# Ubuntu/Debian
sudo apt install borgbackup
# RHEL/Alma/Rocky
sudo dnf install borgbackup
# Khởi tạo repository
borg init --encryption=repokey /backup/borg-repo
# Tạo backup
borg create /backup/borg-repo::web-{now:%Y%m%d} /var/www /etc
# Backup qua SSH sang server khác
borg create user@backup-server:/backup/borg-repo::web-{now:%Y%m%d} /var/www
# Liệt kê archives
borg list /backup/borg-repo
# Restore
borg extract /backup/borg-repo::web-20250315
# Xoá backup cũ, giữ 7 bản daily, 4 bản weekly
borg prune /backup/borg-repo --keep-daily=7 --keep-weekly=4
Cả restic và borg đều là lựa chọn tốt. Nếu bạn mới bắt đầu, restic dễ setup hơn một chút. Nếu đã quen với command line thì borg cũng rất mạnh.
Với các VPS nhỏ chạy vài website, tar + rsync + script cron là quá đủ. Restic hoặc borg phù hợp hơn khi bạn quản lý nhiều server hoặc cần backup data lớn mà muốn tiết kiệm dung lượng lưu trữ.
Checkpoint: thực hành
Bạn đã nắm đủ kiến thức rồi. Giờ là lúc thực hành. Mình sẽ hướng dẫn bạn tạo một hệ thống backup hoàn chỉnh từ đầu đến cuối.
Bước 1: Tạo script backup
Tạo thư mục backup và script:
# Tạo thư mục
sudo mkdir -p /backup
# Tạo script
sudo nano /usr/local/bin/backup.sh
Copy nội dung script backup ở phần trước vào, chỉnh sửa các biến cho phù hợp với server của bạn (tên database, đường dẫn web, password database).
# Phân quyền
sudo chmod +x /usr/local/bin/backup.sh
# Chạy thử
sudo /usr/local/bin/backup.sh
Bước 2: Kiểm tra kết quả
# Xem file backup đã tạo
ls -lh /backup/
# Kiểm tra tar file
tar tzvf /backup/web-*.tar.gz | head
# Kiểm tra database dump
gunzip < /backup/db-*.sql.gz | head -10
Bước 3: Đặt cron chạy hàng đêm
# Mở crontab
sudo crontab -e
# Thêm dòng này:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Bước 4: Test restore
# Tạo thư mục test
mkdir -p /tmp/restore-test
# Restore file
tar xzf /backup/web-*.tar.gz -C /tmp/restore-test
# Kiểm tra
ls -la /tmp/restore-test/var/www/
# Dọn dẹp
rm -rf /tmp/restore-test
Bước 5 (nâng cao): Setup offsite backup
Nếu bạn có server thứ hai:
# Setup SSH key (không password, cần cho cron)
ssh-keygen -t ed25519 -f ~/.ssh/backup-key -N ""
ssh-copy-id -i ~/.ssh/backup-key user@backup-server
# Test rsync
rsync -avz -e 'ssh -i ~/.ssh/backup-key' /backup/ user@backup-server:/backup/vps1/
# Thêm vào script backup.sh
Nếu dùng cloud storage:
# Cài và cấu hình rclone
sudo apt install rclone # hoặc dnf trên RHEL
rclone config # theo wizard
# Test
rclone copy /backup/ remote:backup-bucket/vps1/ --dry-run
# Chạy thật
rclone copy /backup/ remote:backup-bucket/vps1/
Sau khi hoàn thành checkpoint này, bạn đã có một hệ thống backup chạy tự động: script backup web + database mỗi đêm, tự xoá bản cũ, và bạn biết cách restore khi cần. Với quy tắc 3-2-1, thêm bước offsite backup nữa là bạn có thể yên tâm ngủ ngon mà không lo mất data.
Có thể bạn cần xem thêm
- Backup và phục hồi sự cố cho VPS Linux - Kế hoạch toàn diện
- Backup & Restore dữ liệu Docker Volume
- Shell Scripting cơ bản trên Linux - Tự động hóa tác vụ VPS
- Deploy WordPress + MySQL + phpMyAdmin bằng Docker Compose
- Coolify Production - Backup, bảo mật
- Lệnh backup/import database MySQL/PostgreSQL trên máy chủ Linux
Về tác giả
Trần Thắng
Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.