# Этап 1: Сборка PHP зависимостей FROM webdevops/php:8.3-alpine AS php-build ENV WEB_DOCUMENT_ROOT=/var/www/html/public ENV PHP_DATE_TIMEZONE=UTC ENV PHP_DISPLAY_ERRORS=0 ENV PHP_MEMORY_LIMIT=512M ENV PHP_MAX_EXECUTION_TIME=300 ENV PHP_OPCACHE_ENABLE=1 ENV PHP_OPCACHE_MEMORY_CONSUMPTION=256 # Установка системных зависимостей + Microsoft ODBC + sqlsrv RUN apk update && apk add --no-cache \ git \ unzip \ libzip-dev \ oniguruma-dev \ unixodbc-dev \ autoconf \ make \ g++ \ curl \ gnupg \ && case $(uname -m) in \ x86_64) architecture="amd64" ;; \ arm64) architecture="arm64" ;; \ *) echo "Unsupported architecture"; exit 1 ;; \ esac \ && curl -O https://download.microsoft.com/download/0b3d5518-b4a7-4a2b-afc7-7ee9e967f93c/msodbcsql18_18.6.2.1-1_${architecture}.apk \ && ACCEPT_EULA=Y apk add --allow-untrusted msodbcsql18_18.6.2.1-1_${architecture}.apk \ && rm msodbcsql18_18.6.2.1-1_${architecture}.apk \ && pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv \ && apk del autoconf make g++ \ && docker-run-bootstrap # Чистим pecl мусор RUN rm -rf /usr/local/lib/php/test \ && rm -rf /usr/local/lib/php/doc \ && rm -rf /tmp/pear \ && rm -rf /usr/src/php \ && rm -f /usr/src/php.tar.xz 2>/dev/null || true # Фикс OpenSSL 3 совместимости с SQL Server 2016 COPY docker/openssl.cnf /etc/ssl/openssl.cnf # Установка Composer COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html COPY composer.json composer.lock ./ RUN composer install \ --no-interaction \ --no-progress \ --no-scripts \ --prefer-dist \ --optimize-autoloader \ --apcu-autoloader \ --no-dev COPY . . RUN composer dump-autoload --optimize RUN chown -R application:application /var/www/html && \ chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache # Этап 2: Сборка фронтенда FROM node:20-alpine AS node-build WORKDIR /var/www/html COPY package.json package-lock.json* ./ RUN npm ci \ --no-audit \ --progress=false COPY vite.config.js ./ COPY resources/ ./resources/ RUN npm run build # Этап 3: Финальный production образ FROM webdevops/php-nginx:8.3-alpine ENV WEB_DOCUMENT_ROOT=/var/www/html/public ENV PHP_DATE_TIMEZONE=UTC ENV PHP_DISPLAY_ERRORS=0 ENV PHP_MEMORY_LIMIT=512M ENV PHP_MAX_EXECUTION_TIME=300 ENV PHP_POST_MAX_SIZE=100M ENV PHP_UPLOAD_MAX_FILESIZE=100M ENV PHP_OPCACHE_ENABLE=1 ENV PHP_OPCACHE_MEMORY_CONSUMPTION=256 ENV PHP_OPCACHE_MAX_ACCELERATED_FILES=32531 ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS=0 ENV NGINX_WORKER_PROCESSES=auto ENV NGINX_WORKER_CONNECTIONS=1024 # Установка системных зависимостей + Microsoft ODBC + sqlsrv RUN apk update && apk add --no-cache \ git \ unzip \ libzip-dev \ oniguruma-dev \ unixodbc-dev \ autoconf \ make \ g++ \ curl \ gnupg \ && case $(uname -m) in \ x86_64) architecture="amd64" ;; \ arm64) architecture="arm64" ;; \ *) echo "Unsupported architecture"; exit 1 ;; \ esac \ && curl -O https://download.microsoft.com/download/0b3d5518-b4a7-4a2b-afc7-7ee9e967f93c/msodbcsql18_18.6.2.1-1_${architecture}.apk \ && ACCEPT_EULA=Y apk add --allow-untrusted msodbcsql18_18.6.2.1-1_${architecture}.apk \ && rm msodbcsql18_18.6.2.1-1_${architecture}.apk \ && pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv \ && apk del autoconf make g++ \ && docker-run-bootstrap # Чистим pecl мусор RUN rm -rf /usr/local/lib/php/test \ && rm -rf /usr/local/lib/php/doc \ && rm -rf /tmp/pear \ && rm -rf /usr/src/php \ && rm -f /usr/src/php.tar.xz 2>/dev/null || true # Фикс OpenSSL 3 совместимости с SQL Server 2016 COPY docker/openssl.cnf /etc/ssl/openssl.cnf COPY docker/nginx.conf /etc/nginx/nginx.conf COPY docker/app.conf /etc/nginx/conf.d/default.conf COPY docker/supervisord.conf /etc/supervisor/supervisord.conf WORKDIR /var/www/html COPY --chown=application:application --from=php-build /var/www/html . COPY --chown=application:application --from=node-build /var/www/html/public/build ./public/build RUN chown -R application:application /var/www/html && \ chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache RUN php artisan storage:link HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/health || exit 1 EXPOSE 80 CMD ["supervisord", "-c", "/etc/supervisor.d/supervisord.conf"]