Перейти к содержанию

▍Paperless NGX

Paperless NGX

Усовершенствуем систему хранения документов с помощью Paperless NGX

Необходимые требования

У вас должны быть:

Подготовительные работы

Создаём директории для хранения наших будущих документов:

mkdir -p /docker/data/paperless/{data,media,export,consume}

Должна получиться такая структура директорий:

/docker/data/paperless/
├── consume
├── data
├── export
└── media

Docker-compose

nano paperless.yml
version: '3.9'

services:
  paperless:
    image: paperlessngx/paperless-ngx
    depends_on:
      - broker
      - gotenberg
      - tika
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]
      interval: 30s
      timeout: 10s
      retries: 5  
    environment:
      - PAPERLESS_TIME_ZONE=Europe/Moscow
      - PAPERLESS_ADMIN_USER=username
      - PAPERLESS_ADMIN_PASSWORD=Pa$$w)rd
      - [email protected]
      - PAPERLESS_REDIS=redis://broker:6379
      - PAPERLESS_URL=https://paperless.example.ru
      - PAPERLESS_TIKA_ENABLED=1
      - PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://gotenberg:3000
      - PAPERLESS_TIKA_ENDPOINT=http://tika:9998
    volumes:
      - /docker/data/paperless/data:/usr/src/paperless/data
      - /docker/data/paperless/media:/usr/src/paperless/media
      - /docker/data/paperless/export:/usr/src/paperless/export
      - /docker/data/paperless/consume:/usr/src/paperless/consume
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        window: 120s
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: stop-first
      placement:
        constraints: [node.role == worker]
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.paperless.rule=Host(`paperless.example.ru`)"
        - "traefik.http.routers.paperless.entrypoints=https"
        - "traefik.http.routers.paperless.tls=true"
        - "traefik.http.routers.paperless.middlewares=WhitelistHome"
        - "traefik.http.services.paperless.loadbalancer.server.port=8000"

  gotenberg:
    image: thecodingmachine/gotenberg
    environment:
      - DISABLE_GOOGLE_CHROME=1
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        window: 120s
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: start-first
      placement:
        constraints: [node.role == worker]

  tika:
    image: apache/tika
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        window: 120s
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: start-first
      placement:
        constraints: [node.role == worker]


  broker:
    image: redis:6.0
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        window: 120s
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: stop-first
      placement:
        constraints: [node.role == worker]

networks:
  traefik-public:
    external: true

Tika / Gotenberg

Paperless NGX не может обрабатывать офисные файлы, такие как ".doc", ".xlsx" и ".odt", только PDF-файлы. Соответсвенно при попытке загрузить файл Word в систему управления документами появляется сообщение об ошибке. С помощью Tika и Gotenberg можно преобразовать эти типы файлов в файлы PDF во время загрузки.

Недостаток

дополнительные службы потребляют системные ресурсы. У вас может закончиться память, если у вас всего 1-2 ГБ ОЗУ.

Запуск

docker stack deploy --with-registry-auth -c paperless.yml paperless

Вход

Когда вы войдете, вы должны увидеть эту страницу:

cтраница входа в Paperless

Войдите в систему, используя имя пользователя и пароль, которые вы установили для ADMINUSER и ADMINPW, и вы попадете на панель мониторинга, которая изначально будет пустой, за исключением нескольких советов по "первому использованию":

панель управления Paperless

Отсюда вы можете перейти на страницы администратора и настроек и начать загрузку документов, либо перетащив их в поле справа, либо нажав кнопку Загрузите файлы.

Прием документов

Есть несколько способов перенести документы в безбумажную систему.:

Есть consume папка, в которую, если вы поместите в нее материалы, они будут использоваться в Paperless. Что открывает нам возможность примонтировать эту папку, например, как общий ресурс Samba или расшарить её в Syncthing.

Электронная почта! Вы можете настроить адрес электронной почты для получения новых документов. Удобно иметь автоматические правила отправки квитанций по электронной почте в Paperless. Или вы можете делать то же, что и я. Я использую приложение под названием QuickScan, которое сканирует документы с моего телефона.

Заметка 😎️

В Apple есть удобный ярлык, который использует Paperless API для загрузки документов. Сделайте снимок или загрузите PDF-файл, перейдите в раздел "Поделиться" и выберите "Загрузить в Paperless формат"!

https://www.icloud.com/shortcuts/d234abc0885040129d9d75fa45fe1154

Маркировка

Я настоятельно рекомендую создать inbox тег. Это означает, что всем вновь используемым документам присваивается тег inbox, и затем вы можете просматривать все новые документы и обновлять их названия, метаданные, теги и т.д.

Inbox tag Paperless

Затем вы можете создать фильтр Новые файлы, который будет отображать на вашей домашней странице новые документы, чтобы у вас был небольшой список.

Новые файлы на главной странице Paperless

Настройка структуры папок

У безбумажной системы есть концепция "путей хранения". Когда она обрабатывает ваш файл, она сохраняет его по выбранному вами пути.

пути хранения в Paperless

При желании вы можете создать несколько путей хранения, которые совпадают для объектов в документе. Вот один из примеров:

{added_year}/{added_month}/{added_day}-{title}

Безбумажная система поддерживает множество переменных для вашего пути:

  • {asn}: Серийный номер архива документа или "нет".
  • {correspondent}: Имя корреспондента или "нет".
  • {document_type}: Имя типа документа или "нет".
  • {tag_list}: Список всех тегов, присвоенных документу, через запятую.
  • {title}: Название документа.
  • {created}: Полная дата (формат ISO) создания документа.
  • {created_year}: Создан только год, отформатирован как год с указанием столетия.
  • {created_year_short}: Создан только год, отформатирован как год без столетия, дополнен нулем.
  • {created_month}: Создан только месяц (номер 01-12).
  • {created_month_name}: Созданное название месяца в соответствии с локализацией
  • {created_month_name_short}: Сокращенное название месяца, созданное в соответствии с локализацией
  • {created_day}: Создан только день (номер 01-31).
  • {added}: Полная дата (формат ISO) добавления документа в paperless.
  • {added_year}: Добавлен только год.
  • {added_year_short}: Добавлен только год, отформатирован как год без столетия, дополнен нулем.
  • {added_month}: Добавлен только месяц (номер 01-12).
  • {added_month_name}: Добавлено название месяца в соответствии с локализацией
  • {added_month_name_short}: Добавлено сокращенное название месяца в соответствии с локализацией
  • {added_day}: Добавлен только день (номер 01-31).

Полный список можно увидеть здесь.

Если вы уже импортировали все свои файлы, вы можете добавить их все в путь к хранилищу, произведя массовое редактирование. После этого любые изменения в пути к хранилищу будут автоматически обновляться, так что вы сможете автоматически изменять свой путь в будущем, если захотите!

перемещение документов Paperless

Резервные копии

Управление вашими собственными документами также означает необходимость управлять резервными копиями документов.

Мы можем сделать это, выполнив команду:

┌─( root@swarm-worker3 ) - ( 21 files,  ) - ( ~ )
└─> docker exec -it $(docker ps -f name=paperless -q| head -n1) document_exporter /usr/src/paperless/export --zip
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 12/12 [00:00<00:00, 102.05it/s]

При этом выводится файл с именем export-2024-03-05.zip (дата меняется). 

┌─( root@swarm-worker3 ) - ( 23 files,  ) - ( ~ )
└─> ls -lha /docker/data/paperless/export/
total 225M
drwxr-xr-x 2 1000 1000    1 мар  5 13:50 ./
drwxr-xr-x 6 root root    4 фев 16 12:26 ../
-rw-r--r-- 1 1000 1000 225M мар  5 13:50 export-2024-03-05.zip

Настроим crontab задание, используя контейнер swarm-cronjob, вот его docker compose:

nano crontab.yml
version: '3.9'

services:
  swarm-cronjob:
    image: crazymax/swarm-cronjob:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - "TZ=Europe/Moscow"
      - "LOG_LEVEL=info"
      - "LOG_JSON=false"
    networks:
      - traefik-public
    deploy:
      replicas: 1
      restart_policy:
        condition: any
        delay: 5s
        window: 120s
      update_config:
        parallelism: 1
        monitor: 60s
        failure_action: rollback
        order: start-first
      placement:
        constraints: [node.role == manager]


  paperless-cron-backup-job:
    image: paperlessngx/paperless-ngx
    networks:
      - traefik-public
    command: document_exporter /usr/src/paperless/export --zip
    volumes:
      - /docker/data/paperless/data:/usr/src/paperless/data
      - /docker/data/paperless/media:/usr/src/paperless/media
      - /docker/data/paperless/export:/usr/src/paperless/export
      - /docker/data/paperless/consume:/usr/src/paperless/consume
    deploy:
      mode: replicated
      replicas: 0
      labels:
        - "swarm.cronjob.enable=true"
        - "swarm.cronjob.schedule=0 1 * * *"
        - "swarm.cronjob.skip-running=false"
      restart_policy:
        condition: none


networks:
  traefik-public:
    external: true
Задания на резервное копирование будут запускаться каждый день в час ночи swarm.cronjob.schedule=0 1 * * *.

К началу