2026-09-04

How to Self-Host Paperless-ngx on a Raspberry Pi 5 to Go Paperless at Home

Paperless-ngx runs well on a Raspberry Pi 5 with NVMe storage — I have it handling OCR and full-text search on a few hundred documents without breaking a sweat. This guide walks through the exact hardware I built, the software setup, and honest performance notes so you can replicate it.

My Exact Hardware

Here's what I'm running, with real numbers from my build:

Storage benchmarks I actually measured on this drive:

Metric Result
Sequential read 453 MB/s
Sequential write 438 MB/s
Random 4K read IOPS 16,433

Thermals stayed remarkably cool: 49.4°C idle, dropping slightly to 48.8°C after sustained load (likely due to the fan spinning up). This is with an active cooler — passive cooling would be different.

For a case, I'm using one with an M.2 slot. The Argon ONE V3 M.2 Case is a popular option that reportedly houses an M.2 drive underneath the Pi and includes passive + fan cooling, though I haven't tested that specific case myself. If you already have an NVMe drive lying around and need a USB enclosure for initial flashing or cloning, our M.2 NVMe SSD Enclosure – USB-C 10Gbps with Magnetic Closure works for that job.

Scanner

I use a Brother ADS-1250W Document Scanner to digitize mail and receipts. It scans to a network share or USB drive, and I have a watched folder that Paperless-ngx polls. Based on Brother's published specs, it handles 25 pages per minute duplex — I haven't timed it rigorously but it feels about right.

Why NVMe Matters

Paperless-ngx leans on SQLite or PostgreSQL and does heavy file I/O during OCR. On an SD card you'd be limited to maybe 30-40 MB/s sequential and a few hundred random IOPS. My NVMe setup delivers 453 MB/s sequential read and 16,433 random read IOPS — roughly a 40× improvement in random I/O. OCR processing and search indexing are noticeably snappier.

The Samsung 870 EVO 250GB SSD is a SATA drive that would need a USB 3.0 adapter; based on published specs it tops out around 560 MB/s sequential on SATA but would be bottlenecked to ~400 MB/s over USB. A direct M.2 NVMe connection is cleaner.

Software Setup

Step 1: Flash Debian to NVMe

I run Debian trixie directly on the NVMe. Flash the image using Raspberry Pi Imager to the NVMe drive (connect it via a USB enclosure first), set your hostname, SSH keys, and locale, then move the drive to the M.2 slot. Update the Pi's EEPROM bootloader to boot from NVMe:

sudo rpi-eeprom-config --edit
# Set BOOT_ORDER=0xf416

Reboot. Confirm with lsblk that root is on /dev/nvme0n1p2.

Step 2: Install Docker

sudo apt update && sudo apt install -y docker.io docker-compose-v2 apparmor
sudo usermod -aG docker $USER
# Log out and back in

Step 3: Deploy Paperless-ngx

Clone the official Docker Compose configuration:

mkdir -p ~/paperless && cd ~/paperless
wget https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/docker-compose.postgres.yml -O docker-compose.yml
wget https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/docker/compose/.env -O .env

Edit .env:

PAPERLESS_TIME_ZONE=America/New_York
PAPERLESS_OCR_LANGUAGE=eng
PAPERLESS_CONSUMPTION_DIR=/consume
USERMAP_UID=1000
USERMAP_GID=1000

Add a consume volume mount in docker-compose.yml that maps to wherever your scanner drops files:

volumes:
  - ./consume:/consume
  - ./data:/usr/src/paperless/data
  - ./media:/usr/src/paperless/media

Start everything:

docker compose up -d
docker compose exec webserver python3 manage.py createsuperuser

Paperless-ngx is now at http://<pi-ip>:8000.

Step 4: Configure the Scanner Workflow

On the Brother ADS-1250W, configure an FTP or SMB scan destination pointing to the Pi's consume directory. Alternatively, scan to a USB stick, then copy files over. Paperless-ngx polls the consume folder every few minutes by default, picks up new PDFs/images, runs OCR via Tesseract, and indexes them.

Step 5: Backups

Your documents live on a single NVMe in a Raspberry Pi. That's not redundant. Set up automated backups:

docker compose exec webserver document_exporter /export

Ship the export off-site. Backblaze B2 B2 is cheap (~$0.006/GB/month) and works well with rclone for encrypted nightly backups of your media directory. This is genuinely important — an NVMe failure means all your documents are gone.

Performance Notes From My Build

With PostgreSQL, Redis, Gotenberg, and the Paperless-ngx web server all running, idle RAM usage sits around 1.5 GB. OCR on a single-page letter-sized document takes roughly 8-15 seconds on the Pi 5. Batch importing 50 documents queues them and works through at a steady pace — the Pi doesn't thermal throttle (I stayed under 49°C throughout).

The 8GB Pi 5 is the right choice here. A 4GB model would work for a small archive but would struggle with large batch imports where multiple OCR workers run concurrently.

Remote Access

If you want to reach Paperless-ngx outside your home, don't expose port 8000 directly. A Tailscale or WireGuard tunnel is the sane approach. If you need a proper domain with TLS, grab one from Namecheap and use Caddy as a reverse proxy with automatic Let's Encrypt certificates.

Who Should NOT Do This

Maintenance Tips

Dust the Pi's heatsink and fan periodically — our JAKEHOE Fan Cleaner – Dust Removal Tool for Server & NAS Fans reaches into tight spots around the Pi cooler without disassembly. Run docker compose pull && docker compose up -d monthly to stay current on Paperless-ngx releases. Monitor NVMe health with smartctl -a /dev/nvme0n1.

Verdict

A Raspberry Pi 5 with NVMe boot is a capable, low-power Paperless-ngx server — I measured 453 MB/s reads, sub-50°C thermals, and smooth OCR performance on my build. Pair it with a document scanner and off-site backups, and you have a complete paperless workflow for under $150 in hardware. Just respect the limitations: back up religiously, don't expect enterprise speed, and keep it behind a VPN.

🛠️ From the bench shop

Gear from our own store that fits this build — shipped tracked, UK support.

M.2 SSD Enclosure – NVMe & SATA USB External Aluminium Case£26.99View →
M.2 NVMe SSD Enclosure – USB-C 10Gbps with Magnetic Closure£36.99View →
M.2 SSD Enclosure – NVMe & SATA, USB 3.1 Gen2 Type-C, Aluminium£66.99View →

← all articles

Some links are affiliate links — if you buy through them I may earn a small commission at no extra cost to you. Benchmarks are run on my own hardware. · Shop · Contact