diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1a72545 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +node_modules +vendor +*.md +.editorconfig +.gitignore +.gitattributes +storage/logs/*.log diff --git a/Dockerfile b/Dockerfile index a76c696..989d226 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,99 +1,63 @@ -# Этап 1: PHP зависимости -FROM dh-mirror.gitverse.ru/php:8.3-fpm AS phpbuild +# Этап 1: Сборка PHP зависимостей +FROM webdevops/php:8.3-alpine AS php-build -# Установка системных зависимостей В ОДНОМ RUN -RUN apt-get update && apt-get install -y \ +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 + +# Проверяем установленные расширения (для отладки) +RUN php -m && \ + php -i | grep gd && \ + php -i | grep redis + +# Установка дополнительных системных зависимостей, если нужно +RUN apk update && apk add --no-cache \ git \ - curl \ - wget \ unzip \ + # Для сборки некоторых зависимостей Composer libzip-dev \ - libxml2-dev \ - libicu-dev \ - libonig-dev \ - libpng-dev \ - libjpeg-dev \ - libfreetype6-dev \ - libwebp-dev \ - libpq-dev \ - libxslt1-dev \ - libexif-dev \ - libffi-dev \ - pkg-config \ - libssl-dev \ - # Устанавливаем PHP расширения - && docker-php-ext-configure gd \ - --with-freetype \ - --with-jpeg \ - --with-webp \ - && docker-php-ext-install -j$(nproc) \ - bcmath \ - intl \ - mbstring \ - zip \ - opcache \ - pdo \ - pdo_mysql \ - pdo_pgsql \ - gd \ - exif \ - sockets \ - xsl \ - ffi \ - pcntl \ - # Устанавливаем Redis - && pecl install redis \ - && docker-php-ext-enable redis \ - # Сразу чистим - && rm -rf /usr/src/* \ - && rm -rf /tmp/* \ - && rm -rf /var/tmp/* \ - && find / -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true \ - # Чистим apt - && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ - && rm -rf /var/lib/apt/lists/* - -# Настройка opcache для production -RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.memory_consumption=256" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.interned_strings_buffer=32" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.max_accelerated_files=32531" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/opcache.ini + oniguruma-dev \ + && docker-run-bootstrap # Установка Composer -COPY --from=dh-mirror.gitverse.ru/composer:2.7 /usr/bin/composer /usr/bin/composer +COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer -WORKDIR /var/www +WORKDIR /var/www/html -# Копирование файлов для установки зависимостей +# Копируем только файлы зависимостей (для лучшего кэширования слоев) COPY composer.json composer.lock ./ -# Установка PHP зависимостей +# Установка PHP зависимостей (NO DEV для production) RUN composer install \ + --no-interaction \ --no-progress \ --no-scripts \ --prefer-dist \ --optimize-autoloader \ - --apcu-autoloader + --apcu-autoloader \ + --no-dev -# Копируем исходный код +# Копируем остальной код COPY . . -# Установка прав -RUN chown -R www-data:www-data /var/www && \ - chmod -R 775 /var/www/storage /var/www/bootstrap/cache +# Выполняем скрипты post-install +#RUN composer run-script post-install-cmd -# Этап 2: Сборка фронтенда (Inertia + Vue 3) -FROM dh-mirror.gitverse.ru/node:20 AS jsbuild +# Оптимизируем автозагрузчик +RUN composer dump-autoload --optimize -# Установка дополнительных зависимостей для сборки -RUN apt-get update && apt-get install -y \ - python3 \ - make \ - g++ \ - && rm -rf /var/lib/apt/lists/* +# Устанавливаем права +RUN chown -R application:application /var/www/html && \ + chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache -WORKDIR /var/www +# Этап 2: Сборка фронтенда +FROM node:20-alpine AS node-build + +WORKDIR /var/www/html # Копируем зависимости Node.js COPY package.json package-lock.json* ./ @@ -105,108 +69,74 @@ RUN npm ci \ # Копируем файлы для сборки фронтенда COPY vite.config.js ./ -COPY resources/js ./resources/js/ -COPY resources/css ./resources/css/ +COPY resources/ ./resources/ -# Сборка ассетов Vite +# Сборка ассетов RUN npm run build -# Этап 3: Финальный образ -FROM dh-mirror.gitverse.ru/php:8.3-fpm +# Этап 3: Финальный production образ +FROM webdevops/php-nginx:8.3-alpine -RUN apt-get update && apt-get install -y \ - libxml2 \ - libonig5 \ - libpng16-16 \ - libjpeg62-turbo \ - libfreetype6 \ - libwebp7 \ - libpq5 \ - libxslt1.1 \ - libexif12 \ - libffi8 \ +# Production настройки +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 + +# Включаем дополнительные сервисы +#RUN docker-service enable cron && \ +# docker-service enable supervisor + +# Устанавливаем дополнительные пакеты, если нужны +RUN apk update && apk add --no-cache \ supervisor \ - nginx \ - cron \ - && rm -rf /var/lib/apt/lists/* - -# Установка системных зависимостей -RUN apt-get update && apt-get install -y \ - git \ - curl \ - wget \ - unzip \ - libzip-dev \ - libxml2-dev \ - libicu-dev \ - libonig-dev \ - libpng-dev \ - libjpeg-dev \ - libfreetype6-dev \ - libwebp-dev \ - libpq-dev \ - libxslt1-dev \ - libexif-dev \ - libffi-dev \ - pkg-config \ - libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -# Установка PHP расширений -RUN docker-php-ext-configure gd \ - --with-freetype \ - --with-jpeg \ - --with-webp \ - && docker-php-ext-install -j$(nproc) \ - bcmath \ - intl \ - mbstring \ - zip \ - opcache \ - pdo \ - pdo_mysql \ - pdo_pgsql \ - gd \ - exif \ - sockets \ - xsl \ - ffi \ - pcntl - -# Установка Redis расширения -RUN pecl install redis && docker-php-ext-enable redis - -# Настройка opcache для production -RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.memory_consumption=256" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.interned_strings_buffer=32" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.max_accelerated_files=32531" >> /usr/local/etc/php/conf.d/opcache.ini && \ - echo "opcache.validate_timestamps=0" >> /usr/local/etc/php/conf.d/opcache.ini - -# Копируем PHP расширения из первого этапа -#COPY --from=phpbuild /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/ -#COPY --from=phpbuild /usr/local/lib/php/extensions/no-debug-non-zts-20230831/ /usr/local/lib/php/extensions/no-debug-non-zts-20230831/ -#COPY --from=phpbuild /usr/local/bin/ /usr/local/bin/ + # Для планировщика Laravel + dcron \ + # Дополнительные утилиты + nano \ + htop \ + && docker-run-bootstrap # Копируем конфигурации 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 +WORKDIR /var/www/html -# Копируем приложение -COPY --chown=www-data:www-data --from=phpbuild /var/www . -COPY --chown=www-data:www-data --from=jsbuild /var/www/public/build ./public/build -COPY --chown=www-data:www-data --from=jsbuild /var/www/node_modules ./node_modules +# Копируем приложение из этапов сборки +COPY --chown=application:application --from=php-build /var/www/html . +COPY --chown=application:application --from=node-build /var/www/html/public/build ./public/build -# Настройка прав и оптимизация Laravel -RUN mkdir -p /var/log/supervisor && \ - chown -R www-data:www-data /var/www /var/log/supervisor && \ - chmod -R 775 /var/www/storage /var/www/bootstrap/cache +# Настраиваем права +RUN chown -R application:application /var/www/html && \ + chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache -# Создание ссылки на Storage +# Создаем символические ссылки RUN php artisan storage:link +# Кэшируем конфигурации Laravel для production +RUN php artisan config:cache && \ + php artisan route:cache && \ + php artisan view:cache + +# Проверяем расширения в финальном образе +RUN php -m | grep -E "(redis|gd|pdo_mysql|pdo_pgsql|zip|intl|opcache)" && \ + echo "✅ Все необходимые расширения установлены" + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD curl -f http://localhost/health || exit 1 + EXPOSE 80 -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] + +CMD ["supervisord", "-c", "/etc/supervisor.d/supervisord.conf"] diff --git a/docker-compose.yml b/docker-compose.yml index 77a2ae0..a18e592 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,22 +1,47 @@ services: #PHP Service app: - image: registry.brusoff.su/aokb-onboard:1.3 + image: registry.brusoff.su/aokb-onboard:1.4 build: . container_name: aokb_onboard_app restart: unless-stopped ports: - "8090:80" - working_dir: /var/www + working_dir: /var/www/html + environment: + - REDIS_HOST=redis # Явно указываем имя сервиса Redis + - REDIS_PORT=6379 + depends_on: + - redis volumes: - - ./.env:/var/www/.env + - ./.env:/var/www/html/.env - ./docker/php.ini:/usr/local/etc/php/conf.d/app.ini - ./docker/blocked_ips.map:/etc/nginx/blocked_ips.map - ./storage/logs:/var/www/storage/logs networks: - aokb-onboard-network + redis: + image: redis:8-alpine + container_name: aokb_onboard_redis + restart: unless-stopped + volumes: + - aokb-onboard-redis:/data + networks: + - aokb-onboard-network + expose: + - "6379" + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 30s + timeout: 10s + retries: 3 + #Docker Networks networks: aokb-onboard-network: driver: bridge + +volumes: + aokb-onboard-redis: + driver: local