mirror of
https://github.com/Tencent/WeKnora.git
synced 2026-06-04 13:30:32 +08:00
docreader fails to start on a fresh `uv sync` of main:
$ uv sync --frozen
$ uv run python -m docreader.main
Traceback (most recent call last):
...
File ".../docreader/proto/docreader_pb2_grpc.py", line 19, in <module>
raise RuntimeError(...)
RuntimeError: The grpc package installed is at version 1.76.0, but the
generated code in docreader_pb2_grpc.py depends on grpcio>=1.78.0.
Please upgrade your grpc module to grpcio>=1.78.0 or downgrade your
generated code using grpcio-tools<=1.76.0.
`docreader_pb2_grpc.py:8` was regenerated with grpcio-tools 1.78+ and
hardcodes `GRPC_GENERATED_VERSION = '1.78.0'`, then at import time runs
`first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)` and
raises if the installed runtime is older. But `pyproject.toml` still
pins:
"grpcio>=1.76.0",
"grpcio-health-checking>=1.76.0",
"grpcio-tools>=1.76.0",
…and `uv.lock` resolves to grpcio 1.76.0. So every fresh clone +
`uv sync` ends up with a docreader that crashes on import, and a
WeKnora backend that thinks docreader is "not connected" — silently
falling back to the Go-side static engine registry only.
Downstream user-visible symptom: `/api/v1/system/parser-engines`
returns just the Go-side engines. Python-only engines (e.g.
markitdown, plus any custom Python parsers) never appear in the KB
create/edit form. Document parsing falls back to mineru/builtin even
when the user intended to use docreader-backed engines.
Reproduce on main (before this commit):
cd docreader
uv sync --frozen
uv run python -m docreader.main
# → RuntimeError at import, server never starts
After this commit:
Resolved 79 packages
Updated grpcio v1.76.0 -> v1.80.0
Updated grpcio-health-checking v1.76.0 -> v1.80.0
Updated grpcio-tools v1.76.0 -> v1.80.0
...
$ uv run python -c "from docreader.proto import docreader_pb2_grpc; print('ok')"
ok
Fix is the minimum-floor bump on the three grpcio packages, plus the
lockfile update uv emits as a result (all 1.76.0 → 1.80.0, newest
stable matching the proto's floor). No proto regen, no code change —
just aligning the dep declaration with what the generated client
already requires.
The next regen of docreader_pb2_grpc.py (e.g. with grpcio-tools 1.80+)
would raise the floor again; pinning at the proto's declared floor is
the conservative choice that keeps this in sync.
DocReader Service
DocReader 是 WeKnora 项目中负责文档解析和处理的 gRPC 服务。它支持多种文档格式的读取、OCR 识别、多模态处理等功能。
Docker Compose 环境变量配置
在 docker-compose.yml 文件中,docreader 服务配置了以下环境变量:
docreader:
image: wechatopenai/weknora-docreader:${WEKNORA_VERSION:-latest}
environment:
- MINIO_ENDPOINT=minio:9000
- MINIO_PUBLIC_ENDPOINT=http://localhost:${MINIO_PORT:-9000}
- MINERU_ENDPOINT=${MINERU_ENDPOINT:-}
- MAX_FILE_SIZE_MB=${MAX_FILE_SIZE_MB:-}
环境变量说明
1. MINIO_ENDPOINT
- 说明: MinIO 服务的内部访问地址(容器间通信)
- 默认值:
minio:9000 - 用途: DocReader 服务使用此地址连接到 MinIO 对象存储服务,用于读取和存储文档处理过程中的文件
- 配置示例:
- MINIO_ENDPOINT=minio:9000 # Docker 网络内部地址
2. MINIO_PUBLIC_ENDPOINT
- 说明: MinIO 服务的公开访问地址(外部访问)
- 默认值:
http://localhost:9000 - 用途: 用于生成可从外部访问的文件 URL,例如在文档解析后返回图片链接时使用
- 重要提示:
- 如果需要从其他设备或容器访问,需要将
localhost替换为实际的 IP 地址 - 可以在
.env文件中配置MINIO_PORT来自定义端口
- 如果需要从其他设备或容器访问,需要将
- 配置示例:
或直接在 docker-compose.yml 中修改:
# .env 文件 MINIO_PORT=9000- MINIO_PUBLIC_ENDPOINT=http://192.168.1.100:9000 # 使用实际 IP
3. MINERU_ENDPOINT
- 说明: MinerU 服务的访问地址(可选)
- 默认值: 空(不使用 MinerU)
- 用途: MinerU 是一个高级文档解析服务,支持更复杂的文档结构识别和处理。配置此变量后,DocReader 可以调用 MinerU 进行文档解析
- 配置示例:
# .env 文件 MINERU_ENDPOINT=http://mineru-service:8080
4. MAX_FILE_SIZE_MB
- 说明: 允许上传的最大文件大小(单位:MB)
- 默认值:
50MB - 用途: 限制 gRPC 服务接收的文件大小,防止过大的文件导致服务崩溃或性能问题
- 配置示例:
# .env 文件 MAX_FILE_SIZE_MB=100 # 允许最大 100MB 的文件
其他可配置的环境变量
除了 docker-compose.yml 中已配置的变量外,DocReader 还支持以下环境变量(可根据需要添加):
gRPC 配置
DOCREADER_GRPC_MAX_WORKERS: gRPC 服务的最大工作线程数(默认:4)DOCREADER_GRPC_PORT: gRPC 服务监听端口(默认:50051)
解析器资源控制
DOCREADER_MARKITDOWN_MAX_WORKERS: MarkItDown 解析的最大并发数(默认:1,设为 0 可关闭限流)DOCREADER_PDF_RENDER_MAX_WORKERS: 扫描 PDF 渲染为图片的最大并发数(默认:1,设为 0 可关闭限流)DOCREADER_PDF_RENDER_DPI: 扫描 PDF 渲染 DPI(默认:200)DOCREADER_PDF_JPEG_QUALITY: 扫描 PDF 输出 JPEG 质量(默认:90,范围会自动限制在 1-95)
OCR / VLM
DocReader 自身不再内置 OCR 与 VLM 后端。扫描 PDF 会被渲染为 JPEG 图片后交由 Go App 侧调用 OCR/VLM 服务处理,相关配置请参考主项目文档。
存储配置
DocReader 支持多种存储后端:
MinIO/S3 存储(推荐)
STORAGE_TYPE: 设置为minioMINIO_ACCESS_KEY_ID: MinIO 访问密钥 ID(默认:minioadmin)MINIO_SECRET_ACCESS_KEY: MinIO 访问密钥(默认:minioadmin)MINIO_BUCKET_NAME: MinIO 存储桶名称(默认:WeKnora)MINIO_PATH_PREFIX: 文件路径前缀MINIO_USE_SSL: 是否使用 SSL(默认:false)
腾讯云 COS 存储
STORAGE_TYPE: 设置为cosCOS_SECRET_ID: COS 访问密钥 IDCOS_SECRET_KEY: COS 访问密钥COS_REGION: COS 区域COS_BUCKET_NAME: COS 存储桶名称COS_APP_ID: COS 应用 IDCOS_PATH_PREFIX: 文件路径前缀COS_ENABLE_OLD_DOMAIN: 是否使用旧域名(默认:true)
阿里云 OSS 存储
STORAGE_TYPE: 设置为ossOSS_ACCESS_KEY_ID: OSS 访问密钥 IDOSS_ACCESS_KEY_SECRET: OSS 访问密钥OSS_ENDPOINT: OSS 端点(如oss-cn-hangzhou.aliyuncs.com)OSS_BUCKET_NAME: OSS 存储桶名称OSS_REGION: OSS 区域(如cn-hangzhou)OSS_PATH_PREFIX: 文件路径前缀
代理配置
如果需要通过代理访问外部服务:
EXTERNAL_HTTP_PROXY: HTTP 代理地址EXTERNAL_HTTPS_PROXY: HTTPS 代理地址
图像处理配置
扫描 PDF 会被渲染为 JPEG 图片后交给 Go App 侧 OCR 处理。如果在导入多个大 PDF 时出现资源占用过高,
可以优先调低 DOCREADER_PDF_RENDER_MAX_WORKERS 或 DOCREADER_MARKITDOWN_MAX_WORKERS。
配置示例
基础配置(使用 MinIO)
docreader:
environment:
- MINIO_ENDPOINT=minio:9000
- MINIO_PUBLIC_ENDPOINT=http://localhost:9000
- MAX_FILE_SIZE_MB=50
高级配置(启用 MinerU)
docreader:
environment:
- MINIO_ENDPOINT=minio:9000
- MINIO_PUBLIC_ENDPOINT=http://192.168.1.100:9000
- MINERU_ENDPOINT=http://mineru:8080
- MAX_FILE_SIZE_MB=100
使用腾讯云 COS
docreader:
environment:
- STORAGE_TYPE=cos
- COS_SECRET_ID=your_secret_id
- COS_SECRET_KEY=your_secret_key
- COS_REGION=ap-guangzhou
- COS_BUCKET_NAME=your-bucket
- COS_APP_ID=your_app_id
- MAX_FILE_SIZE_MB=50
使用阿里云 OSS
docreader:
environment:
- STORAGE_TYPE=oss
- OSS_ACCESS_KEY_ID=your_access_key_id
- OSS_ACCESS_KEY_SECRET=your_access_key_secret
- OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com
- OSS_BUCKET_NAME=your-bucket
- OSS_REGION=cn-hangzhou
- MAX_FILE_SIZE_MB=50
常见问题
1. DocReader 服务无法启动?
检查容器日志中是否存在依赖缺失或权限相关错误,必要时确认 MINIO_ENDPOINT / 存储相关环境变量是否正确配置。
2. 图片无法显示?
检查 MINIO_PUBLIC_ENDPOINT 配置:
- 确保使用的是可从浏览器访问的地址
- 如果从其他设备访问,不要使用
localhost,应使用实际 IP 地址
3. 文件上传失败?
检查 MAX_FILE_SIZE_MB 配置,确保限制足够大。同时需要确保前端和后端服务的文件大小限制保持一致。
服务健康检查
DocReader 服务配置了健康检查:
healthcheck:
test: ["CMD", "grpc_health_probe", "-addr=localhost:50051"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
可以通过以下命令检查服务状态:
docker ps | grep docreader
docker logs WeKnora-docreader
更多信息
- 服务端口:50051(gRPC)
- 容器名称:WeKnora-docreader
- 网络:WeKnora-network
- 重启策略:unless-stopped