Deploy Laravel lên CapRover ổn định, dễ mở rộng từ A-Z

19/04/2026 P T P Chung 17 phút đọc 0 bình luận

Vì sao CapRover là lựa chọn đáng cân nhắc cho Laravel?

Deploy Laravel lên server không khó, nhưng deploy sao cho ổn định, dễ lặp lại và thuận tiện mở rộng mới là bài toán thực tế. Nhiều team bắt đầu với cách SSH vào VPS, git pull, chạy vài lệnh composer install, php artisan migrate rồi hy vọng mọi thứ ổn. Cách này có thể chạy được lúc đầu, nhưng càng về sau càng dễ phát sinh lỗi do môi trường lệch nhau, downtime khi release, hoặc khó scale khi lưu lượng tăng.

CapRover là một nền tảng PaaS self-hosted giúp đơn giản hóa việc triển khai ứng dụng lên VPS. Với Laravel, CapRover đặc biệt phù hợp nếu bạn muốn có trải nghiệm gần giống Heroku: deploy nhanh, quản lý app bằng giao diện web, hỗ trợ domain, SSL, scale instance, và tách dịch vụ như database, Redis tương đối gọn gàng. Điểm mạnh nhất là bạn vẫn kiểm soát được hạ tầng, nhưng không phải tự dựng mọi thứ bằng tay.

Trong bài viết này, mình sẽ đi theo hướng thực chiến: cách deploy Laravel lên CapRover sao cho ổn định, ít lỗi môi trường, và sẵn sàng mở rộng khi ứng dụng phát triển.

Chuẩn bị trước khi deploy

Trước khi chạm vào CapRover, hãy chuẩn bị Laravel app theo tư duy production.

1. Tách cấu hình khỏi source code

Laravel vốn đã dùng .env, nhưng khi lên production, bạn nên coi mọi cấu hình là biến môi trường, không hard-code trong codebase. Các biến tối thiểu thường gồm:

- APP_NAME - APP_ENV=production - APP_KEY - APP_DEBUG=false - APP_URL - DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD - CACHE_DRIVER - QUEUE_CONNECTION - SESSION_DRIVER - REDIS_HOST, REDIS_PASSWORD, REDIS_PORT

Nguyên tắc quan trọng: không commit .env production vào Git.

2. Chọn chiến lược web server phù hợp

Laravel cần PHP-FPM và một web server như Nginx hoặc Apache. Trên CapRover, cách ổn định nhất thường là đóng gói ứng dụng bằng Dockerfile để kiểm soát chính xác runtime. Điều này giúp tránh tình trạng “chạy được ở máy dev nhưng lỗi ở production”.

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

- PHP 8.2 hoặc 8.3 - Composer để cài dependency - Nginx phục vụ HTTP - PHP-FPM xử lý PHP - Extension cần thiết như pdo_mysql, mbstring, bcmath, redis, opcache

3. Xác định các thành phần stateful

Code Laravel nên là stateless, nhưng app thường vẫn có dữ liệu trạng thái ở nơi khác:

- Database: MySQL hoặc PostgreSQL - Cache/session: Redis - File upload: local storage hoặc object storage như S3 - Queue worker: xử lý nền cho mail, job, notification

Nếu muốn scale nhiều instance Laravel, bạn nên tránh phụ thuộc vào local filesystem cho session hoặc file quan trọng. Hãy ưu tiên:

- SESSION_DRIVER=redis hoặc database - Cache dùng Redis - Upload dùng S3-compatible storage nếu có thể

Kiến trúc deploy Laravel ổn định trên CapRover

Một setup thực tế và dễ bảo trì thường tách thành nhiều app hoặc service:

- myapp-web: ứng dụng Laravel phục vụ HTTP - myapp-worker: queue worker chạy php artisan queue:work - mysql hoặc PostgreSQL app - redis app cho cache, session, queue

Cách tách này mang lại lợi ích lớn:

- Web và worker scale độc lập - Restart worker không ảnh hưởng traffic web - Dễ theo dõi log theo từng vai trò - Hạn chế “một container làm tất cả”

Với CapRover, bạn có thể tạo nhiều app riêng và dùng cùng một image hoặc cùng một source code nhưng command khác nhau.

Cấu hình Dockerfile cho Laravel

Để deployment nhất quán, hãy dùng Dockerfile. Ý tưởng là build đầy đủ dependency trong image, sau đó CapRover chỉ việc chạy image đó.

Một hướng phổ biến:

- Stage build cài Composer dependency với --no-dev - Copy source code vào image - Chạy php artisan config:cache, route:cache, view:cache nếu phù hợp - Thiết lập quyền cho storagebootstrap/cache - Khởi động Nginx + PHP-FPM

Khi dùng Dockerfile, bạn kiểm soát được:

- Phiên bản PHP - Extension hệ thống - Gói hệ điều hành - Lệnh khởi động - Tối ưu opcache

Điều này cực kỳ quan trọng khi cần rollback hoặc nhân bản môi trường.

Các bước deploy lên CapRover

1. Tạo ứng dụng trong CapRover

Trong dashboard CapRover:

- Tạo app mới, ví dụ myapp-web - Bật HTTPS và gán domain - Chọn deploy qua GitHub/GitLab hoặc upload tarball - Nếu dùng Dockerfile, CapRover sẽ build theo file đó

Sau khi tạo web app, bạn tiếp tục tạo:

- myapp-worker - service database - service Redis

2. Cấu hình biến môi trường

Đây là bước quan trọng nhất để tránh lỗi production. Trong phần App Configs, thêm các biến môi trường cho Laravel. Đừng quên:

- APP_ENV=production - APP_DEBUG=false - APP_KEY phải được sinh đúng - LOG_CHANNEL=stderr hoặc cấu hình log phù hợp container - SESSION_DRIVER=redis - CACHE_DRIVER=redis - QUEUE_CONNECTION=redis

Nếu dùng Redis cho session và queue, khi scale lên nhiều instance, ứng dụng vẫn đồng bộ trạng thái tốt hơn nhiều so với lưu cục bộ.

3. Thiết lập persistent data đúng chỗ

Một lỗi phổ biến là mount volume cho toàn bộ source code, khiến container hoạt động khó đoán. Với Laravel, bạn chỉ nên cân nhắc persistent storage khi thật cần, ví dụ:

Quảng cáo

300x250 In-Content Advertisement

- Thư mục lưu upload nếu chưa dùng S3 - Dữ liệu database - Dữ liệu Redis nếu muốn persistence

Phần code ứng dụng nên nằm trong image, không nên phụ thuộc vào local volume.

4. Chạy migration cẩn thận

php artisan migrate là bước dễ gây lỗi nếu chạy không kiểm soát. Thực tế tốt nhất là:

- Chạy migration như bước release riêng - Đảm bảo migration backward-compatible nếu đang zero-downtime - Tránh migration khóa bảng lâu trong giờ cao điểm

Nếu schema thay đổi lớn, hãy chia nhỏ thành nhiều đợt. Đừng gộp cả code mới và migration rủi ro vào cùng một lần deploy.

Tối ưu cho độ ổn định và hiệu năng

1. Dùng queue worker riêng

Đừng để web container tự xử lý job nặng. Những tác vụ như gửi mail, xử lý ảnh, webhook, đồng bộ dữ liệu nên đưa vào queue.

Lợi ích:

- Request HTTP phản hồi nhanh hơn - Worker có thể scale riêng khi hàng đợi tăng - Lỗi job không kéo sập web process

Trên CapRover, app worker có thể chạy command như:

- php artisan queue:work --sleep=3 --tries=3 --timeout=90

2. Tối ưu cache Laravel

Ở production, nên cache cấu hình và route nếu ứng dụng phù hợp:

- php artisan config:cache - php artisan route:cache - php artisan view:cache

Ngoài ra, bật opcache cho PHP sẽ cải thiện hiệu năng đáng kể. Đây là tối ưu cơ bản nhưng rất đáng giá với Laravel chạy trong container.

3. Log ra stdout/stderr

Môi trường container hoạt động tốt nhất khi log đi ra stdout hoặc stderr, thay vì chỉ ghi file nội bộ. Việc này giúp:

- Xem log ngay trên CapRover - Tích hợp giám sát sau này dễ hơn - Tránh phình dung lượng ổ đĩa trong container

Nếu cần giữ log lâu dài, hãy kết hợp thêm giải pháp tập trung log.

Chuẩn bị cho khả năng mở rộng

Scale không chỉ là tăng số lượng container. Với Laravel trên CapRover, muốn scale bền vững, bạn cần chú ý vài điểm.

1. Ứng dụng phải stateless

Nếu 2 hoặc 3 instance web cùng chạy, người dùng có thể được chuyển tới bất kỳ instance nào. Vì vậy:

- Session không nên nằm ở file local - Cache không nên phụ thuộc local - Upload không nên chỉ lưu ở container

Redis và object storage là hai mảnh ghép rất đáng đầu tư sớm.

2. Tách tài nguyên theo vai trò

Khi traffic tăng, nút thắt không phải lúc nào cũng nằm ở web app. Có thể là:

- Database quá tải - Queue tồn đọng - Redis thiếu RAM - Upload chiếm I/O

CapRover cho phép scale app nhanh, nhưng bạn vẫn cần theo dõi đúng tầng đang nghẽn để nâng cấp hợp lý.

3. Theo dõi health và rollback

Một release tốt không chỉ deploy xong, mà còn phải dễ phát hiện lỗi và rollback nhanh. Hãy tập thói quen:

- Kiểm tra endpoint quan trọng sau deploy - Theo dõi log 5-10 phút đầu - Giữ image hoặc version trước đó để quay lui nếu cần

Rollback nhanh thường cứu bạn nhiều hơn mọi tối ưu “cao siêu”.

Những lỗi phổ biến cần tránh

Một số lỗi mình gặp rất thường khi deploy Laravel lên CapRover:

- Dùng APP_DEBUG=true trên production - Session lưu bằng file nhưng lại scale nhiều instance - Không tách worker khỏi web app - Build image thiếu extension PHP cần thiết - Chạy migration trực tiếp mỗi lần deploy mà không kiểm soát rủi ro - Ghi file upload vào container nhưng không có persistent storage - Không cấu hình APP_KEY đúng, dẫn tới lỗi session và mã hóa

Nhìn chung, phần lớn sự cố không đến từ CapRover hay Laravel, mà đến từ việc xem production như môi trường chạy tạm thay vì một hệ thống cần tính nhất quán.

Kết luận

CapRover là một lựa chọn rất thực dụng để deploy Laravel nếu bạn muốn cân bằng giữa độ đơn giản, khả năng kiểm soát, và chi phí hợp lý. Điểm mấu chốt để hệ thống chạy ổn định không nằm ở vài cú click trong dashboard, mà ở cách bạn thiết kế ứng dụng cho production: dùng Dockerfile để chuẩn hóa môi trường, tách web và worker, đưa session/cache/queue sang Redis, và tránh phụ thuộc vào local state.

Nếu làm đúng từ đầu, bạn sẽ có một pipeline deploy gọn gàng, ít lỗi vặt, dễ scale khi cần, và đủ linh hoạt để phát triển lâu dài. Với startup, side project nghiêm túc, hoặc hệ thống nội bộ cần độ tin cậy tốt mà chưa muốn đầu tư Kubernetes, đây là một hướng đi rất đáng thử.

Nếu muốn, mình có thể viết tiếp cho bạn một phiên bản thực hành hơn với: 1. Dockerfile mẫu cho Laravel trên CapRover 2. captain-definition mẫu 3. checklist deploy production từng bước để áp dụng ngay

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!