Bài viết này hướng dẫn từng bước deploy ứng dụng Laravel 12 lên VPS sử dụng Dokploy, kết hợp Docker Compose với MariaDB, Redis và Queue Worker.
1. Chuẩn bị
- VPS Ubuntu 22.04+, tối thiểu 2GB RAM
- GitHub repository chứa mã nguồn Laravel 12
- Đã cài đặt Dokploy (xem Bài 1)
- Docker và Docker Compose trên VPS
2. Dockerfile cho Laravel
Tạo file Dockerfile tại thư mục gốc của dự án Laravel:
FROM php:8.3-fpm-alpine AS base
# Cài extension cần thiết
RUN apk add --no-cache mysql-client zip git \
&& docker-php-ext-install pdo_mysql bcmath exif
WORKDIR /var/www/html
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . .
RUN composer install --no-dev --optimize-autoloader \
&& php artisan config:cache \
&& php artisan route:cache \
&& php artisan view:cache
RUN chown -R www-data:www-data storage bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
3. docker-compose.yml
File này định nghĩa toàn bộ services: web (Nginx + PHP-FPM), database (MariaDB), cache (Redis) và queue worker:
services:
app:
build: .
ports:
- "9000"
environment:
APP_KEY: \${APP_KEY}
DB_HOST: database
DB_DATABASE: laravel
DB_USERNAME: laravel
DB_PASSWORD: secret
REDIS_HOST: redis
depends_on:
- database
- redis
web:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- .:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
database:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:7-alpine
queue:
build: .
command: php artisan queue:work redis --sleep=3 --tries=3
depends_on:
- redis
volumes:
db_data:
4. Cấu hình Nginx
Tạo file nginx.conf để reverse proxy tới PHP-FPM:
server {
listen 80;
server_name _;
root /var/www/html/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
5. Deploy lên Dokploy
Sau khi push code lên GitHub, truy cập Dokploy dashboard:
- Add Service > Docker Compose
- Chọn GitHub repository và nhánh muốn deploy
- Thêm các biến môi trường (APP_KEY, DB_PASSWORD)
- Bấm Deploy
- Dokploy tự động build image, chạy container và cấp SSL Let’s Encrypt
6. Kiểm tra
# Kiểm tra container đang chạy
docker ps
# Xem log Laravel
docker logs laravel-app
# Xem log queue worker
docker logs laravel-queue
# Kiểm tra website
curl -I https://your-domain.com
Tham khảo: Dokploy là gì? | Laravel Deployment