# syntax=docker/dockerfile:1 # --- Stage 0: Сборка Rust/Wasm --- FROM rust:1.80-slim AS wasm-builder RUN apt-get update && apt-get install -y pkg-config libssl-dev curl && \ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh WORKDIR /build COPY ./matrix-engine ./matrix-engine WORKDIR /build/matrix-engine # Собираем Wasm. Кэширование теперь полагается на слои Docker (Registry Cache) RUN cargo install wasm-bindgen-cli --version 0.2.100 --locked RUN wasm-pack build --target web --release # --- Stage 1: Установка зависимостей Node.js --- FROM node:20-alpine AS deps WORKDIR /app RUN npm install -g pnpm COPY package.json pnpm-lock.yaml* ./ RUN pnpm install --frozen-lockfile # --- Stage 2: Сборка Next.js --- FROM node:20-alpine AS builder WORKDIR /app RUN npm install -g pnpm COPY --from=deps /app/node_modules ./node_modules COPY . . # 1. Создаем директорию для статики движка RUN mkdir -p ./public/wasm-matrix/ # 2. Копируем результат компиляции Rust (wasm, glue js) COPY --from=wasm-builder /build/matrix-engine/pkg/* ./public/wasm-matrix/ # 3. КОПИРУЕМ КЛИЕНТСКИЕ ФАЙЛЫ ВОРКЕРА RUN cp matrix-engine/matrix_worker.js ./public/wasm-matrix/ && \ cp matrix-engine/shaders.js ./public/wasm-matrix/ && \ cp matrix-engine/gl-utils.js ./public/wasm-matrix/ # 3.1 Прописываем cache-busting версию (ENGINE_VERSION из NetrunnerMatrix.tsx) # в импорты воркера. Без этого matrix_worker.js?v=X кэш-бастится сам по себе # (см. NetrunnerMatrix.tsx), а его собственные `import ... from "./shaders.js"` # и "./gl-utils.js" — нет: после деплоя браузер/CDN может отдать по тому же # пути старую версию этих файлов, воркер не найдёт в ней нужный экспорт, # упадёт молча и никогда не пришлёт READY — на экране просто фон Hero # (белый/чёрный по теме) вместо матрицы, до жёсткой перезагрузки страницы. RUN ENGINE_VERSION=$(sed -n 's/.*ENGINE_VERSION = "\([^"]*\)".*/\1/p' matrix-engine/NetrunnerMatrix.tsx | head -1) && \ sed -i \ -e "s/^const version = \".*\";/const version = \"${ENGINE_VERSION}\";/" \ -e "s/from \"\.\/shaders\.js\";/from \".\/shaders.js?v=${ENGINE_VERSION}\";/" \ -e "s/from \"\.\/gl-utils\.js\";/from \".\/gl-utils.js?v=${ENGINE_VERSION}\";/" \ ./public/wasm-matrix/matrix_worker.js # 4. Собираем Next.js ENV NEXT_TELEMETRY_DISABLED=1 RUN pnpm run build # --- Stage 3: Продакшен сервер --- FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs COPY --from=builder /app/public ./public COPY --from=builder /app/.next ./.next COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json EXPOSE 3000 CMD ["npm", "start"]