Paperless-ngx на VPS: OCR-архив документов, счетов и договоров
Paperless-ngx на VPS: Docker, PostgreSQL, Redis, Tika, Gotenberg, OCR, теги, full-text search и бэкапы. Self-hosted DMS для семьи и малого бизнеса.
Краткий ответ: Paperless-ngx — система управления документами с OCR, full-text search и auto-tagging. На VPS 2 GB+: Docker stack (PostgreSQL + Redis + Tika + Gotenberg) + Nginx SSL + backup media volume.
Счета в email, договоры в Downloads, сканы на полке — хаос. Paperless-ngx на вашем VPS — загрузил PDF/photo → OCR → поиск по тексту → теги, correspondents, ASN. Альтернатива Evernote и Google Drive для документов.
Paperless-ngx vs Nextcloud Files vs Teedy vs Mayan EDMS
| Критерий | Paperless-ngx | Nextcloud | Teedy | Mayan EDMS |
|---|---|---|---|---|
| OCR focus | Excellent | Plugin | Basic | Good |
| Auto consume | Email, folder, API | Manual mostly | Folder | Watch folders |
| RAM | 2 GB | 2–4 GB | 512 MB | 4 GB+ |
| UI simplicity | Clean | Full cloud suite | Minimal | Complex |
| Mobile app | Community | Official | Limited | Web |
| Full-text search | PostgreSQL FTS | Elasticsearch optional | Basic | Good |
Paperless-ngx — best for «scan everything and find by content».
Архитектура
Scanner / Email / Mobile upload
↓ HTTPS
Nginx reverse proxy
↓
Paperless-ngx (Django)
↓
PostgreSQL (metadata + FTS index)
↓
Redis (Celery task queue)
↓
Apache Tika (document parsing)
↓
Gotenberg (office → PDF conversion)
↓
/usr/src/paperless/media (originals + thumbnails)
OCR: Tesseract внутри paperless container. Языки: PAPERLESS_OCR_LANGUAGE=rus+eng.
Требования к VPS
| Сценарий | RAM | CPU | Диск |
|---|---|---|---|
| Семья, 5k documents | 2 GB | 2 vCPU | 30 GB |
| Малый бизнес 20k docs | 4 GB | 2 vCPU | 100 GB |
| Heavy OCR batch import | 4–8 GB | 4 vCPU | 200 GB SSD |
OCR CPU-intensive — batch import ночью. SSD critical для PostgreSQL FTS.
Docker Compose (full stack)
services:
broker:
image: docker.io/library/redis:7
restart: unless-stopped
volumes:
- redisdata:/data
db:
image: docker.io/library/postgres:16
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: CHANGE_ME
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: unless-stopped
depends_on:
- db
- broker
- gotenberg
- tika
ports:
- "127.0.0.1:8000:8000"
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBUSER: paperless
PAPERLESS_DBPASS: CHANGE_ME
PAPERLESS_SECRET_KEY: CHANGE_ME_LONG
PAPERLESS_URL: https://docs.example.com
PAPERLESS_OCR_LANGUAGE: rus+eng
PAPERLESS_TIME_ZONE: Europe/Moscow
PAPERLESS_ADMIN_USER: admin
PAPERLESS_ADMIN_PASSWORD: CHANGE_ME
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
gotenberg:
image: docker.io/gotenberg/gotenberg:8
restart: unless-stopped
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
tika:
image: docker.io/apache/tika:latest
restart: unless-stopped
volumes:
data:
media:
pgdata:
redisdata:
Nginx reverse proxy
server {
listen 443 ssl http2;
server_name docs.example.com;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
SSL — certbot. Большие PDF — увеличьте client_max_body_size.
Consumption: как загружать документы
| Метод | Настройка |
|---|---|
| Web UI | Drag & drop |
| Consume folder | Copy to ./consume/ — auto-watch |
| IMAP fetch в PAPERLESS_EMAIL_* env | |
| Mobile | Paperless-ngx mobile apps (third-party) |
| API | REST для n8n automation |
Email workflow: счета на invoices@example.com → IMAP → auto-tag «invoice» + correspondent.
Организация: tags, correspondents, document types
| Сущность | Пример |
|---|---|
| Tags | tax, 2025, medical, contract |
| Correspondents | «Ростелеком», «Банк», «Клиент X» |
| Document types | Invoice, Contract, Receipt, ID |
| Storage path | {created_year}/{correspondent}/ |
| ASN | Auto-increment ID на коробке архива |
Matching rules — auto-assign tags/correspondents по OCR content regex.
OCR и языки
PAPERLESS_OCR_LANGUAGE: rus+eng
PAPERLESS_OCR_MODE: skip_noarchive # skip already searchable PDFs
PAPERLESS_OCR_CLEAN: clean
PAPERLESS_OCR_DESKEW: true
Установка tesseract langs в container — обычно pre-installed rus+eng. Для украинского: ukr в language string.
Full-text search
PostgreSQL FTS — мгновенный поиск по OCR text. Tips:
- Используйте
+wordдля required terms correspondent:"Bank Name"— field search- Saved views — filter combinations as virtual folders
Reindex: docker compose exec webserver document_index reindex при проблемах.
Multi-user и права
Paperless supports multiple users с object-level permissions. Для SSO — proxy auth header или OAuth2 proxy перед Authentik.
Family setup: один admin + read-only users для просмотра.
Backup (критично!)
| Компонент | Метод |
|---|---|
| PostgreSQL | pg_dump daily |
| media volume | tar/rsync — originals + thumbnails |
| data volume | config, index snippets |
# Built-in exporter
docker compose exec webserver document_exporter ../export --zip
Стратегия 3-2-1: local + Restic offsite. Media volume растёт — monitor disk.
Security
| Пункт | Действие |
|---|---|
| HTTPS | Обязательно — документы sensitive |
| Strong admin password | 20+ chars |
| Tailscale | Private access preferred |
| Firewall | nftables |
| 2FA | Via Authentik forward auth |
| Export encryption | ZIP password for offsite backup |
Документы = налоги, медицина, договоры. Treat as highly confidential.
Performance tuning
PAPERLESS_TASK_WORKERS: 2— parallel OCR (more CPU)- Batch import overnight —
docker compose execthrottle - PostgreSQL tuning —
shared_buffers25% RAM - SSD only — HDD unusable for FTS at scale
Мониторинг
- Uptime Kuma — web UI ping
- Celery queue — Admin → Tasks, failed OCR jobs
- Disk alerts — media growth
- Netdata — CPU spikes during OCR
Troubleshooting
| Проблема | Решение |
|---|---|
| OCR пустой | Wrong language pack, low quality scan |
| Consume not picking files | File permissions, watch folder path |
| Email fetch fail | IMAP creds, app password, TLS |
| 502 timeout on upload | Increase nginx timeout, client_max_body_size |
| Duplicate documents | Matching rules too broad |
| Slow search | Reindex, PostgreSQL vacuum |
| Gotenberg fail | Office formats — check gotenberg logs |
| Tika OOM | Upgrade RAM, reduce concurrent tasks |
| Thumbnail missing | Re-process document in UI |
| Permission denied | User roles, object permissions |
Связка с экосистемой
- Облако файлов — Nextcloud (complementary)
- Email — Postfix
- Automation — n8n
- Backup — Restic
- SSO — Authentik
Итог
Paperless-ngx — killer app для paperless office. OCR + search превращает хаос сканов в searchable archive. 2 GB VPS достаточно для семьи.
VPS от 2 GB — StormNet Cloud. Backup — 3-2-1. SSL — Let’s Encrypt.
Рекомендуем прочитать
- Stirling PDF на VPS: self-hosted PDF-инструменты без Adobe Cloud
- Nextcloud на VPS: своё облако для файлов и команд
- Правило 3-2-1: стратегия бэкапов на VPS
- Restic на VPS: зашифрованные бэкапы на S3 и диск
- MinIO на VPS: своё S3-хранилище для файлов и бэкапов
- SSL на VPS: Let's Encrypt, автообновление и типичные ошибки
Частые вопросы
Paperless-ngx или Nextcloud для документов?
Paperless-ngx — OCR, full-text search, теги для сканов и PDF. Nextcloud — универсальное файловое облако. Часто оба.
Сколько места нужно Paperless-ngx?
Зависит от объёма сканов. Планируйте 2× текущего архива документов + рост. OCR metadata добавляет ~10–20%.






