# Build stage FROM node:24-alpine3.23 AS builder RUN apk add --no-cache build-base yaml-dev ARG UID=1000 ARG GID=1000 USER ${UID}:${GID} WORKDIR /app # Install all deps (including dev, which is needed for tsc, tsc-alias, prisma) COPY --chown=${UID}:${GID} package*.json ./ RUN npm ci --frozen-lockfile COPY --chown=${UID}:${GID} prisma ./prisma/ COPY --chown=${UID}:${GID} ./prisma.config.ts ./ RUN npx prisma generate COPY --chown=${UID}:${GID} . . # Compile TS and spit on dist/ RUN npm run build RUN cp -r src/static dist/static # Runtime stage FROM node:24-alpine3.23 RUN apk add --no-cache bash postgresql17-client valkey-cli yaml-dev ARG UID=1000 ARG GID=1000 USER ${UID}:${GID} WORKDIR /app # Only prod deps COPY --chown=${UID}:${GID} package*.json ./ RUN npm ci --frozen-lockfile --omit=dev # Prisma client generated in builder COPY --from=builder --chown=${UID}:${GID} /app/node_modules/.prisma ./node_modules/.prisma # Compiled output and prisma schema (needed for migrate deploy) COPY --from=builder --chown=${UID}:${GID} /app/dist ./dist COPY --chown=${UID}:${GID} prisma ./prisma/ COPY --chown=${UID}:${GID} prisma.config.ts ./ EXPOSE 3000 # migrate then start CMD ["sh", "-c", "npx prisma migrate deploy && npm run prod"]