Series Dockerize Laravel Thực chiến #5: "Đồng hồ sinh học" Cronjob & Tự động Backup Database
1. Tại sao không dùng Cron của hệ điều hành?
Nguyên tắc tối thượng của Docker là: Một container, một tiến trình (One process per container).
Nếu bạn cố gắng nhét dịch vụ cron chạy song song với php-fpm trong cùng một container app, khi tiến trình cron bị treo, Docker sẽ không biết để khởi động lại container đó (vì tiến trình chính là php-fpm vẫn đang sống).
Do đó, chúng ta sẽ áp dụng lại tuyệt kỹ "Nhân bản" đã dùng ở Bài 4. Chúng ta sẽ tạo ra một container thứ 6, chuyên làm nhiệm vụ xem đồng hồ và gõ kẻng báo thức cho Laravel.
2. Dựng Container "Người gác đền thời gian" (Scheduler)
Laravel cung cấp sẵn tính năng Task Scheduling cực mạnh. Thay vì phải cấu hình nhiều dòng cron trong Linux, bạn chỉ cần gọi đúng một lệnh duy nhất mỗi phút: php artisan schedule:run.
Hãy mở file docker-compose.yml và thêm service scheduler vào dưới cùng:
# 6. Container Bộ lập lịch (Cron/Scheduler)
scheduler:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: laravel_scheduler
restart: unless-stopped
volumes:
- ./:/var/www/html
# Vòng lặp vô tận: Cứ ngủ 60 giây lại thức dậy chạy lệnh schedule:run
command: >
sh -c "while true; do
php artisan schedule:run --verbose --no-interaction &
sleep 60;
done"
depends_on:
- db
- redis
networks:
- laravel_network
Giải thích: Thay vì dùng daemon cron phức tạp của Linux, chúng ta dùng một vòng lặp while true đơn giản của Bash. Cứ mỗi 60 giây, nó lại gõ kẻng gọi Artisan một lần. Cực kỳ nhẹ và đúng chuẩn Docker!
3. Cấu hình Tự động Backup Database
Bây giờ "đồng hồ" đã chạy, chúng ta cần giao việc cho nó. Thư viện đỉnh cao nhất của Laravel để làm việc này là spatie/laravel-backup.
Bước 1: Cài đặt thư viện
Dùng công cụ alias đã tạo để cài đặt:
d-composer require spatie/laravel-backup
d-artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"
Bước 2: Cấu hình thư mục lưu trữ
File cấu hình config/backup.php sẽ được tạo ra. Mặc định nó sẽ backup và nén toàn bộ Database MySQL thành một file .zip và lưu vào thư mục storage/app/backup-temp. (Bạn nhớ đảm bảo thư mục storage đã được cấp quyền ở Bài 3 nhé).
Bước 3: Lên lịch chạy vào nửa đêm
Mở file app/Console/Kernel.php (hoặc routes/console.php nếu bạn dùng Laravel 11) và thêm lịch chạy:
protected function schedule(Schedule $schedule)
{
// Chạy lệnh backup cơ sở dữ liệu vào lúc 2:00 sáng mỗi ngày
$schedule->command('backup:clean')->daily()->at('01:30');
$schedule->command('backup:run --only-db')->daily()->at('02:00');
// Bạn cũng có thể thêm các Job chốt ca AFC ở đây
// $schedule->job(new DailyRevenueReportJob)->daily()->at('23:59');
}
4. Triển khai và Tận hưởng sự an tâm
Cập nhật lại hệ thống container để "người gác đền thời gian" bắt đầu làm việc:
docker-compose up -d
Để kiểm tra xem hệ thống có đang đếm nhịp chuẩn xác không, bạn có thể xem log của container scheduler:
docker logs -f laravel_scheduler
Mỗi phút trôi qua, bạn sẽ thấy dòng chữ báo hiệu Running scheduled tasks hiện lên. Nếu chưa đến 2h sáng thì nó sẽ báo là không có task nào đến hạn. Mọi thứ diễn ra hoàn toàn tự động!
Tổng kết
Đến trạm này, trận đồ Dockerize Laravel của bạn đã đạt cảnh giới Enterprise đích thực:
- Nginx điều hướng mượt mà.
- PHP-FPM xử lý logic mạnh mẽ.
- Redis & Queue Worker gánh vác tác vụ nặng ngầm.
- Scheduler tự động hóa chu kỳ vận hành và sao lưu dữ liệu.
Đây chính là bộ khung xương sống mà các hệ thống lớn sử dụng để vận hành trơn tru hàng năm trời mà không cần ai phải vào gõ lệnh thủ công.
Ở bài học tiếp theo – Bài 6 (Trạm cuối), bạn muốn chúng ta đóng gói toàn bộ dự án này thành một Image Production duy nhất (Multi-stage build) siêu nhẹ để ném lên server, hay muốn thiết lập Chứng chỉ SSL (HTTPS) miễn phí tự động gia hạn với Traefik?
All rights reserved