DevOps и Docker 13 мин чтения 2026-09-29

Свой электронный архив документов и чеков на VDS: развертывание Paperless-ngx в Docker Compose с OCR-распознаванием на русском языке

Практическая инструкция по развертыванию Paperless-ngx на VDS в Docker Compose: интеграция OCR для русского и английского языков (rus+eng), связка с PostgreSQL 18 и Valkey 9, автоимпорт через папку consume, Nginx с SSL и резервное копирование.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

У любого практикующего системного администратора, вебмастера или владельца IT-бизнеса со временем накапливаются сотни и тысячи рабочих документов: акты выполненных работ от заказчиков, закрывающие накладные, счета на оплату серверов и доменов, договоры аренды, гарантийные талоны и кассовые чеки на оборудование. Обычно эти файлы оседают в хаотичном виде: часть хранится во вложениях рабочей почты, часть в чатах Telegram, а бумажные чеки выцветают в коробках на полке.

Попытки структурировать документы в Google Drive, Яндекс Диске или Nextcloud быстро упираются в фундаментальный недостаток обычных файловых хранилищ: они не умеют осуществлять сквозной полнотекстовый поиск внутри отсканированных графических документов и PDF. Если файл назван сканером как SCAN_2026_09_29_001.pdf, найти в нем реквизиты контрагента или сумму платежа невозможно без ручного открытия каждого файла.

Решением этой проблемы является Paperless-ngx — ведущая open-source система управления электронными документами (EDMS), возглавляющая топы популярности в сообществах Reddit r/selfhosted и GitHub (свыше 25 000 звёзд). Она берет на себя автоматический захват входящих файлов, распознавание текста через движок Tesseract OCR, индексацию и организацию умного поиска с фильтрацией по тегам, датам и корреспондентам.

1. Проблема хаоса в документах: почему облака проигрывают self-hosted архиву

Коммерческие SaaS-решения для документооборота и корпоративные облака создают для IT-специалистов и малого бизнеса ряд существенных рисков:

  • Проблемы с оплатой и привязкой к платформе: Зарубежные сервисы требуют регулярных платежей в валюте, блокируют учетные записи пользователей из РФ и в любой момент могут ограничить доступ к архиву.
  • Конфиденциальность персональных и финансовых данных: Договоры с паспортными данными, финансовые балансы и выписки по расчетным счетам небезопасно доверять сторонним облачным платформам, где файлы анализируются алгоритмами машинного обучения.
  • Отсутствие интеллектуальной категоризации: В стандартных облаках сортировка выполняется вручную по вложенным папкам. В Paperless-ngx встроен самообучающийся классификатор на базе алгоритмов машинного обучения: система анализирует текст документа и автоматически назначает нужного контрагента (корреспондента), тип документа (акт, чек, договор) и теги.

Совет инженера по организации документооборота

Paperless-ngx не просто сохраняет исходный файл, но и создает рядом оптимизированный PDF/A-документ с внедренным невидимым текстовым слоем. Это позволяет открывать и копировать текст из отсканированного документа в любой стандартной читалке PDF на компьютере или смартфоне.

2. Архитектура Paperless-ngx: веб-сервер, воркеры Celery, Tesseract OCR, Valkey и PostgreSQL

Современный стек Paperless-ngx состоит из нескольких тесно интегрированных микросервисов, разворачиваемых в единой сети Docker Compose:

  • Webserver (Django / Gunicorn): Обеспечивает работу современного отзывчивого веб-интерфейса, REST API для мобильных клиентов и аутентификацию пользователей.
  • Consumer & Celery Workers: Фоновые воркеры, которые непрерывно сканируют каталог входящих файлов, распаковывают архивы, обрабатывают очереди задач и вызывают OCR-пайплайн.
  • Tesseract OCR: Оптический движок распознавания текста, преобразующий растровые сканы и изображения в векторный машиночитаемый текст.
  • Брокер сообщений (Valkey 9 / Redis 7): Быстрое in-memory хранилище очередей задач Celery и кэша сессий. В актуальных релизах Paperless-ngx по умолчанию используется valkey:9-alpine — независимый высокопроизводительный форк Redis с открытой лицензией.
  • База данных (PostgreSQL 18): Хранит метаданные документов, историю изменений, права пользователей, теги и связи. Хотя Paperless поддерживает SQLite, в production-среде строго рекомендуется использовать PostgreSQL для исключения блокировок базы при параллельном распознавании нескольких тяжелых файлов.
  • Apache Tika и Gotenberg: Конвертеры документов. Gotenberg преобразует файлы Word (.docx), Excel (.xlsx) и письма (.eml) в PDF, а Apache Tika извлекает из них текстовый поток.

3. Системные требования и сайзинг VDS под задачи оптического распознавания (OCR)

Распознавание растровых изображений через OCR — ресурсоемкая операция, активно нагружающая процессор и оперативную память. Ниже приведены проверенные на практике рекомендации по выбору тарифа VDS в зависимости от объема документооборота:

Параметр Минимальный VDS Рекомендуемый VDS Офис / Компания
Нагрузка Личный архив, 10–20 док/нед Активный фриланс, 50–200 док/нед Команда 3–10 чел, 500+ док/нед
Процессор (vCPU) 1 vCPU (3.0+ ГГц) 2 vCPU 4 vCPU
Память (RAM) 2 ГБ RAM + 2 ГБ Swap 4 ГБ RAM 8 ГБ RAM
Диск (NVMe) 20–30 ГБ NVMe 50–80 ГБ NVMe 150+ ГБ NVMe
Воркеры OCR PAPERLESS_TASK_WORKERS=1 PAPERLESS_TASK_WORKERS=2 PAPERLESS_TASK_WORKERS=3

Важное предупреждение: защита от сбоев OOM Killer

При обработке многостраничных отсканированных PDF с высоким разрешением процесс Tesseract OCR потребляет до 1.2–1.5 ГБ RAM на один документ. Если запустить Paperless на сервере с 1 ГБ RAM без настроенного Swap-файла, системный диспетчер Linux немедленно завершит процесс по ошибке Out Of Memory. Для стабильной работы обязательно задайте лимиты mem_limit в Compose и настройте файл подкачки.

4. Надежные VDS-хостинги для хранения архива и фоновой обработки документов

Для безотказной работы оптического распознавания, быстрой обработки PDF-файлов и безопасного хранения архива сервер VDS должен иметь честную виртуализацию KVM, быстрые накопители NVMe и надежное резервирование каналов.

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud — Быстрые NVMe VDS

Идеально для Paperless-ngx: высокочастотные процессоры 3.3+ ГГц для быстрого OCR, моментальные снапшоты диска и безлимитный канал 1 Гбит/с.

Конфигурация
2 vCPU 3.3 ГГц • 2 ГБ RAM • 30 ГБ NVMe • Трафик без лимита
Премиум Tier III
🔷

Selectel — Надежные облачные серверы

Корпоративная надежность дата-центров Tier III, гарантированные ресурсы vCPU для тяжелой обработки PDF и приватная сеть со встроенным S3 Object Storage.

Конфигурация
2 vCPU • 4 ГБ RAM • 50 ГБ NVMe • Дата-центры Tier III
Удобство управления
🟠

Beget — Простота и стабильность для веб-проектов

Удобная панель управления сервером, надежная KVM-виртуализация, бесплатные ежедневные резервные копии и быстрое масштабирование дискового пространства.

Конфигурация
2 vCPU • 2 ГБ RAM • 35 ГБ NVMe • Бесплатные бэкапы

5. Подготовка сервера: структура каталогов, права доступа и генерация секретов

Подключитесь к вашему VDS по SSH и создайте рабочую директорию для стека Paperless-ngx. В целях безопасности контейнеры Paperless запускаются от непривилегированного пользователя с UID/GID 1000:

# Создаем изолированную директорию проекта
sudo mkdir -p /opt/paperless
cd /opt/paperless

# Создаем каталоги для данных, медиа-файлов, экспорта и папки входящих документов
sudo mkdir -p data media export consume
sudo chown -R 1000:1000 data media export consume
sudo chmod -R 755 data media export consume

Для защиты сессий и шифрования токенов сгенерируем криптостойкий секретный ключ Django длиной 64 символа с помощью генератора SysKit или команды OpenSSL:

Создайте файл переменных окружения /opt/paperless/docker-compose.env с правами 600:

# Создаем файл окружения с ограниченными правами
sudo touch /opt/paperless/docker-compose.env
sudo chmod 600 /opt/paperless/docker-compose.env

Внесите в /opt/paperless/docker-compose.env базовые параметры конфигурации:

# /opt/paperless/docker-compose.env
# Системные идентификаторы пользователя на хосте
USERMAP_UID=1000
USERMAP_GID=1000

# Секретный ключ Django (сгенерирован через openssl rand -hex 32)
PAPERLESS_SECRET_KEY=a7d9f2e4b8c10567e3215890abcefd4512389abcde01456789abcdef01234567

# Внешний URL вашего архива (критично для защиты CSRF и формирования ссылок)
PAPERLESS_URL=https://docs.yourdomain.ru

# Часовой пояс
PAPERLESS_TIME_ZONE=Europe/Moscow

# Языковые параметры OCR: комбинация языков через знак плюс (+)
PAPERLESS_OCR_LANGUAGE=rus+eng

# Корректная обработка заголовков при работе за Reverse Proxy (защита CSRF)
PAPERLESS_USE_X_FORWARD_HOST=true
PAPERLESS_USE_X_FORWARD_PORT=true

# Настройка производительности OCR (1 воркер для серверов с 2 ГБ RAM)
PAPERLESS_TASK_WORKERS=1
PAPERLESS_WEBSERVER_WORKERS=1

# Игнорировать цифровые подписи в сканах для корректного наложения OCR-слоя
PAPERLESS_OCR_USER_ARGS='{"invalidate_digital_signatures": true}'

# Интеграция с Gotenberg и Apache Tika для офисных документов (.docx, .xlsx)
PAPERLESS_TIKA_ENABLED=1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT=http://tika:9998

6. Эталонный манифест Docker Compose с лимитами ресурсов и изоляцией портов

Создайте манифест /opt/paperless/docker-compose.yml. Обратите особое внимание на два ключевых архитектурных требования безопасности и стабильности:

  • Изоляция порта webserver: порт веб-интерфейса привязывается строго к локальному адресу 127.0.0.1:8000:8000. Это исключает прямой доступ из интернета в обход фаервола UFW. Внешний трафик пойдет только через защищенный Nginx с HTTPS.
  • Нативные лимиты mem_limit и cpus: заданы на верхнем уровне каждого сервиса, что гарантирует работу ограничений в обычном Docker Compose без кластера Swarm.
# /opt/paperless/docker-compose.yml
services:
  broker:
    image: docker.io/valkey/valkey:9-alpine
    container_name: paperless-broker
    restart: unless-stopped
    mem_limit: 256m
    cpus: 0.5
    volumes:
      - redisdata:/data

  db:
    image: docker.io/library/postgres:18
    container_name: paperless-db
    restart: unless-stopped
    mem_limit: 512m
    cpus: 1.0
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: super_secure_db_password_syskit
    volumes:
      - pgdata:/var/lib/postgresql/data

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:3.2.1
    container_name: paperless-webserver
    restart: unless-stopped
    mem_limit: 1536m
    cpus: 1.5
    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
    env_file: docker-compose.env
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBENGINE: postgresql
      PAPERLESS_DBNAME: paperless
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: super_secure_db_password_syskit

  gotenberg:
    image: docker.io/gotenberg/gotenberg:8.37
    container_name: paperless-gotenberg
    restart: unless-stopped
    mem_limit: 512m
    cpus: 1.0
    command:
      - "gotenberg"
      - "--chromium-disable-javascript=true"
      - "--chromium-allow-list=file:///tmp/.*"

  tika:
    image: docker.io/apache/tika:3.3.1.0
    container_name: paperless-tika
    restart: unless-stopped
    mem_limit: 512m
    cpus: 0.8

volumes:
  pgdata:
  redisdata:

7. Тонкая настройка Tesseract OCR для точного распознавания русского языка

Для корректной работы с русскоязычными актами, накладными и чеками важно понимать механику работы Tesseract OCR внутри официального Docker-образа Paperless-ngx:

  • Официальный образ уже содержит установленные языковые пакеты Tesseract для большинства распространенных языков, включая русский (rus) и английский (eng).
  • Переменная PAPERLESS_OCR_LANGUAGE принимает трёхбуквенные коды языков по стандарту ISO 639-2. Если в ваших документах встречается только русский текст, укажите rus.
  • Для корректного распознавания смешанных документов (счета-фактуры с артикулами на латинице, договоры с реквизитами SWIFT/IBAN, чеки с названиями брендов) языки комбинируются строго через знак плюс: PAPERLESS_OCR_LANGUAGE=rus+eng. В официальной документации Paperless-ngx отсутствует переменная во множественном числе — объединение словарей управляется исключительно этой директивой.
  • Параметр PAPERLESS_OCR_MODE=skip (режим по умолчанию) проверяет, содержит ли входящий PDF уже готовый текстовый слой. Если документ экспортирован из 1С, Word или онлайн-банка, Paperless мгновенно извлечет существующий векторный текст без запуска тяжелого оптического распознавания, что экономит 95% времени и ресурсов CPU.
  • Если вы сканируете мятые кассовые чеки или нечеткие сканы, можно включить предварительную очистку изображения через параметр PAPERLESS_OCR_CLEAN=clean (применяет утилиту unpaper для выравнивания страниц и удаления шумов).

8. Первый запуск стека и создание учетной записи администратора

Запустите контейнеры стека в фоновом режиме:

# Запуск всех сервисов в фоновом режиме
cd /opt/paperless
docker compose up -d

# Проверка статуса запущенных контейнеров
docker compose ps

Убедитесь по логам, что база данных успешно инициализирована, миграции Django применены, а воркер подключился к брокеру Valkey:

# Просмотр логов веб-сервера
docker compose logs -f webserver

После успешного старта создайте суперпользователя (администратора) для входа в панель управления:

# Интерактивное создание администратора Paperless-ngx
docker compose exec -it webserver python3 manage.py createsuperuser

Система запросит логин (username), адрес электронной почты и надежный пароль.

9. Публикация веб-интерфейса через Nginx Reverse Proxy с сертификатом Let's Encrypt

Поскольку веб-интерфейс Paperless слушает локальный адрес 127.0.0.1:8000, настроим Nginx в качестве реверс-прокси с автоматическим получением бесплатного SSL-сертификата Let's Encrypt.

Создайте конфигурационный файл виртуального хоста /etc/nginx/sites-available/paperless.conf:

# /etc/nginx/sites-available/paperless.conf
server {
    listen 80;
    listen [::]:80;
    server_name docs.yourdomain.ru;

    # Максимальный размер загружаемого скана/документа (до 100 МБ)
    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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        # Поддержка WebSocket для мгновенных уведомлений об окончании OCR
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Увеличенные таймауты для загрузки и обработки тяжелых сканов
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
    }
}

Активируйте сайт и проверьте конфигурацию Nginx:

# Создаем символическую ссылку
sudo ln -s /etc/nginx/sites-available/paperless.conf /etc/nginx/sites-enabled/

# Проверяем синтаксис Nginx
sudo nginx -t

# Перезагружаем Nginx
sudo systemctl reload nginx

Выпустите бесплатный сертификат Let's Encrypt с автоматической настройкой HTTPS и перенаправлением трафика:

# Выпуск SSL-сертификата с автоматическим редиректом на HTTPS
sudo certbot --nginx -d docs.yourdomain.ru --redirect --non-interactive --agree-tos -m admin@yourdomain.ru

Проверьте корректность цепочки SSL-сертификата и шифрования через бесплатный чекер SysKit:

10. Автоматизация импорта: папка consume, мобильное сканирование и обработка почты

Сила Paperless-ngx заключается в том, что вам не нужно каждый раз вручную нажимать кнопку «Загрузить» в браузере. Доступны три удобных канала автоматического пополнения архива:

  • Каталог быстрого сброса (каталог consume): Любой файл (PDF, PNG, JPG, TIFF, DOCX), скопированный в каталог /opt/paperless/consume, мгновенно подхватывается воркером. После успешного распознавания и индексации файл удаляется из входящей папки и сохраняется в защищенном хранилище media. Можно расшарить эту папку по протоколу SMB/Samba для домашнего сетевого сканера.
  • Мобильное приложение (Paperless Mobile / QuickPaper): Бесплатные приложения для Android и iOS с открытым исходным кодом. Вы фотографируете чек в магазине или акт у клиента камерой смартфона — приложение автоматически обрезает границы страницы, выравнивает перспективу и отправляет документ по API в ваш Paperless-ngx.
  • Автоматический сбор из почты (Mail Ingestion): В интерфейсе Paperless перейдите в Настройки → Почта. Подключите корпоративный почтовый ящик по IMAP (Яндекс 360, Mail.ru, собственный почтовый сервер). Создайте правило: «Каждое входящее письмо с темой Акт или от адреса бухгалтерии автоматически скачивать во вложениях и отправлять на OCR».

11. Резервное копирование документов и базы данных с помощью встроенного exporter

Потеря архива документов при сбое накопителя VDS недопустима. Paperless-ngx включает встроенную утилиту экспорта document_exporter, которая выгружает оригиналы файлов, PDF/A-копии и логический дамп базы данных со всеми метаданными в единый структурированный каталог:

# Запуск экспорта архива документов и метаданных во внешнюю папку export
docker compose exec -T webserver document_exporter ../export/

Утилита сохраняет оригиналы документов, их архивные копии и манифест manifest.json. Обратите внимание: экспорт создает снимок текущего состояния данных, но не является атомарной транзакцией во время активного распознавания новых файлов. Для максимальной надежности выполняйте экспорт по расписанию в часы минимальной активности (например, ночью) перед отправкой снапшотов в объектное S3-хранилище через Restic:

Автоматизация бэкапов архива в облачное S3-хранилище

Ознакомьтесь с нашей подробной инструкцией по настройке автоматических инкрементальных бэкапов Docker-томов и баз данных VDS на S3 с дедупликацией и шифрованием AES-256 в Restic.

Открыть инструкцию по бэкапам Restic на S3

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Сколько оперативной памяти требуется Paperless-ngx для стабильной работы?
Сам веб-сервер и Valkey потребляют около 200–300 МБ RAM. Однако в момент оптического распознавания (OCR) многостраничного PDF процесс Tesseract кратковременно требует до 1.2–1.5 ГБ RAM. Для комфортной работы рекомендуется тариф VDS от 2 ГБ RAM с обязательным подключением Swap-файла на 2 ГБ и ограничением PAPERLESS_TASK_WORKERS=1. Если у вас сервер с 4 ГБ RAM, можно увеличить число параллельных воркеров до 2.
Как Paperless-ngx распознает документы на русском языке?
Официальный Docker-образ Paperless-ngx уже включает языковые модели Tesseract OCR для десятков языков, включая русский. Чтобы система распознавала как русский текст, так и латиницу (артикулы, реквизиты, торговые марки), укажите в переменных окружения PAPERLESS_OCR_LANGUAGE=rus+eng. Обратите внимание, что языки объединяются строго через знак плюса (+).
Можно ли загружать документы форматов Word (.docx) и Excel (.xlsx)?
Да. Для работы с офисными документами Microsoft Office и LibreOffice в Docker Compose подключаются дополнительные контейнеры Gotenberg (конвертирует таблицы и документы в PDF) и Apache Tika (извлекает текст и метаданные). В файле конфигурации достаточно задать PAPERLESS_TIKA_ENABLED=1 и передать эндпоинты этих сервисов.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи