FROM node:20-alpine AS base # Устанавливаем зависимости необходимые для Puppeteer и Prisma RUN apk add --no-cache \ chromium \ nss \ freetype \ harfbuzz \ ca-certificates \ ttf-freefont \ openssl \ gcompat \ wget # Устанавливаем переменные окружения для Puppeteer ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser # Устанавливаем рабочую директорию WORKDIR /app # Установка зависимостей FROM base AS deps COPY package.json package-lock.json ./ RUN npm ci # Сборка приложения FROM base AS builder COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npx prisma generate RUN npm run build # Убираем строгую проверку наличия файлов, создаем пустые файлы если нужно RUN mkdir -p ./public/images && \ touch ./public/images/logo.png && \ touch ./public/images/no-image.svg && \ echo "Статические файлы готовы (созданы пустые файлы если оригиналы отсутствовали)" # Запуск приложения FROM base AS runner ENV NODE_ENV production # Создаем директории для статических файлов RUN mkdir -p /app/public/images/cache # Копируем необходимые файлы с builder COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/src/generated ./src/generated COPY --from=builder /app/package.json ./package.json COPY --from=builder /app/public/images /app/public/images # Создаем пустые файлы изображений, если они не существуют RUN if [ ! -f /app/public/images/logo.png ]; then \ echo "Создаем пустой файл logo.png"; \ touch /app/public/images/logo.png; \ fi && \ if [ ! -f /app/public/images/no-image.svg ]; then \ echo "Создаем пустой файл no-image.svg"; \ echo 'No Image' > /app/public/images/no-image.svg; \ fi # Настраиваем права доступа к директории кэша RUN chmod -R 777 /app/public/images/cache # Экспортируем порт EXPOSE 3000 # Создаем скрипт для запуска с предварительной генерацией клиента Prisma RUN echo '#!/bin/sh' > /app/entrypoint.sh && \ echo 'echo "Checking environment..."' >> /app/entrypoint.sh && \ echo 'echo "Создаем необходимые директории и файлы..."' >> /app/entrypoint.sh && \ echo 'mkdir -p /app/public/images/cache' >> /app/entrypoint.sh && \ echo 'if [ ! -f /app/public/images/logo.png ]; then' >> /app/entrypoint.sh && \ echo ' echo "Создаем пустой файл logo.png"' >> /app/entrypoint.sh && \ echo ' touch /app/public/images/logo.png' >> /app/entrypoint.sh && \ echo 'fi' >> /app/entrypoint.sh && \ echo 'if [ ! -f /app/public/images/no-image.svg ]; then' >> /app/entrypoint.sh && \ echo ' echo "Создаем файл no-image.svg"' >> /app/entrypoint.sh && \ echo ' echo "No Image" > /app/public/images/no-image.svg' >> /app/entrypoint.sh && \ echo 'fi' >> /app/entrypoint.sh && \ echo 'chmod -R 777 /app/public/images/cache' >> /app/entrypoint.sh && \ echo 'echo "Все статические файлы готовы"' >> /app/entrypoint.sh && \ echo 'echo "Generating Prisma client..."' >> /app/entrypoint.sh && \ echo 'npx prisma generate' >> /app/entrypoint.sh && \ echo 'if [ "$RUN_MIGRATIONS" = "true" ]; then' >> /app/entrypoint.sh && \ echo ' echo "Running database migrations..."' >> /app/entrypoint.sh && \ echo ' npx prisma migrate deploy' >> /app/entrypoint.sh && \ echo 'fi' >> /app/entrypoint.sh && \ echo 'echo "Starting server..."' >> /app/entrypoint.sh && \ echo 'exec node server.js' >> /app/entrypoint.sh && \ chmod +x /app/entrypoint.sh # Запускаем приложение через скрипт CMD ["/app/entrypoint.sh"]