# QR Presentation — self-contained image (Node + LibreOffice + ffmpeg) FROM node:20-bookworm-slim ENV DEBIAN_FRONTEND=noninteractive # LibreOffice handles Office/OpenDocument -> PDF; ffmpeg normalises video; # fonts make converted decks render correctly. RUN apt-get update && apt-get install -y --no-install-recommends \ libreoffice-impress \ libreoffice-writer \ libreoffice-calc \ ffmpeg \ curl ca-certificates \ fonts-liberation fonts-dejavu-core fonts-noto-core \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY package.json package-lock.json* ./ RUN npm install --omit=dev --no-audit --no-fund COPY . . # Vendor PDF.js so the viewer works even on an offline / air-gapped network. RUN mkdir -p public/vendor/pdfjs \ && curl -fsSL https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js -o public/vendor/pdfjs/pdf.min.js \ && curl -fsSL https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js -o public/vendor/pdfjs/pdf.worker.min.js ENV NODE_ENV=production \ DATA_DIR=/data \ HOME=/tmp \ PORT=3000 # LibreOffice needs a writable home for its profile. RUN mkdir -p /data && chown -R node:node /data /tmp USER node VOLUME ["/data"] EXPOSE 3000 CMD ["node", "server/index.js"]