FROM node:20-alpine # Optional mirror for Alpine packages (helps avoid transient I/O errors on dl-cdn) ARG ALPINE_MIRROR= RUN if [ -n "$ALPINE_MIRROR" ]; then sed -i "s|dl-cdn.alpinelinux.org|$ALPINE_MIRROR|g" /etc/apk/repositories; fi WORKDIR /app # Python + python-docx (нужен для обработки DOCX-шаблонов, если будем расширять) RUN apk add --no-cache python3 py3-pip py3-lxml \ && pip3 install --break-system-packages python-docx \ && rm -rf /root/.cache/pip # Chromium + шрифты для Playwright ENV PLAYWRIGHT_CHROMIUM_PATH=/usr/bin/chromium-browser RUN apk add --no-cache \ chromium \ nss \ freetype \ harfbuzz \ ca-certificates \ ttf-freefont \ font-noto \ ttf-dejavu \ fontconfig \ libstdc++ # LibreOffice для конвертации DOCX→PDF и EMF→PNG RUN apk add --no-cache \ libreoffice \ libreoffice-draw RUN fc-cache -fv # Копируем package.json + package-lock.json и устанавливаем зависимости COPY server/documents/worker/package.json ./worker/package.json COPY server/documents/worker/package-lock.json ./worker/package-lock.json RUN cd /app/worker && npm ci --production # Копируем код worker COPY server/documents/worker ./worker WORKDIR /app/worker # Контейнер не работает от root: отдельный пользователь app. # HOME=/tmp — LibreOffice/Chromium пишут профили в домашнюю директорию. RUN adduser -D app && chown -R app:app /app ENV npm_config_cache=/tmp/.npm \ HOME=/tmp USER app EXPOSE 3000 ENTRYPOINT ["npm", "run", "start"]