/
kochkatech
/
CorpGame
Обзор
Документация
Войти
/
kochkatech
/
CorpGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
master
Dockerfile
52 строки
3 KB
kochkareal
feat(devops): свод к одному процессу Node на SQLite, портативная сборка без Docker; аудит безопасности
06 авг 2026, 15:06
06 авг 2026, 15:06
3266bcd
Код
Авторство
О чём код?
# syntax=docker/dockerfile:1 # # Один образ на всю игру: раньше было 5 контейнеров (postgres, redis, backend, frontend-nginx, # edge-nginx) — теперь сервер сам раздаёт и API, и собранный фронтенд, а база — файл SQLite # в примонтированном томе. Контекст сборки — корень репозитория (нужен доступ и к backend/, # и к frontend/ в одном многоступенчатом Dockerfile). # # Обе сборочные стадии и рантайм-стадия — на одной базе (node:20-alpine, musl): нативный # движок Prisma компилируется под конкретный libc, смешивать alpine/debian между стадиями нельзя. FROM node:20-alpine AS frontend-build WORKDIR /app/frontend COPY frontend/package.json frontend/package-lock.json ./ RUN --mount=type=cache,target=/root/.npm npm ci COPY frontend/ . RUN npm run build FROM node:20-alpine AS backend-build RUN apk add --no-cache openssl WORKDIR /app/backend COPY backend/package.json backend/package-lock.json ./ RUN --mount=type=cache,target=/root/.npm npm ci COPY backend/ . RUN npx prisma generate # npm run build уже собирает backend/prisma/template.db (backend/scripts/generate-template-db.js) # один раз здесь, на стадии сборки образа — а не при каждом старте контейнера. Раньше CMD # запускал `npx prisma migrate deploy` на каждом старте, а он ещё и тянул CLI prisma # (devDependency, в рантайм-образе её нет) из сети через npx. Офлайн это было бы фатально. RUN npm run build FROM node:20-alpine RUN apk add --no-cache openssl WORKDIR /app ENV NODE_ENV=production COPY backend/package.json backend/package-lock.json ./ # --ignore-scripts: без CLI prisma (не входит в prod-зависимости) постинсталл # @prisma/client не смог бы перегенерировать клиент — используем уже собранный на # предыдущей стадии (COPY .prisma ниже), как и в портативной сборке (build-portable.ps1). # --omit=peer: @prisma/client объявляет `prisma`/`typescript` как peerDependencies — npm # доустанавливает пиры независимо от --omit=dev, иначе в образ тянутся CLI prisma (~50 МБ) # и typescript (~23 МБ) со всем деревом зависимостей, рантайму не нужные. RUN --mount=type=cache,target=/root/.npm npm ci --omit=dev --omit=peer --ignore-scripts COPY --from=backend-build /app/backend/dist ./server COPY --from=backend-build /app/backend/node_modules/.prisma ./node_modules/.prisma COPY --from=backend-build /app/backend/prisma/template.db ./prisma/template.db COPY --from=frontend-build /app/frontend/dist ./client EXPOSE 3000 VOLUME /data CMD ["node", "server/main.js"]