FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV VIDEO_PROCESSING_FFMPEG_PATH=/usr/bin/ffmpeg ENV NODE_OPTIONS=--enable-source-maps RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.edge.kernel.org/g' /etc/apk/repositories \ && apk update \ && apk add --no-cache ffmpeg tini COPY package*.json ./ RUN npm ci --omit=dev \ && npm cache clean --force COPY --from=builder --chown=node:node /app/dist ./dist RUN mkdir -p /app/uploads \ && chown -R node:node /app/uploads USER node EXPOSE 4000 HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ CMD wget -q -O /dev/null http://127.0.0.1:4000/api/v1/health || exit 1 ENTRYPOINT ["/sbin/tini", "--"] CMD ["node", "dist/main.js"]