The minimalistic document archiving platform.
docker pull papra-hq/papra:latest
docker run -d --name papra -p 1221:1221 --restart always papra-hq/papra:latest
podman run -d --name papra -p 1221:1221 --restart always papra-hq/papra:latest
skopeo inspect docker://docker.io/papra-hq/papra:latest
oras pull papra-hq/papra:latest
# syntax = docker/dockerfile:1@sha256:87999aa3d42bdc6bea60565083ee17e86d1f3339802f543c0d03998580f9cb89
FROM node:26.12.1-slim@sha256:36793bcbb160a6a16cede1e62b93f84e26b78a972a8a4c0b879c1c12f22761ec AS base
LABEL fly_launch_runtime="Node.js"
ARG PNPM_VERSION=12.4.2
RUN npm install -g pnpm@${PNPM_VERSION}
WORKDIR /app
ENV NODE_ENV="production"
# -----------------
FROM base AS build
# Install packages needed by some node modules
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential node-gyp pkg-config python-is-python3
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
COPY packages/lecture/package.json ./packages/lecture/package.json
COPY packages/webhooks/package.json ./packages/webhooks/package.json
COPY packages/search-parser/package.json ./packages/search-parser/package.json
COPY packages/std/package.json ./packages/std/package.json
COPY apps/papra-server/package.json ./apps/papra-server/package.json
RUN pnpm install --frozen-lockfile --ignore-scripts
COPY packages/lecture ./packages/lecture
COPY packages/webhooks ./packages/webhooks
COPY packages/search-parser ./packages/search-parser
COPY packages/std ./packages/std
COPY apps/papra-server ./apps/papra-server
RUN pnpm --filter "@papra/app-server..." run build
RUN pnpm --filter @papra/app-server --prod deploy /app/production
# -----------------
FROM base
ENV NODE_ENV="production"
ENV PORT=1221
# Install Tesseract OCR
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y tesseract-ocr tesseract-ocr-all && \
rm -rf /var/lib/apt/lists/*
COPY --from=build /app/production /app
COPY pnpm-workspace.yaml ./
EXPOSE 1221
# The command is overridden by Fly at runtime, see ./fly.toml
CMD [ "pnpm", "--silent", "start:with-migrations" ]