使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』
哈喽小伙伴们好,我是Stark-C~
对于文案类的办公场景来说,手头堆放最多的可能就是各种文档文件,以及各种用过的打印废纸。
这么多年来,不管是领导还是员工,都希望能够使用数字化管理做到无纸化办公,抛开环保不谈,更重要的是它能节约成本开支,便于管理与提高效率。这种管理工具市面上不多,并且基本还是收费的。
今天为大家分享的这个项目『Paperless-ngx』就是一款非常不错的无纸化办公管理工具,可以轻松管理我们日常常见的各类文档,最重要的是,它还是免费开源,支持本地私有化部署也保障了文档的安全性。
关于Paperless-ngx
🔺当我们看到Paperless-ngx标识的时候,第一眼看到的绿叶就说明它的功能亮点:绿色环保(也就是它倡导的“无纸化”),实时上它对于很多职场人士来说,确实可以做到无纸化办公。简单谈说,它其实就是帮助用户实现无纸化办公和文档数字化管理工具,其核心功能包括:
文档的组织与索引:通过标签、对应者、类型等多种方式组织扫描文档。
OCR文本识别:对文档进行光学字符识别,使包含图像的扫描文档也能搜索和选择文本。
多语言支持:利用开源的Tesseract引擎,支持100多种语言。
长期存储格式:文档以PDF/A格式保存,设计用于长期存储。
智能标签与分类:使用机器学习自动添加标签、对应者和文档类型。
广泛的文件支持:支持PDF文档、图像、纯文本文件、Office文档等。
定制化的文件管理:Paperless-ngx管理文件名和文件夹,支持不同的配置。
现代化的网页应用:定制仪表板、过滤器、批量编辑、拖放上传、自定义视图、共享链接等。
全文搜索:自动完成、相关性排序、高亮显示匹配查询的部分。
电子邮件处理:从电子邮件账户导入文档,配置多个账户和规则。
多用户权限系统:内置健壮的多用户权限系统。
多核系统优化:并行处理多个文档。
然后引用下其他网友总结出来的几个较为常见且实用的使用场景:
• 个人文件管理:无论是家庭账单、保险合同还是医疗报告,Paperless-ngx 都能帮你把纸质文件变成可搜索的电子文件,告别纸质文件的烦恼。
• 企业档案管理:对于企业来说,文件量庞大且分类复杂,而Paperless-ngx 的OCR和标签功能让档案的整理和查找都更有效率。特别适合中小企业,降低文件管理成本。
• 教育与研究:对于学术机构或研究人员来说,海量的研究报告、会议纪要和参考资料都可以借助 Paperless-ngx 进行存档和检索,为学术研究提供支持。
它还提供了演示Demo,有兴趣的小伙伴可以先体验再部署:https://demo.paperless-ngx.com/
Paperless-ngx部署
部署前的准备:
需要说明的是,今天的这个项目需要多大5个容器同时联动和配合,所以我们可以简单的使用Docker Compose即可轻松部署,而在极空间上使用Docker Compose,最简单的方案莫过于Portainer了。
🔺极空间自从上次更新上线SSH功能以后,可玩性和功能性大大增强。我也是第一时间给大家分享了它的一些基本玩法和注意事项,其中就包括Portainer的部署:
按照文中教程,部署好Portainer以及了解它的基本用法还是没有问题的。
我这里再次多嘴提醒下绝大多数的普通用户:如果你只是为了使用命令部署Docker,就和我一样在部署好Portainer之后关掉极空间的SSH功能,一个是因为安全问题,另一个是防止自己误删极空间的系统文件导致系统问题。在Portainer中支持所有容器的命令和图像化部署,哪怕不是Compose命令,大家也可以通过【composerize】官网在线转换,非常方便!
另外就是Portainer是在使用命令部署容器的时候也是需要拉取Docker镜像,所以必要的代理和网络还是少不了的,要不然也会失败,这里就不讨论了~
🔺然后在极空间的Docker目录下新建一个“paperlessngx”的文件夹,在paperlessngx文件夹下面在新建 consume、data、db、export、media、redis、trash总共7个子文件夹。
开始部署:
🔺完成准备工作之后打开Portainer,选择“堆栈--添加堆栈”。
🔺名称随意,在Web编辑器中输入以下命令(直接复制粘贴即可,注意格式很重要):
services:
redis:
image: redis:7
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
mem_limit: 512m
mem_reservation: 256m
cpu_shares: 768
security_opt:
- no-new-privileges:true
read_only: true
user: 0:0 # 用户UID和GID,极空间用户不用改,其它NAS用户请自行修改
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- ./Docker/paperlessngx/redis:/data:rw # 映射redis文件夹实际路径
environment:
TZ: Asia/Shanghai
restart: unless-stopped
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
cpu_shares: 768
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
timeout: 45s
interval: 10s
retries: 10
volumes:
- ./Docker/paperlessngx/db:/var/lib/postgresql/data # 映射db文件夹实际路径
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperlessuser
POSTGRES_PASSWORD: paperlesspass
restart: unless-stopped
gotenberg:
image: gotenberg/gotenberg:latest
container_name: PaperlessNGX-GOTENBERG
hostname: gotenberg
security_opt:
- no-new-privileges:true
user: 0:0 # 用户UID和GID,极空间用户不用改,其它NAS用户请自行修改
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
restart: unless-stopped
tika:
image: ghcr.io/paperless-ngx/tika:latest
container_name: PaperlessNGX-TIKA
hostname: tika
security_opt:
- no-new-privileges:true
user: 0:0 # 用户UID和GID,极空间用户不用改,其它NAS用户请自行修改
restart: unless-stopped
paperless:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: PaperlessNGX
hostname: paperless-ngx
mem_limit: 6g
cpu_shares: 1024
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 5
ports:
- 8000:8000 # 项目打开端口,冒号前面请勿和本地冲突
volumes:
- ./Docker/paperlessngx/data:/usr/src/paperless/data # 映射data文件夹实际路径
- ./Docker/paperlessngx/media :/usr/src/paperless/media # 映射media文件夹实际路径
- ./Docker/paperlessngx/export:/usr/src/paperless/export # 映射export文件夹实际路径
- ./Docker/paperlessngx/consume:/usr/src/paperless/consume # 映射consume文件夹实际路径
- ./Docker/paperlessngx/trash:/usr/src/paperless/trash # 映射trash文件夹实际路径
environment:
PAPERLESS_REDIS: redis://:redispass@paper-redis:6379
PAPERLESS_DBENGINE: postgresql
PAPERLESS_DBHOST: paper-db
PAPERLESS_DBNAME: paperless
PAPERLESS_DBUSER: paperlessuser
PAPERLESS_DBPASS: paperlesspass
PAPERLESS_EMPTY_TRASH_DIR: ../trash
PAPERLESS_FILENAME_FORMAT: '{{ created_year }}/{{ correspondent }}/{{ document_type }}/{{ title }}'
PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD: 6
PAPERLESS_TASK_WORKERS: 1
USERMAP_UID: 0 # 用户UID,极空间用户不用改,其它NAS用户请自行修改
USERMAP_GID: 0 # 用户GID,极空间用户不用改,其它NAS用户请自行修改
PAPERLESS_TIME_ZONE: Asia/Shanghai
PAPERLESS_ADMIN_USER: stark-c # 默认管理员用户名
PAPERLESS_ADMIN_PASSWORD: 123456 # 默认管理员密码
PAPERLESS_OCR_LANGUAGES: chi-sim chi-tra
PAPERLESS_OCR_LANGUAGE: eng+chi_sim
PAPERLESS_TIKA_ENABLED: 1
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
tika:
condition: service_started
gotenberg:
condition: service_started
以上代码需要根据注释自行修改,其它没有注释的如果不懂请不要乱动。
🔺修改好之后点击页面底部的“部署堆栈”。
🔺等待的时间稍长,如果不出意外,就能看到这个项目中的5个容器都在正常运行。
Paperless-ngx体验
🔺打开方式依然是常规的【极空间本地IP:端口号】即可,首次打开需要输入用户名和密码,也就是我们部署容器时环境变量中自己设置的账户密码。
🔺登录进来之后就可以看到它默认显示的就是我们部署时候的用户名信息,并且原生都是中文显示。
🔺我这里尝试先上传一个Word文档,直接在首页(仪表盘)这里点击上传,或者拖拽都可以。
🔺几秒钟的时间,文件就会出现在“文档”菜单。
🔺点开可以直接查看,同时还能OCR识别。可以看到它对文字类的OCR识别可以说是做到了准确率极高,几乎没有漏掉和错误。
🔺多用户还能方便在这里编辑权限。
🔺同样的方法,我上传了一张照片并打开。
🔺可以看到照片中的文字也被成功识别。
🔺不过稍微复杂的图片文字就少点意思了,并且明显英文的识别率要高于中文很多。
🔺对于TXT格式的文档支持的也非常不错,比如说我这里上传的一段Docker Compose.yaml代码,夹杂着中文注释,它都是完美支持。
🔺最后看看对于PDF的支持,依然没任何问题,并且OCR识别同样准确率很高。
🔺它还有一个很好的功能就是智能搜索,给出关键字,很快就能找到我们保存在上面的文档。
🔺有点遗憾的是它目前不支持我写文章的Markdown格式,如果后期支持那就太合我意了!
最后
今天分享的这个项目还是非常实用了,它可以让我们更好地管理他们的文档,提高生产力,减少纸张使用,不管是对企业还是个人都是一个实用的解决方案,有兴趣的小伙伴可以整起来了!
最近正逢极空间双十一感恩回馈大促销活动,极空间的多款产品都有好价。如果你近期有入手NAS的计划,不妨关注下极空间。
好了,以上就是今天给大家分享的内容,我是爱分享的Stark-C,如果今天的内容对你有帮助请记得收藏,顺便点点关注,咱们下期再见!谢谢大家~