# ═══════════════════════════════════════════════ # Harat's Booking — Production Dockerfile # ═══════════════════════════════════════════════ # Client is pre-built by deploy.ps1 (npm run build) # This Dockerfile only handles server + copies dist # ═══════════════════════════════════════════════ # ── Stage 1: Server Dependencies ── FROM node:20-alpine AS server-deps WORKDIR /app COPY server/package.json server/package-lock.json* ./ RUN npm install --omit=dev # ── Stage 2: Prisma Generate ── FROM node:20-alpine AS prisma-gen WORKDIR /app COPY --from=server-deps /app/node_modules ./node_modules COPY server/prisma ./prisma COPY server/package.json ./ RUN npx prisma generate # ── Stage 3: Final Image ── FROM node:20-alpine WORKDIR /app # Runtime deps + pm2 RUN apk add --no-cache curl \ && npm install -g pm2@latest \ && pm2 install pm2-logrotate \ && pm2 set pm2-logrotate:max_size 10M \ && pm2 set pm2-logrotate:retain 7 \ && pm2 set pm2-logrotate:compress true # Don't run as root RUN addgroup -S harats && adduser -S harats -G harats \ && mkdir -p /data/logs \ && chown -R harats:harats /data # Copy production node_modules (with generated Prisma client) COPY --chown=harats:harats --from=prisma-gen /app/node_modules ./node_modules # Copy server compiled source COPY --chown=harats:harats server/dist ./dist COPY --chown=harats:harats server/prisma ./prisma # Copy shared package (workspace dependency) COPY --chown=harats:harats packages/shared/ ./node_modules/@harats/shared/ # Copy pre-built client dist COPY --chown=harats:harats client/dist ./public # Copy ecosystem config COPY --chown=harats:harats ecosystem.config.cjs ./ecosystem.config.cjs # Copy version.json COPY --chown=harats:harats version.json ./version.json # Version info (injected at build time) ARG BUILD_VERSION=0.0.0 ARG BUILD_DATE=unknown RUN echo "{\"version\":\"${BUILD_VERSION}\",\"build\":\"$(echo $BUILD_DATE | cut -c1-16)\",\"buildDate\":\"${BUILD_DATE}\"}" > version.json USER harats EXPOSE 3001 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD curl -sf http://localhost:3001/api/health || exit 1 CMD ["pm2-runtime", "ecosystem.config.cjs"]