Paperless-ngx
Электронный архив документов, который работает на своем сервере: распознает сканы, ищет по тексту и разделяет доступ. Развернули 3.3.0 на Fatmetal Cloud Server, замерили OCR и проверили поиск, права читателя и восстановление архива.
Вердикт
- Владельцу архива договоров, который помнит содержание, но не имя файла
- Небольшому офису, где сканы нужно искать вместе, а читать разрешать выборочно
- Для постоянного учета PDF и изображений с оригиналом рядом с распознанным текстом
- Для юридически значимого подписания и согласования документов
- Для учета реквизитов без проверки человеком
- Для замены редактора заметок или всех функций файлового облака
Договор находится по тексту, а не имени файла
Папка со сканами быстро превращается в список Scan001.pdf и Scan002.png. Если номер договора забыт, обычный поиск по именам не помогает: нужная информация осталась внутри картинки.
Paperless-ngx сохраняет оригинал, распознает текст и добавляет документ в общий индекс. OCR - это превращение изображения букв в текст, по которому уже можно искать.
На стенде договор назывался Scan001. Запрос «Кедровый мост» нашел его среди других сканов, хотя название проекта было только на странице. В карточке остались исходный PDF и русский текст.
После импорта откройте документ кнопкой с иконкой просмотра. На вкладке «Содержимое» сравните текст со сканом; затем проверьте дату и добавьте понятный тег. Описание файла можно оставить прежним.
Такой порядок полезен для договоров, счетов и актов: искать можно по названию проекта, контрагенту или фразе. В примере распознались кириллица и сумма, а реквизиты проверялись отдельно.
Чем отличается от платного архива
Paperless-ngx - проект сообщества под GPL-3.0. Лицензию покупать не нужно; вы оплачиваете сервер, хранение копий и обслуживание. Архив и пользователи входят в открытую поставку.
| Продукт | Что получаете | За что платите |
|---|---|---|
| Paperless-ngx | Свой архив сканов, OCR, поиск и доступ к документам | Сервер и эксплуатация |
| DocuWare Cloud | Облачный архив и корпоративные процессы | Ориентир 30-125+ долларов за пользователя в месяц |
| Evernote | Заметки, документы и синхронизация в облаке | Подписка Starter или Advanced; цена зависит от предложения |
Диапазон DocuWare указан в прайсе вендора на 6 октября 2026. Итог зависит от пользователей, хранилища и модулей; это ориентир, а не одинаковая корзина функций.
Для читателя из России практическая разница в управлении архивом: здесь доступны русский интерфейс, российский сервер и оплата инфраструктуры в рублях. Документы базовой установки обрабатываются на вашей VM.
Evernote полезнее, когда основной материал - заметки, а документы их дополняют. Paperless-ngx удобен, когда материал уже существует в виде сканов и его нужно найти, открыть и классифицировать.
Сравнивайте не только подписки. У своего архива есть отдельная задача: сохранять копии и проверять восстановление. Эти действия ниже показаны командами, чтобы стоимость владения не заканчивалась ценой VPS.
Как скан становится результатом поиска
Приложение на Python и Django принимает файл через веб-интерфейс или каталог consume. Очередь Valkey передает его обработчику; Tesseract распознает страницы, OCRmyPDF создает архивный PDF/A.
PDF/A - версия PDF для длительного хранения. Paperless оставляет исходник отдельно: распознанная копия не заменяет загруженный файл. Карточка документа связывает файлы, текст, дату, метки и разрешения.
PostgreSQL хранит карточки и пользователей. Полнотекстовый индекс Tantivy находится в томе data; оригиналы, архивные PDF и миниатюры - в media. Caddy открывает браузеру HTTPS, приложение слушает localhost.
Русский язык интерфейса и язык OCR задаются независимо. Русские меню не устанавливают модель распознавания; за нее отвечают PAPERLESS_OCR_LANGUAGE и PAPERLESS_OCR_LANGUAGES в настройках контейнера.
Выберите ресурсы под распознавание и объем архива
Для показанного профиля подойдет CPU4-RAM8-DISK100: четыре процессорных ядра, 8 ГБ памяти и 100 ГБ диска. Установка ниже рассчитана на чистую Ubuntu 24.04 и работу через SSH.
Основная нагрузка возникает при распознавании страниц. На одном восьмистраничном скане процессор занимал примерно два ядра, с пиком 2,4. Поэтому выбран готовый тариф с четырьмя ядрами.
8 ГБ - объем выбранного тарифа, а не требование Paperless к запуску. Запас нужен для более крупных файлов и нескольких обработчиков; базовый расход памяти показан в замерах.
Диск считайте по своим документам: храниться будут оригинал, архивная копия и миниатюра. Восьмистраничный тестовый PDF увеличил media примерно на 6,3 МиБ; одинаковые сто файлов потребовали бы около 630 МиБ.
Если место заканчивается, расширяйте диск под media. В версии 3.3.0 документы лежат в файловых каталогах; штатного S3-хранилища для этого тома нет.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, получаете рабочий домен, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес
Развертывание на Fatmetal Cloud Server
Понадобятся root-доступ, Ubuntu 24.04 и домен, который указывает на сервер. Команды выполняйте в одной root-сессии.
Установите Docker на Ubuntu 24.04
Войдите через SSH и откройте root-сессию командой sudo -i. Пакеты берутся из репозитория Docker; нужен именно плагин docker compose.
apt-get update apt-get install -y ca-certificates curl openssl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc printf 'deb [arch=%s signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable\n' "$(dpkg --print-architecture)" > /etc/apt/sources.list.d/docker.list apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl enable --now dockerСкачайте compose и закрепите версии
Официальный файл задает базу, очередь и тома. Замените плавающие теги и откройте порт приложения только на localhost.
mkdir -p /opt/paperless-ngx && cd /opt/paperless-ngx curl -fsSL https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/v3.3.0/docker/compose/docker-compose.postgres.yml -o compose.yml sed -i -e 's/paperless-ngx:latest/paperless-ngx:3.3.0/' -e 's/valkey:9-alpine/valkey:9.1.2-alpine/' -e 's/postgres:18$/postgres:18.6/' -e 's/"8000:8000"/"127.0.0.1:8000:8000"/' -e 's/POSTGRES_PASSWORD: paperless/POSTGRES_PASSWORD: ${DB_PASSWORD}/' compose.yml sed -i '/PAPERLESS_DBENGINE: postgresql/a\ PAPERLESS_DBPASS: ${DB_PASSWORD}' compose.ymlЗадайте домен, секреты и русский OCR
Замените ваш-домен своим доменом, направленным на IP сервера. На Fatmetal подойдет его автоматический адрес с дефисами вместо точек: дополнительные DNS-записи не нужны.
umask 077 printf 'DB_PASSWORD=%s\nAPP_DOMAIN=ваш-домен\n' "$(openssl rand -hex 32)" > .env cat > docker-compose.env <<EOF PAPERLESS_SECRET_KEY=$(openssl rand -hex 64) PAPERLESS_URL=https://ваш-домен PAPERLESS_PROXY_SSL_HEADER=["HTTP_X_FORWARDED_PROTO", "https"] PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT=1 PAPERLESS_TIME_ZONE=Europe/Moscow PAPERLESS_OCR_LANGUAGE=rus+eng PAPERLESS_OCR_LANGUAGES=rus PAPERLESS_TASK_WORKERS=2 PAPERLESS_THREADS_PER_WORKER=2 PAPERLESS_AI_ENABLED=false PAPERLESS_ADMIN_USER=admin PAPERLESS_ADMIN_PASSWORD=$(openssl rand -hex 24) EOF install -d -o 1000 -g 1000 consume exportДобавьте HTTPS
Caddy получает сертификат автоматически. Входящие TCP-порты 80 и 443 должны быть доступны; PostgreSQL и Valkey остаются внутри Docker-сети.
cat > compose.override.yml <<'EOF' services: caddy: image: caddy:2.11.7-alpine restart: unless-stopped ports: ["80:80", "443:443"] environment: {APP_DOMAIN: "${APP_DOMAIN}"} volumes: ["./Caddyfile:/etc/caddy/Caddyfile:ro", "caddydata:/data", "caddyconfig:/config"] volumes: {caddydata: {}, caddyconfig: {}} EOF printf '{$APP_DOMAIN} {\n encode zstd gzip\n reverse_proxy webserver:8000\n}\n' > CaddyfileЗапустите архив и войдите
При первом старте контейнер установит русский языковой пакет и подготовит базу. Пароль администратора хранится в файле настроек с правами только для root.
docker compose pull docker compose up -d --wait --wait-timeout 600 docker compose ps grep '^PAPERLESS_ADMIN_PASSWORD=' docker-compose.env
Откройте https://ваш-домен/accounts/login/, войдите как admin с показанным паролем. Установите русский язык в настройках профиля и загрузите PDF или PNG через область загрузки документов.
Дождитесь завершения обработки, затем откройте документ. В поиске выберите «Название и содержимое» и введите фразу со страницы. Сравните найденный текст и оригинал, прежде чем заполнять учетные поля.
Что потребуется в работе
Стенд CPU4-RAM8-DISK100, Ubuntu 24.04.4, Xeon E5620 2,4 ГГц. Базовый архив без внешнего AI.
| Память четырех контейнеров в простое | Около 931 МиБ |
| Пик памяти при OCR | Около 1,22 ГиБ |
| Распознавание 8 страниц, PDF около 4 МБ | Около полутора минут |
| Ответ поиска через публичный адрес | Около 160 мс |
| Повторный запуск до HTTP-ответа | Около 68 секунд |
| Логический размер четырех образов | Около 4,1 ГиБ |
| Диск после установки и тестовых импортов | Около 8,6 ГиБ |
При первоначальной установке скачивание образов заняло около четырех минут, запуск и подготовка базы - еще около трех. До готовности контейнеров прошло около девяти минут; выпуск сертификата идет отдельно.
Память в таблице относится к контейнерам без файлового кеша и расходов ОС. Поиск продолжал отвечать во время OCR. Эти цифры описывают небольшой архив и один импорт за раз.
Вывод для работы. Загрузка большого скана не означает мгновенного появления текста. Оставьте время на OCR; когда файл обработан, поиск по содержимому занимает уже доли секунды.
Проверено на версии v3.3.0, 6 октября 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Причина. Язык меню и пакет Tesseract - разные настройки. Без установки rus контейнер не получает нужную модель OCR.
Решение. Оставьте обе русские переменные из инструкции и пересоздайте приложение. Проверьте наличие rus:
docker compose up -d webserver
docker compose exec -T webserver tesseract --list-langsПричина. Повторно использованный домен достиг лимита сертификатов. Перезапуск Caddy лимит не сбрасывает.
Решение. Найдите retry-after в журнале и дождитесь указанного времени. Сохраните том caddydata; повторные заказы сертификата до срока не помогут.
docker compose logs --tail=100 caddyПричина. Индекс AI был создан от root, а веб-приложение работает от paperless. Исправьте владельца этого индекса и перестройте его от пользователя приложения:
docker compose exec -T webserver chown -R paperless:paperless /usr/src/paperless/data/llm_index
docker compose exec -T -u paperless webserver python manage.py document_llmindex rebuild --no-progress-barСохраните архив и ограничьте доступ
Резервную копию делайте штатным экспортером. Он сохраняет файлы и manifest с карточками, текстами и правами. Каталог export принадлежит пользователю приложения, поэтому команду запускайте от paperless:
cd /opt/paperless-ngx
docker compose exec -T -u paperless webserver mkdir -p /usr/src/paperless/export/backup
docker compose exec -T -u paperless webserver python manage.py document_exporter /usr/src/paperless/export/backup --no-progress-bar
Скопируйте export/backup на другой сервер вместе с compose-файлами, Caddyfile, .env и docker-compose.env. Эти файлы содержат секреты; доступ к копии должен быть ограничен.
Для восстановления подготовьте пустой экземпляр той же версии. Перед его первым запуском удалите строки PAPERLESS_ADMIN_ из docker-compose.env: учетные записи вернутся из копии. Поместите копию в export/backup и выполните:
sed -i '/^PAPERLESS_ADMIN_/d' docker-compose.env
docker compose up -d --wait --wait-timeout 600
docker compose exec -T -u paperless webserver python manage.py document_importer /usr/src/paperless/export/backup --no-progress-bar
После восстановления проверьте вход, поиск и просмотр нескольких документов. В нашем опыте вернулись четыре документа, их исходники и архивные PDF, сохраненная дата, тег и право читателя на один файл.
Для обновления сначала сделайте копию, затем замените тег приложения в compose.yml на выбранный релиз. Скачайте образ, пересоздайте контейнер и проверьте журнал миграций:
docker compose pull webserver
docker compose up -d --wait --wait-timeout 600 webserver
docker compose logs --tail=100 webserver
Откройте читателю только нужный договор
Пользователю для чтения нужны view_document, view_uisettings и view_savedview, плюс разрешение на конкретный документ. На стенде читатель видел один договор, не видел остальные и не мог сохранить изменения.
Чтобы повторить доступ только к одному документу, откройте оболочку приложения. В примере создается пользователь reader, а 1 - номер разрешенного документа из адреса его карточки.
docker compose exec -u paperless webserver python manage.py shell
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from guardian.shortcuts import assign_perm
from documents.models import Document
from getpass import getpass
u = get_user_model().objects.create_user('reader', None, getpass('Пароль читателя: '))
u.user_permissions.set(Permission.objects.filter(content_type__app_label='documents', codename__in=['view_document', 'view_uisettings', 'view_savedview']))
assign_perm('view_document', u, Document.objects.get(pk=1))
exit()
Что подключать к архиву
SMTP нужен для отправки документов из интерфейса. После настройки PAPERLESS_EMAIL_HOST, PORT, HOST_USER, HOST_PASSWORD и USE_TLS появляется пункт отправки по электронной почте; доставка PDF проверена до ящика получателя. Добавьте в docker-compose.env данные своего сервера:
PAPERLESS_EMAIL_HOST=mail.example.com
PAPERLESS_EMAIL_PORT=587
PAPERLESS_EMAIL_HOST_USER=you@example.com
PAPERLESS_EMAIL_HOST_PASSWORD=пароль-почты
PAPERLESS_EMAIL_USE_TLS=true
PAPERLESS_EMAIL_USE_SSL=false
PAPERLESS_EMAIL_FROM=you@example.com
Пересоздайте webserver командой из раздела обновления. Выберите документ, затем «Отправить» - «Электронная почта». Проверьте письмо с PDF в ящике получателя, а не только сообщение об успешной отправке.
AI включается отдельно в конфигурации Paperless. Он предлагает реквизиты и отвечает на вопросы со ссылкой на документ. Для базового OCR и обычного поиска ключ провайдера не нужен.
Прокси к внешним API входит в VPS Fatmetal: http://api-proxy.fatmetal.net:8080. Провайдера и модель выбираете вы. Для проверенного OpenAI-совместимого подключения добавьте в окружение webserver:
HTTP_PROXY=http://api-proxy.fatmetal.net:8080
HTTPS_PROXY=http://api-proxy.fatmetal.net:8080
NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,db,broker,webserver,caddy
OPENAI_API_BASE=https://openrouter.ai/api/v1
В версии 3.3.0 поля LLM endpoint и embedding endpoint оставьте пустыми: заполненный endpoint использует транспорт, который игнорирует эти прокси-переменные. Выберите OpenAI-совместимый backend, укажите свой ключ для LLM и эмбеддингов. Проверенные модели: openai/gpt-4o-mini и openai/text-embedding-3-small; embedding endpoint тоже остается пустым.
Пересоздайте webserver, затем выполните команду document_llmindex rebuild от paperless из раздела диагностики. В проверенном чате ответ содержал сумму договора и ссылку на исходный документ.
Подготовить отдельный PDF можно в Stirling-PDF. Совместные файлы удобно держать в Nextcloud; Paperless добавляет к сканам постоянный индекс.
Когда это НЕ ваш выбор
Реквизиты должны попадать в учет без проверки
Дата всех первых сканов определилась как 1 октября, хотя текст содержал 5 и 6 октября. Для договора исправили дату вручную в карточке и сохранили. Правильный текст не гарантирует правильную дату.
Нужны подписи и маршрут согласования
Это архив для хранения и поиска, а не юридически значимый ЭДО. Для подписания, согласований и регламентированного учета выбирайте систему под эти процессы.
Документы нельзя передавать внешнему обработчику
Оставьте AI выключенным: внешние модели и эмбеддинги получают данные документов. Прокси меняет путь запроса, но не место обработки. Базовые Tesseract и поиск работают локально.
Нужно шифрование файлов самим приложением
Paperless хранит документы на диске без прикладного шифрования. Раздельные права в браузере не защищают файлы от того, кто получил доступ к серверу или резервной копии.
Если задача - один раз распознать PDF, отдельный постоянный архив добавит лишнее обслуживание. Если нужна общая папка с редактированием заметок, выбирайте соответствующее файловое облако или редактор.
Частые вопросы
Можно искать текст в PDF без текстового слоя?
Да. Загруженный скан проходит OCR, затем ищется по содержимому. На стенде найден проект, название которого отсутствовало в имени файла.
Как задать русский OCR?
PAPERLESS_OCR_LANGUAGE=rus+eng задает языки обработки, PAPERLESS_OCR_LANGUAGES=rus устанавливает русский пакет. После изменения пересоздайте webserver.
Оригинал останется?
Да. Оригинал и архивный PDF хранятся отдельно в media. При проверке восстановления контрольные суммы обеих версий совпали с экспортом.
Нужен ли ключ модели для поиска?
Нет. Полнотекстовый поиск и локальное OCR работают без внешнего API. Ключ нужен только для дополнительно включаемых AI-функций.
Достаточно сохранить только папку media?
Для полного архива нет: карточки, пользователи и права находятся в базе. Используйте document_exporter и сохраняйте конфигурацию вместе с результатом.
Как понять, что документ готов?
Откройте карточку и вкладку «Содержимое», найдите фразу со скана поиском. Наличие файла в области загрузки еще не означает завершения OCR.
Итог
Paperless-ngx подходит для архива, в котором документ нужно найти по содержанию, а не по удачному имени файла. Начните с нескольких характерных сканов, проверьте распознанный текст, выдайте доступ читателю и восстановите копию.
Тогда у вас будет рабочий способ искать договоры и счета, а также понятная цена эксплуатации: сервер, место под растущий архив и отдельные резервные копии.
Рекомендуемая конфигурация для установки:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe
Не хотите устанавливать вручную?
Запустите Paperless-ngx на этой конфигурации автоматически - от 990 ₽/мес.
Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Нашли баг в гайде - напишите, поправим в течение дня.