▍Paperless NGX¶
Усовершенствуем систему хранения документов с помощью Paperless NGX¶
Необходимые требования¶
У вас должны быть:
- Docker и docker-compose
- Docker Swarm
- Обратный прокси, например, Traefik
Подготовительные работы¶
Создаём директории для хранения наших будущих документов:
Должна получиться такая структура директорий:
Docker-compose¶
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 ГБ ОЗУ.
Запуск¶
Вход¶
Когда вы войдете, вы должны увидеть эту страницу:
Войдите в систему, используя имя пользователя и пароль, которые вы установили для ADMINUSER
и ADMINPW
, и вы попадете на панель мониторинга, которая изначально будет пустой, за исключением нескольких советов по "первому использованию":
Отсюда вы можете перейти на страницы администратора и настроек и начать загрузку документов, либо перетащив их в поле справа, либо нажав кнопку Загрузите файлы
.
Прием документов¶
Есть несколько способов перенести документы в безбумажную систему.:
Есть consume
папка, в которую, если вы поместите в нее материалы, они будут использоваться в Paperless. Что открывает нам возможность примонтировать эту папку, например, как общий ресурс Samba или расшарить её в Syncthing.
Электронная почта! Вы можете настроить адрес электронной почты для получения новых документов. Удобно иметь автоматические правила отправки квитанций по электронной почте в Paperless. Или вы можете делать то же, что и я. Я использую приложение под названием QuickScan
, которое сканирует документы с моего телефона.
Заметка 😎️
В Apple есть удобный ярлык, который использует Paperless API для загрузки документов. Сделайте снимок или загрузите PDF-файл, перейдите в раздел "Поделиться" и выберите "Загрузить в Paperless формат"!
https://www.icloud.com/shortcuts/d234abc0885040129d9d75fa45fe1154
Маркировка¶
Я настоятельно рекомендую создать inbox
тег. Это означает, что всем вновь используемым документам присваивается тег inbox
, и затем вы можете просматривать все новые документы и обновлять их названия, метаданные, теги и т.д.
Затем вы можете создать фильтр Новые файлы
, который будет отображать на вашей домашней странице новые документы, чтобы у вас был небольшой список.
Настройка структуры папок¶
У безбумажной системы есть концепция "путей хранения". Когда она обрабатывает ваш файл, она сохраняет его по выбранному вами пути.
При желании вы можете создать несколько путей хранения, которые совпадают для объектов в документе. Вот один из примеров:
Безбумажная система поддерживает множество переменных для вашего пути:
{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).
Полный список можно увидеть здесь.
Если вы уже импортировали все свои файлы, вы можете добавить их все в путь к хранилищу, произведя массовое редактирование. После этого любые изменения в пути к хранилищу будут автоматически обновляться, так что вы сможете автоматически изменять свой путь в будущем, если захотите!
Резервные копии¶
Управление вашими собственными документами также означает необходимость управлять резервными копиями документов.
Мы можем сделать это, выполнив команду:
┌─( 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:
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 * * *
.