# Build stage FROM node:20-alpine AS builder WORKDIR /app # Copy workspace root files COPY package*.json ./ COPY packages/shared ./packages/shared COPY packages/api ./packages/api # Install dependencies RUN npm install # Build shared package WORKDIR /app/packages/shared RUN npm run build # Build API WORKDIR /app/packages/api RUN npm run prisma:generate RUN npm run build # Production stage FROM node:20-alpine # Install OpenSSL for Prisma and Python for recipe-scrapers RUN apk add --no-cache openssl python3 py3-pip # Install recipe-scrapers Python package RUN pip3 install --break-system-packages recipe-scrapers WORKDIR /app # Copy built files and dependencies COPY --from=builder /app/package*.json ./ COPY --from=builder /app/packages/shared/package.json ./packages/shared/ COPY --from=builder /app/packages/shared/dist ./packages/shared/dist COPY --from=builder /app/packages/api/package.json ./packages/api/ COPY --from=builder /app/packages/api/dist ./packages/api/dist COPY --from=builder /app/packages/api/prisma ./packages/api/prisma COPY --from=builder /app/packages/api/scripts ./packages/api/scripts COPY --from=builder /app/node_modules ./node_modules WORKDIR /app/packages/api # Create uploads directory and make Python script executable RUN mkdir -p /app/uploads && chmod +x scripts/scrape_recipe.py EXPOSE 3001 CMD ["sh", "-c", "npx prisma migrate deploy && node dist/index.js"]