Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Личное облако и файлы

Paperless-ngx

Электронный архив документов, который работает на своем сервере: распознает сканы, ищет по тексту и разделяет доступ. Развернули 3.3.0 на Fatmetal Cloud Server, замерили OCR и проверили поиск, права читателя и восстановление архива.

Проверено на версии v3.3.0, 6 октября 2026~12 минутFatmetal Team
Электронный архивЛицензия: GPL-3.0Русский интерфейс и OCR

Вердикт

Подходит
  • Владельцу архива договоров, который помнит содержание, но не имя файла
  • Небольшому офису, где сканы нужно искать вместе, а читать разрешать выборочно
  • Для постоянного учета PDF и изображений с оригиналом рядом с распознанным текстом
Не подходит
  • Для юридически значимого подписания и согласования документов
  • Для учета реквизитов без проверки человеком
  • Для замены редактора заметок или всех функций файлового облака
Рекомендуем: CPU4-RAM8-DISK100Сложность: средняяГлавный риск: неверная автоматическая датаПрод-готовность: после настройки HTTPS, прав и копий
Задача

Договор находится по тексту, а не имени файла

Папка со сканами быстро превращается в список Scan001.pdf и Scan002.png. Если номер договора забыт, обычный поиск по именам не помогает: нужная информация осталась внутри картинки.

Paperless-ngx сохраняет оригинал, распознает текст и добавляет документ в общий индекс. OCR - это превращение изображения букв в текст, по которому уже можно искать.

На стенде договор назывался Scan001. Запрос «Кедровый мост» нашел его среди других сканов, хотя название проекта было только на странице. В карточке остались исходный PDF и русский текст.

После импорта откройте документ кнопкой с иконкой просмотра. На вкладке «Содержимое» сравните текст со сканом; затем проверьте дату и добавьте понятный тег. Описание файла можно оставить прежним.

Русский распознанный текст и исходный скан договора рядом
Содержимое документа: текст OCR рядом с исходной страницей, Paperless-ngx 3.3.0.

Такой порядок полезен для договоров, счетов и актов: искать можно по названию проекта, контрагенту или фразе. В примере распознались кириллица и сумма, а реквизиты проверялись отдельно.

Сравнение

Чем отличается от платного архива

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.

Paperless-ngx 3.3.0DjangoPostgreSQL 18.6Valkey 9.1.2TesseractCaddy 2.11.7

Русский язык интерфейса и язык OCR задаются независимо. Русские меню не устанавливают модель распознавания; за нее отвечают PAPERLESS_OCR_LANGUAGE и PAPERLESS_OCR_LANGUAGES в настройках контейнера.

Русский список документов Paperless-ngx с пятью синтетическими сканами
Рабочий архив: пять демонстрационных документов; данные вымышлены.
Сервер

Выберите ресурсы под распознавание и объем архива

Для показанного профиля подойдет CPU4-RAM8-DISK100: четыре процессорных ядра, 8 ГБ памяти и 100 ГБ диска. Установка ниже рассчитана на чистую Ubuntu 24.04 и работу через SSH.

Основная нагрузка возникает при распознавании страниц. На одном восьмистраничном скане процессор занимал примерно два ядра, с пиком 2,4. Поэтому выбран готовый тариф с четырьмя ядрами.

8 ГБ - объем выбранного тарифа, а не требование Paperless к запуску. Запас нужен для более крупных файлов и нескольких обработчиков; базовый расход памяти показан в замерах.

Диск считайте по своим документам: храниться будут оригинал, архивная копия и миниатюра. Восьмистраничный тестовый PDF увеличил media примерно на 6,3 МиБ; одинаковые сто файлов потребовали бы около 630 МиБ.

i

Если место заканчивается, расширяйте диск под media. В версии 3.3.0 документы лежат в файловых каталогах; штатного S3-хранилища для этого тома нет.

В маркетплейсе Fatmetal

Не хотите ставить руками?

Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, получаете рабочий домен, валидный TLS и файл с доступами.

Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес

В маркетплейс →
Установка

Развертывание на Fatmetal Cloud Server

Понадобятся root-доступ, Ubuntu 24.04 и домен, который указывает на сервер. Команды выполняйте в одной root-сессии.

  1. Установите 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
  2. Скачайте 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
  3. Задайте домен, секреты и русский 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
  4. Добавьте 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
  5. Запустите архив и войдите

    При первом старте контейнер установит русский языковой пакет и подготовит базу. Пароль администратора хранится в файле настроек с правами только для 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 через область загрузки документов.

Дождитесь завершения обработки, затем откройте документ. В поиске выберите «Название и содержимое» и введите фразу со страницы. Сравните найденный текст и оригинал, прежде чем заполнять учетные поля.

Карточка Scan001 с датой 5 октября и тегом договора
Дата проверена по скану и исправлена вручную, тег назначен пользователем.
Замеры

Что потребуется в работе

Стенд 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. Эти цифры описывают небольшой архив и один импорт за раз.

i

Вывод для работы. Загрузка большого скана не означает мгновенного появления текста. Оставьте время на OCR; когда файл обработан, поиск по содержимому занимает уже доли секунды.

Проверено на версии v3.3.0, 6 октября 2026. На новых версиях результаты могут отличаться.

Диагностика

Где может сломаться

Русский интерфейс есть, а кириллица не распознается

Причина. Язык меню и пакет Tesseract - разные настройки. Без установки rus контейнер не получает нужную модель OCR.

Решение. Оставьте обе русские переменные из инструкции и пересоздайте приложение. Проверьте наличие rus:

docker compose up -d webserver
docker compose exec -T webserver tesseract --list-langs
Let's Encrypt: too many certificates already issued / HTTP 429

Причина. Повторно использованный домен достиг лимита сертификатов. Перезапуск Caddy лимит не сбрасывает.

Решение. Найдите retry-after в журнале и дождитесь указанного времени. Сохраните том caddydata; повторные заказы сертификата до срока не помогут.

docker compose logs --tail=100 caddy
sqlite3.OperationalError: attempt to write a readonly database

Причина. Индекс 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, отдельный постоянный архив добавит лишнее обслуживание. Если нужна общая папка с редактированием заметок, выбирайте соответствующее файловое облако или редактор.

FAQ

Частые вопросы

Можно искать текст в 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 ₽/мес.

Запустить Paperless-ngx →
Анонсы новых разборов в Telegram-канале Новые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Нашли баг в гайде - напишите, поправим в течение дня.

Спросить инженера в TelegramМы на связи