一、技术选型与架构说明
针对档案软件维护成本高、二次开发难、数据迁移繁琐的问题,本文采用目前开源社区最成熟的文档管理系统Paperless-ngx作为核心,配合Docker容器化技术进行部署。该方案完全替代传统商业档案软件的文档归档、OCR识别、全文检索及标签管理功能。
系统架构包含三个核心组件:
- paperless-webserver:基于Django的Web应用,负责业务逻辑处理。
- paperless-redis:负责任务队列管理和缓存。
- paperless-postgres:存储元数据、用户配置及索引信息。
- paperless-gotenberg:负责将文档转换为PDF。
- paperless-tika:负责解析文档内容。
二、环境准备与Docker安装
本指南以Ubuntu 22.04 LTS为例,其他CentOS或Debian系统操作步骤类似。首先确保你拥有一台拥有Root权限的服务器。
1. 更新系统并安装依赖
执行以下命令更新系统源并安装必要的工具:
```bash
apt update && apt upgrade -y
apt install -y curl git wget
```
2. 安装Docker及Docker Compose
直接使用官方一键安装脚本,避免手动配置环境变量出错:
```bash
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
```
安装完成后,启动Docker服务并设置开机自启:
```bash
systemctl start docker
systemctl enable docker
```
验证安装是否成功:
```bash
docker --version
docker compose version
```
三、项目目录与配置文件创建
为了便于管理和数据持久化,我们需要创建一个独立的目录来存放配置和数据文件。
1. 创建目录结构
```bash
mkdir -p /opt/paperless/data
mkdir -p /opt/paperless/media
mkdir -p /opt/paperless/export
mkdir -p /opt/paperless/consume
cd /opt/paperless
```
2. 编写docker-compose.yml
在/opt/paperless目录下创建docker-compose.yml文件。请直接复制以下完整配置,无需修改即可运行。该配置已包含中文环境优化设置。
```yaml
services:
broker:
image: docker.io/library/redis:7
restart: always
volumes:
- ./redis:/data
gotenberg:
image: docker.io/gotenberg/gotenberg:7.7
restart: always
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/."
tika:
image: ghcr.io/paperless-ngx/tika:latest
restart: always
db:
image: docker.io/postgres:15
restart: always
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: always
depends_on:
- db
- broker
- gotenberg
- tika
ports:
- "8000:8000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"]
interval: 30s
timeout: 10s
retries: 5
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBPASS: paperless
设置时区为上海
PAPERLESS_TIME_ZONE: Asia/Shanghai
设置OCR语言为简体中文和英文,这是档案识别的关键
PAPERLESS_OCR_LANGUAGE: chi_sim+eng
PAPERLESS_OCR_MODE: skip_no_text
自动消耗导入目录中的文件
PAPERLESS_CONSUMPTION_DIR: /usr/src/paperless/consume
PAPERLESS_MEDIA_ROOT: /usr/src/paperless/media
禁用遥测数据上传
PAPERLESS_ENABLE_HTTP_REMOTE_USER: false
USERMAP_UID: 1000
USERMAP_GID: 1000
webserver-exporter:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
restart: always
depends_on:
- db
- broker
- gotenberg
- tika
volumes:
- ./data:/usr/src/paperless/data
- ./media:/usr/src/paperless/media
- ./export:/usr/src/paperless/export
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBPASS: paperless
PAPERLESS_TIME_ZONE: Asia/Shanghai
command: ["document_exporter"]
volumes:
data:
media:
postgres:
```
四、部署与中文OCR支持配置
配置文件准备好后,即可启动服务。由于官方镜像默认未包含完整的中文OCR训练数据,我们需要在启动后手动加载,否则档案识别将无法显示中文。
1. 启动服务容器
在/opt/paperless目录下执行:
```bash
docker compose up -d
``>
等待约30-60秒,待所有容器状态为Up (healthy)后,查看启动日志:
```bash
docker compose logs -f webserver
```
看到类似Starting development server at http://0.0.0.0:8000/的日志时,按Ctrl+C退出日志查看。
2. 安装中文OCR语言包
这是实现档案中文检索的核心步骤。我们需要下载chi_sim.traineddata文件并放入容器内的Tesseract tessdata目录。
首先进入webserver容器:
```bash
docker exec -it paperless-webserver-1 bash
```
在容器内执行以下命令下载中文简体语言包:
```bash
wget https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata -P /usr/share/tessdata/
wget https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata -P /usr/share/tessdata/
```

下载完成后,验证文件是否存在:
```bash
ls -l /usr/share/tessdata/chi_sim.traineddata
```
确认文件存在后,退出容器:
```bash
exit
```
重启Web服务以加载语言包:
```bash
docker compose restart webserver
```
五、初始化与基础使用
1. 创建超级管理员账户
服务重启完毕后,执行以下命令创建管理员:
```bash
docker compose exec webserver createsuperuser
``>
按照提示输入用户名、邮箱和密码(密码输入时不可见)。
2. 访问系统与文档归档
打开浏览器,访问http://服务器IP:8000。使用刚才创建的超级管理员账户登录。
档案上传方式:
- Web界面上传:点击右上角“Upload”按钮,直接拖拽PDF或图片文件。
- 文件夹监控(推荐):将文件上传到服务器的
/opt/paperless/consume目录,系统会自动抓取、OCR识别并归档,随后自动删除原文件。
3. 验证OCR识别效果
上传一张包含中文的PDF或图片,进入“Documents”列表。点击文档详情,在右侧侧边栏查看“Metadata”或直接在搜索框输入文档中的中文关键词。如果能搜到结果,说明中文OCR配置成功。
六、自动化备份与维护策略
解决维护成本高的核心在于自动化。通过脚本实现数据库和文件的定时备份,确保数据安全且无需人工干预。
1. 编写自动备份脚本
创建/opt/paperless/backup.sh文件,写入以下内容:
```bash
!/bin/bash
定义变量
BACKUP_DIR="/opt/paperless/backups"
DATE=$(date +%Y%m%d_%H%M%S)
POSTGRES_CONTAINER="paperless-db-1"
创建备份目录
mkdir -p $BACKUP_DIR
1. 备份PostgreSQL数据库
echo "Backing up database..."
docker exec $POSTGRES_CONTAINER pg_dump -U paperless paperless > $BACKUP_DIR/db_backup_$DATE.sql
2. 打包数据目录和媒体目录
echo "Backing up data and media..."
tar -czf $BACKUP_DIR/paperless_data_$DATE.tar.gz /opt/paperless/data /opt/paperless/media
3. 删除7天前的备份
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: $DATE"
```
赋予脚本执行权限:
```bash
chmod +x /opt/paperless/backup.sh
```
2. 设置定时任务
使用crontab每天凌晨2点自动执行备份:
```bash
crontab -e
```
在文件末尾添加:
```bash
0 2 /opt/paperless/backup.sh >> /var/log/paperless_backup.log 2>&1
```
七、系统更新与灾难恢复
当软件版本更新时,无需重新购买或复杂迁移,只需执行以下命令即可一键升级:
1. 更新系统镜像
```bash
cd /opt/paperless
docker compose pull
docker compose up -d
docker image prune -f
```
2. 灾难恢复操作
若服务器发生故障,只需在新机器上按照上述步骤安装Docker和配置目录,然后将backups目录中的备份文件拷贝过去。
恢复数据库:
```bash
恢复DB
docker exec -i paperless-db-1 psql -U paperless paperless < db_backup_xxx.sql
恢复文件
tar -xzf paperless_data_xxx.tar.gz -C /
```
执行完恢复操作后,重启服务即可完全还原档案系统。