115 lines
4.4 KiB
Docker
115 lines
4.4 KiB
Docker
# syntax=docker/dockerfile:1.7
|
|
|
|
FROM python:3.11-slim-trixie AS fastapi-builder
|
|
|
|
WORKDIR /app/servers/fastapi
|
|
|
|
ENV UV_COMPILE_BYTECODE=1 \
|
|
UV_LINK_MODE=copy
|
|
|
|
RUN python -m venv --without-pip /opt/venv \
|
|
&& pip install --no-cache-dir uv
|
|
|
|
COPY servers/fastapi/pyproject.toml servers/fastapi/uv.lock ./
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv export --frozen --no-dev --no-emit-project -o /tmp/requirements.txt \
|
|
&& uv pip install --python /opt/venv/bin/python -r /tmp/requirements.txt
|
|
|
|
COPY servers/fastapi /app/servers/fastapi
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv pip install --python /opt/venv/bin/python --no-deps .
|
|
# mem0/spaCy BM25 lemmatization loads en_core_web_sm at runtime; spaCy tries pip to
|
|
# download it otherwise. Runtime image has no pip in PATH (--without-pip venv).
|
|
RUN --mount=type=cache,target=/root/.cache/uv \
|
|
uv pip install --python /opt/venv/bin/python \
|
|
"https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl"
|
|
RUN --mount=type=cache,target=/root/.cache \
|
|
/opt/venv/bin/python scripts/warm_fastembed_cache.py
|
|
|
|
|
|
FROM node:20-bookworm-slim AS nextjs-builder
|
|
|
|
WORKDIR /app/servers/nextjs
|
|
|
|
ENV NEXT_TELEMETRY_DISABLED=1
|
|
|
|
COPY servers/nextjs/package.json servers/nextjs/package-lock.json ./
|
|
RUN --mount=type=cache,target=/root/.npm \
|
|
npm ci
|
|
|
|
COPY servers/nextjs /app/servers/nextjs
|
|
RUN npm run build \
|
|
&& rm -rf .next-build/cache
|
|
|
|
|
|
FROM node:20-bookworm-slim AS assets-builder
|
|
|
|
WORKDIR /app
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates unzip \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY package.json /app/
|
|
|
|
RUN mkdir -p /app/document-extraction-liteparse \
|
|
&& npm --prefix /app/document-extraction-liteparse init -y \
|
|
&& npm --prefix /app/document-extraction-liteparse install @llamaindex/liteparse@1.4.0 --omit=dev
|
|
|
|
COPY electron/resources/document-extraction/liteparse_runner.mjs /app/document-extraction-liteparse/liteparse_runner.mjs
|
|
COPY scripts/sync-presentation-export.cjs /app/scripts/sync-presentation-export.cjs
|
|
# Bundled export still loads @img/sharp-* native addons from node_modules (not inlined).
|
|
RUN node /app/scripts/sync-presentation-export.cjs --force \
|
|
&& chmod +x /app/presentation-export/py/convert-linux-x64 \
|
|
&& cd /app/presentation-export \
|
|
&& npm init -y \
|
|
&& npm install "sharp@^0.34.5" --include=optional --omit=dev --no-fund --no-audit --no-package-lock
|
|
|
|
|
|
FROM python:3.11-slim-trixie AS runtime
|
|
|
|
WORKDIR /app
|
|
|
|
ARG INSTALL_TESSERACT=true
|
|
ARG INSTALL_LIBREOFFICE=true
|
|
|
|
# LiteParse uses Node + @llamaindex/liteparse (same runner as Electron); OCR uses Tesseract.
|
|
ENV APP_DATA_DIRECTORY=/app_data \
|
|
TEMP_DIRECTORY=/tmp/presenton \
|
|
EXPORT_PACKAGE_ROOT=/app/presentation-export \
|
|
EXPORT_RUNTIME_DIR=/app/presentation-export \
|
|
BUILT_PYTHON_MODULE_PATH=/app/presentation-export/py/convert-linux-x64 \
|
|
PRESENTON_APP_ROOT=/app \
|
|
PATH="/opt/venv/bin:${PATH}" \
|
|
NODE_ENV=production \
|
|
START_OLLAMA=false
|
|
|
|
RUN set -eux; \
|
|
packages="ca-certificates curl nginx fontconfig imagemagick zstd"; \
|
|
if [ "$INSTALL_LIBREOFFICE" = "true" ]; then packages="$packages libreoffice"; fi; \
|
|
if [ "$INSTALL_TESSERACT" = "true" ]; then packages="$packages tesseract-ocr tesseract-ocr-eng"; fi; \
|
|
apt-get update; \
|
|
apt-get install -y --no-install-recommends $packages; \
|
|
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -; \
|
|
apt-get install -y --no-install-recommends nodejs; \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN mkdir -p /app/scripts /app/servers/fastapi /app/servers/nextjs
|
|
|
|
COPY --from=fastapi-builder /opt/venv /opt/venv
|
|
COPY --from=fastapi-builder /app/servers/fastapi /app/servers/fastapi
|
|
|
|
COPY --from=assets-builder /app/package.json /app/package.json
|
|
COPY --from=assets-builder /app/document-extraction-liteparse /app/document-extraction-liteparse
|
|
COPY --from=assets-builder /app/presentation-export /app/presentation-export
|
|
COPY --from=assets-builder /app/scripts/sync-presentation-export.cjs /app/scripts/sync-presentation-export.cjs
|
|
|
|
COPY --from=nextjs-builder /app/servers/nextjs/.next-build/standalone/ /app/servers/nextjs/
|
|
COPY --from=nextjs-builder /app/servers/nextjs/public /app/servers/nextjs/public
|
|
COPY --from=nextjs-builder /app/servers/nextjs/.next-build/static /app/servers/nextjs/.next-build/static
|
|
|
|
COPY start.js LICENSE NOTICE ./
|
|
COPY nginx.conf /etc/nginx/nginx.conf
|
|
|
|
EXPOSE 80
|
|
CMD ["node", "/app/start.js"]
|