Backup và phục hồi

Checklist thử restore website trên môi trường tách biệt

Checklist dựng môi trường restore cô lập, chặn email, webhook và thanh toán thật, kiểm tra database, file và đo RPO/RTO sau khi khôi phục.

Thử restore website tách biệt
Mục lục

Một file backup nén nằm ngay ngắn trên cloud storage hay dòng thông báo "Backup completed successfully" chưa bao giờ là bằng chứng cho thấy website của bạn có thể phục hồi an toàn. Trên thực tế, có rất nhiều trường hợp file backup giải nén hoàn toàn bình thường, nhưng khi dựng lại hệ thống thì:

  • Phiên bản PHP hoặc cơ sở dữ liệu trên máy chủ mới bị lệch khiến mã nguồn không thể chạy.
  • Mật khẩu mã hóa file backup bị nhớ sai hoặc khóa giải mã bị thất lạc.
  • Database import thành công nhưng thiếu hẳn một bảng quan trọng do quyền của tài khoản chạy dump bị hạn chế.
  • Người chịu trách nhiệm không tìm thấy file cấu hình .env hoặc danh sách secret để kết nối các dịch vụ.

Thế nhưng, nếu bạn chọn cách thử khôi phục trực tiếp trên chiếc VPS đang chạy thật (production), rủi ro mang lại còn lớn hơn gấp bội: script import có thể ghi đè dữ liệu mới của ngày hôm nay, background worker có thể vô tình gửi email thông báo hàng loạt cho khách hàng cũ, hoặc gọi API thanh toán thật dẫn đến trừ tiền người dùng.

Giải pháp an toàn và chuyên nghiệp nhất là tiến hành restore thử nghiệm trên một môi trường tách biệt hoàn toàn (isolated environment). Dưới đây là checklist chi tiết giúp bạn thực hiện bài kiểm tra này một cách bài bản mà không gây bất kỳ tác động tiêu cực nào tới hệ thống đang chạy.

Nguyên tắc 1: Chọn bản backup thực tế, không "làm đẹp" dữ liệu chỉ để test

Một lỗi thường gặp khi làm kiểm thử là: quản trị viên chủ động đăng nhập vào VPS, dọn dẹp hệ thống sạch sẽ, chạy lệnh tạo một bản backup mới tinh rồi mang bản đó đi thử.

Cách làm này không phản ánh đúng năng lực phục hồi khi có sự cố bất ngờ. Trong thực tế, sự cố có thể ập đến vào lúc 3h chiều, và bản backup bạn có trong tay là bản chạy tự động từ lúc 2h sáng hôm qua.

Khi thực hiện restore test:

  • Hãy chọn một bản backup ngẫu nhiên được sinh ra từ cron job tự động trong vòng 7 ngày qua.
  • Lấy file trực tiếp từ nơi lưu trữ từ xa (như Object Storage S3, Cloudflare R2), đóng vai người hoàn toàn không thể truy cập vào chiếc VPS chính.
  • Kiểm tra xem thông tin manifest, mã kiểm tra toàn vẹn (checksum SHA-256) và dung lượng file có khớp với các bản lưu trữ thông thường hay không.

Nguyên tắc 2: Cô lập môi trường thử nghiệm tuyệt đối trước khi khởi động

Môi trường tách biệt có thể là một chiếc VPS thuê theo giờ với giá vài nghìn đồng, hoặc một máy ảo chạy cục bộ trên máy tính kỹ thuật. Trước khi nạp dữ liệu và bật ứng dụng lên, bạn bắt buộc phải khóa chặt các "cửa ngõ" kết nối ra thế giới bên ngoài:

1. Cách ly tên miền (DNS) và lưu lượng truy cập

  • Tuyệt đối không trỏ tên miền chính thức của website về IP của máy chủ test.
  • Sử dụng hostname nội bộ hoặc cấu hình file hosts trên máy tính cá nhân của bạn (ví dụ trỏ test.yourdomain.local về IP máy chủ test) để chỉ có một mình bạn truy cập được.
  • Bật tường lửa (firewall) chặn tất cả các IP lạ truy cập vào cổng web của máy chủ test.

2. Chặn các tác vụ gửi thông tin ra ngoài (Email, SMS, Webhook)

Một trong những tai nạn tệ nhất khi bung backup database là các tiến trình nền tự động quét các đơn hàng dở dang và gửi hàng loạt email/tin nhắn cho khách hàng thật:

  • Với Email: Cấu hình ứng dụng trỏ SMTP về một dịch vụ "hố đen" như Mailpit hoặc MailHog (các công cụ này lưu email vào một giao diện web nội bộ để bạn xem giao diện mà không bao giờ gửi ra ngoài internet).
  • Với SMS và thông báo: Xóa hoặc thay thế API key của bên thứ ba bằng các chuỗi ngẫu nhiên vô hiệu.
  • Với Webhook: Tạm dừng các worker chạy hàng đợi (queue worker) trước lần khởi động đầu tiên, hoặc đổi URL nhận webhook về localhost.

3. Đổi thông tin kết nối cổng thanh toán sang Sandbox

Nếu website có tính năng thanh toán trực tuyến:

  • Đảm bảo các cấu hình kết nối ngân hàng hoặc cổng thanh toán (VNPay, MoMo, Stripe...) được chuyển sang môi trường Sandbox/Test, hoặc vô hiệu hóa hẳn module thanh toán trong quá trình kiểm thử.

Checklist 6 giai đoạn thực hiện một buổi Restore Test

Giai đoạn 1: Chuẩn bị hạ tầng độc lập

  • ☐ Khởi tạo một máy chủ VPS mới hoàn toàn sạch sẽ (hoặc container tách biệt).
  • ☐ Cài đặt hệ điều hành và phiên bản runtime (PHP, Node.js, Python...) tương thích với phiên bản đang chạy trên production.
  • ☐ Cài đặt hệ quản trị cơ sở dữ liệu (MySQL, PostgreSQL...) với cấu hình UTF-8/collation tương đồng.
  • ☐ Thiết lập file cấu hình .env.test với mật khẩu database nội bộ mới, tắt chế độ debug nhạy cảm và thay thế toàn bộ API key thật.
  • ☐ Bấm giờ bắt đầu tính thời gian phục hồi (RTO timer).

Giai đoạn 2: Lấy dữ liệu và giải mã từ nơi lưu trữ độc lập

  • ☐ Đóng vai người không có quyền SSH vào VPS chính: đăng nhập vào Object Storage từ máy tính quản trị để lấy file backup.
  • ☐ Tải về đúng bộ backup set gồm: file dump database, file nén upload và file manifest.
  • ☐ Kiểm tra tính toàn vẹn của file bằng mã băm SHA-256 (sha256sum -c).
  • ☐ Giải mã file bằng mật khẩu dự phòng (nếu file backup có cài đặt mã hóa GPG).
  • ☐ Ghi lại thời gian tải và giải mã dữ liệu.

Giai đoạn 3: Khôi phục dữ liệu Database và File

  • ☐ Tạm dừng tất cả các background worker, queue daemon và cron job trên máy chủ test.
  • ☐ Khôi phục thư mục file upload/media về đúng đường dẫn, phân lại quyền đọc/ghi (chown -R www-data:www-data).
  • ☐ Import file dump vào database đích thông qua dòng lệnh.
  • ☐ Kiểm tra log của database server xem có xuất hiện cảnh báo lỗi cú pháp hoặc bảng bị hỏng (corrupted) hay không.

Giai đoạn 4: Kiểm tra tính toàn vẹn của dữ liệu thô

Trước khi mở giao diện web, hãy chạy vài câu lệnh truy vấn trực tiếp vào database để đánh giá:

  • ☐ Kiểm tra số lượng bảng (tables) xem có đầy đủ như thiết kế của phiên bản hiện tại không.
  • ☐ Kiểm tra tổng số lượng bản ghi của các bảng quan trọng (users, orders, posts) xem có khớp với số liệu ước tính không.
  • ☐ Kiểm tra mốc thời gian của bản ghi mới nhất: nếu bản backup tạo lúc 2h00 sáng, bản ghi đơn hàng mới nhất phải nằm sát mốc 2h00. Đây chính là căn cứ để tính toán RPO thực tế.
  • ☐ Kiểm tra liên kết giữa database và file: bốc ngẫu nhiên 5 bản ghi sản phẩm hoặc bài viết có đính kèm ảnh, kiểm tra xem đường dẫn file tương ứng trong thư mục /uploads có tồn tại và mở được không.

Giai đoạn 5: Khởi động ứng dụng và kiểm tra luồng nghiệp vụ cốt lõi (Critical Flow)

Bật dịch vụ web server và truy cập qua file hosts để thực hiện các bài kiểm tra thực tế:

  • ☐ Trang chủ và danh mục: Website có tải lên đầy đủ hình ảnh, CSS, JavaScript mà không báo lỗi 500 không?
  • ☐ Đăng nhập và phân quyền: Sử dụng tài khoản quản trị nội bộ để đăng nhập vào trang quản lý.
  • ☐ Kiểm tra luồng ghi mới: Thử tạo một bài viết mẫu, upload một hình ảnh mới và bấm lưu. Dữ liệu có vào database và file có ghi được vào đĩa không?
  • ☐ Kiểm tra tải về: Thử tải về một tài liệu hoặc xuất một báo cáo Excel xem chức năng download có bị lỗi quyền truy cập không?
  • ☐ Kiểm tra log ứng dụng: Mở file log của ứng dụng (storage/logs/laravel.log hoặc log của Nginx) xem có dòng lỗi kết nối ẩn nào không.

Giai đoạn 6: Đánh giá RPO/RTO thực tế và dọn dẹp hạ tầng

  • ☐ Bấm dừng đồng hồ: Ghi nhận tổng thời gian từ lúc bắt đầu tải file backup đến khi website test hoạt động trơn tru. So sánh con số này với cam kết RTO mục tiêu của doanh nghiệp (xem thêm cách tối ưu tại RPO và RTO khác nhau thế nào trong một sự cố thật?).
  • ☐ Tính toán RPO thực tế: Đối chiếu lượng dữ liệu bị thiếu hụt giữa bản backup và thời điểm hiện tại.
  • ☐ Cập nhật tài liệu vận hành (Runbook): Nếu trong quá trình dựng hệ thống bạn phải tự tay sửa một lỗi cấu hình nào đó mà trong tài liệu chưa ghi, hãy bổ sung ngay vào runbook.
  • ☐ Xóa bỏ môi trường test: Vì máy chủ test đang chứa toàn bộ dữ liệu thật của khách hàng, hãy hủy hoàn toàn máy chủ VPS tạm hoặc xóa sạch database/file sau khi kiểm tra xong để đảm bảo an toàn bảo mật.

Khi nào buổi restore test phải dừng lại ngay lập tức?

Trong quá trình thực hiện, nếu phát hiện bất kỳ dấu hiệu nào sau đây, bạn phải lập tức dừng tiến trình và tắt máy chủ test để xử lý:

  1. Phát hiện cấu hình đang trỏ nhầm về database thật: Nếu chuỗi kết nối database trong file cấu hình vẫn là địa chỉ IP của VPS production, việc chạy lệnh import sẽ xóa sạch dữ liệu đang chạy của khách hàng.
  2. Hệ thống bắt đầu gửi email hoặc SMS thật: Lập tức ngắt kết nối mạng của VPS test để kiểm tra lại cấu hình SMTP/API key.
  3. Mã checksum file backup không khớp: Điều này chứng tỏ file backup đã bị lỗi trong quá trình truyền tải hoặc ổ đĩa lưu trữ có vấn đề. Đây là lỗi nghiêm trọng cần điều tra ngay quy trình phối hợp backup database và file hoặc kiểm tra lại quy tắc lưu trữ 3-2-1.
  4. Không tìm thấy khóa giải mã: Nếu không ai trong đội ngũ tìm ra mật khẩu để mở file backup, bạn cần lập tức cập nhật lại quy trình quản lý secret của công ty.

Một bài restore test thành công không chỉ mang lại cảm giác an tâm cho người quản trị, mà còn cung cấp những bằng chứng rõ ràng cho chủ doanh nghiệp thấy rằng hệ thống luôn sẵn sàng ứng phó trước mọi rủi ro gián đoạn, là mắt xích kiểm chứng quan trọng trong Chiến lược backup VPS cho doanh nghiệp nhỏ và là bước chuẩn bị không thể thiếu cho một Kế hoạch disaster recovery tối thiểu.

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Backup và phục hồi