# syntax=docker/dockerfile:1 # Образ `web` = nginx + собранная SPA + конфиг (TLS, прокси на api, X-Accel-раздача аудио). # Сборка из корня репозитория: docker build -f apps/web/Dockerfile --build-arg VERSION=1.2.3 . FROM node:22-alpine AS build RUN npm install -g pnpm@11.9.0 WORKDIR /repo # Сначала только манифесты workspace: слой с установкой зависимостей пересобирается лишь при их изменении, # а не при любой правке кода. Новый пакет в apps/ или packages/ — добавить его package.json сюда. COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ # pnpm-патчи зависимостей (lockfile ссылается на них, без них --frozen-lockfile падает) COPY patches/ patches/ COPY apps/web/package.json apps/web/ COPY apps/mobile/package.json apps/mobile/ COPY packages/api-client/package.json packages/api-client/ COPY packages/core/package.json packages/core/ COPY packages/design-tokens/package.json packages/design-tokens/ COPY packages/i18n/package.json packages/i18n/ RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile --filter @pipu/web... COPY . . # Сгенерированные клиенты и токены лежат в репозитории (их актуальность проверяет CI), поэтому generate здесь не нужен. RUN pnpm --filter @pipu/web build FROM nginx:1.28-alpine COPY deploy/nginx/default.conf.template /etc/nginx/templates/default.conf.template COPY deploy/nginx/security-headers.conf /etc/nginx/snippets/security-headers.conf COPY --from=build /repo/apps/web/dist /usr/share/nginx/html ARG VERSION=0.0.0-dev LABEL org.opencontainers.image.version=${VERSION} ENV API_UPSTREAM=api:8080 EXPOSE 80