# Multi-stage build for Laravel + React application FROM node:20-alpine AS frontend-builder WORKDIR /app # Copy package files COPY package*.json ./ # Install Node dependencies RUN npm ci --only=production # Copy frontend source COPY resources/ resources/ COPY public/ public/ COPY vite.config.ts ./ COPY tsconfig.json ./ COPY components.json ./ COPY eslint.config.js ./ # Build frontend assets RUN npm run build # PHP runtime stage FROM php:8.2-fpm-alpine # Install system dependencies RUN apk add --no-cache \ git \ curl \ libpng-dev \ libxml2-dev \ zip \ unzip \ oniguruma-dev \ mysql-client # Install PHP extensions RUN docker-php-ext-install \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd # Install Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /var/www/html # Copy application code first COPY . . # Install PHP dependencies after copying all files RUN composer install --no-dev --optimize-autoloader --no-interaction # Copy built frontend assets from builder stage COPY --from=frontend-builder /app/public/build/ ./public/build/ # Set proper permissions RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 /var/www/html/storage \ && chmod -R 755 /var/www/html/bootstrap/cache # Create a startup script RUN echo '#!/bin/sh' > /usr/local/bin/start-app \ && echo 'cp -r /var/www/html/public/. /var/www/html/public_shared/ 2>/dev/null || true' >> /usr/local/bin/start-app \ && echo 'php artisan config:cache' >> /usr/local/bin/start-app \ && echo 'php artisan route:cache' >> /usr/local/bin/start-app \ && echo 'php artisan view:cache' >> /usr/local/bin/start-app \ && echo 'php artisan migrate --force' >> /usr/local/bin/start-app \ && echo 'php-fpm' >> /usr/local/bin/start-app \ && chmod +x /usr/local/bin/start-app # Expose port 9000 for PHP-FPM EXPOSE 9000 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD php artisan --version || exit 1 # Start the application CMD ["/usr/local/bin/start-app"]