0

Joomla Bài học 20: Quy trình sao lưu (Backup), phục hồi với Akeeba Backup và nâng cấp hệ thống an toàn

Không một hệ thống Production nào được phép xem là hoàn thiện nếu thiếu kịch bản sao lưu và phục hồi thảm họa (Disaster Recovery Plan - DRP). Trong Joomla Bài học 20 — bài học khép lại Phần 2, chúng ta sẽ làm chủ quy trình đóng gói toàn bộ mã nguồn và cơ sở dữ liệu bằng công cụ tiêu chuẩn ngành Akeeba Backup (định dạng nén .jpa), quy trình giải nén và di chuyển máy chủ siêu tốc với Akeeba Kickstart, kết hợp cùng các tập lệnh Joomla CLI dành riêng cho quy trình CI/CD và nâng cấp hệ thống an toàn không gián đoạn (Zero-downtime).

1. Bản chất của một bản Backup toàn diện trong Joomla 5

Một bản sao lưu Joomla hoàn chỉnh bắt buộc phải đảm bảo tính nhất quán (Data Consistency) giữa 2 thành phần tại cùng một thời điểm:

  1. Filesystem (Hệ thống tệp tin): Toàn bộ mã nguồn Core, các Extensions đã cài đặt (components, modules, plugins, templates), file cấu hình gốc configuration.php, file .htaccess và toàn bộ tài nguyên người dùng tải lên trong /images, /media. (Lưu ý: Luôn loại trừ nội dung trong /cache, /administrator/cache và /tmp để giảm dung lượng bản nén).

  2. Database (Cơ sở dữ liệu MySQL): Toàn bộ cấu trúc bảng (DDL - CREATE TABLE), dữ liệu (DML - INSERT), kèm theo các Triggers, Views hoặc Stored Procedures nếu dự án có sử dụng.

2. Sao lưu chuyên nghiệp với Akeeba Backup (Định dạng .jpa)

Mặc dù bạn có thể dùng lệnh tar kết hợp mysqldump ở tầng Linux, nhưng trong hệ sinh thái Joomla, Akeeba Backup (Core/Pro) là tiêu chuẩn vàng nhờ thuật toán chia nhỏ bước chạy thông minh (tránh lỗi PHP Timeout trên các website nặng nhiều GB) và định dạng nén độc quyền .jpa (Joomla Pack Archive).

A. Tại sao định dạng .jpa lại vượt trội hơn .zip?

  • Vượt giới hạn bộ nhớ PHP: Chuẩn .jpa được thiết kế để nối thêm dữ liệu theo từng khối nhỏ (Chunk) mà không cần tải toàn bộ cấu trúc cây thư mục vào RAM như chuẩn .zip.

  • Chống quét trộm từ Web Server: Nếu ai đó vô tình để lộ file .zip hoặc .sql trên thư mục web công khai, hacker có thể tải về ngay. Ngược lại, file .jpa kết hợp với cấu hình chặn truy cập trực tiếp trong thư mục /administrator/components/com_akeebabackup/backup/ giúp bảo vệ dữ liệu tuyệt đối.

  • Tích hợp sẵn trình cài đặt (Embedded Installer - ANGIE): Bên trong một file .jpa duy nhất đã bao gồm: Mã nguồn web + File dump SQL + Bộ cài đặt độc lập ANGIE. Khi đem sang máy chủ mới, bạn không cần cài Joomla trắng trước mà bung trực tiếp ra hệ thống hoàn chỉnh!

B. Quy trình thiết lập và cấu hình Akeeba Backup

  1. Cài đặt & Chạy Configuration Wizard:

    • Tải gói Akeeba Backup Core (Miễn phí) từ akeeba.com và cài đặt qua System →\rightarrow Install →\rightarrow Extensions.

    • Truy cập Components →\rightarrow Akeeba Backup for Joomla! →\rightarrow Bấm chạy Configuration Wizard. Hệ thống sẽ tự động benchmark tốc độ đọc/ghi ổ đĩa và giới hạn max_execution_time của container PHP để tự căn chỉnh kích thước mỗi bước nén.

  2. Đổi thư mục lưu trữ ra ngoài Web Root (Chuẩn Bảo mật Production):

    • Vào Profile Configuration →\rightarrow Tại mục Output Directory, thay vì để mặc định bên trong thư mục /administrator/..., hãy trỏ nó ra một thư mục nằm ngoài /var/www/html (ví dụ: /var/backups/joomla được mount volume riêng trong Docker) để không một HTTP Request nào có thể chạm tới file backup.
  3. Loại trừ bảng dữ liệu rác (Database Tables Exclusion):

    • Trong giao diện Akeeba Backup, chọn Database Tables Exclusion.

    • Đánh dấu chọn cột Exclude Data (Chỉ giữ cấu trúc bảng, bỏ qua dữ liệu bên trong) cho các bảng tạm như: #__session (phiên đăng nhập tạm) và #__finder_tokens (bảng bộ nhớ tạm trong quá trình lập chỉ mục tìm kiếm). Việc này giúp giảm từ 20% – 40% dung lượng file SQL!

3. Phục hồi (Restore) và Di chuyển Server với Akeeba Kickstart

Giả sử máy chủ cũ gặp sự cố hoặc bạn cần nhân bản (Clone) hệ thống từ môi trường Docker Local lên máy chủ Production mới tinh. Quy trình phục hồi bằng Akeeba Kickstart chỉ gói gọn trong 4 bước:

  1. Chuẩn bị 2 file duy nhất: Lấy file bản sao lưu .jpa vừa tạo và tải file script giải nén kickstart.php (từ trang chủ Akeeba) bỏ vào thư mục gốc (/var/www/html/) của máy chủ mới.

  2. Chạy trình giải nén Kickstart:

    • Mở trình duyệt truy cập: [http://domain-moi.com/kickstart.php](http://domain-moi.com/kickstart.php).

    • Chọn file .jpa và bấm Start. kickstart.php sẽ giải nén siêu tốc toàn bộ mã nguồn ra thư mục hiện tại và tự động kích hoạt trình cài đặt ANGIE.

  3. Cấu hình lại thông số môi trường mới trong ANGIE:

    • Bước Database Restoration: Nhập thông tin kết nối MySQL của máy chủ mới (Host, User, Password, Database Name). ANGIE sẽ tự động import lại toàn bộ các bảng.

    • Bước Site Setup: Cập nhật lại tên website, mật khẩu Super User (nếu muốn) và quan trọng nhất là kiểm tra lại 2 đường dẫn vật lý tmp_path và log_path để khớp với đường dẫn trên máy chủ mới (tránh lỗi không cài được extension sau khi chuyển host).

  4. Dọn dẹp tự động (Clean Up): Sau khi báo hoàn tất, quay lại tab của Kickstart và bấm nút Clean Up. Hệ thống sẽ tự động xóa sạch file kickstart.php, file .jpa gốc và thư mục installation/ để đảm bảo an toàn bảo mật.

4. Quy trình Nâng cấp Joomla 5 an toàn (Pre-Update Check & CLI Update)

Joomla 5 tuân thủ chặt chẽ quy tắc Semantic Versioning (Major.Minor.Patch - ví dụ 5.2.1):

  • Bản vá bảo mật (Patch: 5.2.0 →\rightarrow 5.2.1): Chỉ sửa lỗi và vá lỗ hổng bảo mật, không bao giờ làm hỏng giao diện hay extension. Cần cập nhật càng sớm càng tốt.

  • Bản cập nhật tính năng (Minor: 5.1 →\rightarrow 5.2) và Bản lớn (Major: 5.x →\rightarrow 6.0): Cần kiểm tra tương thích kỹ lưỡng trên môi trường Staging/Docker trước khi chạy trên Production.

A. Sử dụng công cụ Pre-Update Check trên giao diện Admin

Truy cập System →\rightarrow Update →\rightarrow Joomla. Trước khi cho phép bấm nút cập nhật, Joomla 5 chạy bộ kiểm tra Pre-Update Check cực kỳ thông minh gồm 3 nhóm:

  1. Required PHP & Database Settings: Kiểm tra phiên bản PHP, MySQL và các PHP Extensions.

  2. Extensions Pre-Update Check: Tự động quét qua toàn bộ các Component, Module, Plugin bên thứ ba trong máy của bạn và đối chiếu với máy chủ cập nhật của nhà phát triển xem chúng đã khai báo tương thích với phiên bản Joomla mới chưa (Hiển thị nhãn Xanh/Cam/Đỏ rõ ràng).

  3. Database Schema Verification (System →\rightarrow Maintenance →\rightarrow Database): Nếu sau khi nâng cấp có bất kỳ sự lệch pha nào về cấu trúc bảng Core, bạn chỉ cần vào đây bấm nút Update Structure để Joomla tự động chạy các bản vá ALTER TABLE còn thiếu.

5. Giải phẫu CLI & Tự động hóa Backup/Update cho DevOps (Góc nhìn Backend)

Là một Backend Developer vận hành hệ thống bằng Docker và Linux, bạn không cần phải mở trình duyệt bấm tay từng bước. Chúng ta có thể kết hợp Joomla CLI (cli/joomla.php) với Bash Script để tự động hóa 100% quy trình Backup và Nâng cấp:

Bash

#!/usr/bin/env bash
# File: scripts/safe_upgrade.sh - Quy trình Backup & Update Joomla 5 qua CLI
set -e

BACKUP_DIR="/var/backups/joomla"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
JOOMLA_ROOT="/var/www/html"

echo "=== [1/5] Bật chế độ bảo trì (Site Offline) qua Joomla CLI ==="
php ${JOOMLA_ROOT}/cli/joomla.php site:down

echo "=== [2/5] Export Database MySQL (Loại bỏ dữ liệu bảng #__session) ==="
mysqldump -h db -u joomla_user -p'joomla_password' \
  --single-transaction --quick --lock-tables=false \
  --ignore-table=joomla_db.j5_session \
  joomla_db | gzip > "${BACKUP_DIR}/db_${TIMESTAMP}.sql.gz"

# Lưu lại cấu trúc rỗng của bảng #__session
mysqldump -h db -u joomla_user -p'joomla_password' \
  --no-data joomla_db j5_session | gzip >> "${BACKUP_DIR}/db_${TIMESTAMP}.sql.gz"

echo "=== [3/5] Nén toàn bộ mã nguồn (Loại trừ thư mục cache và tmp) ==="
tar --exclude="${JOOMLA_ROOT}/cache/*" \
    --exclude="${JOOMLA_ROOT}/administrator/cache/*" \
    --exclude="${JOOMLA_ROOT}/tmp/*" \
    -czf "${BACKUP_DIR}/files_${TIMESTAMP}.tar.gz" -C "${JOOMLA_ROOT}" .

echo "=== [4/5] Kiểm tra và cập nhật Joomla Core qua CLI ==="
php ${JOOMLA_ROOT}/cli/joomla.php core:check-updates
php ${JOOMLA_ROOT}/cli/joomla.php core:update

echo "=== [5/5] Xóa sạch Cache và mở lại trang web (Site Online) ==="
php ${JOOMLA_ROOT}/cli/joomla.php cache:clean
php ${JOOMLA_ROOT}/cli/joomla.php site:up

echo "✅ Hoàn tất nâng cấp an toàn! Bản sao lưu được lưu tại: ${BACKUP_DIR}"

Mẹo tích hợp Akeeba Backup với Task Scheduler: Nếu bạn cài bản Akeeba Backup Professional, nó đi kèm sẵn một Task Plugin tích hợp thẳng vào Task Scheduler (mà chúng ta đã học ở Bài 19) và lệnh CLI php cli/joomla.php akeeba:backup:take, đồng thời hỗ trợ đẩy thẳng file .jpa vừa nén lên Amazon S3, Google Drive hoặc Backblaze B2 ngay sau khi nén xong!

6. Tổng kết bài học & Khép lại Phần 2

  • Nắm vững quy tắc Data Consistency khi sao lưu cả Filesystem và Database (cùng các thư mục/bảng cần loại trừ để tối ưu dung lượng).

  • Làm chủ công cụ Akeeba Backup (.jpa) và quy trình giải nén/chuyển đổi máy chủ nhanh gọn với Akeeba Kickstart + ANGIE.

  • Hiểu rõ quy trình Pre-Update Check của Joomla 5 và thành thạo bộ lệnh CLI (site:down, core:update, cache:clean, site:up) để tự động hóa quy trình nâng cấp an toàn.

Chúc mừng bạn đã hoàn thành trọn vẹn Phần 2 (Bài 11 - 20), làm chủ toàn bộ các kỹ năng Quản trị cấp cao, Phân quyền ACL, Đa ngôn ngữ, SEO, Caching và Bảo mật hệ thống!

Bắt đầu từ Bài học 21, chúng ta sẽ chính thức bước sang Phần 3: Thiết kế & Lập trình Giao diện - Template Development (Bài 21 - 30), mở đầu bằng việc khám phá cấu trúc của Template mặc định Cassiopeia, Bootstrap 5 và CSS Grid trong Joomla.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí