Deploy Laravel 12 lên VPS với Dokploy: Hướng dẫn Docker Compose + MariaDB + Redis

KP
Khoi Pro (Kevin)

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:

  1. Add Service > Docker Compose
  2. Chọn GitHub repository và nhánh muốn deploy
  3. Thêm các biến môi trường (APP_KEY, DB_PASSWORD)
  4. Bấm Deploy
  5. 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

Viết bởi Khoi Pro (Kevin)

WordPress Core Contributor & General Translation Editor for Vietnamese. Founder of CODE TOT JSC. Chia sẻ kiến thức về WordPress, PHP, DevOps và freelancer.