FROM node:20-slim AS base # Install Claude Code CLI RUN npm install -g @anthropic-ai/claude-code # Install Playwright browsers (for ad creative generation) RUN npx playwright install chromium --with-deps FROM base AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npx prisma generate RUN npm run build FROM base AS runner WORKDIR /app ENV NODE_ENV=production ENV HOME=/home/node # Create Claude credentials directory with correct ownership RUN mkdir -p /home/node/.claude && chown -R node:node /home/node COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/lib/generated ./lib/generated COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json COPY --from=builder /app/prisma.config.ts ./prisma.config.ts # Copy the marketing pipeline COPY pipeline/ ./pipeline/ # Startup script: ensure DB exists, then start server RUN printf '#!/bin/sh\nnpx prisma db push 2>&1 || true\nnpx prisma db seed 2>&1 || true\nnode server.js\n' > /app/start.sh && chmod +x /app/start.sh # Ensure node user owns the app directory RUN chown -R node:node /app USER node EXPOSE 3000 CMD ["/app/start.sh"]