# Multi-stage build для оптимизации размера образа # Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app # Копировать package files COPY package*.json ./ # Установить зависимости RUN npm ci --only=production # Копировать исходники COPY . . # Собрать проект RUN npm run build # Stage 2: Runtime FROM node:20-alpine WORKDIR /app # Установить dumb-init для правильной обработки сигналов RUN apk add --no-cache dumb-init # Создать пользователя без root RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 # Копировать зависимости из builder COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist COPY --from=builder --chown=nodejs:nodejs /app/package.json ./ COPY --from=builder --chown=nodejs:nodejs /app/wrangler.jsonc ./ COPY --from=builder --chown=nodejs:nodejs /app/migrations ./migrations COPY --from=builder --chown=nodejs:nodejs /app/seed.sql ./ # Создать директорию для локальной БД RUN mkdir -p .wrangler/state/v3/d1 && \ chown -R nodejs:nodejs .wrangler # Переключиться на непривилегированного пользователя USER nodejs # Открыть порт EXPOSE 3000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD wget --quiet --tries=1 --spider http://localhost:3000 || exit 1 # Запуск с dumb-init ENTRYPOINT ["dumb-init", "--"] # Команда запуска CMD ["sh", "-c", "npm run db:reset && npx wrangler pages dev dist --d1=webapp-production --local --ip 0.0.0.0 --port 3000"]