31368fdc17
Builder-стейдж — node:20-alpine, там busybox grep, не понимающий -P/\K (перловый lookbehind). Локально с GNU grep всё работало, в CI на alpine падало с exit 2 ещё до sed. Извлекает ENGINE_VERSION чистым POSIX sed вместо grep -oP.
75 lines
3.2 KiB
Docker
75 lines
3.2 KiB
Docker
# 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"] |