# 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* ./ # КЭШИРУЕМ: Хранилище pnpm 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 . . # Копируем Wasm ДО билда Next.js COPY --from=wasm-builder /build/matrix-engine/pkg/matrix_engine_bg.wasm ./public/wasm-matrix/ COPY --from=wasm-builder /build/matrix-engine/pkg/matrix_engine.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"]