# ============================================================================= # Dockerfile para Producción - App Padel API # Fase 7.4 - Go Live y Soporte # ============================================================================= # Multi-stage build para optimizar el tamaño de la imagen final # Node.js 20 Alpine para menor tamaño y mayor seguridad # ============================================================================= # ----------------------------------------------------------------------------- # Stage 1: Builder # Instala dependencias y compila TypeScript # ----------------------------------------------------------------------------- FROM node:20-alpine AS builder # Instalar dependencias del sistema necesarias para compilación RUN apk add --no-cache \ python3 \ make \ g++ \ openssl \ libc6-compat # Crear directorio de trabajo WORKDIR /app # Copiar archivos de dependencias primero (para caché de Docker) COPY package*.json ./ COPY prisma ./prisma/ # Instalar TODAS las dependencias (incluyendo devDependencies) RUN npm ci # Generar cliente Prisma RUN npx prisma generate # Copiar código fuente COPY . . # Compilar TypeScript RUN npm run build # ----------------------------------------------------------------------------- # Stage 2: Production # Imagen final optimizada con solo lo necesario # ----------------------------------------------------------------------------- FROM node:20-alpine AS production # Metadata de la imagen LABEL maintainer="Canchas Padel " LABEL version="1.0.0" LABEL description="API REST para App de Canchas de Pádel" # Instalar solo las dependencias del sistema necesarias para ejecutar RUN apk add --no-cache \ dumb-init \ curl \ && addgroup -g 1001 -S nodejs \ && adduser -S nodejs -u 1001 # Crear directorio de trabajo WORKDIR /app # Crear directorios necesarios con permisos correctos RUN mkdir -p logs uploads tmp \ && chown -R nodejs:nodejs /app # Copiar archivos de dependencias COPY --chown=nodejs:nodejs package*.json ./ COPY --chown=nodejs:nodejs prisma ./prisma/ # Instalar SOLO dependencias de producción # --omit=dev excluye devDependencies # --ignore-scripts evita ejecutar scripts post-install RUN npm ci --omit=dev --ignore-scripts && npm cache clean --force # Generar cliente Prisma para producción RUN npx prisma generate # Copiar código compilado desde el stage builder COPY --chown=nodejs:nodejs --from=builder /app/dist ./dist # Copiar archivos estáticos necesarios COPY --chown=nodejs:nodejs --from=builder /app/package.json ./package.json # Cambiar a usuario no-root por seguridad USER nodejs # Puerto expuesto EXPOSE 3000 # Health check # Verifica que la aplicación esté respondiendo cada 30 segundos HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/api/v1/health || exit 1 # Variables de entorno por defecto ENV NODE_ENV=production \ PORT=3000 \ LOG_LEVEL=info # Usar dumb-init para manejar señales de proceso correctamente ENTRYPOINT ["dumb-init", "--"] # Comando de inicio CMD ["node", "dist/index.js"] # ----------------------------------------------------------------------------- # Notas: # ----------------------------------------------------------------------------- # Build: # docker build -f Dockerfile.prod -t padel-api:latest . # # Run: # docker run -p 3000:3000 --env-file .env padel-api:latest # # Verificar health: # docker exec curl http://localhost:3000/api/v1/health # -----------------------------------------------------------------------------