From ffbfde943c0f8bdd87d9a13c82f8052a3a5156fe Mon Sep 17 00:00:00 2001 From: phuongtc Date: Thu, 21 May 2026 04:00:30 +0000 Subject: [PATCH] Deployment: Upgrade Dockerfile with multi-stage asset building, add Redis service and queue workers --- Dockerfile | 12 ++++++++++++ docker-compose.yml | 19 ++++++++++++++++++- docker/docker-entrypoint.sh | 3 ++- docker/supervisord.conf | 13 +++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 77e98318..ece05416 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,12 @@ +# Stage 1: Build front-end assets +FROM node:22-alpine AS assets-builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Stage 2: Production PHP FPM + Nginx image FROM php:8.3-fpm-alpine AS base RUN apk add --no-cache \ @@ -36,6 +45,9 @@ RUN composer install --no-dev --no-interaction --no-autoloader --no-scripts --pr COPY . . +# Copy Vite compiled assets +COPY --from=assets-builder /app/public/build ./public/build + RUN composer dump-autoload --optimize --no-dev \ && mkdir -p storage/app/private/feedback-attachments \ && mkdir -p storage/framework/{cache,sessions,views} \ diff --git a/docker-compose.yml b/docker-compose.yml index d3959699..8a748a4c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,18 +1,35 @@ +version: '3.8' + services: app: build: context: . dockerfile: Dockerfile + image: minicrm:latest + container_name: minicrm_app ports: - "${APP_PORT:-8080}:80" env_file: - .env volumes: - - ./database/database.sqlite:/var/www/html/database/database.sqlite + - ./database:/var/www/html/database - ./storage/app:/var/www/html/storage/app restart: unless-stopped + depends_on: + - redis healthcheck: test: ["CMD", "curl", "-f", "http://localhost/admin/login"] interval: 30s timeout: 5s retries: 3 + + redis: + image: redis:7-alpine + container_name: minicrm_redis + command: redis-server --appendonly yes + volumes: + - redis_data:/data + restart: unless-stopped + +volumes: + redis_data: diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index f21d05bc..671466db 100644 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -3,8 +3,9 @@ set -e if [ ! -f /var/www/html/database/database.sqlite ]; then touch /var/www/html/database/database.sqlite - chown www-data:www-data /var/www/html/database/database.sqlite fi +chown -R www-data:www-data /var/www/html/database +chmod -R 775 /var/www/html/database if [ -z "$APP_KEY" ]; then php artisan key:generate --force --no-interaction diff --git a/docker/supervisord.conf b/docker/supervisord.conf index 0fdac56b..2b7dff4d 100644 --- a/docker/supervisord.conf +++ b/docker/supervisord.conf @@ -13,3 +13,16 @@ stdout_logfile_maxbytes=0 command=nginx -g 'daemon off;' stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 + +[program:laravel-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +numprocs=1 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0