方案选型与技术栈说明
针对小微企业档案管理需求,商业软件授权费用高且二次开发困难。本文采用开源技术栈,基于Docker容器化部署Paperless-ngx系统。该方案支持OCR文字识别、自动标签归档、全文检索,完全满足小微企业合同、发票、人事档案数字化管理需求,且无需支付任何授权费用。
技术栈构成:
- Web服务:Paperless-ngx (基于Django)
- 数据库:PostgreSQL 15
- 缓存:Redis 7
- 文档转换:Gotenberg (处理PDF转图片)
- OCR引擎:Tesseract (支持中文识别)
- 容器编排:Docker Compose
环境准备
本指南以Ubuntu 22.04 LTS为例,其他Linux发行版命令略有差异。请确保拥有一台拥有公网IP的服务器或内网虚拟机,配置建议为2核4G内存,硬盘空间根据档案量自行配置。
安装Docker与Docker Compose
首先更新系统源并安装必要依赖:
```bash
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
```
添加Docker官方GPG密钥:
```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```
设置Docker仓库并安装:
```bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
验证安装是否成功:
```bash
docker --version
docker compose version
```
部署实施
创建项目目录结构
为了数据持久化,我们需要在宿主机创建目录挂载到容器中。执行以下命令:
```bash
mkdir -p ~/paperless/data
mkdir -p ~/paperless/media
mkdir -p ~/paperless/export
mkdir -p ~/paperless/consume
mkdir -p ~/paperless/db
cd ~/paperless
```
编写Docker Compose配置文件
在~/paperless目录下创建docker-compose.yml文件,内容如下。该配置已包含中文OCR优化设置:
```yaml
services:
broker:
image: docker.io/library/redis:7-alpine
container_name: paperless_broker
restart: always
volumes:
- ./redisdata:/data
db:
image: docker.io/library/postgres:15
container_name: paperless_db
restart: always
volumes:
- ./db:/var/lib/postgresql/data
environment:
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
POSTGRES_DB: paperless
webserver:
image: ghcr.io/paperless-ngx/paperless-ngx:latest
container_name: paperless_webserver
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
- ./fonts:/usr/share/fonts
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBUSER: paperless
PAPERLESS_DBPASS: paperless
PAPERLESS_DBPORT: 5432
PAPERLESS_OCR_LANGUAGE: chi_sim+eng
PAPERLESS_OCR_LANGUAGES: chi_sim,eng
PAPERLESS_TIME_ZONE: Asia/Shanghai
PAPERLESS_ADMIN_USER: admin
PAPERLESS_ADMIN_PASSWORD: your_secure_password
PAPERLESS_URL: http://localhost:8000
gotenberg:
image: docker.io/gotenberg/gotenberg:7
container_name: paperless_gotenberg
restart: always
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/."
tika:
image: ghcr.io/paperless-ngx/tika:latest
container_name: paperless_tika
restart: always
```
配置中文OCR支持
默认镜像可能不包含完整的中文训练数据。我们需要下载中文字体和语言包以确保识别准确率。在~/paperless目录下执行:
```bash
创建字体目录
mkdir -p ./fonts
下载中文字体(以思源黑体为例)
wget https://github.com/adobe-fonts/source-han-sans/raw/release/SubsetOTF/CN/SourceHanSansCN-Regular.otf -O ./fonts/SourceHanSansCN-Regular.otf
下载Tesseract中文训练数据
wget https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata -O ./data/chi_sim.traineddata
```
启动服务与初始化
启动容器
在~/paperless目录下执行以下命令拉取镜像并启动所有服务:
```bash
docker compose up -d
```
查看容器运行状态,确保所有服务均为Up状态:
```bash
docker compose ps
```
初始化管理员账户

虽然我们在配置文件中设置了环境变量,但建议首次进入后手动修改密码。如果配置文件中未设置PAPERLESS_ADMIN_USER,可以使用以下命令创建:
```bash
docker compose run --rm webserver createsuperuser
```
按照提示输入用户名、邮箱和密码。
系统配置与使用
启动完成后,通过浏览器访问http://服务器IP:8000。
配置保存路径
登录后,点击右上角头像 -> Settings -> Settings -> Documents。
- Original Documents: 勾选"Preserve original filename"(保留原始文件名)。
- Numbering: 设置文档编号规则,例如按年份归档。
设置自动归档规则
这是档案自动化的核心。进入Settings -> Settings -> Automation。
- 点击Create new automation rule。
- Match title: 输入匹配规则,如
Invoice_.(匹配所有以Invoice_开头的文件)。
- Assign tag: 选择或创建"财务发票"标签。
- Assign document type: 选择"发票"。
- 点击Save。
此后,上传文件名匹配规则的文档时,系统会自动打标并归档。
文档上传与OCR测试
- 点击界面左侧的Upload Documents。
- 拖拽一张包含中文的PDF或图片文件。
- 等待几秒钟,系统会自动进行OCR识别。
- 点击进入文档详情页,右侧会显示识别出的文字内容。在顶部搜索框输入任意识别出的文字,即可检索到该文档。
数据备份与恢复策略
小微企业必须重视数据安全。我们编写一个简单的备份脚本,将数据库和文档文件打包。
编写备份脚本
创建backup.sh:
```bash
!/bin/bash
BACKUP_DIR="/root/paperless_backups"
DATE=$(date +%Y%m%d_%H%M%S)
SOURCE_DIR="/root/paperless"
mkdir -p $BACKUP_DIR
备份数据库
docker compose exec -T db pg_dump -U paperless paperless > $BACKUP_DIR/db_dump_$DATE.sql
打包数据与媒体文件
tar -czf $BACKUP_DIR/paperless_data_$DATE.tar.gz $SOURCE_DIR/media $SOURCE_DIR/export $SOURCE_DIR/data
删除7天前的备份
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed: $DATE"
```
赋予执行权限并设置定时任务:
```bash
chmod +x backup.sh
crontab -e
```
添加每天凌晨2点执行备份:
```text
0 2 /root/paperless/backup.sh >> /var/log/paperless_backup.log 2>&1
```
常见维护操作
更新系统版本
Paperless-ngx更新频繁,获取新功能和Bug修复:
```bash
cd ~/paperless
docker compose pull
docker compose up -d
docker compose exec webserver python3 manage.py migrate
```
清理未使用的文档
如果误上传或需要清理测试数据,不要直接删除media目录下的文件,这会导致数据库不一致。应在Web界面删除文档,或使用命令:
```bash
docker compose run --rm webserver document_management_manager clear_media
```
查看日志排查错误
如果OCR失败或上传报错,查看Web服务日志:
```bash
docker compose logs -f webserver
```