# ======================================== # Stage 1: Build Frontend Assets (Vue.js) # ======================================== FROM node:20-alpine as node_builder WORKDIR /app # Copy package files untuk caching layer COPY package*.json ./ # Install dependencies RUN npm ci --legacy-peer-deps # Copy seluruh source code COPY . . # Build production assets RUN npm run build # ======================================== # Stage 2: Laravel Application # ======================================== FROM php:8.3-fpm-alpine # Install system dependencies dan PHP extensions RUN apk update && apk add --no-cache \ git \ unzip \ libzip-dev \ libpng-dev \ oniguruma-dev \ libxml2-dev \ curl \ mysql-client \ autoconf \ g++ \ make \ && docker-php-ext-install \ pdo_mysql \ zip \ gd \ mbstring \ exif \ pcntl \ bcmath \ && pecl install redis \ && docker-php-ext-enable redis \ && apk del autoconf g++ make \ && rm -rf /var/cache/apk/* /tmp/* # Install Composer COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /var/www/html # Copy composer files untuk caching layer COPY composer.json composer.lock ./ # Install PHP dependencies RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist # Copy application source code COPY . . # Copy hasil build Vue dari stage 1 COPY --from=node_builder /app/public/build /var/www/html/public/build # Generate autoload files dengan optimasi RUN composer dump-autoload --optimize --classmap-authoritative # Create required directories dan set permissions RUN mkdir -p \ storage/framework/cache \ storage/framework/sessions \ storage/framework/views \ storage/logs \ bootstrap/cache \ && chown -R www-data:www-data \ /var/www/html/storage \ /var/www/html/bootstrap/cache \ && chmod -R 775 \ /var/www/html/storage \ /var/www/html/bootstrap/cache # Switch ke user non-root untuk keamanan USER www-data EXPOSE 9000 CMD ["php-fpm"]