Papra 26.7.1 配置参数详解
Papra 26.7.1 配置参数详解:179 个环境变量分类总览、13 组核心参数逐项默认值与实测验证、生产配置模板与常见问题
Papra 26.7.1 配置参数详解
目标:把 Papra 26.7.1 的全部配置参数讲清楚——参数从哪里看、在哪里改、怎么改才生效,并给出一套按场景分组的核心参数默认值速查与可直接套用的生产配置模板。参数清单源自官方 Configuration 文档(2026-10-31 抓取,登记 179 个变量),关键参数的生效行为已在真实环境逐项实测验证。
一、环境信息
| 项 | 说明(实测环境) |
|---|---|
| 操作系统 | Ubuntu 22.04 |
| Papra | 26.7.1(构建标识实测:PAPRA_VERSION=26.7.1、GIT_COMMIT=3078ac59e953ee9a96e8f5ad7a967ae39e594037、BUILD_DATE=2026-10-22T21:42:32+02:00) |
| 主实验实例 | 监听 8134,按部署篇第四章编排部署,参数默认值体系 |
| 注册关闭实验实例 | 监听 8135,额外注入 AUTH_IS_REGISTRATION_ENABLED=false,用于验证注册开关行为 |
| 数据目录 | /opt/papra/data |
| 参数清单来源 | https://docs.papra.app/self-hosting/configuration (2026-10-31 抓取,179 个变量) |
💡 说明:Papra 没有配置文件,全部配置通过环境变量注入。官方 Configuration 页是唯一的参数权威清单;本文默认值均对照该页逐项核对(标注"实测"的取值来自真实实例)。
二、前置条件
- 已按《Papra 26.7.1 Docker Compose 部署指南》完成一套可访问的 Papra 实例(本文实测基址
http://192.168.1.200:8134)。 - 具备该实例部署编排文件的修改权限(参数修改的落点就在编排文件或其引用的
.env中)。 - 准备一个可用于验证的服务账号:演示环境使用
admin@papra.local/q1w2e3r4,并在界面"设置 → API 密钥"中创建一个带全量权限的 API Key 供 curl 验证使用。 - 阅读本文第五节前建议先通读第四节参数总览,建立分类框架。
三、参数查看与修改方式
3.1 参数的三个来源与优先级
Papra 的一个生效参数值由三层叠加合成,后者覆盖前者:
| 层级 | 来源 | 举例 |
|---|---|---|
| ① 代码默认 | 官方 Configuration 页标注的 Default value | PORT=1221 |
| ② 打包发行内置 | 官方打包发行形态注入的默认环境变量 | SERVER_SERVE_PUBLIC_DIR=true、PAPRA_CONFIG_DIR=./app-data、EMAILS_DRY_RUN=true、BETTER_AUTH_TELEMETRY=0(这四个均不在官方 179 个变量清单内,实测实例环境中可见) |
| ③ 部署注入 | 部署编排 environment: 与 .env 中显式声明的变量 | APP_BASE_URL=http://192.168.1.200:8134 |
⚠️ 注意:有 3 个参数的"打包发行内置值"与官方文档登记的代码默认值不同,直接照抄文档默认值会误判:
变量 官方文档默认(代码) 打包发行内置(实测生效) DATABASE_URL file:./db.sqlitefile:./app-data/db/db.sqliteDOCUMENT_STORAGE_FILESYSTEM_ROOT ./local-documents./app-data/documentsSERVER_SERVE_PUBLIC_DIR falsetrue
3.2 查看当前生效参数
Papra 不提供运行时读取参数的 API 或命令行工具,当前生效值需要在部署编排层核对:逐一检查编排文件 environment: 列表、同目录 .env,再叠加 3.1 表中②层的四个内置变量。本文实测实例的部署注入实录(密钥值脱敏):
| 变量 | 实测生效值 |
|---|---|
| APP_BASE_URL | http://192.168.1.200:8134 |
| AUTH_SECRET | 96 位十六进制随机串(openssl rand -hex 48 生成) |
| DATABASE_URL | file:./app-data/db/db.sqlite |
| DOCUMENT_STORAGE_FILESYSTEM_ROOT | ./app-data/documents |
| PAPRA_CONFIG_DIR | ./app-data |
| EMAILS_DRY_RUN | true |
| SERVER_SERVE_PUBLIC_DIR | true |
| CLIENT_BASE_URL | http://localhost:1221 |
| BETTER_AUTH_TELEMETRY | 0 |
其中 PAPRA_VERSION / GIT_COMMIT / BUILD_DATE 三件套由发行流程在构建时注入,界面"关于"页可见(官方注释:used for display in the about page)。
3.3 修改参数与生效验证
修改步骤:
- 编辑部署编排文件:少量变量直接写进
environment:;含密钥的变量建议放同目录.env并以AUTH_SECRET=${AUTH_SECRET}形式引用(见部署篇 4.2)。 - 重启实例使新值生效(编排变更后的滚动重建操作见部署篇第十章)。
- 按参数类型选择验证手段:注册开关看注册接口返回、上传上限看大文件上传、邮件驱动看服务日志。
实测验证 1:注册开关(AUTH_IS_REGISTRATION_ENABLED)
官方默认 true。在额外注入 AUTH_IS_REGISTRATION_ENABLED=false 的 8135 实例上发起注册:
curl -s -w '\nHTTP=%{http_code}\n' -X POST http://192.168.1.200:8135/api/auth/sign-up/email \
-H 'Content-Type: application/json' \
-d '{"name":"newuser","email":"newuser@papra.local","password":"q1w2e3r4"}'
实测回显(HTTP 400):
{"message":"Email and password sign up is not enabled","code":"EMAIL_PASSWORD_SIGN_UP_DISABLED"}
HTTP=400
💡 说明:注意该错误没有外层
error对象,与业务接口错误形态不同(better-auth 认证端点风格)。生产关闭注册后,新账号由管理员在组织设置中邀请。
实测验证 2:上传大小上限(DOCUMENT_STORAGE_MAX_UPLOAD_SIZE)
保持默认值(26214400 字节 = 25MB)不变,构造 27MB 随机文件上传:
dd if=/dev/urandom of=/tmp/oversize.bin bs=1M count=27
curl -s -w '\nHTTP=%{http_code}\n' -X POST \
http://192.168.1.200:8134/api/organizations/org_tqq4cqy4g6ui3iwvitpgucgh/documents \
-H "Authorization: Bearer ${PAPRA_API_KEY}" \
-F 'file=@/tmp/oversize.bin'
实测回显(HTTP 413):
{"error":{"message":"Document size too large.","code":"document.size_too_large"}}
HTTP=413
实测验证 3:邮件驱动(EMAILS_DRY_RUN)
部署注入 EMAILS_DRY_RUN=true 的实例,启动日志中邮件服务以 driverName":"logger" 初始化(日志实录见部署篇 4.3),即所有待发邮件只落到日志、不真实外发——验证了 5.7 节邮件驱动的兜底形态。
四、参数总览
官方 Configuration 页共登记 179 个配置变量(2026-10-31 抓取统计)。按职责分为 13 组,与第五节子节一一对应:
| 分类 | 代表变量 | 规模 | 一句话职责 |
|---|---|---|---|
| 基础与服务 | PROCESS_MODE、APP_BASE_URL、PORT | 15 | 监听地址端口、基址与进程形态 |
| 数据库 | DATABASE_URL | 3 | 数据库连接与静态加密 |
| 文档生命周期 | DOCUMENTS_OCR_LANGUAGES | 5 | 回收站保留期、OCR 语言、重处理 |
| 文档存储 | DOCUMENT_STORAGE_DRIVER | 22 | 四种存储驱动、容量上限、存储键、加密 |
| 内容提取 | CONTENT_EXTRACTION_STRATEGY | 25 | 五种提取策略与外部 OCR 服务接入 |
| 认证与账号 | AUTH_SECRET、AUTH_IS_REGISTRATION_ENABLED | 17 | 密钥、注册开关、OAuth 提供方 |
| 邮件发送 | EMAILS_DRIVER | 10 | logger/SMTP/Resend 三种发送通道 |
| 采集通道 | INTAKE_EMAILS_*、INGESTION_FOLDER_* | 18 | 邮件采集与文件夹采集两条入口 |
| 任务与调度 | TASKS_PERSISTENCE_DRIVER、各 *_CRON | 14 | 后台任务持久化与五个定时清理任务 |
| 分享链接 | DOCUMENT_SHARE_LINKS_* | 6 | 链接数量、访问令牌时效、三条限流 |
| 配额与组织 | MAX_TAGS_PER_ORGANIZATION | 9 | 组织数、标签数、邀请与配额 |
| AI 与自动打标 | AI_IS_ENABLED、AUTO_TAGGING_* | 21 | 九家模型适配器与自动打标 |
| 遥测与安全 | POSTHOG_ENABLED、WEBHOOK_SSRF_PROTECTION_ENABLED | 5 | 产品遥测与 Webhook SSRF 防护 |
五、核心参数分类详解
以下 13 小节给出全部高频参数的官方默认值与说明;标 ✅ 的行为在本文实测环境验证过。
5.1 基础与服务参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| PROCESS_MODE | all | 进程形态:all 同进程跑 API 与后台任务;web 仅 API;worker 仅后台任务。拆分部署时 web 与 worker 共用同一数据库 |
| APP_BASE_URL | 空 | 全局基址,设置后覆盖 CLIENT/SERVER_BASE_URL;前端由本服务直接托管时官方推荐只用它。必须与外部访问地址一致,否则分享链接、邮件内链接全部拼错 ✅ |
| CLIENT_BASE_URL | http://localhost:1221 | 前端基址(APP_BASE_URL 未设时生效) |
| SERVER_BASE_URL | http://localhost:1221 | 服务端基址(APP_BASE_URL 未设时生效) |
| TRUSTED_ORIGINS | 空 | 信任来源逗号列表;CLIENT_BASE_URL 自动包含,无需重复添加 |
| TRUSTED_APP_SCHEMES | papra://,exp://,papra-dev:// | 移动端 App 回跳 scheme 信任列表;设置即整体覆盖默认,需自带原值 |
| PORT | 1221 | 监听端口 |
| SERVER_HOSTNAME | 0.0.0.0 | 绑定地址 |
| SERVER_API_ROUTES_TIMEOUT_MS | 20000 | 单路由最大执行毫秒数 |
| SERVER_CORS_ORIGINS | http://localhost:3000 | API 的 CORS 允许来源 |
| SERVER_SERVE_PUBLIC_DIR | false(打包发行内置 true ✅) | 是否由本服务直接托管前端静态资源;前置独立 Web 服务器托管前端时才关 |
| PAPRA_VERSION / GIT_COMMIT / BUILD_DATE | dev / unknown / unknown | 构建三件套,由发行流程注入,实测实例为 26.7.1 / 3078ac59… / 2026-10-22T21:42:32+02:00 ✅ |
5.2 数据库参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| DATABASE_URL | file:./db.sqlite(打包发行内置 file:./app-data/db/db.sqlite ✅) | 内嵌 SQLite 文件库连接串。改为 libsql://… 或 postgres://… 连接串即可切换外部数据库(远程 LibSQL 需配 DATABASE_AUTH_TOKEN) |
| DATABASE_AUTH_TOKEN | 空 | 远程 LibSQL 数据库的认证令牌 |
| DATABASE_ENCRYPTION_KEY | 空 | 数据库整体静态加密密钥。一旦设置后丢失,数据不可恢复(官方原话警告);启用前必须先做好密钥备份 |
💡 说明:单机 SQLite 是默认形态,实测 5 份文档时整个数据目录仅 860K;文档量大或多人并发写时再评估切换 PostgreSQL。
5.3 文档生命周期参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENTS_DELETED_DOCUMENTS_RETENTION_DAYS | 30 | 回收站(软删除)保留天数,到期由定时任务硬删除(cron 见 5.9) |
| DOCUMENTS_OCR_LANGUAGES | eng | Tesseract OCR 语言码,官方注释注明多语言以逗号分隔;中文扫描件建议 chi_sim,eng |
| DOCUMENT_REPROCESSING_ENABLED | true | 允许用当前实例配置对已入库文档重新做内容提取 |
| DOCUMENT_REPROCESSING_RATE_LIMIT | 100/h | 重处理请求的每组织限流,格式如 10/h、2/5m |
| DOCUMENTS_CONTENT_EXTRACTION_ENABLED | true | 总开关:上传文档是否执行 OCR/文本提取 |
💡 说明:重处理关闭时调用接口返回 403
document.reprocessing_disabled,超限返回 429server.too_many_requests并附Retry-After(官方 API 文档口径,接口实测见《Papra 26.7.1 REST API 使用详解》)。
5.4 文档存储参数
存储驱动四选一:
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENT_STORAGE_DRIVER | filesystem | 可选 filesystem / s3 / in-memory / azure-blob。in-memory 仅测试用 |
| DOCUMENT_STORAGE_FILESYSTEM_ROOT | ./local-documents(打包发行内置 ./app-data/documents ✅) | 本地文件存储根目录,必须在持久化数据目录内 |
S3 驱动参数(DOCUMENT_STORAGE_S3_ 前缀):ACCESS_KEY_ID、SECRET_ACCESS_KEY、BUCKET_NAME、REGION(默认 auto)、ENDPOINT、FORCE_PATH_STYLE(默认 false)。
Azure Blob 驱动参数(DOCUMENT_STORAGE_AZURE_BLOB_ 前缀):CONNECTION_STRING(设置后账号密码被忽略)、ACCOUNT_NAME、ACCOUNT_KEY、CONTAINER_NAME。
容量上限:
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENT_STORAGE_MAX_UPLOAD_SIZE | 26214400 | 单文件上限字节数(25MB);0 为不限制。27MB 文件默认配置下实测 413 document.size_too_large ✅ |
存储键体系(决定文件在存储目录中的路径,默认沿用 legacy 规则 ✅——实测数据目录布局为 {组织ID}/originals/{文档ID}.{原始后缀}):
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENT_STORAGE_USE_LEGACY_STORAGE_KEY_DEFINITION_SYSTEM | true | 启用 legacy 存储键({{organization.id}}/originals/{{document.id}});此时下方 pattern、递增后缀、随机后缀机制全部不生效 |
| DOCUMENT_STORAGE_KEY_PATTERN | {{organization.id}}/{{document.name}} | legacy 关闭后生效的存储键模板,支持 {{…}} 表达式(官方 Guides → Storage Key Patterns) |
| DOCUMENT_STORAGE_PATTERN_MAX_INCREMENTAL_SUFFIX_ATTEMPTS | 9 | 存储键被占用时递增后缀尝试次数(file_1.txt→file_2.txt…),0 为禁用 |
| DOCUMENT_STORAGE_PATTERN_ENABLE_RANDOM_SUFFIX_FALLBACK | true | 递增后缀耗尽后追加 8 位随机字母数字后缀兜底 |
| DOCUMENT_STORAGE_KEY_SYNC_ENABLED | false | 文档更新时按模板重算存储键(日期、随机表达式会重新求值);存量文档不自动迁移 |
存储加密:
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED | false | 文档内容静态加密开关 |
| DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS | 空 | 密钥加密密钥(KEK),32 字节十六进制串(openssl rand -hex 32 生成)。单键自动编为版本 1;多版本格式 1:<key1>,2:<key2>,最高版本加密新 DEK、全部版本可解密旧 DEK,实现密钥轮换 |
5.5 内容提取策略参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| CONTENT_EXTRACTION_STRATEGY | internal | 提取策略链,逗号分隔按优先级排列(如 mistral-ocr,internal):首个可处理该类型的策略执行,失败自动降级到下一个 |
五种策略及专属参数:
| 策略 | 专属参数(默认值) | 说明 |
|---|---|---|
internal | 无 | 内置 lecture 库 + Tesseract OCR,支持常见全部格式,永远可用,官方推荐作为兜底策略 |
mistral-ocr | MISTRAL_OCR_MODEL_NAME=mistral-ocr-latest、MISTRAL_OCR_REQUEST_TIMEOUT_MS=300000、MISTRAL_OCR_MIME_TYPES_ALLOW_LIST=application/pdf,image/* | Mistral OCR API,需 MISTRAL_API_KEY |
docling | DOCLING_BASE_URL=http://localhost:5001、DOCLING_API_KEY(请求头 X-API-Key)、DOCLING_REQUEST_TIMEOUT_MS=300000、DOCLING_OPTIONS={}、DOCLING_MIME_TYPES_ALLOW_LIST=* | 自建 Docling 服务器(docling-serve) |
azure-di | AZURE_DI_ENDPOINT、AZURE_DI_API_KEY(请求头 Ocp-Apim-Subscription-Key)、AZURE_DI_REQUEST_TIMEOUT_MS=300000、AZURE_DI_MIME_TYPES_ALLOW_LIST=*、AZURE_DI_POLLING_ATTEMPTS=10、AZURE_DI_POLLING_DELAY_MS=2000 | Azure Document Intelligence |
custom-http | CONTENT_EXTRACTION_CUSTOM_HTTP_URL、…HEADERS={}、…UPLOAD_FORMAT=form-data(form-data/json)、…REQUEST_TIMEOUT_MS=30000、…RESPONSE_FORMAT=json(json/text)、…JSON_RESPONSE_TEXT_PATH=text、…MIME_TYPES_ALLOW_LIST=* | 自定义 HTTP 提取服务,POST 上传文档取回文本 |
💡 说明:各策略的
MIME_TYPES_ALLOW_LIST通用语法——*全部;image/*类通配;!前缀排除且排除始终优先(如*,!image/png表示除 PNG 外全部)。
5.6 认证与账号参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| AUTH_SECRET | papra-default-auth-secret-change-me | 出厂默认值必须更换:≥32 字符,openssl rand -hex 48 生成 ✅。它是会话签名与加密的基础密钥,更换后全部已有登录会话与 API Key 立即失效 ✅ |
| AUTH_IS_REGISTRATION_ENABLED | true | 公开注册开关。置 false 后注册请求实测返回 400 EMAIL_PASSWORD_SIGN_UP_DISABLED ✅(回显见 3.3) |
| AUTH_IS_PASSWORD_RESET_ENABLED | true | 忘记密码自助重置开关(需先配好真实邮件通道) |
| AUTH_IS_EMAIL_VERIFICATION_REQUIRED | false | 是否强制邮箱验证 |
| AUTH_SHOW_LEGAL_LINKS | false | 认证页是否展示 Papra 官方法务链接(官方注释明言对自托管无意义) |
| AUTH_FIRST_USER_AS_ADMIN | true | 首个注册用户自动授予管理员角色 |
| AUTH_IP_ADDRESS_HEADERS | x-forwarded-for | 限流取真实 IP 的请求头;标准反代用默认值,Cloudflare 用 cf-connecting-ip;必须是代理注入的不可伪造头 |
| AUTH_ALLOWED_EMAIL_DOMAINS | 空 | 注册邮箱域名白名单(逗号分隔,精确匹配、大小写不敏感);空为不限制 |
| AUTH_FORBIDDEN_EMAIL_DOMAINS | papra.app,papra.email,owlrelay.email,callback.email,clb.email | 注册邮箱域名黑名单(覆盖式,优先于白名单) |
| AUTH_PROVIDERS_EMAIL_IS_ENABLED | true | 邮箱密码登录开关 |
| AUTH_PROVIDERS_GITHUB_IS_ENABLED | false | GitHub OAuth 开关;配套 …_CLIENT_ID、…_CLIENT_SECRET(占位 set-me) |
| AUTH_PROVIDERS_GOOGLE_IS_ENABLED | false | Google OAuth 开关;配套 …_CLIENT_ID、…_CLIENT_SECRET |
| AUTH_PROVIDERS_CUSTOMS | 空 | 自定义 OAuth 提供方列表(JSON 字符串,better-auth generic-oauth 规范;官方 Guides → Custom OAuth2 Providers) |
5.7 邮件发送参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| EMAILS_DRIVER | logger | 三选一:logger(只写日志不真发)/ smtp / resend。打包发行形态实测以 EMAILS_DRY_RUN=true 注入,日志中邮件服务以 driverName":"logger" 初始化 ✅ |
| EMAILS_FROM_ADDRESS | Papra <…>(官方页脱敏展示) | 发件人地址与显示名,部署时设为自己的地址 |
| LOGGER_EMAIL_DRIVER_LOG_LEVEL | info | logger 驱动的日志级别 |
| SMTP_HOST / SMTP_PORT | 空 / 587 | SMTP 服务器地址与端口 |
| SMTP_USER / SMTP_PASSWORD | 空 | SMTP 认证凭据 |
| SMTP_SECURE | false | 是否 TLS 直连 |
| SMTP_JSON_CONFIG | 空 | nodemailer 原生 JSON 配置,设置后覆盖以上全部 SMTP 项(高级场景用) |
| RESEND_API_KEY | 空 | Resend 服务 API Key(EMAILS_DRIVER=resend 时必填) |
5.8 采集通道参数
邮件采集(把文档发进专属邮箱地址即自动归档):
| 变量 | 默认值 | 说明 |
|---|---|---|
| INTAKE_EMAILS_IS_ENABLED | false | 邮件采集总开关 |
| INTAKE_EMAILS_DRIVER | catch-all | catch-all(自有域收信)/ owlrelay(第三方收信服务) |
| INTAKE_EMAILS_CATCH_ALL_DOMAIN | papra.local | catch-all 模式下生成采集地址的域名 |
| OWLRELAY_API_KEY / OWLRELAY_WEBHOOK_URL / OWLRELAY_DOMAIN | change-me / 空 / 空 | OwlRelay 接入三件套(webhook 缺省由服务地址推导) |
| INTAKE_EMAILS_WEBHOOK_SECRET | 空 | 收信 webhook 校验密钥,16~128 位随机串 |
| INTAKE_EMAILS_USERNAME_CUSTOMIZATION_IS_ENABLED | false | 允许用户自定义采集地址用户名 |
| INTAKE_EMAILS_USERNAME_DRIVER | random | 采集地址用户名生成:random / pattern |
| INTAKE_EMAILS_USERNAME_DRIVER_PATTERN | {{user.name}}-{{random.digits}} | pattern 模式模板,占位符支持 {{user.name}}、{{user.id}}、{{user.email.username}}、{{organization.id}}、{{organization.name}}、{{random.digits}},结果自动 slug 化 |
文件夹采集(监控目录,落文件即归档):
| 变量 | 默认值 | 说明 |
|---|---|---|
| INGESTION_FOLDER_IS_ENABLED | false | 文件夹采集总开关 |
| INGESTION_FOLDER_ROOT_PATH | ./ingestion | 采集根目录,每个组织对应子目录 <root>/<organization id> |
| INGESTION_FOLDER_WATCHER_USE_POLLING | false | 是否用轮询监视(网络文件系统建议 true) |
| INGESTION_FOLDER_WATCHER_POLLING_INTERVAL_MS | 2000 | 轮询间隔 |
| INGESTION_FOLDER_WATCHER_FILE_STABILITY_THRESHOLD_MS | 2000 | 文件大小持续不变的时长判定(避免处理仍在写入的文件,适配扫描仪/相机/网络共享) |
| INGESTION_FOLDER_WATCHER_FILE_STABILITY_POLL_INTERVAL_MS | 100 | 稳定性检查的轮询间隔 |
| INGESTION_FOLDER_PROCESSING_CONCURRENCY | 1 | 并发处理文件数;调大提速但增加 CPU/内存占用 |
| INGESTION_FOLDER_POST_PROCESSING_STRATEGY | delete | 采集成功后原文件处置:delete / move |
| INGESTION_FOLDER_POST_PROCESSING_MOVE_FOLDER_PATH | ./ingestion-done | move 策略的目标目录(相对组织采集目录) |
| INGESTION_FOLDER_ERROR_FOLDER_PATH | ./ingestion-error | 采集失败时文件移入目录 |
| INGESTION_FOLDER_IGNORED_PATTERNS | **/.DS_Store,**/.env,…(13 项默认) | 忽略的 glob 模式(picomatch 语法);更新即整体覆盖默认,不合并 |
5.9 后台任务与调度参数
任务持久化:
| 变量 | 默认值 | 说明 |
|---|---|---|
| TASKS_PERSISTENCE_DRIVER | memory | memory / libsql。官方注释明确:单实例部署 memory 足够;多实例共享任务队列才需 libsql |
| TASKS_PERSISTENCE_DRIVERS_LIBSQL_URL | file:./tasks-db.sqlite | libsql 任务库连接串 |
| TASKS_PERSISTENCE_DRIVERS_LIBSQL_AUTH_TOKEN | 空 | 远程 libsql 认证令牌 |
| TASKS_PERSISTENCE_DRIVERS_LIBSQL_MIGRATE_WITH_PRAGMA | true | 建库时附带 PRAGMA 语句 |
| TASKS_PERSISTENCE_DRIVERS_LIBSQL_POLL_INTERVAL_MS | 1000 | 任务轮询间隔 |
| TASKS_WORKER_ID | 空 | 多 worker 部署时每实例唯一标识 |
五个定时清理任务(cron 与启动即执行开关;启动日志实录见部署篇 4.3 ✅):
| 任务 | CRON 默认 | RUN_ON_STARTUP 默认 | 职责 |
|---|---|---|---|
| DOCUMENTS_HARD_DELETE_EXPIRED_DOCUMENTS | 0 0 * * * | true | 硬删除超过保留期的回收站文档 |
| ORGANIZATIONS_EXPIRE_INVITATIONS | 0 0 * * * | true | 过期组织邀请作废 |
| ORGANIZATIONS_PURGE_EXPIRED_ORGANIZATIONS | 0 1 * * * | true | 彻底清除软删除到期的组织 |
| KV_STORE_PURGE_EXPIRED_ENTRIES | 0 2 * * * | true | 清理过期 KV 条目(仅 libsql KV 驱动需要) |
| PLAN_ENTITLEMENTS_REVERIFY | 0 3 * * * | false | 云托管套餐权益复核(自托管无感) |
5.10 分享链接参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| DOCUMENT_SHARE_LINKS_BASE_URL | 空 | 生成分享链接的基址;空则依次回退 APP_BASE_URL → CLIENT_BASE_URL |
| DOCUMENT_SHARE_LINKS_MAX_LINKS_PER_DOCUMENT | 10 | 单文档同时存在的分享链接上限 |
| DOCUMENT_SHARE_LINKS_ACCESS_TOKEN_TTL_MINUTES | 15 | 密码验证通过后签发的访问令牌(JWT)有效期(分钟) |
| DOCUMENT_SHARE_LINKS_PASSWORD_VERIFICATION_RATE_LIMIT | 30/1h | 密码验证尝试限流(防爆破),全局范围 |
| DOCUMENT_SHARE_LINKS_DOCUMENT_ACCESS_RATE_LIMIT | 3600/1h | 分享链接文档访问限流,全局范围 |
| DOCUMENT_SHARE_LINKS_FILE_ACCESS_RATE_LIMIT | 600/1h | 分享链接文件下载限流,全局范围 |
💡 说明:限流值格式统一为
次数/时间窗(如10/h、10/2h、2/5m,单位 s/m/h)。密码验证失败的实测报错(401share_link.invalid_password)与令牌用法见《Papra 26.7.1 REST API 使用详解》。
5.11 配额与组织参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| MAX_ORGANIZATION_COUNT_PER_USER | 10 | 标准用户可建组织数上限 |
| ORGANIZATION_INVITATION_EXPIRATION_DELAY_DAYS | 7 | 组织邀请有效期(天) |
| MAX_USER_ORGANIZATIONS_INVITATIONS_PER_DAY | 30 | 每用户每日可发邀请数 |
| ORGANIZATIONS_DELETED_PURGE_DAYS_DELAY | 30 | 软删除组织彻底清除的延迟天数 |
| MAX_TAGS_PER_ORGANIZATION | 200 | 每组织标签数上限 |
| MAX_CUSTOM_PROPERTIES_PER_ORGANIZATION | 100 | 每组织自定义属性定义数上限 |
| IS_FREE_PLAN_UNLIMITED | true | 免费套餐不设文档/标签/组织配额——官方注释:自托管实例基本恒为 true |
| PLANS_PRICE_ID、STRIPE、GLOBAL_COUPON_ID | change-me/空 | 云托管计费专用(Plus/Pro 套餐价目、Stripe 密钥与 webhook、全局优惠券),自托管无需理会 |
5.12 AI 与自动打标参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| AI_IS_ENABLED | false | AI 功能总开关(自动打标等均以其为前提) |
| AI_CREDITS_IS_ENABLED | false | AI 用量计费开关;官方注释:自托管保持关闭 |
| AI_DEFAULT_MODEL | 空 | 缺省模型,格式 <adapterId>://<modelName>,如 ollama://llama3.1:8b |
| AUTO_TAGGING_ENABLED | true | 自动打标可用性(组织设置中还需单独启用,且依赖 AI_IS_ENABLED) |
| AUTO_TAGGING_MODEL | 空 | 自动打标专用模型(同上格式) |
| AUTO_TAGGING_DEFAULT_MAX_TAGS | 5 | 自动打标默认单文档最大标签数(组织设置可覆盖) |
九家模型适配器(*_BASE_URL / *_API_KEY):
| 适配器 | BASE_URL 默认值 | API_KEY 默认值 |
|---|---|---|
| OPENAI | https://api.openai.com/v1 | 空 |
| ANTHROPIC | 空 | 空 |
| MISTRAL | https://api.mistral.ai/v1 | 空 |
| DEEPSEEK | https://api.deepseek.com/v1 | 空 |
| OPENROUTER | https://openrouter.ai/api/v1 | 空 |
| OLLAMA | http://localhost:11434/v1 | ollama |
| LMSTUDIO | http://localhost:1234/v1 | lm-studio |
| VLLM | http://localhost:8000/v1 | not-needed |
| COCORE | https://cocore.dev/api/v1 | 空 |
本地模型(Ollama/LM Studio/vLLM)默认即指向本机端口,内网部署无需公网出口即可启用自动打标。
5.13 遥测与安全参数
| 变量 | 默认值 | 说明 |
|---|---|---|
| POSTHOG_ENABLED | false | 产品分析遥测开关,自托管保持关闭即可 |
| POSTHOG_API_KEY / POSTHOG_HOST | set-me / https://eu.i.posthog.com | 启用遥测时的接入配置 |
| WEBHOOK_SSRF_PROTECTION_ENABLED | true | Webhook URL 的 SSRF 防护。官方明确不建议关闭;确有内网回调需求时优先用下一项放行指定主机名 |
| WEBHOOK_URL_ALLOWED_HOSTNAMES | 空 | SSRF 防护白名单主机名;为空时所有本地/私有/保留 IP 一律拦截 |
六、生产配置模板
适用场景:10 人以内团队文档归档;2C4G 起、100GB 数据盘;中文扫描件为主;单实例 SQLite;管理员统一建号、注册关闭。以下 .env 可直接套用(注释掉的是按需打开项):
# ===== 基础 =====
APP_BASE_URL=https://docs.example.com
AUTH_SECRET=<用 openssl rand -hex 48 生成后替换>
# PORT=1221
# PROCESS_MODE=all
# ===== 注册与账号 =====
AUTH_IS_REGISTRATION_ENABLED=false # 关闭公开注册,管理员邀请建号
AUTH_FIRST_USER_AS_ADMIN=true # 首个注册者自动成为管理员
# AUTH_ALLOWED_EMAIL_DOMAINS=example.com # 如需开放注册,限定企业域名
AUTH_IS_PASSWORD_RESET_ENABLED=true # 依赖下方真实邮件通道
# ===== 数据库 =====
DATABASE_URL=file:./app-data/db/db.sqlite # 单机默认;多实例/高并发再评估 postgres://
# ===== 存储与上传 =====
DOCUMENT_STORAGE_DRIVER=filesystem
DOCUMENT_STORAGE_MAX_UPLOAD_SIZE=104857600 # 100MB,按最大单件需求调整
DOCUMENTS_OCR_LANGUAGES=chi_sim,eng # 中文扫描件 OCR
# ===== 邮件 =====
EMAILS_DRY_RUN=true # 调试期只落日志;密码重置需真发时切 SMTP
# SMTP_HOST=smtp.example.com
# SMTP_PORT=587
# SMTP_USER=docs@example.com
# SMTP_PASSWORD=<SMTP 密钥>
# SMTP_SECURE=false
# ===== 生命周期与分享 =====
DOCUMENTS_DELETED_DOCUMENTS_RETENTION_DAYS=30
DOCUMENT_SHARE_LINKS_MAX_LINKS_PER_DOCUMENT=10
DOCUMENT_SHARE_LINKS_ACCESS_TOKEN_TTL_MINUTES=15
# ===== 采集(按需) =====
# INGESTION_FOLDER_IS_ENABLED=true
# INGESTION_FOLDER_ROOT_PATH=/data/ingestion
# INTAKE_EMAILS_IS_ENABLED=true
# INTAKE_EMAILS_CATCH_ALL_DOMAIN=docs.example.com
⚠️ 注意:
AUTH_SECRET一旦上线不可随意更换(全部会话与 API Key 失效);务必首次部署就固定为自己的随机值并纳入密钥管理。- 若启用文档加密(
DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED=true),必须同时配置 KEK 并离线备份——密钥丢失即数据不可恢复。- 该模板对应 2C4G 档位;文档量超过 10 万份或多人并发上传时,把
DATABASE_URL切到外部 PostgreSQL 并将TASKS_PERSISTENCE_DRIVER保持memory(单实例)或libsql(多实例)。
七、常见问题
Q1:上传文件报 Document size too large?
默认单文件上限 25MB(DOCUMENT_STORAGE_MAX_UPLOAD_SIZE=26214400)。27MB 文件实测返回 413,完整回显见 3.3 实测验证 2。按字节调大该值(0 为不限制)并重启实例。
Q2:注册接口报 EMAIL_PASSWORD_SIGN_UP_DISABLED?
AUTH_IS_REGISTRATION_ENABLED=false 的预期行为,实测回显见 3.3 实测验证 1。注意该错误无外层 error 对象,与业务接口错误形态不同;开放注册时建议同步配置 AUTH_ALLOWED_EMAIL_DOMAINS 白名单。
Q3:AUTH_SECRET 事后更换会怎样? 全部已有登录会话与 API Key 立即失效(实测 26.7.1 行为),用户需重新登录、API Key 需重建。例行密钥轮换请安排在维护窗口。
Q4:DATABASE_ENCRYPTION_KEY 设置后丢失怎么办? 官方文档明确警告:密钥丢失则数据不可恢复。启用数据库加密前必须把该密钥纳入离线备份;已加密的库无法用其他密钥打开。
Q5:修改 DOCUMENT_STORAGE_KEY_PATTERN 后老文档会搬家吗?
不会。官方注释明确存量文档不自动迁移;DOCUMENT_STORAGE_KEY_SYNC_ENABLED=true 只影响此后被更新的文档。存量迁移走官方 Guides → Migrate Document Storage 流程。
Q6:单实例需要把 TASKS_PERSISTENCE_DRIVER 换成 libsql 吗? 不需要。官方注释明确单实例 memory 足够;只有多实例部署(多个 worker 共享任务队列)才需要统一指向 libsql 任务库。
Q7:重处理文档被限流或拒绝?
每组织默认限流 DOCUMENT_REPROCESSING_RATE_LIMIT=100/h,超限返回 429 并附 Retry-After;整体关闭时返回 403。调整对应两个开关即可,接口行为实测见《Papra 26.7.1 REST API 使用详解》。
八、参考链接
- 官方配置参考(179 个变量全清单):https://docs.papra.app/self-hosting/configuration (2026-10-31 查询)
- 官方文档加密指南:https://docs.papra.app/guides/document-encryption (2026-10-31 查询)
- 官方存储键模式指南:https://docs.papra.app/guides/storage-key-patterns (2026-10-31 查询)
- 官方内容提取指南:https://docs.papra.app/guides/content-extraction (2026-10-31 查询)
- 官方 LLM 配置指南:https://docs.papra.app/guides/llm-configuration (2026-10-31 查询)
- 官方文件夹采集指南:https://docs.papra.app/guides/setup-ingestion-folder (2026-10-31 查询)
- 官方仓库:https://github.com/papra-hq/papra (2026-10-31 查询)
本专栏姊妹篇:《Papra 26.7.1 介绍与选型指南》、《Papra 26.7.1 Docker Compose 部署指南》、《Papra 26.7.1 REST API 使用详解》。