53 lines
1.1 KiB
Docker
53 lines
1.1 KiB
Docker
# Stage 1: Frontend build
|
|
FROM node:20-alpine AS frontend-build
|
|
|
|
WORKDIR /app
|
|
|
|
# Копируем только frontend-зависимости
|
|
COPY package*.json ./
|
|
RUN npm ci
|
|
|
|
# Копируем весь проект (vite.config.ts, src/, public/, и т.д.)
|
|
COPY . .
|
|
|
|
# Сборка фронтенда
|
|
RUN npm run build
|
|
|
|
# Stage 2: Backend build
|
|
FROM node:20-alpine AS backend-build
|
|
|
|
WORKDIR /app
|
|
|
|
COPY package*.json ./
|
|
RUN npm ci --only=production
|
|
|
|
# Копируем сервер
|
|
COPY server/ ./server/
|
|
|
|
# Stage 3: Final production image
|
|
FROM node:20-alpine AS production
|
|
|
|
WORKDIR /app
|
|
|
|
# Установка production-зависимостей
|
|
COPY package*.json ./
|
|
RUN npm ci --only=production && npm cache clean --force
|
|
|
|
# Копируем backend
|
|
COPY server/ ./server/
|
|
|
|
# Копируем собранный frontend
|
|
COPY --from=frontend-build /app/dist ./public
|
|
|
|
# Создаём каталог для загрузок
|
|
RUN mkdir -p uploads
|
|
|
|
# Создаём non-root user
|
|
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
|
|
RUN chown -R nodejs:nodejs /app
|
|
USER nodejs
|
|
|
|
EXPOSE 3001
|
|
|
|
CMD ["node", "server/index.js"]
|