其实想搭一套 paperless-ngx 已经挺久的了, 趁着四月底休假的时候搞了一动。
我们经常会有一些各式各样的 PDF 文档,例如和各种供应商、公司之间签署的文件、账单, 以及参加一些学术会议时留下的幻灯、资料等等。比较自然的办法就是创建不同的文件夹来分门别类地保存。 然而,简单地用文件系统来保存这些文件有这样一些问题:
PENDING_DELETE_<TODAY+365days>
目录中,然后等到期之后世界整体删除。之前在上家公司搞的是 NAS,因此我平时也经常会看到一些与此相关的讨论。我发现 paperless 这个项目实现了大部分我希望的功能。 后来,这个项目发展成了 paperless-ng 和 paperless-ngx。
FreeBSD 提供了一个 paperless-ng 的 port,不过还需要稍微配置一下。
$ sudo pkg install py311-paperless-ngx redis nginx ca_root_nss
首先是 PostgreSQL 数据库,基本上,创建一个 paperless 的数据库,以及一个专门的用户来访问该数据库:
$ su -l postgres
$ createuser paperless
$ createdb paperless -O paperless
$ sql paperless_db
alter role paperless with encrypted password '修改此密码'
grant all privileges on database paperless to paperless
exit
启用 redis:
$ sudo sysrc redis_enable=yes
port 提供了一个示范的 /usr/local/etc/paperless.conf
。除了数据库、redis之外我主要修改了下面的配置:
PAPERLESS_SECRET_KEY
。这个随机生成一个长串即可(我不太理解为什么系统不自动生成一个存下来)。PAPERLESS_URL
、PAPERLESS_CSRF_TRUSTED_ORIGINS
、PAPERLESS_ALLOWED_HOSTS
、PAPERLESS_CORS_ALLOWED_HOSTS
。填写 BeyondCorp 的地址。PAPERLESS_OCR_LANGUAGE
。我设置了 eng+chi_sim+chi_tra
(英语、简体中文、繁体中文)PAPERLESS_OCR_USER_ARGS
。我设置了 {"invalidate_digital_signatures": true}
。有些 PDF 文件有数字签名,此时 OCRmyPDF 会拒绝识别文字,这是没有必要的,原因是 paperless-ngx 已经保留了原始文件。PAPERLESS_WORKER_TIMEOUT
。我设置了一个比较大的值,原因是机器毕竟已经十几年前的配置了,而且这是个批作业操作,没必要那么早放弃。sched_yield()
,而 OpenBLAS 拒绝承认这是他们的问题。实际使用中,我认为对个人用户来说,采用多线程对性能的改善有限(分类基本上是个批作业的活,而所有的计算中比较耗时的是 OCR,然而即使是 OCR 在我的机器上也不算很慢了)。port 还提供了一个示范的 nginx.conf
。我做的主要变动是:
client_max_body_size 256m; # 允许上传不超过 256MB 的 PDF。默认值是 1MB
set_real_ip_from PROXY_IP; # 相信来自 PROXY_IP 的 X-Forwarded-For IP 地址。
real_ip_header X-Forwarded-For;
在 /etc/rc.conf
中最终应该有下列启动项目:
postgresql_login_class="postgres"
postgresql_enable="yes"
redis_enable="yes"
paperless_migrate_enable="YES"
paperless_beat_enable="YES"
paperless_consumer_enable="YES"
paperless_webui_enable="YES"
paperless_worker_enable="YES"
nginx_enable="YES"
我启用了 paperless_migrate_enable
,主要是因为该服务器有自动快照,而我认为没有理由不让 Django
在软件升级时不做数据库迁移。
单独做一个 paperless-ngx 用于保存数据的 ZFS (默认配置中,在 /var/db/paperless
下) ,可以方便备份。
不过,由于 paperless-ngx 的许多信息是保存在数据库中的,因此实践上还应把数据库等等放在一起才比较符合备份的原则。
我最终选择了对整个 jail 做一个 ZFS 数据集。