FROM node:20-alpine AS builder # Install OpenSSL, Git, and Bash RUN apk add --no-cache openssl git bash curl # Install Bun for tinypdf-plus build RUN curl -fsSL https://bun.sh/install | bash && \ /root/.bun/bin/bun --version WORKDIR /app # Copy package files COPY package*.json ./ # Copy prisma directory if it exists, otherwise we'll handle it COPY prisma ./prisma/ # Install dependencies RUN npm install # Build tinypdf-plus package (add bun to PATH) RUN cd node_modules/tinypdf-plus && \ PATH=/root/.bun/bin:$PATH /root/.bun/bin/bun run build || \ (echo "tinypdf-plus build failed" && exit 1) # Copy source COPY . . # Generate Prisma Client RUN npx prisma generate # Build TypeScript RUN npm run build # Production image FROM node:20-alpine # Install OpenSSL for Prisma RUN apk add --no-cache openssl WORKDIR /app # Copy built files COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/package*.json ./ # Run as non-root USER node EXPOSE 3000 CMD ["sh", "-c", "npx prisma db push --skip-generate && npx prisma db seed && node dist/src/server.js"]