# 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 # КЭШИРУЕМ: Реестр Cargo и папку target. RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/build/matrix-engine/target \ 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 --mount=type=cache,target=/root/.local/share/pnpm/store \ 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 . . # Создаем директорию заранее RUN mkdir -p ./public/wasm-matrix/ # Копируем ВЕСЬ контент из pkg (там matrix_engine.js, matrix_engine_bg.js и .wasm) # Это критично, так как они зависят друг от друга COPY --from=wasm-builder /build/matrix-engine/pkg/* ./public/wasm-matrix/ # Копируем сам воркер поверх (если он не попал в pkg ранее) RUN cp matrix-engine/matrix_worker.js public/wasm-matrix/ 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"]