FROM node:18 AS builder WORKDIR /app # Install pnpm RUN npm i -g pnpm # Copy package files first for better caching COPY package.json pnpm-lock.yaml ./ # Install dependencies RUN pnpm install --frozen-lockfile # Copy source code COPY . . # Build the application RUN pnpm run build # Production stage FROM node:18 AS runtime WORKDIR /app # We don't need the standalone Chromium ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # Install Google Chrome Stable and fonts # Note: this installs the necessary libs to make the browser work with Puppeteer. RUN apt-get update && apt-get install curl gnupg -y \ && curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ && apt-get update \ && apt-get install google-chrome-stable -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install pnpm RUN npm i -g pnpm # Copy built application and package files COPY --from=builder /app/dist ./dist COPY --from=builder /app/package.json /app/pnpm-lock.yaml ./ # Install production dependencies RUN pnpm install --prod --frozen-lockfile && pnpm store prune # Set environment variables ENV HOST=0.0.0.0 \ PORT=4321 \ NODE_ENV=production # Expose port EXPOSE 4321 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:4321/ || exit 1 # Start the application CMD ["node", "./dist/server/entry.mjs"]