# syntax=docker/dockerfile:1.7 FROM node:22-alpine AS frontend-builder WORKDIR /workspace COPY frontend/package.json frontend/package-lock.json ./frontend/ COPY frontend-admin/package.json frontend-admin/package-lock.json ./frontend-admin/ RUN --mount=type=cache,target=/root/.npm \ npm --prefix frontend ci && npm --prefix frontend-admin ci COPY frontend ./frontend COPY frontend-admin ./frontend-admin COPY scripts ./scripts COPY backend/public ./backend/public RUN npm --prefix frontend run build && npm --prefix frontend-admin run build FROM php:8.2-fpm-bookworm AS app WORKDIR /var/www/backend RUN apt-get update \ && apt-get install -y --no-install-recommends \ curl \ ffmpeg \ fonts-noto-cjk \ libfreetype6-dev \ libjpeg62-turbo-dev \ libonig-dev \ libpng-dev \ libwebp-dev \ libzip-dev \ poppler-utils \ unzip \ && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-install -j"$(nproc)" gd mbstring pdo_mysql zip \ && mkdir -p /usr/local/share/cosyvoice \ && curl -fsSL --retry 3 \ https://raw.githubusercontent.com/FunAudioLLM/CosyVoice/main/asset/zero_shot_prompt.wav \ -o /usr/local/share/cosyvoice/zero_shot_prompt.wav \ && echo "c7b31d6dbe7cc6a716dded00550db5b50940bf209e424e4ad207b12e657c8ff6 /usr/local/share/cosyvoice/zero_shot_prompt.wav" | sha256sum -c - \ && rm -rf /var/lib/apt/lists/* COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer COPY backend/composer.json backend/composer.lock ./ RUN --mount=type=cache,target=/tmp/composer-cache \ COMPOSER_CACHE_DIR=/tmp/composer-cache composer install \ --no-dev --no-interaction --no-progress --prefer-dist \ --no-scripts --optimize-autoloader COPY backend ./ COPY --from=frontend-builder /workspace/backend/public ./public RUN composer run-script post-autoload-dump --no-interaction \ && mkdir -p runtime uploads storage/cosyvoice \ && chown -R www-data:www-data runtime uploads storage COPY deploy/docker/php.ini /usr/local/etc/php/conf.d/99-app.ini COPY deploy/docker/php-fpm.conf /usr/local/etc/php-fpm.d/zz-app.conf COPY deploy/docker/app-entrypoint.sh /usr/local/bin/app-entrypoint RUN chmod +x /usr/local/bin/app-entrypoint ENTRYPOINT ["app-entrypoint"] FROM nginx:1.28-alpine AS web COPY deploy/docker/nginx.conf /etc/nginx/conf.d/default.conf COPY --from=frontend-builder /workspace/backend/public /var/www/backend/public