98 lines
2.6 KiB
Docker
98 lines
2.6 KiB
Docker
# Multi-stage build для оптимизации размера образа
|
||
|
||
# Development stage
|
||
FROM node:20-alpine AS development
|
||
|
||
WORKDIR /app
|
||
|
||
# Аргументы сборки для Next.js (должны быть доступны во время сборки)
|
||
ARG NEXT_PUBLIC_API_URL
|
||
ARG NEXT_PUBLIC_WS_URL
|
||
ARG NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
||
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
|
||
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем зависимости
|
||
RUN npm install
|
||
|
||
# Копируем остальные файлы
|
||
COPY . .
|
||
|
||
# Открываем порт
|
||
EXPOSE 3000
|
||
|
||
# Запускаем dev server с Turbopack
|
||
CMD ["npm", "run", "dev"]
|
||
|
||
# Production dependencies stage
|
||
FROM node:20-alpine AS production-deps
|
||
|
||
WORKDIR /app
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем только production зависимости
|
||
RUN npm ci --only=production && npm cache clean --force
|
||
|
||
# Production build stage
|
||
FROM node:20-alpine AS production-build
|
||
|
||
WORKDIR /app
|
||
|
||
# Аргументы сборки для Next.js
|
||
ARG NEXT_PUBLIC_API_URL
|
||
ARG NEXT_PUBLIC_WS_URL
|
||
ARG NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
||
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
|
||
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
|
||
|
||
# Копируем package files
|
||
COPY package*.json ./
|
||
|
||
# Устанавливаем все зависимости для сборки
|
||
RUN npm ci
|
||
|
||
# Копируем исходный код
|
||
COPY . .
|
||
|
||
# Папка public может отсутствовать — Next.js работает и без неё
|
||
RUN mkdir -p public
|
||
|
||
# Собираем приложение с оптимизацией
|
||
ENV NODE_ENV=production
|
||
RUN npm run build
|
||
|
||
# Production stage
|
||
FROM node:20-alpine AS production
|
||
|
||
WORKDIR /app
|
||
|
||
# Копируем собранное приложение (standalone mode)
|
||
COPY --from=production-build /app/.next/standalone ./
|
||
COPY --from=production-build /app/.next/static ./.next/static
|
||
COPY --from=production-build /app/public ./public
|
||
|
||
# Создаем непривилегированного пользователя
|
||
RUN addgroup --system --gid 1001 nodejs
|
||
RUN adduser --system --uid 1001 nextjs
|
||
RUN chown -R nextjs:nodejs /app
|
||
USER nextjs
|
||
|
||
# Открываем порт
|
||
EXPOSE 3000
|
||
|
||
ENV NODE_ENV=production
|
||
ENV PORT=3000
|
||
ENV HOSTNAME="0.0.0.0"
|
||
|
||
# Запускаем production server
|
||
CMD ["node", "server.js"]
|