使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』

使用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,如果今天的内容对你有帮助请记得收藏,顺便点点关注,咱们下期再见!谢谢大家~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL基础入门——SQL基础语法

1. 数据库、表、列的创建与管理 在SQL中,数据库是一个数据的集合,包含了多个表、视图、索引、存储过程等对象。每个表由若干列(字段)组成,表中的数据行代表记录。管理数据库和表的结构是SQL的基础操作。 1.1 创建数据…

YOLOv11融合PIDNet中的PagFM模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2…

什么是代理,nodenginx前端代理详解

一. 什么是代理? 代理就是通过一个特殊的网络服务去访问另一网络服务的一种间接访问方式。像我们不能直接访问国外的网站,只能使用VPN,就是使用了代理 二. 前端为什么要用代理? 首先明确以下两个概念 (1&#xff09…

BERT解析

BERT项目 我在BERT添加注释和部分推理代码 main.py vocab WordVocab.load_vocab(args.vocab_path)#加载vocab那么这个加载的二进制是什么呢? 1. 加载数据集 继承关系:TorchVocab --> Vocab --> WordVocab TorchVocab 该类主要是定义了一个词…

《独立开发:Spring 框架的综合应用》

一、Spring 框架概述 Spring 是一个分层的 Java SE/EE full-stack 轻量级开源框架,以 IoC 和 AOP 为内核,具有方便解耦、方便集成优秀框架、降低 Java EE API 使用难度等优点。 Spring 框架因其强大的功能以及卓越的性能而受到众多开发人员的喜爱。它是…

JMeter如何配置分布式?

一、复制两个代理机 二、代理机一 在第一个D:\install\apache-jmeter1\bin目录下,修改"jmeter.properties"文件 搜索"server_port"改成"server_port1999", "#server.rmi.ssl.disablefalse"改成"server.r…

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…

物联网实验室建设方案

一、物联网实验室建设 (1) 基础理论教学云平台 唯众基础理论教学云平台是一个专为物联网相关专业教学打造的综合性在线教学平台。该平台凭借先进的技术架构和丰富的教学资源,为师生提供了一个高效、便捷、互动的学习环境。以下是该平台的主要特点和功能描述&#…

【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式

文章目录 前言1. ret 和 retf1.1 ret 指令1.1.1 功能与理解1.1.2 程序演示 1.2 retf 指令1.2.1 功能与理解1.2.2 程序演示 2. call 指令3. 依据位移进行转移的call指令3.1 格式与功能3.1.1 格式3.1.2 功能 3.2 理解指令 4. 转移的目的地址在指令中的call指令4.1 格式与功能4.1.…

(免费送源码)计算机毕业设计原创定制:Java+B/S+SSM+Web前端开发技术+IDEA+MySQL+Navicat 有风小院

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对有风小院等问题,对有风小院信息…

# DBeaver 连接hive数仓

前提 前提是基于hadoop的hive服务已经启动,其中hive的服务包括metastore元数据服务和hiveserver2服务已经启动。hiveserver2服务在默认端口10000启动,且通过telnet xx.xx.xx.xx 10000 能通。 满足以上要求后,再可以看以下连接文档&#xff…

数据结构:链表进阶

链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素&#xff1…

DVWA 在 Windows 环境下的部署指南

目录预览 一、靶场介绍二、前置准备1. 环境准备2.靶场下载 三、安装步骤1.配置Phpstudy2.配置数据库3.配置DVWA4.登入DVWA靶场 四、参考链接 一、靶场介绍 DVWA 一共包含了十个攻击模块,分别是: Brute Force(暴力(破解&#xff…

关于如何在k8s中搭建一个nsfw黄图鉴定模型

随着现在应用内图片越来越多,安全审查也是必不可少的一个操作了 下面手把手教你如何将huggingface中的黄图检测模型部署到自己的服务器上去 1.找到对应的模型 nsfw_image_detection 2.在本地先验证如何使用 首先安装transformers python库 pip install transform…

【linux】tar命令讲解笔记

Linux tar 命令 Linux tar(英文全拼:tape archive )命令用于备份文件。 tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。 tar 名字来自 "tape archive"(磁带归档),最初用于将…

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机,说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机,让用户更加专注上层,而不用在乎下层的一个产品。这就是JVM的跨平台,一次编译,到处运行。 而JVM中的核心功能其实就是自动…

Android音频框架总结

1、AudioFlinger:接收多个APP的数据,合并下发;是策略的执行者,例如具体如何与音频设备通信,如何维护现有系统中的音频设备,以及多个音频流的混音如何处理等等都得由它来完 成。 AudioFlinger主要包含3个主…

深度学习:自然语言处理

一、引言 自然语言处理作为人工智能领域的关键分支,致力于使计算机能够理解、分析和生成人类语言。近年来,随着深度学习技术的迅猛发展,自然语言处理取得了前所未有的突破,一系列创新技术和应用不断涌现,极大地推动了…

网络安全-安全散列函数,信息摘要SHA-1,MD5原理

安全散列函数 单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要。数据指纹)。还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA 散列函数的要求 散列函数的目的是文件、消息或者其它数据…

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…