forked from Tencent/WeKnora
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path.env.example
More file actions
709 lines (658 loc) · 36.1 KB
/
Copy path.env.example
File metadata and controls
709 lines (658 loc) · 36.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
# =====================================================================
# WeKnora 环境变量配置示例
# ---------------------------------------------------------------------
# 使用说明:
# 1. 复制此文件为 .env:cp .env.example .env
# 2. 替换所有占位符为实际值(尤其标 ⚠️ 必填 的项)
# 3. 确保 .env 不会被提交到版本控制
#
# 配置注入机制:
# - app 服务通过 env_file: .env 读取本文件全部变量;
# - docreader / mcp / frontend / odl-hybrid 服务无 env_file,仅消费各自
# environment 段显式列出的变量(见 docker-compose.yml)。
#
# 分组顺序:
# A. 部署基础 镜像、运行时、网络
# B. 数据与存储 数据库、Redis、文件存储、对象存储
# C. 检索与图谱 向量库、知识图谱
# D. 模型 LLM/VLM/Ollama、内置模型
# E. 文档解析 Docreader、任务超时
# F. 认证与多租户 JWT/AES、注册、RBAC、OIDC
# G. Agent 与沙箱 Sandbox、Skills、Agent 超时
# H. 可选集成 网络搜索、MCP Server
# I. 可观测性 Langfuse
# J. 安全与调优 SSRF、代理、并发
# =====================================================================
# #####################################################################
# A. 部署基础
# #####################################################################
# ========== A1. 镜像版本与构建 ==========
# WeKnora 镜像版本标签:latest(稳定版)/ main(最新开发版)。
# WEKNORA_VERSION=latest
# Alpine apk 镜像源(构建 app 镜像用,留空用默认源;国内可设 mirrors.tencent.com 加速)。
APK_MIRROR_ARG=mirrors.tencent.com
# docreader 镜像构建时 apt 镜像源(留空用默认源)。
# APT_MIRROR=
# ========== A2. 运行时基础 ==========
# gin 运行模式:debug(开发,详细日志 + Swagger)/ release(生产,禁用 Swagger)。
GIN_MODE=release
# 日志级别:debug / info / warn / error / fatal,默认 debug。
# LOG_LEVEL=debug
# 日志文件路径(留空只输出 stdout);LLM_DEBUG_LOG 开启时同目录写 llm_debug.log。
# LOG_PATH=
# 自定义日志格式模板(留空用内置默认格式)。
# LOG_FORMAT=
# LLM 调试日志:把每次大模型调用的完整请求/响应写入独立文件,排查上下文问题用。
# 可选值:true(写 LOG_PATH 同目录 llm_debug.log)/ false/空(关闭)/ 指定文件路径。
# LLM_DEBUG_LOG=true
# 时区,默认 Asia/Shanghai。影响系统时间显示与日志时间戳。
# 常用值:Asia/Shanghai, Asia/Tokyo, America/New_York, Europe/London, UTC。
TZ=Asia/Shanghai
# 系统默认语言(BCP-47),用于 Prompt 中 {{language}} 占位符回退。
# 优先级:Accept-Language 请求头 > 此变量 > 内置默认值 (en-US)。
# WEKNORA_LANGUAGE=zh-CN
# 启动时自动执行数据库迁移;设 false 禁用(默认启用)。
AUTO_MIGRATE=true
# 自动恢复脏数据迁移状态(默认 true)。
AUTO_RECOVER_DIRTY=true
# 启动时自动把指定 email 的用户提升为系统管理员(幂等;仅 PROMOTE 从不 DEMOTE)。
# 适用于 docker-compose/k8s 首次自举;后续提权/撤销走 SystemAdmin 管理页。
# WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL=
# ========== A3. 网络与外部地址 ==========
# 应用服务主机名,默认 app(Docker 内部服务名);远程后端可设远程地址。
APP_HOST=app
# 应用服务宿主机映射端口,默认 8080(仅影响宿主机访问,不影响容器间通信)。
APP_PORT=8080
# NGINX 代理到后端的目标端口,默认 8080(App 容器内部监听端口)。
# 本地部署保持默认;远程部署设为远程 App 服务的实际端口。
# APP_BACKEND_PORT=8080
# NGINX 代理到后端的协议,默认 http;远程后端为 HTTPS 时设 https。
# APP_SCHEME=http
# 前端服务端口,默认 80。
FRONTEND_PORT=80
# Docreader 地址(app 连接 docreader 用)。
DOCREADER_ADDR=docreader:50051
# Docreader 连接方式:grpc / http / https。
DOCREADER_TRANSPORT=grpc
# 应用外部访问地址(仅影响 IM 渠道中 local 后端的图片/文件链接)。
# 设为 WeKnora 实例「IM 平台/客户端公网可达」URL,如 https://weknora.example.com。
# 作用范围:local 后端必填,否则 IM 收到 local://... 无法渲染;
# MinIO/COS/OSS/S3/TOS/OBS 不读此变量,链接由各自 *_ENDPOINT 决定。
# 内网 IP 和 localhost 对飞书/企微/Slack 等 IM 平台不可达;本地开发请用 ngrok/cloudflared/frp。
# APP_EXTERNAL_URL=
# 前端外部 origin,用于邀请链接等绝对 URL(留空走 host-relative)。
# FRONTEND_BASE_URL=
# 对外暴露的 MCP Server 端口(默认 8082)。
# MCP_PORT=8082
# #####################################################################
# B. 数据与存储
# #####################################################################
# ========== B1. 数据库 ⚠️ 必填 ==========
# 主数据库类型:postgres / mysql / sqlite。
DB_DRIVER=postgres
# 数据库主机地址。
DB_HOST=postgres
# 数据库端口。
DB_PORT=5432
# 数据库用户名。
DB_USER=postgres
# 数据库密码。
DB_PASSWORD=postgres123!@#
# 数据库名称。
DB_NAME=WeKnora
# SQLite 驱动时使用(DB_DRIVER=sqlite),postgres/mysql 忽略。
# DB_PATH=./data/weknora.db
# ========== B2. Redis / 流处理 / Asynq 队列 ==========
# --- 流处理后端与 Redis 连接 ---
# 流处理后端:memory / redis。redis 模式下 Asynq 任务队列也依赖此 Redis。
STREAM_MANAGER_TYPE=redis
# Redis 地址(留空表示禁用 Redis,Lite 模式用 memory)。
REDIS_ADDR=redis:6379
# Redis 用户名(Redis 6.0+ ACL,可选)。
# REDIS_USERNAME=
# Redis 密码,未设置可留空。
REDIS_PASSWORD=redis123!@#
# Redis 数据库索引,默认 0。
REDIS_DB=0
# Redis key 前缀,用于命名空间隔离。
REDIS_PREFIX=stream:
# Redis 频道命名空间后缀(多部署共享同一 Redis 时隔离用)。
# WEKNORA_REDIS_NAMESPACE=
# Asynq 客户端 Redis 读写超时(毫秒,默认 500,写可扩到 1000)。
# WEKNORA_REDIS_OP_TIMEOUT_MS=500
# --- Redis TLS(托管 Redis 加密传输,如 AWS ElastiCache;默认关闭)---
# 是否启用 TLS。
# REDIS_USE_TLS=false
# TLS 证书校验与 SNI 的服务器名(地址为 IP 时有用)。
# REDIS_TLS_SERVER_NAME=
# 跳过服务器证书校验。不安全,仅开发/自签证书用,生产禁用。
# REDIS_TLS_INSECURE_SKIP_VERIFY=false
# --- Asynq worker 并发 ---
# 每个 pool 是独立 asynq.Server,硬隔离;留空或 <1 走代码默认。值为「每实例保底并发」,多副本部署按副本数累加。也可在系统设置(asynq.*_concurrency)运行时调整,无需重启。格式:变量 = 默认值 — 消费的队列 / 说明
# default + chat_attachment(文档解析主链路;chat_attachment 权重更高,避免被批量导入挤占)
# WEKNORA_ASYNQ_CORE_CONCURRENCY=8
# postprocess(解析后的知识库后处理/fan-out;独立成池避免排在长耗时 DocReader 后,需低延迟)
# WEKNORA_ASYNQ_POSTPROCESS_CONCURRENCY=2
# summary / multimodal / graph / question(摘要、图片多模态、图谱 chunk 抽取、问题生成;LLM/VLM 重,按 provider 预算调)
# WEKNORA_ASYNQ_ENRICHMENT_CONCURRENCY=12
# sync + low(数据源同步、FAQ 导入、KB 克隆/删除、批量重解析、知识移动;长耗时,不参与 shared 借用)
# WEKNORA_ASYNQ_MAINTENANCE_CONCURRENCY=4
# 弹性池,可借用 CORE/ENRICHMENT 队列(atomic dequeue 安全);不消费 POSTPROCESS/MAINTENANCE
# WEKNORA_ASYNQ_SHARED_CONCURRENCY=6
# Wiki 生成专用池(LLM 绑定,按 provider 并发预算调整)
# WEKNORA_WIKI_ASYNQ_CONCURRENCY=8
# 后台任务每模型并发上限(0/负数禁用;交互 chat 不受其限制)
# WEKNORA_MODEL_MAX_CONCURRENCY=32
# ========== B3. 文件存储(通用)==========
# 文件存储类型:local / minio / cos / tos / s3 / obs / oss / dummy。
STORAGE_TYPE=local
# 允许用户使用的存储类型白名单(逗号分隔,留空允许全部)。
# STORAGE_ALLOW_LIST=local,minio,cos,tos,s3,obs,oss
# 本地存储根目录(STORAGE_TYPE=local 时用)。
LOCAL_STORAGE_BASE_DIR=/data/files
# 本地存储路径前缀(legacy 回填用,一般留空)。
# LOCAL_STORAGE_PATH_PREFIX=
# 统一文件大小限制(MB,默认 50)。影响单文件上传、docreader gRPC 消息、frontend Nginx请求体、浏览器客户端校验。属部署期配置:Go/Nginx/docreader/浏览器四层启动时读一次,运行中改不生效,改后须同步重启四层。
# MAX_FILE_SIZE_MB=50
# ========== B4. 对象存储 provider(按 STORAGE_TYPE 选其一)==========
# ----- MinIO(STORAGE_TYPE=minio)-----
# MinIO 端点(host:port)。IM 渠道时必须是 IM 平台公网可达的 host(不能用 minio:9000)。
# MINIO_ENDPOINT=minio:9000
# MINIO_ACCESS_KEY_ID=your_minio_access_key
# MINIO_SECRET_ACCESS_KEY=your_minio_secret_key
# MINIO_BUCKET_NAME=your_minio_bucket_name
# MINIO_PATH_PREFIX=
# MINIO_USE_SSL=false
# MinIO 端口(compose 映射用)。
# MINIO_PORT=9000
# MINIO_CONSOLE_PORT=9001
# ----- 腾讯云 COS(STORAGE_TYPE=cos)-----
# COS_SECRET_ID=your_cos_secret_id
# COS_SECRET_KEY=your_cos_secret_key
# COS_REGION=ap-guangzhou
# COS_BUCKET_NAME=your_cos_bucket_name
# COS_APP_ID=your_cos_app_id
# COS_PATH_PREFIX=your_cos_path_prefix
# COS_TEMP_BUCKET_NAME=your_cos_temp_bucket_name
# COS_TEMP_REGION=your_cos_temp_region
# ----- 火山引擎 TOS(STORAGE_TYPE=tos)-----
# TOS_ENDPOINT=https://tos-cn-beijing.volces.com
# TOS_REGION=cn-beijing
# TOS_ACCESS_KEY=your_tos_access_key
# TOS_SECRET_KEY=your_tos_secret_key
# TOS_BUCKET_NAME=your_tos_bucket_name
# TOS_PATH_PREFIX=your_tos_path_prefix
# TOS_TEMP_BUCKET_NAME=your_tos_temp_bucket_name
# TOS_TEMP_REGION=your_tos_temp_region
# ----- AWS S3(STORAGE_TYPE=s3)-----
# S3_ENDPOINT=https://s3.amazonaws.com
# S3_REGION=us-east-1
# S3_ACCESS_KEY=your_s3_access_key
# S3_SECRET_KEY=your_s3_secret_key
# S3_BUCKET_NAME=your_s3_bucket_name
# S3_PATH_PREFIX=weknora/
# S3_USE_SSL=true
# S3_FORCE_PATH_STYLE=false
# ----- 华为云 OBS(STORAGE_TYPE=obs)-----
# OBS_ENDPOINT=obs.cn-north-4.myhuaweicloud.com
# OBS_REGION=cn-north-4
# OBS_ACCESS_KEY=your_obs_access_key
# OBS_SECRET_KEY=your_obs_secret_key
# OBS_BUCKET_NAME=your_obs_bucket_name
# OBS_PATH_PREFIX=weknora/
# OBS_USE_SSL=true
# OBS_PROXY_DOMAIN=https://your-domain.com/obs
# ----- 阿里云 OSS(STORAGE_TYPE=oss)-----
# OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com
# OSS_REGION=cn-hangzhou
# OSS_ACCESS_KEY=your_oss_access_key
# OSS_SECRET_KEY=your_oss_secret_key
# OSS_BUCKET_NAME=your_oss_bucket_name
# OSS_PATH_PREFIX=weknora/
# OSS_TEMP_BUCKET_NAME=your_oss_temp_bucket_name
# OSS_TEMP_REGION=your_oss_temp_region
# #####################################################################
# C. 检索与图谱
# #####################################################################
# ========== C1. 向量库 / 检索引擎 ==========
# 向量存储类型(逗号分隔可多驱动):postgres / elasticsearch_v7 / elasticsearch_v8 /
# opensearch / qdrant / milvus / weaviate / doris / tencent_vectordb。
RETRIEVE_DRIVER=postgres
# 多向量库并行检索超时(秒,RETRIEVE_DRIVER 含多个驱动时生效)。
# MULTI_STORE_RETRIEVE_TIMEOUT_SEC=
# ----- Elasticsearch v7/v8 -----
# ELASTICSEARCH_ADDR=http://localhost:9200
# ELASTICSEARCH_USERNAME=your_elasticsearch_username
# ELASTICSEARCH_PASSWORD=your_elasticsearch_password
# ELASTICSEARCH_INDEX=WeKnora
# ----- OpenSearch(dev compose 自带单节点 profile)-----
# OPENSEARCH_ADDR=http://opensearch:9200
# OPENSEARCH_USERNAME=
# OPENSEARCH_PASSWORD=
# OPENSEARCH_INSECURE_SKIP_VERIFY=false
# OPENSEARCH_INDEX=WeKnora
# ----- Qdrant -----
# QDRANT_HOST=qdrant
# QDRANT_PORT=6334
# QDRANT_REST_PORT=6333
# QDRANT_COLLECTION=weknora_embeddings
# QDRANT_API_KEY=your_qdrant_api_key
# QDRANT_USE_TLS=false
# ----- Milvus -----
# MILVUS_ADDRESS=milvus:19530
# MILVUS_COLLECTION=weknora_embeddings
# MILVUS_METRIC_TYPE=IP # IP(默认)/COSINE/L2,改后需重建 collection。
# MILVUS_USERNAME=your_milvus_username
# MILVUS_PASSWORD=your_milvus_password
# MILVUS_DB_NAME=your_milvus_db_name
# ----- Weaviate -----
# 容器内访问用 service:port(不要用 localhost/宿主机映射端口)。
# WEAVIATE_HOST=weaviate:8080
# WEAVIATE_GRPC_ADDRESS=weaviate:50051
# WEAVIATE_SCHEME=http
# WEAVIATE_AUTH_ENABLED=false # 启用 APIKey/OIDC 时再设 true 并配 WEAVIATE_API_KEY。
# WEAVIATE_API_KEY=your_secret_key
# WEAVIATE_COLLECTION=your_weaviate_db_name
# ----- Apache Doris 4.1+ -----
# DORIS_ADDR=doris-fe:9030 # FE MySQL 协议地址。
# DORIS_HTTP_PORT=8030 # FE HTTP,Stream Load partial update 入口。
# DORIS_DATABASE=weknora
# DORIS_USERNAME=root
# DORIS_PASSWORD=
# DORIS_TABLE_PREFIX=weknora_embeddings
# DORIS_COMPAT_MODE=auto # auto(探测)/legacy(cosine_distance)/inner_product_duplicate;建表后不可互换。
# compose 端口。
# DORIS_FE_HTTP_PORT=8030
# DORIS_FE_MYSQL_PORT=9030
# DORIS_BE_HTTP_PORT=8040
# ----- 腾讯云 Tencent VectorDB -----
# TENCENT_VECTORDB_ADDR=http://your-instance.tencentvectordb.com
# TENCENT_VECTORDB_USERNAME=root
# TENCENT_VECTORDB_API_KEY=your_tencent_vectordb_api_key
# TENCENT_VECTORDB_DATABASE=weknora
# TENCENT_VECTORDB_COLLECTION=weknora_embeddings
# TENCENT_VECTORDB_REPLICA_NUMBER=1
# ========== C2. 知识图谱(Neo4j,可选)==========
# 知识图谱唯一全局开关。非 true 则禁用图谱构建与检索(构建阶段需调用大模型,耗时较长)。
# 注:ENABLE_GRAPH_RAG 自 v0.1.6 起已被 NEO4J_ENABLE 取代,Go 主应用不再读取,已移除。
# NEO4J_ENABLE=false
# Neo4j 连接 URI。bolt:// 直连单机(推荐,无路由开销);neo4j:// 走集群路由发现(单机也能用但多一次探测)。
# WeKnora 默认部署单机 Neo4j,故用 bolt://。
# NEO4J_URI=bolt://neo4j:7687
# NEO4J_USERNAME=neo4j
# NEO4J_PASSWORD=password
# #####################################################################
# D. 模型
# #####################################################################
# ========== D1. LLM / VLM / Ollama ==========
# Ollama 不可用时仅告警不阻断(true 时生效,默认不阻断,避免未配 Ollama 就启动失败)。
OLLAMA_OPTIONAL=true
# Ollama 服务基准 URL(连接本地/远程 Ollama)。
OLLAMA_BASE_URL=http://host.docker.internal:11434
# 批量 embedding 大小(留空走代码默认)。
# BATCH_EMBED_SIZE=
# VLM 单次 HTTP 请求超时(秒,默认 180;慢端点超时报 context deadline 时调大)。
# VLM_HTTP_TIMEOUT_SECONDS=180
# LLM 流原始转储(排查上下文问题;1 启用,默认目录 ~/.weknora/investigate/llm-stream)。
# WEKNORA_LLM_STREAM_RAW_DUMP=
# WEKNORA_LLM_STREAM_RAW_DUMP_DIR=
# ========== D2. 内置模型声明式配置(可选)==========
# 启用 config/builtin_models.yaml(见 config/builtin_models.yaml.example)后,YAML 中的
# ${NAME} 占位符会在应用启动期从这里读取真实值。变量名由 YAML 自定,下面给出常见命名参考。
# 详见 docs/BUILTIN_MODELS.md。
#
# 内置对话模型
# LLM_MODEL_NAME=
# LLM_BASE_URL=
# LLM_API_KEY=
# LLM_PROVIDER=openai
#
# 内置向量模型
# EMBEDDING_MODEL_NAME=
# EMBEDDING_BASE_URL=
# EMBEDDING_API_KEY=
# EMBEDDING_PROVIDER=openai
#
# 内置 Rerank 模型
# RERANK_MODEL_NAME=
# RERANK_BASE_URL=
# RERANK_API_KEY=
# RERANK_PROVIDER=generic
# #####################################################################
# E. 文档解析
# #####################################################################
# ========== E1. Docreader gRPC 与解析通用 ==========
# ----- gRPC 服务端 TLS / 认证(docreader 与 app 共用,客户端/服务端需配相同值)-----
# 启用 gRPC TLS 加密传输。默认 false(docreader 仅在 compose 内网供 app 调用,明文即可)。
# GRPC_TLS_ENABLED=false
# 服务端证书 / 客户端证书(mTLS 时填)。server 启用 TLS 时必填。
# GRPC_TLS_CERT=/path/to/server.crt
# 证书对应私钥。
# GRPC_TLS_KEY=/path/to/server.key
# CA 证书:client 用于校验 server 证书;server 端 mTLS 时用于签发客户端证书的 CA。
# GRPC_TLS_CA=/path/to/ca.crt
# TLS SNI / 证书校验名。DOCREADER_ADDR 用 IP、或与证书 CN 不一致时,设为证书里的 hostname。
# GRPC_TLS_SERVER_NAME=
# server 端:true 时强制要求客户端提供证书(双向 TLS / mTLS)。
# GRPC_MTLS_REQUIRE_CLIENT_CERT=false
# gRPC per-RPC 认证 token(客户端/服务端需一致)。启用时强烈建议同时开 TLS,
# 否则 token 会明文随每次 RPC 传输;GRPC_TLS_ENABLED=true 时客户端会拒绝在不安全连接上发送 token。
# GRPC_AUTH_TOKEN=your-secret-token-at-least-16-bytes
# ----- gRPC 服务参数 -----
# gRPC server 最大并发 worker 数(默认 4)。
# DOCREADER_GRPC_MAX_WORKERS=4
# gRPC 单条消息大小上限(MB,默认 50)。通常跟随 MAX_FILE_SIZE_MB;过大扫描件图可能超此值。
# DOCREADER_GRPC_MAX_FILE_SIZE_MB=50
# gRPC 监听端口(默认 50051)一般无需修改,需要与docker-compose中的docreader port保持一致。
# DOCREADER_GRPC_PORT=50051
# ----- 解析通用 -----
# DOCX 解析最大页数(默认 0=不限制)。设正整数(如 500)可限制超大 Word 文档解析开销。
# DOCREADER_DOCX_MAX_PAGES=0
# MarkItDown(重型解析器)并发 worker 数。0 关闭限流;默认 1 适合单机/GPU 受限。
# DOCREADER_MARKITDOWN_MAX_WORKERS=1
# 出站 HTTP/HTTPS 代理(抓取网页 / 远程图片时用)。
# DOCREADER_EXTERNAL_HTTP_PROXY=
# DOCREADER_EXTERNAL_HTTPS_PROXY=
# ========== E2. OpenDataLoader hybrid(可选,知识库 parser_engine_rules 指定 engine: opendataloader)==========
# ODL 重型解析器并发(默认 1)。
# DOCREADER_ODL_MAX_WORKERS=1
# hybrid 模式开关:off(默认,纯 fast 本地解析)/ docling-fast 等(需另起 odl-hybrid 容器)。
# DOCREADER_ODL_HYBRID=off
# odl-hybrid 服务地址。代码默认 http://127.0.0.1:5002;docker compose 注入 http://odl-hybrid:5002。
# DOCREADER_ODL_HYBRID_URL=http://odl-hybrid:5002
# hybrid 模式选择(auto),一般无需改。
# DOCREADER_ODL_HYBRID_MODE=auto
# hybrid 失败时是否回退到 fast 模式(默认 false)。
# DOCREADER_ODL_HYBRID_FALLBACK=false
# hybrid 输出 markdown 是否保留 HTML(默认 false)。
# DOCREADER_ODL_MARKDOWN_WITH_HTML=false
# ----- odl-hybrid 容器参数(仅 --profile odl-hybrid 时用)-----
# 传给 odl-hybrid 的额外参数。默认 --no-ocr(数字 PDF);扫描件用 --force-ocr(需 EasyOCR+libGL)。
# ODL_HYBRID_EXTRA_ARGS=--no-ocr
# odl-hybrid 对外端口(dev compose 映射用)。
# ODL_HYBRID_PORT=5002
# app 启动时等待 odl-hybrid 就绪的最长时间(秒)。
# ODL_HYBRID_STARTUP_WAIT_SEC=180
# ========== E3. PDF 渲染 ==========
# PDF 渲染 worker 数(跨文档并发,默认 1)。
# DOCREADER_PDF_RENDER_MAX_WORKERS=1
# 单个 PDF 内部「扫描页渲染」的并行进程数(pdfium 非线程安全,按进程并行)。默认随 CPU 取min(4, cpu);大体量扫描件串行渲染在 CPU 受限容器上可能耗时数小时,调大可显著缩短(实测874 页 117s->30s/4 进程 ->17s/8 进程)。容器需分配足够 CPU 才能吃到加速。
# DOCREADER_PDF_RENDER_PARALLELISM=4
# 渲染 DPI(默认 200)。
# DOCREADER_PDF_RENDER_DPI=200
# 渲染图 JPEG 质量(默认 85)。
# DOCREADER_PDF_JPEG_QUALITY=85
# 渲染页图的最大长边像素(默认 2000)。防止超大页面渲染出 100+MP 图撑爆 gRPC 消息上限;调小可进一步减小图片体积,过小会影响 OCR 识别(密集中文建议 >=1600)。
# DOCREADER_PDF_RENDER_MAX_EDGE=2000
# ========== E4. PDF 扫描件判定与强制 ==========
# 强制所有 PDF 全页按扫描件解析(渲染成图片再走 OCR/VLM)。适合文本层质量差但页面可 OCR 的PDF;开启后速度和模型调用成本都会上升。默认 false(由下方阈值自动判定)。
# DOCREADER_PDF_FORCE_SCANNED=false
# 自动判定:一页的图片对象覆盖面积 >= 此比例视为扫描页(默认 0.5)。
# DOCREADER_PDF_SCAN_IMAGE_RATIO=0.5
# 自动判定:一页文本字符数少于此值视为「无可用文本层」(默认 10)。
# DOCREADER_PDF_SCAN_MIN_CHARS=10
# ========== E5. PDF 版式 / 文本抽取(原生文本页)==========
# 版式感知文本抽取:重建可读阅读顺序(默认 true)。
# DOCREADER_PDF_LAYOUT_ORDERING=true
# glyph 无显式空格定位时(OCR/搜索文本常见),间距超过 median 字宽的多少倍时插空格(默认 0.4)。
# DOCREADER_PDF_WORD_GAP_WIDTH_RATIO=0.4
# 丢弃窄边栏(arXiv 侧栏水印、页码标签)的页宽比例阈值(默认 0.12)。
# DOCREADER_PDF_MARGIN_COL_WIDTH_RATIO=0.12
# 一行至少多少字符才允许字体大小启发式将其提升为 markdown 标题(默认 8)。
# DOCREADER_PDF_MIN_HEADING_LINE_CHARS=8
# 把视觉上较大的行提升为 markdown 标题(用 rect 高度做字体大小代理,默认 true)。
# DOCREADER_PDF_DETECT_HEADINGS=true
# 丢弃不可见文本(render-mode 3)、页外文本和退化文本,防 hidden-text 注入(默认 true)。
# DOCREADER_PDF_FILTER_HIDDEN_TEXT=true
# 清理 pdfium 占位符(U+FFFE)和软连字符;剥离矢量图坐标轴/图例文字(默认 true)。
# DOCREADER_PDF_SANITIZE_TEXT=true
# 剥离图表区碎片文本(与 SANITIZE_TEXT 配合,默认 true)。
# DOCREADER_PDF_STRIP_CHART_DEBRIS=true
# ========== E6. PDF 嵌入图片抽取(原生文本页)==========
# 抽取原生页面里的嵌入位图供 VLM/OCR 分析(默认 true)。
# DOCREADER_PDF_EXTRACT_EMBEDDED_IMAGES=true
# 嵌入图片保留的最小像素宽与高(默认 80,低于则丢弃)。
# DOCREADER_PDF_EMBED_MIN_PIXELS=80
# 嵌入图片占页面面积的最小比例,低于则丢弃(默认 0.01)。
# DOCREADER_PDF_EMBED_MIN_AREA_RATIO=0.01
# 同一张图在文本页中出现比例 >= 此值时视为页眉页脚等运行项并去重(默认 0.5)。
# DOCREADER_PDF_EMBED_REPEAT_PAGE_FRAC=0.5
# 每篇文档抽取嵌入图片的硬上限(默认 50)。
# DOCREADER_PDF_EMBED_MAX_IMAGES=50
# ========== E7. PDF 图表区识别(矢量图区域)==========
# 把检测到的矢量图表区(无嵌入位图)渲染成 JPEG 供 VLM/OCR(默认 true)。
# DOCREADER_PDF_RENDER_VECTOR_FIGURES=true
# 一个区域被视为图表所需的每行最少字符数(默认 18)。
# DOCREADER_PDF_MIN_CHART_REGION_CHARS=18
# 一个区域被视为图表所需的最小面积占比(默认 0.015)。
# DOCREADER_PDF_MIN_CHART_REGION_AREA=0.015
# 一个区域被视为图表的最大面积占比(超过则不当图表,默认 0.42)。
# DOCREADER_PDF_MAX_CHART_REGION_AREA=0.42
# 图形高度占页高的最大比例,超过则不当作独立图表(默认 0.38)。
# DOCREADER_PDF_MAX_FIGURE_HEIGHT_RATIO=0.38
# ========== E8. 文档处理 / 任务超时 ==========
# 单文档处理任务总超时(Go duration,默认 2h;大文件可调大)。
# WEKNORA_DOCUMENT_PROCESS_TIMEOUT=2h
# 单次 DocReader RPC 超时(默认 30m,须小于上一项)。
# WEKNORA_DOCREADER_CALL_TIMEOUT=30m
# 知识库巡检回收(回收卡在 processing 的脏数据;false 禁用,不建议)。
# WEKNORA_HOUSEKEEPING_ENABLED=true
# 聊天附件解析产物保留时长(小时,默认 24)。
# WEKNORA_CHAT_ATTACHMENT_TTL_HOURS=24
# 单轮问答等待附件解析完成的最长时间(秒,默认 60;大/扫描件调大)。
# WEKNORA_CHAT_ATTACHMENT_WAIT_TIMEOUT_SEC=60
# 附件 VLM OCR 调优(扫描件/图片型文档):并发数 / 最大页数。
# WEKNORA_CHAT_ATTACHMENT_OCR_CONCURRENCY=8
# WEKNORA_CHAT_ATTACHMENT_OCR_MAX_PAGES=8
# #####################################################################
# F. 认证与多租户
# #####################################################################
# ========== F1. 密钥 ⚠️ 必填(生产务必改默认值)==========
# JWT 签名密钥,用于前端登录刷新 Token(留空则启动时随机生成)。
JWT_SECRET=weknora-jwt-secret
# AES-256 主密钥,用于数据库中 API Key 等敏感字段落盘加密(必须为 32 字节)。
# 加密范围:tenants.api_key、模型 API key、向量库凭证、web search provider key、
# WeKnoraCloud.AppSecret 等。缺失或长度不对时已加密字段无法解密(UI 显示为空,需重填)。
# 生产必须显式设置且妥善保管,丢失则所有加密数据不可恢复。
# 注:TENANT_AES_KEY / CRYPTO_MASTER_KEY / CRYPTO_SALT 已废弃。v0.4.0 起 CryptoService(PBKDF2)被移除,加密统一改用 SYSTEM_AES_KEY。这三个变量 Go 主应用不再读取,已移除。
SYSTEM_AES_KEY=weknora-system-aes-key-32bytes!!
# ========== F2. 注册与租户策略 ==========
# 禁止新用户注册(生产建议 true)。
# DISABLE_REGISTRATION=false
# 公开注册后的默认空间策略:create_personal(默认,自动创建个人空间)/ tenantless。
# WEKNORA_AUTH_DEFAULT_TENANT_MODE=create_personal
# 是否允许普通用户登录后主动创建空间(默认 true;false 仅能邀请加入,超管不受影响)。
# WEKNORA_TENANT_SELF_SERVICE_CREATION_ENABLED=true
# 启用空间级 RBAC(true 默认强制鉴权 / false 观察模式仅记录不拦截)。
# WEKNORA_TENANT_ENABLE_RBAC=true
# 启用跨租户访问(需配合用户的 CanAccessAllTenants 权限;默认 false)。开启有存在一个跨租户管理员,需要手动修改数据库的数据为某个用户设置为跨租户管理员
# WEKNORA_TENANT_ENABLE_CROSS_TENANT_ACCESS=false
# 单个非超管用户可自助创建空间数上限(>0 强制限额;=0 走默认;<0 关闭限额)。
# WEKNORA_TENANT_MAX_OWNED_PER_USER=
# 创建空间时是否自动生成 full_access API Key 并在响应中返回 token(默认 false,兼容旧版回退开关)。
# WEKNORA_TENANT_AUTO_CREATE_API_KEY=false
# 新建空间默认存储配额(GB,默认 10)。
# WEKNORA_TENANT_DEFAULT_STORAGE_QUOTA_GB=10
# 租户邀请链接 TTL(Go duration,默认 168h=7 天)。
# WEKNORA_INVITATION_TTL=168h
# 审计日志保留天数(0 禁用清理,默认 90)。
# WEKNORA_AUDIT_RETENTION_DAYS=90
# ========== F3. OIDC 认证(可选,OIDC_AUTH_ENABLE=true 启用)==========
# OIDC_AUTH_ENABLE=false
# OIDC_AUTH_ISSUER_URL=http://127.0.0.1:5556/dex
# OIDC_AUTH_DISCOVERY_URL=http://127.0.0.1:5556/dex/.well-known/openid-configuration
# OIDC_AUTH_PROVIDER_DISPLAY_NAME=OIDC
# OIDC_AUTH_CLIENT_ID=client_id_for_oidc_client
# OIDC_AUTH_CLIENT_SECRET=secret_for_oidc_client
# 若 OIDC_AUTH_DISCOVERY_URL 已填,以下端点可留空。
# OIDC_AUTH_AUTHORIZATION_ENDPOINT=http://127.0.0.1:5556/dex/auth
# OIDC_AUTH_TOKEN_ENDPOINT=http://127.0.0.1:5556/dex/token
# OIDC_AUTH_USER_INFO_ENDPOINT=http://127.0.0.1:5556/dex/userinfo
# OIDC_AUTH_SCOPES="openid profile email"
# OIDC 首次自动开户后的空间策略与本地注册共用 WEKNORA_AUTH_DEFAULT_TENANT_MODE,无独立配置。
# OIDC_USER_INFO_MAPPING_USER_NAME=name
# OIDC_USER_INFO_MAPPING_EMAIL=email
# #####################################################################
# G. Agent 与沙箱
# #####################################################################
# ========== G1. Agent Skills Sandbox ==========
# Sandbox 模式:docker(默认)/ local / disabled。
WEKNORA_SANDBOX_MODE=docker
# 脚本执行超时(秒,默认 60)。
WEKNORA_SANDBOX_TIMEOUT=60
# Sandbox Docker 镜像(默认 wechatopenai/weknora-sandbox:latest)。
# WEKNORA_SANDBOX_DOCKER_IMAGE=wechatopenai/weknora-sandbox:latest
# 自定义 Skills 目录(挂载后指定,免重建镜像)。
# WEKNORA_SKILLS_DIR=
# 智能体大模型调用默认超时(秒,默认 120;复杂推理调大如 300/600)。
# 注:全局默认;单个智能体在数据库配独立 llm_call_timeout 时以其为准。
# WEKNORA_AGENT_LLM_TIMEOUT=300
# MCP 工具人工审核等待超时(秒,默认 600;支持 Go duration 如 30s/5m/1h)。
# WEKNORA_AGENT_TOOL_APPROVAL_TIMEOUT=600
# MCP 工具人工审批失败时是否放行(true 放行 / 默认 fail-close 拒绝)。
# WEKNORA_AGENT_TOOL_APPROVAL_FAIL_OPEN=
# #####################################################################
# H. 可选集成
# #####################################################################
# ========== H1. 网络搜索(SearXNG / Tavily)==========
# ===== SearXNG(可选自建网络搜索)=====
# 启用:`docker compose --profile searxng up -d`。
# SEARXNG_SECRET 不设时使用 docker-compose 中的写死默认值,足够本机/loopback 部署使用;
# 如果改 SEARXNG_BIND=0.0.0.0 把实例暴露到 LAN/公网,请务必用 openssl rand -hex 32 生成
# 并显式设置 SEARXNG_SECRET,否则默认值会被任何人用于签名 image-proxy URL。
#
# 后端访问方式(容器化部署):控制台中 Provider 类型选 "SearXNG",
# Instance URL 填 http://searxng:8080;docker compose 已默认把 searxng 主机名注入
# SSRF_WHITELIST_EXTRA,无需额外配置。
#
# 本地开发(go run + docker compose -f docker-compose.dev.yml --profile searxng up):
# 后端跑在宿主机,需走 published 端口;Instance URL 填 http://127.0.0.1:8888,
# 并把 127.0.0.1 加入下方 SSRF_WHITELIST。
#
# 端口默认仅监听 127.0.0.1,避免把开了 limiter:false 的实例暴露到 LAN。
# 如需对内网开放,显式覆盖 SEARXNG_BIND=0.0.0.0 并自行加固。
# SEARXNG_PORT=8888
# SEARXNG_BIND=127.0.0.1
# SEARXNG_SECRET=
# Tavily Search API Key(可选,启用 Tavily 网页搜索提供者)。
# TAVILY_API_KEY=tvly-your_tavily_api_key
# ========== H2. MCP Server(可选,--profile full 时启动)==========
# MCP Server 访问 WeKnora REST API 用的 API Key(在前端「设置 -> API Keys」生成)。
# WEKNORA_API_KEY=
# HTTP/SSE 传输必填:mcp-server 启动时若缺少此项会拒绝启动(客户端以 Authorization: Bearer 携带)。
# MCP_SERVER_AUTH_TOKEN=
# 调用 WeKnora REST 的读超时(秒,默认 300)。
# WEKNORA_CHAT_TIMEOUT=300
# 是否校验 WeKnora 后端 TLS 证书(默认 true;自签证书可设 false)。
# WEKNORA_VERIFY_SSL=true
# 允许上传的目录白名单(逗号分隔;留空禁用文件上传工具)。
# MCP_ALLOWED_UPLOAD_DIRS=
# #####################################################################
# I. 可观测性(Langfuse,可选)
# #####################################################################
# ========== I1. Langfuse 接入(追踪 chat/embedding/rerank/VLM/ASR 模型调用,统计 token 消耗)==========
# 详细说明:docs/Langfuse集成.md
#
# 方案 A:接入 Langfuse Cloud(最简单)
# 1) 登录 https://cloud.langfuse.com 生成 API Key
# 2) 填入下方 PUBLIC_KEY / SECRET_KEY
# 3) docker compose up -d app
#
# 方案 B:自建 Langfuse(局域网/内网环境)
# 1) 启动自建栈:docker compose --profile langfuse up -d
# 首次启动后 ClickHouse 迁移约 1-2 分钟,耐心等待 langfuse-web 健康
# 2) 浏览器打开 http://localhost:3000 注册管理员账号并生成 API Key
# 3) 取消注释下方 LANGFUSE_HOST=http://langfuse-web:3000,填入刚生成的 PUBLIC_KEY / SECRET_KEY
# 4) docker compose up -d app
#
# 只要同时设置 PUBLIC_KEY + SECRET_KEY 就会自动启用,无需显式开关。
LANGFUSE_PUBLIC_KEY=pk-lf-xxxxxxxx
LANGFUSE_SECRET_KEY=sk-lf-xxxxxxxx
LANGFUSE_HOST=http://langfuse-web:3000
# 自建模式下改成:LANGFUSE_HOST=http://langfuse-web:3000
# 可选:显式开关(true/false,默认根据 key 自动判断)。
# LANGFUSE_ENABLED=true
# 可选:版本 / 环境标签,便于在 Langfuse UI 过滤。
# LANGFUSE_RELEASE=v0.4.2
# LANGFUSE_ENVIRONMENT=production
# 可选:批量上报与采样策略(生产高流量建议调大 FLUSH_AT、降低 SAMPLE_RATE)。
# LANGFUSE_FLUSH_AT=15
# LANGFUSE_FLUSH_INTERVAL=3s
# LANGFUSE_QUEUE_SIZE=2048
# LANGFUSE_REQUEST_TIMEOUT=10s
# LANGFUSE_SAMPLE_RATE=1.0
# LANGFUSE_DEBUG=false
# ========== I2. Langfuse 自建栈配置(仅在使用 --profile langfuse 时需要)==========
# 设计说明:为最小化资源占用,Langfuse 自建栈会**复用** WeKnora 已有的
# - postgres:创建独立的 "langfuse" 数据库(由 langfuse-db-init 容器一次性创建)
# - redis :使用独立的 Redis DB 号(默认 1,WeKnora 用 0)
# 真正新增的只有 3 个常驻容器:langfuse-web、langfuse-worker、langfuse-clickhouse
# + 1 个专用 S3:langfuse-minio
# + 1 个一次性 init:langfuse-db-init
# Langfuse Web UI 对外端口。
# LANGFUSE_WEB_PORT=3000
# Langfuse 专用 MinIO 端口(避免和 WeKnora 主 MinIO 9000/9001 冲突)。
# LANGFUSE_MINIO_S3_PORT=9100
# LANGFUSE_MINIO_CONSOLE_PORT=9101
# 媒体上传外部 endpoint(浏览器直连 Langfuse MinIO),默认指向宿主机映射的 9100 端口。
# LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=http://localhost:9100
# 在 WeKnora-postgres 中创建的 Langfuse 库名。
# LANGFUSE_DB_NAME=langfuse
# 在 WeKnora-redis 中使用的 DB 号(1~15,不要和 WeKnora 的 0 冲突)。
# LANGFUSE_REDIS_DB=1
# ClickHouse / Langfuse 专用 MinIO 凭证(生产请务必修改)。
# LANGFUSE_CLICKHOUSE_USER=clickhouse
# LANGFUSE_CLICKHOUSE_PASSWORD=clickhouse
# LANGFUSE_MINIO_USER=langfuseminio
# LANGFUSE_MINIO_PASSWORD=langfuseminiosecret
# Langfuse 核心安全字段,生产必须重新生成:
# LANGFUSE_SALT=$(openssl rand -base64 32)
# LANGFUSE_ENCRYPTION_KEY=$(openssl rand -hex 32)
# LANGFUSE_NEXTAUTH_SECRET=$(openssl rand -base64 32)
# LANGFUSE_SALT=
# LANGFUSE_ENCRYPTION_KEY=
# LANGFUSE_NEXTAUTH_SECRET=
# LANGFUSE_NEXTAUTH_URL=http://localhost:3000
# LANGFUSE_TELEMETRY_ENABLED=false
# 可选:自动化首次启动(填写后直接注入管理员+项目,跳过 UI 注册)。
# LANGFUSE_INIT_ORG_ID=WeKnora
# LANGFUSE_INIT_ORG_NAME=WeKnora
# LANGFUSE_INIT_PROJECT_ID=WeKnora
# LANGFUSE_INIT_PROJECT_NAME=WeKnora
# LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-lf-weknora-init
# LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-lf-weknora-init
# LANGFUSE_INIT_USER_EMAIL=admin@example.com
# LANGFUSE_INIT_USER_NAME=Admin
# LANGFUSE_INIT_USER_PASSWORD=change-me-please
# #####################################################################
# J. 安全与部署调优
# #####################################################################
# ========== J1. SSRF 防护 ==========
# SSRF 校验白名单(可选)。逗号分隔;每条可为:精确域名(api.internal)、通配域名(*.example.com)、
# IPv4(203.0.113.5)、IPv6(2001:db8::1,不带方括号)或 CIDR(10.0.0.0/8, 2001:db8::/32)。
# 列入者会在 URL 校验等地方绕过常规 SSRF 规则,生产环境请谨慎配置。
# SSRF_WHITELIST=internal.service,*.corp.example,172.16.0.0/12,2001:db8::1,fd00::/8
#
# ===== 向量库地址的 SSRF 校验 =====
# 通过 API 创建/测试向量库连接时,地址会经过 SSRF 校验。docker-compose 内置服务
# (qdrant, milvus, weaviate, doris-fe, doris-be, searxng)已通过 SSRF_WHITELIST_EXTRA 默认放行。
# 如使用外部私网地址或被拦截端口(5432, 9200 等),请将主机加入 SSRF_WHITELIST_EXTRA
# (注意:自定义该变量会覆盖 compose 默认值,需重新包含内置服务名),例如:
# SSRF_WHITELIST_EXTRA=searxng,qdrant,milvus,weaviate,doris-fe,doris-be,my-opensearch.internal
#
# Doris Stream Load:FE 会将请求 307 重定向到 BE;docker compose 默认放行
# doris-fe 与 doris-be(见 SSRF_WHITELIST_EXTRA)。
#
# 本地开发(go run + docker-compose.dev.yml --profile opensearch):后端跑在宿主机,
# OpenSearch 经 published 端口 http://localhost:9200 访问;通过 API 创建该向量库前,
# 需把 localhost 加入 SSRF_WHITELIST(9200 是被拦截端口,localhost 是受限主机名):
# SSRF_WHITELIST=localhost
# 保留原始 URL 的图片域名白名单(可选,逗号分隔)。配置后这些域名的图片仍会被下载分析
# (OCR/字幕),但 markdown 中保留原始 URL,不替换为对象存储的 provider:// URL。
# IMAGE_HOST_KEEP_URL=mineru.internal.example.com
# ========== J2. 代理与并发 ==========
# gin 信任的代理 CIDR(逗号分隔)。默认信任 loopback + 私网段(容器网络内 nginx 已覆盖)。
# 显式设为空字符串则禁用代理信任(ClientIP 返回直连对端)。生产部署在多层代理后需按实际填写。
# WEKNORA_TRUSTED_PROXIES=
# ants 协程池大小(Embedding 并发,出现 429 时调小)。
CONCURRENCY_POOL_SIZE=5